中文博客也迁移为 Vimwiki 静态博客

博客

自 2011 年起,我的博客就放在 is-programmer.com 上。然而正如我一年比一年少的文章一样,is-programmer.com 网站及其基于的博客平台 Chito 的更新维护也停滞了。虽然现在还有在日常续命,迁移出去是迟早的事情。

之所以是“迁移”而不是另开一个,主要是担心旧的文章因为被自己忘记而消失不见,以后完全找不回来了。更早之前我在 Google App Engine 上的博客(cuihaopy)就随着 Google 种种业务调整消失了,多亏有 Internet Archive 才恢复出来。我想 Google 肯定是有通知的,但因为是旧博客,又过去那么多年,我自己看到通知时多半是忘记它的存在了。

去年春天的时候,lilydjwg 就把TA的 Chito 数据导出分享给了我,但我一直拖着这么个事情。这次过年刚回来,并不是很忙,想起来迁移博客这件事情了,就折腾了一番。这里简单总结一下过程。

这一步主要基于 lilydjwgChito 博客爬数据脚本(部分依赖库来自 lilydjwg/winterpy)。这个脚本能从 Chito 管理界面爬出来文章源码(HTML)和评论并导入 PostgreSQL 数据库。

我自己不用 PostgreSQL,所以改了改导出成 JSON 了。代码见 chito.pychito2json.py。注意 chito.py 里面的博客地址和登录用户名需要自己改。

这里导出的 JSON 原始记录最好备份下来。之后迁移的过程数据是有损的,留着原始记录,日后发现问题也好恢复数据。

这套脚本不会导出 is-programmer.com 上面上传的文件。我是在下面迁移数据时下载回来的。

我去年开始用 Vimwiki 写英文博客。用简陋的标记语言写博客也挺不错的,能够把经历集中在写作上,也方便自己管理和检索数据。计算机技术向的文章一般图也不多,易用性不是问题。我决定之后中文博客也用 Vimwiki 写了。

至于旧的文章,直接提供 HTML 放在一个新网站下(如同之前恢复的 cuihaopy)是最方便的。不过最理想的当然是导出成 Vimwiki 格式放到新站,这样一来方便管理和日后编辑,二来新站也能继承旧博客的内容,不显得空荡荡。

我调研了一下,Pandoc 可以把 HTML 转换成 Markdown 等格式,但 Vimwiki 因为只有实现 Reader 没有实现 Writer 不能做导出格式。我试了试 HTML to Markdown,效果还是有点堪忧。毕竟 HTML 太灵活了(我有的文章里还有 iframe),不可能无损地转换到 Markdown/Vimwiki,而且我早期的文章格式也比较垃圾,不太利于程序处理。

最后我搞了个有点脏的方案:把文章内容转成 plain text,带上元数据(标题、日期、标签等)放进 Vimwiki,附加一个指向原始 HTML 的链接。然后前端用 Javascript 加载原始 HTML,替换掉 Vimwiki 生成的文章内容。本质上还是直接提供 HTML,但是可以放进 Vimwiki 一起管理了。

这里用到的脚本是 convert_posts.py。它会生成下面这样的 Vimwiki 文件:

:计算机:优化:arch:systemd:aufs:squashfs:
%date 2014-07-09
%title 把 /usr/share 压成 squashfs,以及写 systemd 的 mount 单元
{{{
文章内容(plain text)
\}}}
[[local:isp_xxxxx.html|__RAW_HTML__]]

最后的链接 isp_xxxxx.html 指向原始的 HTML,供前端加载。这个脚本顺带还把指向 is-programmer.com 的图片下载到本地了,解决了文件没有导出的问题。

至于前端 Javascript 部分,就是这么个逻辑:

$("#content > p > a").each(function (item) {
    if ($(this).text() == "__RAW_HTML__") {
        fetch($(this).attr("href"))
            .then(response => response.text())
            .then(function(html) {
                $("#content > pre").replaceWith(html);
            });
        $(this).remove();
        return false;
    }
});

目前 Vimwiki 静态博客用 Disqus 提供评论服务。不支持的平台,可以自己生成 Custom XML 格式数据,导入进 Disqus。我写了 convert_comments.py 这个脚本干这件事。

Disqus 有个坑:导入的评论不能覆盖或者删除重新导入。因此如果你导入的数据出了问题,只能删站重来。所以最好自己添加一个测试站点,确保导入的数据没有问题了再往正在使用的站点导入。

另外,我这样导入后,旧的评论都没有头像。加头像有点麻烦,我懒得弄了。这篇文章有介绍大概步骤(很“大概”)。

emm,希望能多写点文章吧。

Page created on 2019-02-21