美文网首页开发沉思录IOSiOS开发技术分享
使用 UITextView来对markdown语法高亮

使用 UITextView来对markdown语法高亮

作者: MarkNote | 来源:发表于2015-12-11 22:51 被阅读816次

    自从我开始开发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 上。如有任何改进意见,还望多多指教。

    相关文章

      网友评论

      • Ha__Ha:在输入的时候,需要考虑marked text
        -(void)textViewDidChange:(UITextView *)textView{
        if (textView.markedTextRange == nil) {
        [textView updateSyntax];
        }
        }
      • 759248ecdc51:牛逼
        MarkNote:@759248ecdc51 果酱了,做起来其实挺简单的~

      本文标题:使用 UITextView来对markdown语法高亮

      本文链接:https://www.haomeiwen.com/subject/ikbyhttx.html