使用 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;
語法解析和渲染
解析過程比較直接:
- 構建markdown 的語法規則隊列, 每一個規則有表達式和需要應用的樣式;
- 對文本,遍歷規則。針對每一個規則尋找文本中匹配的實例,將其位置和規則的樣式構建SyntaxOccurance對象。
- 最后,把所有的SyntaxOccurance對象直接轉換為
NSAttributedString
, 賦予UI組件進行顯示。在這里,我的例子中用的是UITextView,其他支持NSAttributedString的UI組件也是可以用的。
所有核心的代碼直接扔到了 github 上。如有任何改進意見,還望多多指教。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!