Rexdf

The devil is in the Details.

Octopress博客更新日志

| Comments

Octopress用了应该超过一年了,感觉还不错,看到了不少迁移到基于Python的Pelican和基于nodejs的Hexo,不过暂时我还没打算迁移过去。因为到现在才刚刚适应Jekyll的环境,虽然生成的时候确实非常之慢。

1.CDN加速

  • 全站静态文件启动cdn加速。

这个似乎并不困难,但是我现在有200多篇blog,一篇篇来改显然不现实。我希望的是可以自动化替换,并且可以随时修改的。

暂时我没有发现scss和ruby变量通用的方法,所以scss里面专用一个变量,在octopress/sass/screen.scss的第三行加入一行$cdn_prefix:"http:cdn.example.com",这样便可以在各个scss文件中使用这个变量了。注意的是,scss语法中,字符替换和ruby的类似。是这样使用的:background: $page-bg image-url('#{$cdn_prefix}/images/back_gb.jpg') top center fixed;,也就是说,'#{$var}'这个$var会被替换。

另外一个便是ruby代码和html模板中的变量。ruby代码中我使用的是Jekyll.configuration({})['cdn_prefix']来读取_config.yml中的配置,而html中则是使用{ { site.cdn_prefix } }来替换字符。

2.增加分类列表

  • category list tag

这个网上解决方案很多,而且还有云标签等不同的实现。问题是网上找的的好像都不支持中文。原因是他们处理超链接的时候没有采用Jekyll的默认方式,而是自作聪明写了一段代码。下面是我的代码。

2.1.注册插件

plugins/增加category_list_tag.rb文件,内容如下

plugins/category_list_tag.rbMyBlog
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
category_dir = context.registers[:site].config['category_dir']
#category_url = File.join(category_dir, category.gsub(/_|\P{Word}/, '-').gsub(/-{2,}/, '-').downcase)
html << "<li class='category'><a href='/#{category_dir}/#{category.to_url}/'>#{category} (#{posts_in_category})</a></li>\n"
end
html
end
end
end
Liquid::Template.register_tag('category_list', Jekyll::CategoryListTag)

这里重点是第10行,#{category.to_url}是关键,这样对中文的支持就没有问题了。ruby会自动把汉字转换成拼音,日语转换成罗马字母。

2.2建立aside模板

然后新建 source/_inclide/custom/asides/category_list.html,内容如下:

source/_inclide/custom/asides/category_list.htmlMyBlog
<section>
<h1>Categories</h1>
<ul id="categories">
{ % category_list % }
</ul>
</section>

2.3添加CSS

修改sass/custom/_styles.scss,添加如下内容,这个自定义符合自己主题搭配的就好。

sass/custom/_styles.scssMyBlog
#markdown-toc:before {
content: "目录";
font-weight: bold;
}
ul#markdown-toc {
list-style: none;
float: right;
@include shadow-box;
background-color: white;
border: 0.5em solid rgba(224, 224, 248, 0.1);
padding:5px;
margin-left:10px;
}

3.图像CDN加速

这里只是具体地讲一下,图像有两种。一个是markdown自身的,另一个是octopress/jekyll定义的。

3.1原生markdown语法CDN加速(原创)

这个比较麻烦,曾经一年多我都没有解决。前两天无意中解决了。过程不详细叙述了。这里只是简要说明下过程。因为我用的是kramdown,所以如果你是用的rdiscount,那么不用看这个了。

这里是系统级别的hacking,也就是给kramdown进行一个强制的硬编码。(我是这么想的,在自己的电脑上,kramdown被依赖到的可能性非常低。所以我就放心地hacking了。)

在Cygwin的gem都是被安装在了~/.gem/ruby/gems下面,而Linux下面除了这个目录,还可能在/usr/lib/ruby/gems/2.1.0/gems/下面,可以通过gem env查看你系统的gem存放目录。在这里目录下面应该会发现一个kramdown-***目录,这个目录下面lib/kramdown/converter/html.rb,打开这个文件,搜索convert_img,会找到一个def convert_img(el, indent)定义的函数。原始的应该只有一行。我们要打一个patch,变成如下:

lib/kramdown/converter/html.rbMyBlog
def convert_img(el, indent)
if !(el.attr['src'].match(/^http/))
el.attr['src'] = Jekyll.configuration({})['cdn_prefix'] + el.attr['src']
end
"<img#{html_attributes(el.attr)} />"
end

这里我用了_config.yml里面增加的一个变量cdn_prefix,如果你嫌麻烦硬编码也是可以的,只是这样下次修改cdn的时候方便些。

3.2 Octopress定义的语法加速

这个比较简单,网上到处都有,简单叙述下。 修改plugins/image_tag.rb,如下

plugins/image_tag.rbMyBlog
...
else
@img['alt'] = @img['title'].gsub!(/"/, '&#34;') if @img['title']
end
@img['class'].gsub!(/"/, '') if @img['class']
@img['src'] = Jekyll.configuration({})['cdn_prefix'] + @img['src'] if @img['src'][0] == '/'
end
super

也就是增加第36行,这里也是用了_config.yml里面增加的一个变量cdn_prefix,你完全可以硬编码。

4.Pygment错误

较常见的是如下的错误

Error:  Pygments can't parse unknown language: </p>

这个有一个辅助解决办法是修改plugins/pygments_code.rb,如下

plugins/pygments_code.rbMyBlog
rescue MentosError
raise "Pygments can't parse unknown language: #{lang}#{code}."
end

家下来可以根据出错提示,修改博客的markdown原文就好。

5.大量Configuration信息

实际上每执行一次Jekyll.configuration({})['cdn_prefix']都会输出一次。如果不想见到满屏的这个提示。请按照修改kramdown的方法,修改lib/jekyll.rb,注释掉一行$stdout.puts "Configuration from #{config_file}"。如果是2.4版本请修改/usr/lib/ruby/gems/2.1.0/gems/jekyll-2.4.0/lib/jekyll/configuration.rb,就是注释掉一行 Jekyll.logger.info "Configuration file:", file

Comments