自從我開始開發(fā)MarkNote 之后,一直在琢磨怎么讓markdown寫得更簡單。
一種方式是支持語法高亮,對常用的markdown語法提供輔助。不過這個特性一直在開發(fā)計劃中優(yōu)先級不高,所以遲遲未能實現(xiàn)。
今天有點心情,研究了一把,用一種比較簡單的方式實現(xiàn)了。下面是簡單的演示效果。

效果
沒有做成 UITextView的子類,而是作為一個category來實現(xiàn)的,這樣對使用者而言侵入性更小一些,使用起來也更方便。
Talk is cheap, show me the code!
下面簡單解釋一下:
SynctaxRule
首先定義了一個語法規(guī)則類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 的語法規(guī)則隊列, 每一個規(guī)則有表達式和需要應用的樣式;
- 對文本,遍歷規(guī)則。針對每一個規(guī)則尋找文本中匹配的實例,將其位置和規(guī)則的樣式構建SyntaxOccurance對象。
- 最后,把所有的SyntaxOccurance對象直接轉換為
NSAttributedString, 賦予UI組件進行顯示。在這里,我的例子中用的是UITextView,其他支持NSAttributedString的UI組件也是可以用的。
所有核心的代碼直接扔到了 github 上。如有任何改進意見,還望多多指教。