幫 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/newtest/origin 。 (new 好像是放新功能。) 之後 test 時就會比較這二個一不一樣。

有時候你加了新功能,舊的 test 就 fail 了, 這時候就找到 bug 了。 但我的情況是我加了舊的不相容的語法, 所以舊的會 fail。

我本來是想如果加參數 --gfm 可以用原本的版本, (也就是預設的 github flavor markdown。) 但一些選項不會處理,不知道怎麼改, 現在一些 gfm 會不相容, 像星號外面也要有空白才能被 parse 成強調。