讓Octopress有中文分類及側邊列

前言

Octopress 雖然號稱他可以讓人輕鬆部屬、愉悅寫作,但實際上原生 Octopress 2.0 對中文的支持很差,對於與 Ruby 不是好朋友的我,沒有能力自己去改寫,只能去找網路上的 Octopress 前輩們的解法參考,然後 Copy and Paste 試試看究竟可不可以解決問題。

首先我遇到了第一個問題是『如何使用中文分類,以及將分類顯示在側邊列』

很不幸地是,似乎蠻多前輩都是使用英文分類,而其他找到的解法雖然可以使用中文分類,但側編列的問題似乎並不適用於 host 在 github 的情況,這真是很奇怪的問題,讓我一度萌生把東西改架在 Heroku 上。

最後我參考了 khaos 如何去讓 Octopreess 支援中文分類的作法,如法炮製地更改側邊列的 category_sidebar.rb 讓他成功讓我可以在 github 上的 Octopress 使用中文側邊列,有鑑於我沒有在網路上找到我的情況的解法,在此分享給大家。

解決方法

基本上我是跟隨 Octopress易筋经,中文分类标签 的思考方法。既然中文行不通,那就把中文換成英文拼音,以英文來存取中文檔名。實作上是利用 stringexto_url 函式把中文分類標籤的連結位置與相應的 category_dir 全部換成相應的拼音。實際上當你使用 rake new_[post|page] 指令創建含有中文名的文章時也採用了這樣的技巧,你可以去觀察 Octopress 所建出來的 markdown 檔名,中文標題全部換為拼音顯示。

實際實現方法

1. 修改分類的生成方法

首先你得先讓修改分類的生成方法,使之可以使用中文。我採用 khaos 的 Octopress易筋经,中文分类标签 這篇文章所提方法,在此轉錄他的作法:

請修改你的 plugins/category_generator.rb,首先在文件頭加上一句:

require "stringex"

然後找到其中定義 category 目錄的部分,約在 109 行附近:

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)

再找到定義中文分類網頁標籤的部分,約是 164 行附近:

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

將其修改為:

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

這樣你就完成中文分類的修改了。

2. 加入分類到側邊欄

在修改側篇欄可以使用中文分類前得先有側邊欄分類,以下參考 DrayChou的做法

首先把以下內容存到 plugins/category_sidebar.rb

category_sidebar.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module Jekyll
  class CategoryListTag < Liquid::Tag
    def render(context)
      html = ""
      categories = context.registers[:site].categories.keys
      categories.sort.each do |category|
        posts_in_category = context.registers[:site].categories[category].size
        html << "<li class='category'><a href='/blog/categories/#{category.downcase}/'>#{category} (#{posts_in_category})</a></li>\n"
      end
      html
    end
  end
end

Liquid::Template.register_tag('category_sidebar', Jekyll::CategoryListTag)

接下來把以下內容存到 source/_includes/asides/category_sidebar.html

category_sidebar.html
1
2
3
4
5
6
<section>
  <h1>Categories</h1>
  <ul id="categories">
    {% category_sidebar %}
  </ul>
</section>

最後修改 _config.yml ,增加分類內容 asides/category_sidebar.htmldefault_asides

_config.yml
1
   default_asides: [asides/category_sidebar.html, asides/recent_posts.html]

這樣就完成加入側邊欄的分類列表了。

3. 修改側邊欄支援中文分類

最後你可以藉由修改 plugins/category_list_tag.rb 來讓他支援中文分類。作法如下: 首先在文件頭加入:

require "stringex"

再來找到 category_list_tag.rb 檔案裡的:

html << "<li class='category'><a href='/blog/categories/#{category.downcase}/'>#{category} (#{posts_in_category})</a></li>\n"

將之換成底下這句:

html << "<li class='category'><a href='/blog/categories/#{category.to_url.downcase}/'>#{category} (#{posts_in_category})</a></li>\n"

這樣便大功告成,打完收工。

參考資料

关于在64位 Windows 7 中部署中文化的Octopress
Octopress博客分类添加中文支持
Octopress易筋经,中文分类标签
DrayChou 的 Octopress 框架

Posted by Lucien,
octopress

Comments

Copyright © 2013 - Lucien Lee - Powered by Octopress