前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于cmark的swift markdown库

基于cmark的swift markdown库

作者头像
大话swift
修改2019-07-04 17:55:06
8730
修改2019-07-04 17:55:06
举报
文章被收录于专栏:大话swift大话swift

开启了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才是真正的核心,有兴趣的字型去研究

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档