input coloring

This commit is contained in:
Ian Gulliver
2026-10-17 08:53:21 -07:00
parent 3e537c827d
commit b1eb595af1
8 changed files with 171 additions and 15 deletions
+24 -3
View File
@@ -7,9 +7,22 @@ indirect enum MDInline: Sendable {
case em([MDInline])
case image(src: String, alt: String)
case link(href: String, [MDInline])
case mark(MDMark, [MDInline])
case lineBreak
}
enum MDMark: Sendable {
case ok, warn, danger
}
private let marks: [String: MDMark] = [
"✓": .ok, "✔": .ok, "✔️": .ok, "✅": .ok, "☑": .ok, "☑️": .ok,
"~": .warn, "≈": .warn, "〜": .warn, "⚠": .warn, "⚠️": .warn, "🟡": .warn,
"x": .danger, "X": .danger, "×": .danger, "✗": .danger, "✘": .danger, "✕": .danger, "✖": .danger, "✖️": .danger, "❌": .danger,
]
private let boldWrap = Re(#"^(\*\*|__)(.*)\1$"#)
struct MDItem: Sendable {
var choice: String?
var choiceIndex = 0
@@ -301,6 +314,14 @@ private func cells(_ line: String) -> [String] {
}
private func inline(_ src: String) -> [MDInline] {
let t = trimmed(src)
if let mark = marks[trimmed(boldWrap.exec(t)?[2] ?? t)] {
return [.mark(mark, spans(src))]
}
return spans(src)
}
private func spans(_ src: String) -> [MDInline] {
var out: [MDInline] = []
var rest = src
while !rest.isEmpty {
@@ -314,13 +335,13 @@ private func inline(_ src: String) -> [MDInline] {
if let code = g[1] {
out.append(.code(code))
} else if let strong = g[2] ?? g[3] {
out.append(.strong(inline(strong)))
out.append(.strong(spans(strong)))
} else if let em = g[4] ?? g[5] {
out.append(.em(inline(em)))
out.append(.em(spans(em)))
} else if let alt = g[6] {
out.append(.image(src: trimmed(g[7] ?? g[8]!), alt: alt))
} else if let text = g[9] {
out.append(.link(href: g[10]!, inline(text)))
out.append(.link(href: g[10]!, spans(text)))
} else if let bare = g[11] {
out.append(.link(href: bare, [.text(bare)]))
}