Markdown 渲染引擎折腾记

2011-04-26 21:43:32
最近折腾nesta,这个CMS非常轻便,而且能用git直接管理。结合heroku,很快就能搭建一个微型blog。我比较欣赏其对markdown和textile文件格式的支持,所以准备尝试一下。但试用的结果并不令人满意。nesta试用markdown渲染引擎是maruku,一款非常老的(老掉牙了的)引擎。抛开性能不说,单说对中文的支持就不怎么样。对中文的无序列表根本就不能识别。Mars对此非常生气。于是决定调查原因,发现问题可能出在maruku上,于是用textile类型的文件作为参照,并对比了英文的markdown文件。结果发现果然问题出在maruku上。

其实我真的之前没有听说过maruku,只知道markdown的渲染引擎有BlueCloth。要知道作为github标准文本语言markdown在ruby世界可谓是广泛应用。于是我做了些功课,考察一下主流markdown渲染引擎。选择一款来替代nesta中的maruku。

我找到了github一篇非常好的文章: https://github.com/blog/832-rolling-out-the-redcarpet 里面讲述了为何要换Redcarpet作为Markdown渲染引擎,不但有性能的考虑,也有安全性的考虑。另外一款主流的引擎就是RDiscount了,和BlueCloth差不多。

那么我们就来实地测量一下Redcarpet到底能有多快吧。

基准测试的方法可以参考:
http://deveiate.org/projects/BlueCloth/

Rehearsal ------------------------------------------------------
BlueCloth (2.1.0) 0.249000 0.016000 0.265000 ( 0.270016)
Redcarpet (1.11.2) 0.031000 0.000000 0.031000 ( 0.032002)
Maruku (3.1.7.3) 15.195000 6.989000 22.184000 ( 23.970371)
-------------------------------------------- total: 22.480000sec
                         user system total real
BlueCloth (2.1.0) 0.219000 0.000000 0.219000 ( 0.219013)
Redcarpet (1.11.2) 0.032000 0.000000 0.032000 ( 0.033001)
Maruku (3.1.7.3) 14.757000 7.098000 21.855000 ( 23.346335)

豆瓣没有等宽字体,凑合看吧。不过明眼人一下子就能看出来差别。Maruku和BlueCloth差两个数量级,BlueCloth和Redcarpet还差一个数量级。这也验证了我的一些猜测,Maruku果然是nesta性能不高的一个主要原因(heroku不能使用cache是另外一个原因)。于是乎我果断地用Redcarpet替换Maruku。但是为了能够方便地跑在heroku上,还需要做一个gem。

总之我非常享受这个实践过程,怎么说呢,很(符合)ruby(的风格)。我们遇到一个问题,先要寻找别人的最佳实践,充分吸取别人经验教训,然后自己动手评测,用科学的方法来证实我们的想法,最后修改完善手中的工具。整个过程都非常有条理。虽然是很小的一个事情,但真希望大项目也是这样的。

PS:建议豆瓣的日记,或者书评也可以采用Markdown。起码代码什么的就可以显示正常了。

旦弗
2011-04-26 22:21:45 旦弗 (Carpe Diem)

但是我看typo里面用的好像也是这个

Mars
2011-04-26 22:35:47 Mars (上溢下漏)

还有几点没说nesta用的rspec也是1.x的,啥时候应该换成2.5吧。不过问题不大,测试还是挺全的。而且对于0字节的文件处理还有些问题。
我刚看了typo的源码用的是bluecloth
https://github.com/fdv/typo/blob/master/Gemfile 第35行

旦弗
2011-04-26 22:38:54 旦弗 (Carpe Diem)

恩,很久前看的了,我记得有

Mars
2011-04-26 22:42:57 Mars (上溢下漏)

哈,我不喜欢rails做这种简单的事儿。因为没啥要用数据库的地方,不就是个blog么。哈哈,简单就是美~~

旦弗
2011-04-26 22:45:35 旦弗 (Carpe Diem)

哈,typo是一个不错的实践

Mars
2011-04-26 22:47:18 Mars (上溢下漏)

哪天你给讲解一下吧,我顺便学学rails,哈~~

zxn0
2011-04-27 18:04:14 zxn0 (・´ェ`・)

http://www.pell.portland.or.us/~orc/Code/discount/

Mars
2011-04-27 21:18:08 Mars (上溢下漏)

Rehearsal ------------------------------------------------------
BlueCloth (2.1.0) 0.265000 0.000000 0.265000 ( 0.343201)
Redcarpet (1.11.2) 0.047000 0.000000 0.047000 ( 0.046800)
Maruku (3.1.7.3) 14.742000 7.410000 22.152000 ( 23.700843)
RDiscount (1.6.8) 0.109000 0.016000 0.125000 ( 0.124800)
-------------------------------------------- total: 22.589000sec

user system total real
BlueCloth (2.1.0) 0.203000 0.016000 0.219000 ( 0.218401)
Redcarpet (1.11.2) 0.031000 0.000000 0.031000 ( 0.031200)
Maruku (3.1.7.3) 14.492000 7.472000 21.964000 ( 23.889043)
RDiscount (1.6.8) 0.125000 0.000000 0.125000 ( 0.124800)

discount还是和upskirt有差距吧
http://fossil.instinctive.eu/libupskirt/index

ppip
2011-09-30 12:30:11 ppip (石头和水)

豆瓣的大众定位决定了他和markdown还是有距离的。