Md2UBB

谨以此工具献给习惯于Markdown又想在Discuz!论坛低成本发帖的同学们。

背景

公司内网论坛是基于Discuz!的,编辑器不支持Markdown语法,导致一些习惯用Markdown(一般来说,是GitHub Flavored Markdown)来写帖的同学(包括我)感觉被QJ得不行。

我至少看到了两位同学在帖子里表示调格式调得崩溃,这从某种程度上打击了同学们发帖子的欲望。那么,扯了这么多,到底如何在内网上发布Markdown格式的内容?

转变

Discuz!编辑器使用的纯文本代码叫UBB代码Ultimate Bulletin Board)。
那么,我们需要解决的问题从 “如何在内网上发布Markdown格式的内容?” 转变为 “如何把Markdown格式的内容转化成UBB格式的内容?

答案

Google了一下“markdown to ubb”,展示的第一条记录是一个Github仓库 - varHarrie/md2ubb。从README.md里面可以看到使用方式:

1
2
3
4
5
6
# install as global module
npm install -g md2ubb
# ouput to output.txt
md2ubb test.md output.txt
# output to console
md2ubb test.md

结束?

varHarrie同学写的工具确实不错,但是有些小细节上我不太满意。比如说:

1
[`Markdown`](https://en.wikipedia.org/wiki/Markdown)

上面的这个代码,md2ubb只能解析出行内代码,即反引号(`),超链接没有办法做符合期望的转换。

原因在于varHarrie/md2ubb中使用的是正则替换,核心逻辑代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
module.exports = function convert (md) {
return [
'bold',
'italic',
'underscore',
'hx',
'h3',
'h2',
'h1',
'hr',
'quote',
'code',
'shortcode',
'image',
'link',
'ul'
].reduce((md, type) => {
return md.replace(
rules[type].regexp,
rules[type].replacement
)
}, md)
}

做了shortcode的替换之后,就没有办法做link的替换了。当然,可能varHarrie不会遇到这样的场景。当然,还有一些显示的风格不太符合我的爱好(比如h1需要使用的字体大小)。

鲁迅曾经说过:

简单的开源工具功能不符合期望怎么办?撸起。

撸起

varHarrie/md2ubb的弱点是没有比较完整的markdown语法解析。于是,就找到lepture/mistune这么一个项目,非常完整而且高度抽象,唯一需要做的就是把默认的Html格式的Renderer换成自定义的UbbRenderer。于是,就有了sel-fish/md2ubb,使用方法详见Readme

1
2
3
git clone https://github.com/sel-fish/md2ubb
cd md2ubb
python md2ubb.py your-markdown-file-path

总结

Don’t complain until you really done your part.

参考