摆脱wordpress

2011-12-26 18:03

一直对架博客的wordpress很有腹诽. 速度慢得让人很不爽, 而且样式也不太符合我的审美观(好吧, 之前那个样式是我改的, 但是基于wordpress做样式化永远不是那么让人开心的). 在圣诞前看到codahale.com的样式, 很喜欢, 觉得这才是自己要的博客, 于是圣诞假期就写了一些脚本把wordpress里的博客导出整理成单个的html文件.

wordpress提供了导出功能, 实际上是提供了一个xml文件, 将数据库里的重要数据全部写到这个文件里, 并提供给你下载. 我要做的事情也就是解析这个文件, 将里面的文章内容提取出来(不好意思, 评论全被我扔掉了). 对内容进行下修改, 就成为了一个单独的html文件. 另外再提供一个索引文件, 供访问者来访时查看. 对单篇文章, 我们需要处理的是里面的代码片段及下载/图片链接.

代码片段之前在wordpress里面用的是syntaxhighlighter. 现在我不太高兴为了这个功能而另外加一个javascript文件, 于是我们需要把样式化的工作放在本地完成. python的pygments能够完成这个工作:

from pygments import highlight
from pygments.lexers import PythonLexer, BashLexer, CssLexer, HtmlLexer
from pygments.lexers import JavascriptLexer, PhpLexer
from pygments.formatters import HtmlFormatter as Formatter

LexerDict = {
    'bash': BashLexer,
    'css': CssLexer,
    'html': HtmlLexer,
    'js': JavascriptLexer,
    'php': PhpLexer,
    'python': PythonLexer,
}


def styleit(text):
    """ find [code] field in text and tranlate it. """
    while text.find('[code lang="') != -1:
        start = text.find('[code lang="')
        end = text.find('"]', start)
        eof = text.find('\n[/code]', end) + 1
        lexer = LexerDict[text[start+12:end]]
        code = text[end+2:eof].strip()
        text = text[:start] + highlight(code, lexer(), Formatter()) + text[eof+8:]
    return text

调用这个styleit函数就能替换原有的代码块了. 这段写得比较丑, 大家就捏着鼻子批评吧. 至于将下载/图片链接进行迁移的代码比这个还要丑, 就藏拙了.

这个过程中我还对移动设备访问站点做一些优化, 但是这项工作还没有完成. 另外, 现在的样式也不够让我满意, 还需要进一步地修改.

最后, 整个这部分的代码放在这儿, 具体使用说明请参考里面的Makefile.

Update @20120313: 这部分代码是有问题的, 因为我的wordpress源代码里已经有完整地html源码, 而不少人写的博客里完全没有任何html标签. 所以直接拿这份代码格式化出来会比较难看. 另外, 我的脚本也有部分更新, 现在的代码放在了这儿. 有兴趣的同学可以参考.