使用 UITextView來對markdown語法高亮

jopen 8年前發布 | 11K 次閱讀 iOS開發 移動開發

自從我開始開發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 上。如有任何改進意見,還望多多指教。

來自: http://www.jianshu.com/p/12186ff99f00

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!