PSJay Blog

#FIXME, seriously

Using Markdown !

| Comments

早就想用 Markdown 写东西,只是 WordPress 对 Markdown 的支持有限,所以一直还在坚持用 HTML 写博客。但是文字里面混杂着各种 HTML 标签的感觉实在是太糟糕了,于是从昨天开始计划让博客的编辑平滑地过度到 Markdown 上来。

我先试着安装了几款插件,发现 WordPress 的 Markdown 插件还真是少之又少。上的了台面的似乎就只有两款:

  • WP-Markdown,在保存以及编辑文章的时候对 HTML 和 Markdown 互相转换,并且附带了 PageDown 和一个高亮插件。
  • Markdown on Save,另存一份 Markdown 文本在数据库,在保存文章的时候转成 HTML。

前者很强大,但是在我博客上似乎有些诡异的表现,那就是它会在保存文章之后忽略代码块中的换行,所以代码块中的内容全部挤在了一行。不知道这是个 bug 还是与我的配置不兼容,总之我已经在 GitHub 上提交了一个 issue 给作者。

因此,在问题解决之前,我只能选择后者。Markdown on Save 有一个缺点就是不能向后与 HTML 兼容,也就是说,以前的 HTML 内容,不会自动转换成 Markdown 文本。不过,鉴于我也不怎么经常编辑之前发布的博客,所以这也不是什么大问题。

最头疼的问题就是,为了使博客只存在一个代码高亮插件,我又得转换代码块的标签。之前已经用过几个插件,并且转换过几次,数据库中的格式大概是:

1
<pre lang="lang" line="">code</pre>

现在要转换成:

1
<pre><code>code</code></pre>

于是只好把 wp_posts 表下载下来,写了这个 Python 脚本进行处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python
#coding=utf-8

__FILE = 'wp_posts.sql'
__OUT_FILE = 'posts_output.sql'


import re


def __replace(m):
    content = m.group(1)
    return '<pre><code>' + content + '</code></pre>'

if __name__ == '__main__':

    in_file = open(__FILE, 'r')
    out_file = open(__OUT_FILE, 'w')

    pattern = r'<pre\s+.[^>]*?>([\s\S]+?)</pre>'

    for line in in_file:
        out_content = re.sub(pattern, __replace, line)
        out_file.write(out_content)

    print 'done'

覆盖原数据后就差不多大功告成了。BTW, 高亮插件用的是 wp-highlight.js,因为有我最喜欢的 monokai colorscheme,XD。


Update:

WP-Markdown 的作者已经确认并且修复了我上文说的那个 bug,因此,现在我正在使用 WP-Markdown,它工作得非常好。

Comments