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跌了不少啊