使用 UITextView来对markdown语法高亮

自从我开始开发MarkNote 之后,一直在琢磨怎么让markdown写得更简单。
一种方式是支持语法高亮,对常用的markdown语法提供辅助。不过这个特性一直在开发计划中优先级不高,所以迟迟未能实现。
今天有点心情,研究了一把,用一种比较简单的方式实现了。下面是简单的演示效果。

效果

没有做成 UITextView的子类,而是作为一个category来实现的,这样对使用者而言侵入性更小一些,使用起来也更方便。
Talk is cheap, show me the code!
下面简单解释一下:

SynctaxRule

首先定义了一个语法规则类SyntaxRule,它用来容纳正则表达式,以及对应的样式。样式用NSDictionary来容纳。也就是说如果文本匹配express,则对它应用style里面的样式。
类很简单,声明如下:

@interface SyntaxRule
@property (readonly) NSRegularExpression* express;
@property (readonly) NSDictionary* styles;

-(instancetype) initWithExpress:(NSRegularExpression*) exp Styles:(NSDictionary*) styles;
@end

SyntaxOccurance

这个类用来代表解析后的结果:记录文本的位置,记录需要对它应用的样式:

@interface SyntaxOccurance 
@property(readonly) NSRange range;
@property (readonly) NSDictionary* styles;

语法解析和渲染

解析过程比较直接:

  1. 构建markdown 的语法规则队列, 每一个规则有表达式和需要应用的样式;
  2. 对文本,遍历规则。针对每一个规则寻找文本中匹配的实例,将其位置和规则的样式构建SyntaxOccurance对象。
  3. 最后,把所有的SyntaxOccurance对象直接转换为NSAttributedString , 赋予UI组件进行显示。在这里,我的例子中用的是UITextView,其他支持NSAttributedString的UI组件也是可以用的。

所有核心的代码直接扔到了 github 上。如有任何改进意见,还望多多指教。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,259评论 4 61
  • 简介浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工 作原理,我们将看到,从你在地址栏输入google.c...
    听风阁阅读 3,316评论 0 7
  • 一、开始 老头子斜靠在公园靠椅上,目光注视着眼前的小花园。就这么注视着。已经有大半天的功夫。没有移动,身边拧...
    初天晓月阅读 383评论 0 0
  • When I need you, you always let me down.我需要你的时候你总是让我失望透顶 ...
    小烈呐阅读 1,724评论 0 2
  • 在这里每一天都担心会不会被开掉,就算是个兼职,就算比别人忙拿的钱少,可还是不敢说,因为如果被开掉我真的不知道自己还...
    魏喂魏啊阅读 263评论 0 0