Blog Rebooted

#blog #ikiwiki

Ikiwiki is a wiki compiler. It converts wiki pages into HTML pages suitable for publishing on a website. Ikiwiki stores pages and history in a revision control system such as Subversion or Git. There are many other features, including support for blogging, as well as a large array of plugins.

生成静态页面,后端git存储,加上disqus的comment支撑,于是就有了这个改头换面的新blog。稍微纪录一下。

typecho 2 wordpress

无论是ikiwiki还是disqus,貌似wordpress的wxr格式都是最好的解决方案,typecho没有现成的导出插件,只好用wordpress作跳板。好在typecho 2 wordpress已经有人做好了: typecho 2 wordpress

wordpress 2 texts

最简单直接的方法是xslt,不过做之前有些准备工作。

uuid

disqus需要每一篇post里都有一个唯一的id来对应comment,permalink是一个选择,不过换了域名后会比较痛苦,相比之下uuid是个不错的解决方案。

#!/usr/bin/env python

import sys
import xml.dom.minidom
import uuid
import codecs

def main():
  doc = xml.dom.minidom.parse(sys.stdin)

  rss = doc.getElementsByTagName("rss")[0];
  rss.setAttribute("xmlns:dsq", "http://www.disqus.com/")

  for node in doc.getElementsByTagName("item"):
    uuid_str = "urn:uuid:%s" % uuid.uuid4()
    # <dsq:thread_identifier>disqus_identifier</dsq:thread_identifier>
    identifier_node = doc.createElement("dsq:thread_identifier")
    value_node = doc.createTextNode(uuid_str)
    identifier_node.appendChild(value_node)

    node.appendChild(identifier_node)

  sys.stdout = codecs.lookup('utf-8')[-1](sys.stdout)
  print doc.toxml()

if __name__ == "__main__":
     main()

生成的新xml里每个item都会包含一个dsq:thread_identifier的element

wxr > txt

这里有个现成的xslt,不过不是很符合我的需求,稍做修改,新的xslt可以参考这里

主要做的改动是:

  • 把link按照http://gopoherwood.info/year/month/day/slug 的pattern做匹配,然后在posts目录下分级创建year/month/day的目录,最后在目录下生成名为slug.mdwn的文件
  • 把wxr里每篇post的dsq:thread_identifier的值map到新文件的meta的guid字段

xsl:result-document只有xslt 2.0支持,所以xsltproc处理不了,建议用saxon

原来的post都是textile,文章不多于是手动改成了markdown

wordpress > disqus

disqus导入时会检查每篇post的link是否真的存在,不存在的时候会自动跳过,很讨厌,于是加工wxr去掉link的element。好在所有link都是字成一行,grep一下就ok了。

ikiwiki

ikiwiki的配置可以参考官方的wiki,不过自动生成的setup文件貌似不能正确处理git的post-update hook的权限,需要手动将git_wrappermode改为0755

出于洁癖建立了空的basewiki和template目录后rebuild,然后只加入需要的文件进去。cgi也没什么用处,蔽掉了

template

ikiwiki的meta插件有parse guid的tag模版里却怎么也拿不到meta的值,暴力加了guid的var进去

    diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm
    index ad6d1a8..5b56411 100644
    --- a/IkiWiki/Plugin/meta.pm
    +++ b/IkiWiki/Plugin/meta.pm
    @@ -288,6 +288,9 @@ sub pagetemplate (@) {
                    my %seen;
                    $template->param(meta => join("\n", grep { (! $seen{$_}) && ($seen{$_}=1) } @{$metaheaders{$page}}));
            }
    +       if (exists $pagestate{$page}{meta}{guid} && $template->query(name => "guid")) {
    +               $template->param(guid => $pagestate{$page}{meta}{guid});
    +       }
            if (exists $pagestate{$page}{meta}{title} && $template->query(name => "title")) {
                    $template->param(title => HTML::Entities::encode_numeric($pagestate{$page}{meta}{title}));
                    $template->param(title_overridden => 1);

然后模版里就可以用 <TMPL_VAR GUID> 获取guid的值了,把这个值放在disqus的code里就大功告成

顺手用html5重写了一下模版


最近帮主身体不适,APPL跌了不少啊