import Markdown
nonisolated func markdownToHTML(_ text: String, imageURLResolver: ((String) -> String?)? = nil) -> String {
let document = Document(parsing: text)
var renderer = MarkdownHTMLRenderer(imageURLResolver: imageURLResolver)
return renderer.visit(document)
}
private struct MarkdownHTMLRenderer: MarkupVisitor {
typealias Result = String
nonisolated(unsafe) let imageURLResolver: ((String) -> String?)?
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
}
nonisolated mutating func visit(_ markup: Markup) -> String {
markup.accept(&self)
}
nonisolated mutating func defaultVisit(_ markup: Markup) -> String {
visitChildren(of: markup)
}
nonisolated mutating func visitDocument(_ document: Document) -> String {
visitChildren(of: document)
}
nonisolated mutating func visitHeading(_ heading: Heading) -> String {
"
\(visitChildren(of: paragraph))
\n" } nonisolated mutating func visitBlockQuote(_ blockQuote: BlockQuote) -> String { "\n\(visitChildren(of: blockQuote))\n" } nonisolated mutating func visitUnorderedList(_ unorderedList: UnorderedList) -> String { "
\(escapeHTML(codeBlock.code))\n"
}
nonisolated mutating func visitInlineCode(_ inlineCode: InlineCode) -> String {
"\(escapeHTML(inlineCode.code))"
}
nonisolated mutating func visitThematicBreak(_: ThematicBreak) -> String {
"