文章目录
  1. 1. 下载
  2. 2. 安装
  3. 3. 排错
    1. 3.1. 第一个错误: comparison of Array with Array failed in _layouts/page.html
    2. 3.2. 又一个警告:Layout ‘nil’ requested in tags/标签名/atom.xml does not exist.
    3. 3.3. 基本不会遇见的问题
  4. 4. 配置
    1. 4.1. 中文化
    2. 4.2. 配置边栏中标签的数量和样式
    3. 4.3. 在文章列表中显示标签
    4. 4.4. 在博客下面或者上面显示标签
    5. 4.5. new_post 模板修改

Octopress默认只有分类没有标签,于是在网上找为octopress添加标签的方式并且整理记录下来。

下载

首先,下载需要的插件: octopress-tag-pagesoctopress-tag-cloud。使用git clone或者直接下载压缩包都行。

安装

安装其实很简单,只需要将下面几个文件复制到octopress中相应的目录中即可:

octopress-tag-pages中的

  • plugins/tag_generator.rb
  • source/_layouts/tag_index.html
  • source/_includes/custom/tag_feed.xml

octopress-tag-cloud中的

  • plugins/tag_cloud.rb
  • source/_includes/custom/asides/tags.html(如果需要汉化,直接修改这里面的内容即可)

例如,把octopress-tag-pages中的plugins/tag_generator.rb复制到octopress安装目录下的plugins文件夹中.

最后,修改_config.xml中的default_asides,将custom/asides/tags.html添加进去:

1
default_asides: [custom/asides/category_list.html, custom/asides/tags.html, ...]

至此,已经安装完毕。可是执行 rake generate 却发生了错误(不是所有人都会遇到)

1
Liquid Exception: comparison of Array with Array failed in _layouts/page.html

排错

第一个错误: comparison of Array with Array failed in _layouts/page.html

在tag_cloud.rb中第74行是这么写的:

1
2
3
4
5
6
7
if @limit > 0 and @sort != 'rand'
# sort the tag pairs by frequency in descending order
weighted.sort! { |a,b| b[1] <=> a[1] }
# then slice off the top @limit tag pairs
weighted = weighted[0,@limit]
end

weighted = weighted[0,@limit] 应该就是取指定数目的标签。如果你的标签数量少于 @limit ,那么就会报错。所以我们修改第74行为:

1
if @limit > 0 and @sort != 'rand' and @limit < weighted.length

同样的,将第95行修改为:

1
if @limit > 0 and @limit < weighted.length

这时再执行 rake generate 就不会报错了。但是又出现了几条警告:

1
Build Warning: Layout 'nil' requested in tags/github page/atom.xml does not exist.exist.

又一个警告:Layout ‘nil’ requested in tags/标签名/atom.xml does not exist.

tag_feed.xml 里面的 nil 改为 null:

1
layout: null

基本不会遇见的问题

如果刚刚开始使用Octopress,只有一两篇博客,而且所有的标签的博客数量都一样,那么就会发现左侧的标签的源码是这样:

1
<a style="font-size: NaN%" href="/tags/github-page/">github page</a>

将tag_cloud.rb第69行改为:

1
2
3
4
5
if max == min
weight = (100 - size_min) / (size_max - size_min)
else
weight = (Math.log(count) - Math.log(min))/(Math.log(max) - Math.log(min))
end

这时就可以正常使用了。

配置

中文化

如果用户点击边栏上的标签,会跳转到标签页。而标签页的默认标题为: Tag: 标签名.
如果想将其中的 Tag: 换成中文的,可以在 _config.yml 中添加下面的内容:

1
tag_title_prefix: "标签: "

重新生成一下,标题就会变成 标签: 标签名

配置边栏中标签的数量和样式

直接修改 source/_includes/custom/asides/tags.html 中的 limit 后面的数字即可,默认标签的样式是每一个标签单独一行,可以修改为多个标签连续显示 style: para:

1
{% tag_cloud font-size: 70-130%, style: para, limit: 15 %}

在文章列表中显示标签

将octopress-tag-pages插件中的 source/_includes/archive_post.html 复制到octopress中的 source/_includes/ 目录下,该文件本来已经有了,直接覆盖就可以。

或者如果你已经修改过octopress中的 source/_includes/archive_post.html 文件了,那么可以参考插件中的文件,直接将

1
2
3
{% if tag != '0' %}
<span class="tags">tagged with &#123;{ post.tags | tag_links }}</span>
{% endif %}

复制到octopress下的文件中的特定位置即可。

在博客下面或者上面显示标签

参考octopress-tag-pages插件中的source/_layouts目录中的post.html,修改octopress下的post.html,比如我的post.html中相应的部分是这样的:

1
2
3
4
5
6
7
8
9
10
11
<p class="meta">
{% include post/categories.html %}
{% include post/tags.html %}
<br/>
{% include post/author.html %}
{% include post/date.html %}
{{ time }}
{% if updated %}
{{ updated }}
{% endif %}
</p>

标签的的html文件里默认是不会带着 标签: 前缀的,打开 source/_includes/post/tags.html 文件,加上文字

1
2
3
4
5
6
7
8
<span class="tags">
标签:
{% if post %}
{{ post.tags | tag_links }}
{% else %}
{{ page.tags | tag_links }}
{% endif %}
</span>

同样分类的html文件默认也不会带着 分类: 前缀的,打开 source/_includes/post/categories.html 文件,加上文字

1
2
3
4
5
6
7
8
<span class="categories">
分类:
{% if post %}
{{ post.categories | category_links }}
{% else %}
{{ page.categories | category_links }}
{% endif %}
</span>

new_post 模板修改

打开 Gemfile 文件,插入 post.puts "tags: []" 这一句,然后在使用 new_post 命令生成一篇新的文章时会在开头默认插入tags

1
2
3
4
post.puts "date: #{Time.now.strftime('%Y-%m-%d %H:%M:%S %z')}"
post.puts "comments: true"
post.puts "categories: "
post.puts "tags: []"