开启了macOS的自动更新之后,无论是iPad(有总是爱尝鲜的客户也是醉了)还是Mac常用的App经常出现闪退,尤其对于markdown有严重依赖的lz,于是就像自己搞个markdown,于是搜罗了很久,但是大多都是OC版本或者C/C 版本的,于是怎么玩?当然不能用OC啦,那只能走swift与C的交互……
提到swift与C的兼容不得不说对于新的编程语言这是很明智的举动---因为前期库和生态是很不完善的只能通过这些老牌的编程语言来补充啦
使用起来很简单:
通过SPM来导入
代码语言:javascript复制.package(url: "https://github.com/brokenhandsio/cmark-gfm.git", .upToNextMajor(from: "1.0.0")),
添加到对应的依赖中
代码语言:javascript复制dependencies: ["Leaf","SKCmark"]),
然后就是使用
代码语言:javascript复制
import SKCmark
func testDefault(){
do{
let result = try skMarkdownToHTML(textH1)
XCTAssertEqual(result, "<h1>Hello</h1>n")
}catch{
XCTAssertThrowsError(error)
}
do{
let result = try skMarkdownToHTML(img)
XCTAssertEqual(result, "<p><img src="https://www.baidu.com" alt="我是一个img" /></p>n")
}catch{
XCTAssertThrowsError(error)
}
}
类说明
代码语言:javascript复制import cmark
public typealias MarkdownOption = Int32
extension MarkdownOption {
public static var sourcePosition = Int32(1 << 1)
public static var hardBreaks = Int32(1 << 2)
public static var safe = Int32(1 << 3)
public static var noBreaks = Int32(1 << 4)
public static var normalize = Int32(1 << 8)
public static var validateUt8 = Int32(1 << 9)
public static var smartQuotes = Int32(1 << 10)
}
public enum SKCmarkError: Error{
case conversionFailed
}
extension Array {
var rawValue:MarkdownOption{
var value : MarkdownOption = self.first! as! MarkdownOption
for item in 1 ..< self.count {
value = value | ( self[item] as! MarkdownOption)
}
return value
}
}
public func skMarkdownToHTML(_ str: String, options : [MarkdownOption ] = [MarkdownOption.safe] ) throws -> String {
var buffer: String?
try str.withCString {
guard let buf = cmark_markdown_to_html($0, Int(strlen($0)), options.rawValue) else {
throw SKCmarkError.conversionFailed
}
buffer = String(cString: buf)
free(buf)
}
guard let output = buffer else {
throw SKCmarkError.conversionFailed
}
return output
}
我们做的就是将swift中的String转化为UnsafePoint然后跟cmark进行桥接,然后根据swift的风格写成一个swifter看懂的coding
说明:lz的markdown是基于
https://github.com/brokenhandsio/cmark-gfm.git做的一层swift桥接,cmark才是真正的核心,有兴趣的字型去研究