使用 UITextView來對markdown語法高亮

自從我開始開發(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;

語法解析和渲染

解析過程比較直接:

  1. 構建markdown 的語法規(guī)則隊列, 每一個規(guī)則有表達式和需要應用的樣式;
  2. 對文本,遍歷規(guī)則。針對每一個規(guī)則尋找文本中匹配的實例,將其位置和規(guī)則的樣式構建SyntaxOccurance對象。
  3. 最后,把所有的SyntaxOccurance對象直接轉換為NSAttributedString , 賦予UI組件進行顯示。在這里,我的例子中用的是UITextView,其他支持NSAttributedString的UI組件也是可以用的。

所有核心的代碼直接扔到了 github 上。如有任何改進意見,還望多多指教。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,422評論 4 61
  • 簡介瀏覽器可以被認為是使用最廣泛的軟件,本文將介紹瀏覽器的工 作原理,我們將看到,從你在地址欄輸入google.c...
    聽風閣閱讀 3,398評論 0 7
  • 一、開始 老頭子斜靠在公園靠椅上,目光注視著眼前的小花園。就這么注視著。已經(jīng)有大半天的功夫。沒有移動,身邊擰...
    初天曉月閱讀 400評論 0 0
  • When I need you, you always let me down.我需要你的時候你總是讓我失望透頂 ...
    小烈吶閱讀 1,741評論 0 2
  • 在這里每一天都擔心會不會被開掉,就算是個兼職,就算比別人忙拿的錢少,可還是不敢說,因為如果被開掉我真的不知道自己還...
    魏喂魏啊閱讀 286評論 0 0

友情鏈接更多精彩內(nèi)容