關於擴展markdown的總結

(以下的閱讀需要你有一定的javascript知識)

經過幾日的研究,關於markdown的擴展總結如下:

首先,我之前講的是remarkable,是因為tiddlywiki的md插件用的是remarkable,後来我讀到了某篇文章,它說markdown-it是remarkable的後續,作者把99%的代碼拿過来新開了個項目,原項目停止開發。因此後面我談的都是markdown-it,簡稱mdit。

mdit如果是定製塊級標籤,那會是非常方便,因為官方給了一個container的插件。我快速的定製了一個swiper輪播圖:

不過到了行內標籤,幾乎是不可定製的,因為markdown的機制就是用簡陋的ascii符號輸出標準的html,因此它一定會有非常複雜的渲染規則。

(雖然我後来通過copy官方的某個插件實現了定製行內標籤,但是我認為它遠不如你直接寫< ij>字元< /ij>来的方便。還有個問題就是,ascii的符號是有限的,每定製一套,你就用掉一個符號。比如我用@字元@来定製ijfont,那下次就不能用@了。並且如何不跟其它的符號衝突也是個很大的問題。)

因此我的結論是,如果你想要類似swiper輪播圖一樣的塊級功能,那麼mdit可以很好的定製。如果你想要特殊的行內功能,最好的辦法是允許直接輸入html標籤。

同時經過這幾日的研究,也證實了markdown(行內標籤)遠比bbcode要難定製。

比較markdown和bbcode的輪播圖實現:

markdown:

:::swiper
@@@ss
圖一
@@@
@@@ss
圖二
@@@
:::

bbcode:

[swiper]
[ss]圖一[/ss]
[ss]圖二[/ss]
[/swiper]

本次我只研究了markdown-it,還有marked以及showdown沒有研究。歡迎有研究過的同學出来談下。

bbcode看起來就像是把HTML的<>換成[]

或許是,但是你可以任意添加元素,比如這個swiper的實現:

<div class="swiper-container"><!-- Additional required wrapper -->
<div class="swiper-wrapper"><!-- Slides -->
{TEXT}
</div>
<!-- Add Pagination -->
<div class="swiper-pagination-ejsoon"></div>
<!-- If we need navigation buttons -->
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
</div>

轉成bbcode就是 [swiper]{TEXT}[/swiper]

使用mdit或marked還有一個問題,編輯框沒有toolbar,還是我不懂找?

你对 markdown 的要求也太高了。这种语法本身就不是为复杂情况而诞生的,虽然现在确实有许多方法可以去扩充它的功能。

在考虑如何进行扩充之前,也许应该先回答一个问题:为什么选择 markdown?

你是對的,markdown就是比 純文本 高級一點的標記語言。

它是全世界都廣泛應用的標記方法,它可以用ascii符號標記格式,比直打html省事很多。

與此同時,由於markdown的廣泛使用,也有很多人在開發markdown編輯器,而bbcode編輯器就沒有人在做,連個像樣的項目都沒有。

我後面希望能研究出如何用markdown擴展来設定字體顏色。(這在bbcode是很簡單的功能,但markdown似乎要實現很困難)。

經過研究,也就是copy某個官方擴展之後自己寫,markdown也可以有字體顏色了:

也就是說,如果你是高手的話,定制markdown也挺方便的,包括行內標籤。

几年前用mkdocs时折腾过python-markdown,各种现成的扩展插件使用非常舒适,最重要的是可以和html混写,甚至还自己改插件扩展语法……现在,老实用最基础的md功能,不折腾了
插件列表

1 个赞

增强嘛挺容易的,甚至自己发明一种标记语言也不是多大的事情。

然而通用性和可移植性就没了。markdown 支持混入 html 代码,已经是非常大的开放性了。

mdit也都是現成的擴展, 但是,沒有現成的toolbar…於是,toolbar也是我自己寫的…

你說的對,markdown也是人發明的,以及latex。

不過由於mdit的機制有點難理解,或者說我一時沒有讀懂它的api文檔,所以確實經歷了一段學習的艱辛過程。不過最終總算研究出来了。

相比之下,由於bbcode格式比較簡單,兩年前我就自己寫好了一個bbcode編輯器。

關於通用性,目前只有html是唯一的標準,任何text都要轉成html才能顯示。

只要在發表文章之前明確一下,你現在是在自建的網站寫,還是在別人的論壇或者github上寫,應該就不會混淆了。

可移植性,只要你把插件.js保存起来,它就可以移植了。

是的。只要markdown的標記本身不反過来影響html,比如**我確實是想輸入星號,而不是希望加粗。雖然這種情況不多。**

增強的最大困難是,它能不能跟其它已有的規則並行不悖。據我測試,加粗跟字體顏色不能直接套用,需要中間夾一些其它字符。mdit官方的一些擴展也是一樣。然而斜體跟加粗是可以並用的,因此我認為它是因為渲染規則(也就是正則匹配和優先次序)沒有寫好。

規則越来越多之後,你根本照看不過来,哪兩個標記需要並用。markdown的標記簡單的背後,是複雜的渲染規則,以及更多的渲染失敗的風險。

相比之下,bbcode因為能夠明確閉合,不僅容易擴展,而且不會因並用而失效。