幫 marked 加上空格限制
我的 markdown 有自訂新語法, 像刪除線和底線,但如果同一行有二個符號就會自動觸發。 加上新限制條件符號外要加空白, 就能避免誤判減號成刪除線。
我的 markdown
考完期中比較閒來幫 marked 功能。
之前加了 底線 、 書名號 、 刪除線 。
底線就是底線,把原本和星號混用的功能去掉;
書名號用波浪符,刪除線用減號。
本來的慣例是二個波浪符是刪除線,
但我覺得減號比較適合刪除,波浪用書名號。
而且本來刪除線是用 <del>
,
del 是日後和 ins 搭配做修改用的 tag。
我用刪除線多是用來做效果,
根據 w3c 這應該要用 s,
也就是不含修改功能的刪除線。
但語法解析還是舊的,變成只要用了二個減號,
像 a-b-c
就會被當成刪除線。
(這篇文章不會因為已經修掉了。)
因為我 regexp 是下 /-(\S+)-/
,
只規定減號中不能有空白,像 -this-text-delete-
。
其它二種也是類似的做法,只是空白要換成波浪符和底線。
因為是用 javascript 寫的, 可以 直接在網頁上試玩 。
marked 的 lex
lex 是詞法分析,就是斷詞的步驟,
把字串拆成 token。
marked 的斷詞是一個個匹配,
看是不是超連結、強調等語法元素;
都沒中就會用 /.*?(?=[-*~_\[\]])/
去匹配,
也就是把 []-*~_
以外的字都視為 text,
然後停下來重新偵測是不是有語法元素。
我把 regexp 改成遇到空白才會停 ,
或中文斷句符號 、,:;。?!
會停。
(因為 emacs 的 pangu-mode
在斷句符號後不會加空白 = =)
而平常碰到語法符號也不會停。
marked 的 test
marked 有測試,雖然只是簡單的黑箱測試,但還蠻實用的。
node test
跑完就知道有哪些問題了。
之前丟 pull request 給 marked-man 他就有叫我寫測試。
測試就是加一個新功能後,寫一個 text 檔有該語法,
和預期的轉換結果的 html 檔,
放到 test/new
或 test/origin
。
(new 好像是放新功能。)
之後 test 時就會比較這二個一不一樣。
有時候你加了新功能,舊的 test 就 fail 了, 這時候就找到 bug 了。 但我的情況是我加了舊的不相容的語法, 所以舊的會 fail。
我本來是想如果加參數 --gfm
可以用原本的版本,
(也就是預設的 github flavor markdown。)
但一些選項不會處理,不知道怎麼改,
現在一些 gfm 會不相容,
像星號外面也要有空白才能被 parse 成強調。