在 Octopress 中对分类的 url 和名称进行分离设置

/

Octopress 的默认“分类”处理机制是:

  1. 分类名是英文,url 使用 stringex Gem 转成小写加连字符形式,名称转换成小写。
  2. 分类名是中文,url 使用 stringex Gem 转成汉语拼音加连字符的形式,名称保持中文不变。
  3. 中英混合参照 1、2。

分类名是英文时,名称强制转换成小写实在不科学,有很多单词,比如 SEO,约定俗成了要大写。分类名是中文时,url 转成汉语拼音的形式也让我无法接受,总感觉有点傻,还有个潜在的风险,两个完全不同的中文单词,读音相同的话,生成的 url 就会完全一致,比如技术基数

下面是我对 Octopress plugins 目录下 category_generator.rb 所做的修改:

@@ -23,6 +23,24 @@ require 'stringex'
 
 module Jekyll
 
+  def self.get_category_attributes(category)
+    att = category.split('|')
+    slug = att[0].to_url
+    name = att[0].split.map(&:capitalize).join(' ')
+    if att[2].nil?
+      if !att[1].nil?
+        name = att[1].split.map(&:capitalize).join(' ')
+      end
+    else
+      if att[1].empty?
+        name = att[0].upcase
+      else
+        name = att[1].upcase
+      end
+    end
+    [slug, name]
+  end
+
   # The CategoryIndex class creates a single category page for the specified category.
   class CategoryIndex < Page
 
@@ -42,10 +60,13 @@ module Jekyll
       self.data['category']    = category
       # Set the title for this page.
       title_prefix             = site.config['category_title_prefix'] || 'Category: '
-      self.data['title']       = "#{title_prefix}#{category}"
+      # self.data['title']       = "#{title_prefix}#{category}"
+      att = Jekyll.get_category_attributes(category)
+      self.data['title']       = "#{title_prefix}#{att[1]}"
       # Set the meta-description for this page.
       meta_description_prefix  = site.config['category_meta_description_prefix'] || 'Category: '
-      self.data['description'] = "#{meta_description_prefix}#{category}"
+      # self.data['description'] = "#{meta_description_prefix}#{category}"
+      self.data['description'] = "#{meta_description_prefix}#{att[1]}"
     end
 
   end
@@ -69,10 +90,13 @@ module Jekyll
       self.data['category']    = category
       # Set the title for this page.
       title_prefix             = site.config['category_title_prefix'] || 'Category: '
-      self.data['title']       = "#{title_prefix}#{category}"
+      # self.data['title']       = "#{title_prefix}#{category}"
+      att = Jekyll.get_category_attributes(category)
+      self.data['title']       = "#{title_prefix}#{att[1]}"
       # Set the meta-description for this page.
       meta_description_prefix  = site.config['category_meta_description_prefix'] || 'Category: '
-      self.data['description'] = "#{meta_description_prefix}#{category}"
+      # self.data['description'] = "#{meta_description_prefix}#{category}"
+      self.data['description'] = "#{meta_description_prefix}#{att[1]}"
 
@@ -108,7 +132,9 @@ module Jekyll
       if self.layouts.key? 'category_index'
         dir = self.config['category_dir'] || 'categories'
         self.categories.keys.each do |category|
-          self.write_category_index(File.join(dir, category.to_url), category)
+          # self.write_category_index(File.join(dir, category.to_url), category)
+          att = Jekyll.get_category_attributes(category)
+          self.write_category_index(File.join(dir, att[0]), category)
         end
 
       # Throw an exception if the layout couldn't be found.
@@ -164,7 +190,9 @@ ERR
     #
     def category_link(category)
       dir = @context.registers[:site].config['category_dir']
-      "<a class='category' href='/#{dir}/#{category.to_url}/'>#{category}</a>"
+      # "<a class='category' href='/#{dir}/#{category.to_url}/'>#{category}</a>"
+      att = Jekyll.get_category_attributes(category)
+      "<a class='category' href='/#{dir}/#{att[0]}/'>#{att[1]}</a>"
     end
 
     # Outputs the post.date as formatted html, with hooks for CSS styling.

修改过的代码会将分类名是英文时的名称转成每个单词首字母大写,如果想全部转成大写,可写成如下形式(以 SEO 为例):

categories:
- SEO

生成的 html 为:

<a href="http://www.example.com/categories/seo/">SEO</a>

分类名是中文时,可以完全对 url 和名称实现分离(以 Octopress 插件为例):

categories:
- Octopress 插件

生成的 html 为:

<a href="http://www.example.com/categories/octopress-plugin/">Octopress 插件</a>

Comments