MovableType and CommonMark

2017-05-08 11:31:51来源:https://blog.othree.net/log/2017/05/07/movabletype-and-commo作者:O3noBLOG人点击


我这边用的 blog 系统是 MovableType 不是新闻了,然后也因为用 MovableType 我一直都只能用最初版的 markdown 引擎,没错,就是 Daring Fireball 作者 John Gruber 的 那一版 ,这个版本其实已经可以满足我大部分的需求了,不过当我想要用 Typora 写文章的时候,就遇到问题了,Typora 在输出成 Markdown 文件时,code block 只支援三个 ``` 包起来的 Fenced Code Block ,而不支援 Indented Code Block ,刚好初版的 Markdown 格式只有 Indented Code Block,两者其实要比的话,我是比较喜欢 Indented Code Block 的,比较符合 Markdown 的 sense,不过用 Fenced Code Block 有个优点是可以指定程式码的语言,也因此才能够有 syntax highlight 的效果。


总之,因为这个原因,用 Typora 写技术文章对我来说就很不方便,一直以来都有想解决这个问题,前两天还去 Typora 发 issue 说希望他们可以支援 Indented Code Block,结果发完没多久,躺在床上快要睡觉的时候突然想到,CommonMark 这么多语言有实做,搞不好有 Perl 的啊,结果快速搜寻了一下,还真的有一个 perl-commonmark ,桥接 Perl 和 [cmark][],也有发布到 CPAN 上,当下心里就盘算着,隔天起来要来把它接到 MovableType 去看看。


结果隔天实做起来是没花我太多时间,虽然对 Perl 不熟,但是可以直接拿初版 Markdown.pl 来修改,原本的 Markdown.pl 这个档案里面实际上自己是一个 Markdown 的 Perl Package,同时也可以作为 MovableType 的 plugin script,我只需要把 plugin script 的部分留下,然后把最后做转换的 function 换掉就好了,当然系统要装好 cmark 和 Perl 的 CommonMark,cmark 应该很多环境都有了,我在 archlinux 上是直接用 pacman 装:


pacman -S cmark

然后 CommonMark 是用 CPAN 装,本来要用 cpanminus 的不知道为何用它会抓不到 package:


sudo CPAN CommonMark

我的 nginx 跑 CGI 时用的 perl 不是系统预设位置的,所以 CPAN 执行档的路径我是特别指定给他的,这样 MovableType 执行的时候才找的到 CommonMark Module,实际上没花多少功夫,我就把 MovableType 和 CommonMark 串起来了,当下心情真的是非常难以言喻,一来是这个问题其实存在已经许久了,二是我竟然把第一个支援 Markdown 的部落格系统接上 2017 年最新的 CommonMark 实做,虽然现在应该是也帮不到什么人了。不过没高兴多久,就发现在 UTF-8 字元似乎有些状况,有中文的文章会烂掉,或是 Dashboard 那页的文字会变乱码,后来为了这个问题又弄了好几个小时,推测问题应该是因为 cmark 那边回来的字串已经失去编码的 metadata,所以在做 summary 切文字的时候,就会出现切错地方的状况,花了很多时间交叉比对和测试,最后的结果只是用 Perl 的 Encoding 把 cmark 传回来的字串重新 encode 过而已,其实很简单。除此之外,我其实还有试着想接看看 cmark-gfm ,因为它还多支援了 Table,不过几次测试都不太顺利,就没继续尝试下去了。


目前的成果放在 GitHub 上,取名叫 MT-CommonMark ,附上简单的安装说明,暂时是没打算发去 movabletype.org 那边。


做好之后 MT-CommonMark 之后,我就开始在部落格上测试程式码的 syntax highlight了,研究一阵子之后选择的是 prismjs ,选择它的原因很多,不过有两个是比较主要的:


作者有 Lea Verou
支援的 class name 格式刚好和 cmark 输出的一样

结果两者也很顺利的搭配起来,中间就没有再遇到什么问题了。


相关文章

    无相关信息

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台