cell highlighting
This commit is contained in:
@@ -12,16 +12,18 @@ indirect enum MDInline: Sendable {
|
||||
}
|
||||
|
||||
enum MDMark: Sendable {
|
||||
case ok, warn, danger
|
||||
case ok, warn, danger, muted
|
||||
}
|
||||
|
||||
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,
|
||||
"-": .muted, "–": .muted, "—": .muted, "−": .muted,
|
||||
]
|
||||
|
||||
private let boldWrap = Re(#"^(\*\*|__)(.*)\1$"#)
|
||||
private let leadToken = Re(#"^\s*(\S*)([\s\S]*)$"#)
|
||||
|
||||
struct MDItem: Sendable {
|
||||
var choice: String?
|
||||
@@ -200,7 +202,7 @@ private func blocks(_ lines: [String], _ choices: Bool) -> [MDBlock] {
|
||||
rows.append(cells(lines[i]))
|
||||
i += 1
|
||||
}
|
||||
out.append(.table(head: rows[0].map(inline), rows: rows.dropFirst().map { $0.map(inline) }))
|
||||
out.append(.table(head: rows[0].map(cellInline), rows: rows.dropFirst().map { $0.map(cellInline) }))
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -314,13 +316,29 @@ 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)] {
|
||||
if let mark = markOf(src) {
|
||||
return [.mark(mark, spans(src))]
|
||||
}
|
||||
return spans(src)
|
||||
}
|
||||
|
||||
private func markOf(_ src: String) -> MDMark? {
|
||||
let t = trimmed(src)
|
||||
return marks[trimmed(boldWrap.exec(t)?[2] ?? t)]
|
||||
}
|
||||
|
||||
private func cellInline(_ src: String) -> [MDInline] {
|
||||
if markOf(src) != nil {
|
||||
return inline(src)
|
||||
}
|
||||
let g = leadToken.exec(src)!
|
||||
let lead = g[1] ?? "", rest = g[2] ?? ""
|
||||
guard let mark = markOf(lead) else {
|
||||
return spans(src)
|
||||
}
|
||||
return [.mark(mark, spans(lead))] + spans(rest)
|
||||
}
|
||||
|
||||
private func spans(_ src: String) -> [MDInline] {
|
||||
var out: [MDInline] = []
|
||||
var rest = src
|
||||
|
||||
@@ -60,6 +60,7 @@ extension MDMark {
|
||||
case .ok: Palette.ok
|
||||
case .warn: Palette.warn
|
||||
case .danger: Palette.danger
|
||||
case .muted: Palette.muted
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,6 +69,7 @@ extension MDMark {
|
||||
case .ok: Palette.okTint
|
||||
case .warn: Palette.warnTint
|
||||
case .danger: Palette.dangerTint
|
||||
case .muted: Palette.surface
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -676,7 +678,7 @@ private struct TableBlock: View {
|
||||
}
|
||||
|
||||
private func tint(_ cell: [MDInline]) -> Color? {
|
||||
guard cell.count == 1, case .mark(let mark, _) = cell[0] else {
|
||||
guard case .mark(let mark, _) = cell.first else {
|
||||
return nil
|
||||
}
|
||||
return mark.tint
|
||||
|
||||
Reference in New Issue
Block a user