基于cmark的swift markdown库

开启了macOS的自动更新之后,无论是iPad(有总是爱尝鲜的客户也是醉了)还是Mac常用的App经常出现闪退,尤其对于markdown有严重依赖的lz,于是就像自己搞个markdown,于是搜罗了很久,但是大多都是OC版本或者C/C++版本的,于是怎么玩?当然不能用OC啦,那只能走swift与C的交互……

提到swift与C的兼容不得不说对于新的编程语言这是很明智的举动---因为前期库和生态是很不完善的只能通过这些老牌的编程语言来补充啦

使用起来很简单:

通过SPM来导入

.package(url: "https://github.com/brokenhandsio/cmark-gfm.git", .upToNextMajor(from: "1.0.0")),

添加到对应的依赖中

dependencies: ["Leaf","SKCmark"]),

然后就是使用


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)


        }
    }

类说明

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

本文分享自微信公众号 - 大话swift(gh_ca2266b7cab0)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iOSDevLog

图像检测-如何通过扫描图像来制造幻觉

今年,Apple发布了ARKit 2的新功能。其中之一就是图像检测。这是一个非常酷的功能,允许您在用户的环境中跟踪2D图像,并在其上放置增强现实内容。在本课程中...

8820
来自专栏iOSDevLog

按钮与交互-使用按钮触发操作

在本节中,我们将介绍一个重要且简单的元素,即按钮。这个小元素可以改变整个UX。我们将使用该按钮来缩放我们的3D模型。此外,我们将尝试更改手机的壁纸。对于您的型号...

8120
来自专栏运维笔记

CentOS7使用Ocser一键搭建CiscoAnyconnect服务器

AnyConnect作为Cisco专有技术,其服务端只能运行在Cisco设备上,即如果没有购买Cisco相关设备,将无法使用AnyConnect服务端。而Ope...

55520
来自专栏AndroidTraveler

Flutter 快速上手定时器/倒计时及实战讲解

这里我们设置了超时时间为 5 秒。然后启动一个定时器,等到 5 秒时候到了,就会执行回调方法。

20020
来自专栏iOSDevLog

将模型添加到场景中 - 在您的环境中显示3D内容

在最后几节中,我们能够检测到一个平面并显示一个焦点方块,以帮助我们为模型指定一个位置。我们也熟悉了热门测试和世界变换。现在,我们拥有显示虚拟对象所需的所有工具。...

17620
来自专栏AI科技大本营的专栏

史上最强最贵Mac Pro诞生,iPadOS和iOS分家!WWDC19全面总结

一年一度的WWDC终于来了!43岁的苹果,产品经验位居世界前列。一个迈入中年的公司,该如何持续做出让人惊艳的产品呢?答案就在WWDC 2019!

12560
来自专栏娱乐心理测试

iOS (动态库,静态库) 的制作,使用及遇到的问题

去年接的一个私活,制作SDK给其它游戏厂家使用,功能很简单就是集成 登录,注册,支付等功能。当初抵挡不住金钱的诱惑,对于从没做过SDK的我竟有莫名的勇气接了下来...

82730
来自专栏大宇笔记

SwiftUI WWDC作为开发者的我最激动的部分

我们都知道前端工作离不开适配,虽然之前Apple Xib的一些设计适配起来很方便了。但是在pad或者tv上还是要写不同的代码去做在不同的平台运行。

11730
来自专栏iOS开发干货分享

iOS两年前的面试题总结,现在的你掌握了嘛?

这些面试题是两年前的标准了,虽然跟现在的面试需求显得相对简单了点,但是也是可以帮着梳理一下基础方面的知识的!

13120
来自专栏CRPER折腾记

Vue 2.x折腾记 - (22) Vue 打包图片在safari不显示的问题

图片不显示这个问题在safari上会出现,不管是PC还是手机端,而其他浏览器是可以正常预览

18720

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励