爲 Octopress 分類添加中文支持

2012年11月19日 (Shadow Ma)

雖然講的是分類(Category),但現在我這兒沒有分類只有標籤(Tag),Octopress 自帶的分類根本就是當作標籤用,再加上自己很少用分類,就把所有分類相關的字樣全改成了標籤,這樣看着不那麼彆扭,插件什麼的全改了,改動過程十分蛋疼就不說了,這裏還是按本來的 Category 來說。

Octopress 自帶的分類生成插件「category_generator.rb」不能處理非 ASCII 字符分類,Google 到兩種修改插件方法,一種是直接把分類目錄名轉換爲 url 編碼,另一種是分離分類顯示名和路徑名,對比之後決定採用後一種方案,避免 url 中包含辨識度低的編碼。

參照 SPRABBIT 火霧宗師的修改把分類格式改爲 <分類顯示名稱>{<分類目錄名稱>},然後如此創建分類:

1
categories:  隨筆{essay}

就能把顯示爲「隨筆」的分類頁面保存在一個叫「essay」的目錄中。

但這裏存在兩個問題,一是每次建立分類時都必須加上後面的分類目錄名稱,不然在 generate 時會報錯,二是爲了規範 url 原來的插件會先把分類中的大寫轉換爲小寫、空格替換爲「-」才作爲目錄名,但這個字符串處理也被作者去除了,雖然指定目錄名時稍加注意就好,但增強健壯性的話,就算以後隨意些也沒問題。

第一個問題,在調用分類的地方加上條件判斷,指定了目錄名時先作相應處理,沒有指定目錄名就像原來一樣使用這個分類,比如:

1
self.data['title']       = "#{title_prefix}#{if (/.*{.*}$/ === category) then "#{category[/[^{]*/]}" else "#{category}" end}"

在指定了目錄名時分類會變成 <分類顯示名稱>{<分類目錄名稱>} 的格式,需要用正則表達式 category[/[ ^ { ]*/] 取出 <分類顯示名稱> 這一部分用於顯示,沒有指定目錄名時直接就是 <分類顯示名稱>,這樣只有在分類是中文時才需要指定目錄名。

目錄名的部分也作相應修改,比如:

1
self.write_category_index(File.join(dir, "#{if (/.*{.*}$/ === category) then "#{category[/(?<={)[^}]*/]}" else "#{category}" end}".gsub(/_|\P{Word}/, '-').gsub(/-{2,}/, '-').downcase), category)

正則表達式 category[/(?<={)[^}]*/] 用於取出大括號中的分類目錄名稱,這裏保留 gsub 和 downcase 的字符串處理,在指定目錄名稱時可以不用在意空格和大小寫。

其它部分可以參考我修改的標籤插件。

2012年12月22日 更新:
多個分類時要這樣寫:

1
2
categories:
- 随笔{essay}

寫在方括號中會出問題,看有空能不能修好這個。

2013年02月03日 更新:
Octopress 將在 2.1 版本支持分類的名稱與索引分離,詳情請查看 Puttin Wong 提交的這個 Issue,2.1 的插件已經可用,替換原來的就行,然後分類改成這樣的形式:

1
2
categories:
- essay [随笔]
添加 SRV 記錄啓用 Google Apps 對外聊天 通過「Nowplaying Share Page」分享音樂的 Amarok 腳本
點擊查看評論
返回首頁 返回頂部