Octopress易筋经,中文分类标签

| Comments

卷二,讨论如何在Octopress中使用中文分类标签。

基于Octopress的博客系统自带了一个很好用分类标签插件。但遗憾的是它不支持中文,如果你在文章中定义了中文分类,那么点击的时候会链接到404页面。事实上,这个分类功能是通过plugins/category_generator.rb来实现,所以有好事者对其进行了hack,以提供中文分类的支持。例如,

  1. 这篇文章中,作者修改了category_generator.rb文件中write_category_indexes函数,原理就是将category_dir下的目录名做成汉字在 url 中的编码 (RFC1738),然后和中文分类标签链接起来。测试了一下,这种方式在本地预览的时候没有问题,但是push到GitHub上就无法解析中文地址。
  2. 另外一种方法(参见这里),也是修改了category_generator.rb。与上面不同的是,它重新定义了分类标签在文章中的定义格式。例如,用中文分类标签名{英文别名}这样的格式来定义标签。于是在文章显示是中文分类,但实际链接到英文别名上。这种方法虽然定义标签麻烦些,但可定制性强。实际应用中却有问题,修改后的系统可以正常generate&deploy,但是preview那里有问题,无法自动跟踪文章的改变。这实际上很让人抓狂,因为不能实时的预览文档。也许以后的文章里会进行详细的研究。

我的解决方案当然也逃脱不了hack category_generator.rb的套路,但是思路上简单多了,就是利用stringex包的to_url函数将中文分类标签的链接名和category_dir下的目录名都转换成相应的拼音。这样无论在本地还是GitHub上都没有问题。事实上,Octopress系统在利用rake new_[post|page]命令创建含有中文名的文章时也采用了这样的技巧,你可以查看Rakefile中相关的部分。

下面是实现步骤,在category_generator.rb文件头处添加

require "stringex"

然后找到其中定义category目录的部分

self.write_category_index(File.join(dir, category.gsub(/_|\P{Word}/, '-').gsub(/-{2,}/, '-').downcase), category)

将其修改为

self.write_category_index(File.join(dir, category.gsub(/_|\P{Word}/, '-').gsub(/-{2,}/, '-').to_url.downcase), category)

再找到定义中文分类网页标签的部分

"<a class='category' href='/#{dir}/#{item.gsub(/_|\P{Word}/, '-').gsub(/-{2,}/, '-').downcase}/'>#{item}</a>"

改为

"<a class='category' href='/#{dir}/#{item.gsub(/_|\P{Word}/, '-').gsub(/-{2,}/, '-').to_url.downcase}/'>#{item}</a>"

注意上面两处修改就是再相应的地方加上to_url函数进行地址的转换。

修改后重新generate和deploy/preview,就可以看到中文分类了,而实际的链接就是对应的拼音。你可以用这个blog来测试中文分类功能。