update cmark lib (#1708)

This commit is contained in:
Ryan Nystrom
2018-04-08 18:25:10 -04:00
committed by GitHub
parent 30fa009e37
commit 746fffc77f
11 changed files with 50 additions and 32 deletions

2
Pods/Manifest.lock generated
View File

@@ -142,7 +142,7 @@ EXTERNAL SOURCES:
CHECKOUT OPTIONS:
cmark-gfm-swift:
:commit: 7f604e31125983861076b9904fb3251d2fe41c47
:commit: 307b5303a716ee3642f301891943f036537df1b1
:git: https://github.com/GitHawkApp/cmark-gfm-swift.git
ContextMenu:
:commit: bac5362e41f9c0322f341b8cd9eb32992ea1d8fe

View File

@@ -20,7 +20,7 @@ extension Block {
return .text(text: [.code(text: text)])
case .list(let items, let type):
let deeper = level + 1
return .list(children: items.flatMap { $0.listElements(deeper) }, type: type, level: deeper)
return .list(children: items.compactMap { $0.listElements(deeper) }, type: type, level: deeper)
default: return nil
}
}
@@ -28,6 +28,6 @@ extension Block {
extension Sequence where Iterator.Element == Block {
func listElements(_ level: Int) -> [ListElement] {
return flatMap { $0.listElement(level) }
return compactMap { $0.listElement(level) }
}
}

View File

@@ -16,8 +16,8 @@ extension Block {
}
var tableRow: TableRow? {
switch self {
case .tableRow(let items): return .row(cells: items.flatMap { $0.tableCell })
case .tableHeader(let items): return .header(cells: items.flatMap { $0.tableCell })
case .tableRow(let items): return .row(cells: items.compactMap { $0.tableCell })
case .tableHeader(let items): return .header(cells: items.compactMap { $0.tableCell })
default: return nil
}
}

View File

@@ -17,5 +17,5 @@ extension Block {
}
extension Sequence where Iterator.Element == Block {
var textElements: [[TextElement]] { return flatMap { $0.textElements } }
var textElements: [[TextElement]] { return compactMap { $0.textElements } }
}

View File

@@ -14,12 +14,12 @@ extension Inline {
case .softBreak: return .softBreak
case .lineBreak: return .lineBreak
case .code(let text): return .code(text: text)
case .emphasis(let children): return .emphasis(children: children.flatMap { $0.textElement })
case .strong(let children): return .strong(children: children.flatMap { $0.textElement })
case .emphasis(let children): return .emphasis(children: children.compactMap { $0.textElement })
case .strong(let children): return .strong(children: children.compactMap { $0.textElement })
case .custom(let literal): return .text(text: literal)
case .link(let children, let title, let url):
return .link(children: children.flatMap { $0.textElement }, title: title, url: url)
case .strikethrough(let children): return .strikethrough(children: children.flatMap { $0.textElement })
return .link(children: children.compactMap { $0.textElement }, title: title, url: url)
case .strikethrough(let children): return .strikethrough(children: children.compactMap { $0.textElement })
case .mention(let login): return .mention(login: login)
case .checkbox(let checked, let originalRange): return .checkbox(checked: checked, originalRange: originalRange)
case .image, .html: return nil
@@ -28,5 +28,5 @@ extension Inline {
}
extension Sequence where Iterator.Element == Inline {
var textElements: [TextElement] { return flatMap { $0.textElement } }
var textElements: [TextElement] { return compactMap { $0.textElement } }
}

View File

@@ -6,6 +6,7 @@
//
import Foundation
import cmark_gfm
struct FoldingOptions {
var quoteLevel: Int
@@ -27,7 +28,7 @@ extension Block {
case .html(let text):
return [.html(text: text)]
case .list(let items, let type):
return [.list(items: items.flatMap { $0.listElements(0) }, type: type)]
return [.list(items: items.compactMap { $0.listElements(0) }, type: type)]
case .paragraph(let text):
let builder = InlineBuilder(options: options)
text.forEach { $0.fold(builder: builder) }
@@ -38,7 +39,7 @@ extension Block {
}
return els
case .table(let items):
return [.table(rows: items.flatMap { $0.tableRow })]
return [.table(rows: items.compactMap { $0.tableRow })]
case .tableHeader, .tableRow, .tableCell:
return [] // handled in flattening .table
case .thematicBreak:
@@ -70,7 +71,7 @@ class InlineBuilder {
}
extension Inline {
/// Collapse all text elements, break by image and html elements
/// Collapse all text elements, break by image elements
func fold(builder: InlineBuilder) {
switch self {
case .text, .softBreak, .lineBreak, .code, .emphasis, .strong,
@@ -82,16 +83,40 @@ extension Inline {
if let title = title, let url = url {
builder.pushNonText(.image(title: title, url: url))
}
case .html(let text):
builder.pushNonText(.html(text: text))
case .html:
// handled by converting blocks containing html into full html elements
break
}
}
}
private extension Node {
var containsHTML: Bool {
if type == CMARK_NODE_HTML_BLOCK || type == CMARK_NODE_HTML_INLINE {
return true
}
for child in children {
if child.containsHTML { return true }
}
return false
}
}
public extension Node {
var flatElements: [Element] {
return elements.flatMap { $0.folded(FoldingOptions(quoteLevel: 0)) }
let options = FoldingOptions(quoteLevel: 0)
return children.reduce([Element]()) {
if $1.containsHTML {
return $0 + [.html(text: $1.html)]
} else {
if let block = Block($1) {
return $0 + block.folded(options)
} else {
return $0
}
}
}
}
}

View File

@@ -99,7 +99,7 @@ extension Inline {
guard let type = InlineType(rawValue: node.typeString) else {
return nil
}
let inlineChildren = { node.children.flatMap(Inline.init) }
let inlineChildren = { node.children.compactMap(Inline.init) }
switch type {
case .text:
self = .text(text: node.literal!)
@@ -136,8 +136,8 @@ extension Block {
guard let type = BlockType(rawValue: node.typeString) else {
return nil
}
let parseInlineChildren = { node.children.flatMap(Inline.init) }
let parseBlockChildren = { node.children.flatMap(Block.init) }
let parseInlineChildren = { node.children.compactMap(Inline.init) }
let parseBlockChildren = { node.children.compactMap(Block.init) }
switch type {
case .paragraph:
self = .paragraph(text: parseInlineChildren())
@@ -145,7 +145,7 @@ extension Block {
self = .blockQuote(items: parseBlockChildren())
case .list:
let type: ListType = node.listType == CMARK_BULLET_LIST ? .unordered : .ordered
self = .list(items: node.children.flatMap { $0.listItem }, type: type)
self = .list(items: node.children.compactMap { $0.listItem }, type: type)
case .code_block:
self = .codeBlock(text: node.literal!, language: node.fenceInfo)
case .html_block:
@@ -172,7 +172,7 @@ extension Node {
var listItem: [Block]? {
switch type {
case CMARK_NODE_ITEM:
return children.flatMap(Block.init)
return children.compactMap(Block.init)
default:
return nil
}
@@ -212,12 +212,12 @@ extension Node {
/// The abstract syntax tree representation of a Markdown document.
/// - returns: an array of block-level elements.
public var elements: [Block] {
return children.flatMap(Block.init)
return children.compactMap(Block.init)
}
}
func tableOfContents(document: String) -> [Block] {
let blocks = Node(markdown: document)?.children.flatMap(Block.init) ?? []
let blocks = Node(markdown: document)?.children.compactMap(Block.init) ?? []
return blocks.filter {
switch $0 {
case .heading(_, let level) where level < 3: return true

View File

@@ -3,11 +3,7 @@
#include "core-extensions.h"
//extern cmark_node_type CMARK_NODE_CHECKBOX;
cmark_syntax_extension *create_checkbox_extension(void);
//int cmark_node_get_checkbox_checked(cmark_node *node);
//int cmark_node_get_checkbox_location(cmark_node *node);
//int cmark_node_get_checkbox_length(cmark_node *node);
#endif

View File

@@ -3,8 +3,6 @@
#include "core-extensions.h"
//extern cmark_node_type CMARK_NODE_MENTION;
cmark_syntax_extension *create_mention_extension(void);
//const char *cmark_node_get_mention_login(cmark_node *node);
#endif