Skip to content

Commit 5f61335

Browse files
authored
Replace embedded cmark-gfm by swift-cmark (#348)
1 parent 5544181 commit 5f61335

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+52
-30794
lines changed

.gitattributes

-2
This file was deleted.

Package.resolved

+9
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99
"version" : "6.0.0"
1010
}
1111
},
12+
{
13+
"identity" : "swift-cmark",
14+
"kind" : "remoteSourceControl",
15+
"location" : "https://github.com/swiftlang/swift-cmark",
16+
"state" : {
17+
"revision" : "3ccff77b2dc5b96b77db3da0d68d28068593fa53",
18+
"version" : "0.5.0"
19+
}
20+
},
1221
{
1322
"identity" : "swift-snapshot-testing",
1423
"kind" : "remoteSourceControl",

Package.swift

+3-2
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@ let package = Package(
2020
dependencies: [
2121
.package(url: "https://github.com/gonzalezreal/NetworkImage", from: "6.0.0"),
2222
.package(url: "https://github.com/pointfreeco/swift-snapshot-testing", from: "1.10.0"),
23+
.package(url: "https://github.com/swiftlang/swift-cmark", from: "0.4.0"),
2324
],
2425
targets: [
25-
.target(name: "cmark-gfm"),
2626
.target(
2727
name: "MarkdownUI",
2828
dependencies: [
29-
"cmark-gfm",
29+
.product(name: "cmark-gfm", package: "swift-cmark"),
30+
.product(name: "cmark-gfm-extensions", package: "swift-cmark"),
3031
.product(name: "NetworkImage", package: "NetworkImage"),
3132
]
3233
),

Sources/MarkdownUI/Parser/MarkdownParser.swift

+37-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import Foundation
22
@_implementationOnly import cmark_gfm
3+
@_implementationOnly import cmark_gfm_extensions
34

45
extension Array where Element == BlockNode {
56
init(markdown: String) {
@@ -317,7 +318,7 @@ extension UnsafeNode {
317318
return node
318319
case .table(let columnAlignments, let rows):
319320
guard let table = cmark_find_syntax_extension("table"),
320-
let node = cmark_node_new_with_ext(CMARK_NODE_TABLE, table)
321+
let node = cmark_node_new_with_ext(ExtensionNodeTypes.shared.CMARK_NODE_TABLE, table)
321322
else {
322323
return nil
323324
}
@@ -354,7 +355,7 @@ extension UnsafeNode {
354355

355356
fileprivate static func make(_ tableRow: RawTableRow) -> UnsafeNode? {
356357
guard let table = cmark_find_syntax_extension("table"),
357-
let node = cmark_node_new_with_ext(CMARK_NODE_TABLE_ROW, table)
358+
let node = cmark_node_new_with_ext(ExtensionNodeTypes.shared.CMARK_NODE_TABLE_ROW, table)
358359
else {
359360
return nil
360361
}
@@ -364,7 +365,7 @@ extension UnsafeNode {
364365

365366
fileprivate static func make(_ tableCell: RawTableCell) -> UnsafeNode? {
366367
guard let table = cmark_find_syntax_extension("table"),
367-
let node = cmark_node_new_with_ext(CMARK_NODE_TABLE_CELL, table)
368+
let node = cmark_node_new_with_ext(ExtensionNodeTypes.shared.CMARK_NODE_TABLE_CELL, table)
368369
else {
369370
return nil
370371
}
@@ -400,7 +401,8 @@ extension UnsafeNode {
400401
return node
401402
case .strikethrough(let children):
402403
guard let strikethrough = cmark_find_syntax_extension("strikethrough"),
403-
let node = cmark_node_new_with_ext(CMARK_NODE_STRIKETHROUGH, strikethrough)
404+
let node = cmark_node_new_with_ext(
405+
ExtensionNodeTypes.shared.CMARK_NODE_STRIKETHROUGH, strikethrough)
404406
else {
405407
return nil
406408
}
@@ -480,3 +482,34 @@ private struct UnsafeNodeSequence: Sequence {
480482
.init(self.node)
481483
}
482484
}
485+
486+
// Extension node types are not exported in `cmark_gfm_extensions`,
487+
// so we need to look for them in the symbol table
488+
private struct ExtensionNodeTypes {
489+
let CMARK_NODE_TABLE: cmark_node_type
490+
let CMARK_NODE_TABLE_ROW: cmark_node_type
491+
let CMARK_NODE_TABLE_CELL: cmark_node_type
492+
let CMARK_NODE_STRIKETHROUGH: cmark_node_type
493+
494+
static let shared = ExtensionNodeTypes()
495+
496+
private init() {
497+
func findNodeType(_ name: String, in handle: UnsafeMutableRawPointer!) -> cmark_node_type? {
498+
guard let symbol = dlsym(handle, name) else {
499+
return nil
500+
}
501+
return symbol.assumingMemoryBound(to: cmark_node_type.self).pointee
502+
}
503+
504+
let handle = dlopen(nil, RTLD_LAZY)
505+
506+
self.CMARK_NODE_TABLE = findNodeType("CMARK_NODE_TABLE", in: handle) ?? CMARK_NODE_NONE
507+
self.CMARK_NODE_TABLE_ROW = findNodeType("CMARK_NODE_TABLE_ROW", in: handle) ?? CMARK_NODE_NONE
508+
self.CMARK_NODE_TABLE_CELL =
509+
findNodeType("CMARK_NODE_TABLE_CELL", in: handle) ?? CMARK_NODE_NONE
510+
self.CMARK_NODE_STRIKETHROUGH =
511+
findNodeType("CMARK_NODE_STRIKETHROUGH", in: handle) ?? CMARK_NODE_NONE
512+
513+
dlclose(handle)
514+
}
515+
}

Sources/cmark-gfm/arena.c

-103
This file was deleted.

0 commit comments

Comments
 (0)