From 02fbc13ddb5b66ecf1d0dff3e7173a845984e006 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Mon, 30 Mar 2026 16:44:49 -0500 Subject: feat(markdown): finalize migration to apple/swift-markdown renderer --- .../Views/Repositories/MarkdownHTMLRenderer.swift | 42 +++++++++++++++++++--- 1 file changed, 38 insertions(+), 4 deletions(-) (limited to 'Hutch') diff --git a/Hutch/Views/Repositories/MarkdownHTMLRenderer.swift b/Hutch/Views/Repositories/MarkdownHTMLRenderer.swift index 67966f1..5c69659 100644 --- a/Hutch/Views/Repositories/MarkdownHTMLRenderer.swift +++ b/Hutch/Views/Repositories/MarkdownHTMLRenderer.swift @@ -10,7 +10,9 @@ private struct MarkdownHTMLRenderer: MarkupVisitor { typealias Result = String nonisolated(unsafe) let imageURLResolver: ((String) -> String?)? - private var isRenderingTableHead = false + nonisolated(unsafe) private var isRenderingTableHead = false + nonisolated(unsafe) private var currentTableAlignments: [Markdown.Table.ColumnAlignment?] = [] + nonisolated(unsafe) private var currentTableColumnIndex = 0 nonisolated init(imageURLResolver: ((String) -> String?)?) { self.imageURLResolver = imageURLResolver @@ -140,7 +142,14 @@ private struct MarkdownHTMLRenderer: MarkupVisitor { } nonisolated mutating func visitTable(_ table: Markdown.Table) -> String { - "\n\(visitChildren(of: table))
\n" + let previousAlignments = currentTableAlignments + let previousColumnIndex = currentTableColumnIndex + currentTableAlignments = table.columnAlignments + currentTableColumnIndex = 0 + let content = visitChildren(of: table) + currentTableAlignments = previousAlignments + currentTableColumnIndex = previousColumnIndex + return "\n\(content)
\n" } nonisolated mutating func visitTableHead(_ tableHead: Markdown.Table.Head) -> String { @@ -160,12 +169,18 @@ private struct MarkdownHTMLRenderer: MarkupVisitor { } nonisolated mutating func visitTableRow(_ tableRow: Markdown.Table.Row) -> String { - "\(visitChildren(of: tableRow))\n" + let previousColumnIndex = currentTableColumnIndex + currentTableColumnIndex = 0 + let content = visitChildren(of: tableRow) + currentTableColumnIndex = previousColumnIndex + return "\(content)\n" } nonisolated mutating func visitTableCell(_ tableCell: Markdown.Table.Cell) -> String { let tagName = isRenderingTableHead ? "th" : "td" - return "<\(tagName)>\(visitChildren(of: tableCell))" + let styleAttribute = alignmentStyleAttribute(forColumn: currentTableColumnIndex) + currentTableColumnIndex += 1 + return "<\(tagName)\(styleAttribute)>\(visitChildren(of: tableCell))" } nonisolated private mutating func visitChildren(of markup: Markup) -> String { @@ -195,6 +210,25 @@ private struct MarkdownHTMLRenderer: MarkupVisitor { } } + nonisolated private func alignmentStyleAttribute(forColumn column: Int) -> String { + guard column < currentTableAlignments.count, + let alignment = currentTableAlignments[column] else { + return "" + } + + let textAlignment: String + switch alignment { + case .left: + textAlignment = "left" + case .center: + textAlignment = "center" + case .right: + textAlignment = "right" + } + + return " style=\"text-align: \(textAlignment);\"" + } + nonisolated private func checkboxHTML(for checkbox: Checkbox) -> String { switch checkbox { case .checked: -- cgit v1.2.3