summaryrefslogtreecommitdiff
path: root/Hutch/Views/Repositories/MarkdownHTMLRenderer.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Hutch/Views/Repositories/MarkdownHTMLRenderer.swift')
-rw-r--r--Hutch/Views/Repositories/MarkdownHTMLRenderer.swift19
1 files changed, 14 insertions, 5 deletions
diff --git a/Hutch/Views/Repositories/MarkdownHTMLRenderer.swift b/Hutch/Views/Repositories/MarkdownHTMLRenderer.swift
index 5c69659..bc63f9d 100644
--- a/Hutch/Views/Repositories/MarkdownHTMLRenderer.swift
+++ b/Hutch/Views/Repositories/MarkdownHTMLRenderer.swift
@@ -1,8 +1,12 @@
import Markdown
-nonisolated func markdownToHTML(_ text: String, imageURLResolver: ((String) -> String?)? = nil) -> String {
+nonisolated func markdownToHTML(
+ _ text: String,
+ imageURLResolver: ((String) -> String?)? = nil,
+ linkURLResolver: ((String) -> String?)? = nil
+) -> String {
let document = Document(parsing: text)
- var renderer = MarkdownHTMLRenderer(imageURLResolver: imageURLResolver)
+ var renderer = MarkdownHTMLRenderer(imageURLResolver: imageURLResolver, linkURLResolver: linkURLResolver)
return renderer.visit(document)
}
@@ -10,12 +14,14 @@ private struct MarkdownHTMLRenderer: MarkupVisitor {
typealias Result = String
nonisolated(unsafe) let imageURLResolver: ((String) -> String?)?
+ nonisolated(unsafe) let linkURLResolver: ((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?)?) {
+ nonisolated init(imageURLResolver: ((String) -> String?)?, linkURLResolver: ((String) -> String?)? = nil) {
self.imageURLResolver = imageURLResolver
+ self.linkURLResolver = linkURLResolver
}
nonisolated mutating func visit(_ markup: Markup) -> String {
@@ -94,8 +100,11 @@ private struct MarkdownHTMLRenderer: MarkupVisitor {
nonisolated mutating func visitLink(_ link: Markdown.Link) -> String {
let content = visitChildren(of: link)
- guard let destination = link.destination,
- let sanitizedDestination = sanitizedReadmeLinkURLString(destination) else {
+ guard let destination = link.destination else {
+ return content
+ }
+ let resolvedDestination = linkURLResolver?(destination) ?? destination
+ guard let sanitizedDestination = sanitizedReadmeLinkURLString(resolvedDestination) else {
return content
}
let href = escapeHTMLAttribute(decodeHTMLEntities(sanitizedDestination))