逸言

Octopress博客问题解决方案与技巧

| Comments

在GitHub上创建了自己的博客后,先后在Jekyll和Octopress之间来回折腾了好一段时间。之前打算直接使用Jekyll提供的博客模板,后来觉得太费神,看到Octopress还不错,且它也是基于Jekyll,并能非常方便地部署到GitHub上。经过最初的安装到对博客的深入改造,目前我的博客需要的功能已经大致完成。在这个过程中,也碰到了许多问题。通过搜索Google以及自己阅读Octopress代码,找到了对应的解决办法。此外,也有一些小技巧的积累。考虑到还有许多正在使用或想要使用Octopress的朋友,因此在这里集中分享一下。

不能在ZSH中输入命令的问题

Octopress提供了许多Rake任务,可以方便地完成一些操作。常用的命令是rake new_post[“title”]。但是在ZSH下,输入这样的命令,会提示错误:

zsh: no matches found: new_post[...]

原因是诸如[]之类的不是正确的命令字符。当然,我们也可以使用转义符来解决这一问题。但每次都需要敲入转义符,实在是太麻烦了。解决方案是在~/.zshrc文件下,加入这样一行内容:

alias rake="noglob rake"

解决中文乱码问题

Octopress要创建一篇博客,可以直接运行rake new_post[“title”],它会在source/_post下创建一个markdown文件。同时,它会将你输入的title作为blog的链接URL。我们可以通过一些工具,例如EMacs或者MouApp(在Mac OS下)打开该文件进行编辑。但是,当我将markdown文件打开,修改title为中文,且输入中文博客时,再运行rake generate生成博客页面时,会报告编码错误。信息为:

gems/ruby-1.9.2-p290/gems/jekyll-0.11.0/lib/jekyll/convertible.rb:32:in `read_yaml': invalid byte sequence in US-ASCII (ArgumentError)

这是因为jekyll代码没有很好地支持多种编码的缘故。解决办法是找到提示信息中的convertible.rb文件,将第29行的如下代码:

self.content = File.read(File.join(base, name))

修改为:

self.content = File.read(File.join(base, name), :encoding => "utf-8")

有的博客还提到ruby环境的问题。我并没有碰到。我使用的版本是ruby 1.9.3。如果遇到类似问题,根据这篇博客的讲解,可以修改ruby环境下的setup_environment.bat文件,在文件最后加入2行:

set LC_ALL=en_US.UTF-8
set LANG=en_US.UTF-8

中文博客名称的问题

前面已经提到,rake new_post[“”]命令会将双引号引起来的标题作为blog链接的一部分。这就必然导致一个问题,就是我们无法在new_post[“”]命令中直接使用中文作为博客的标题。带来的问题是,我们每次都需要在创建了博客之后,再打开markdown文件,去修改文件前方的title内容为中文。这无疑增加了工作量。解决的办法很简单,因为new_post就是一个rake任务而已,我们可以参照该任务,创建一个自己的任务,添加一个新的参数alias,将它作为我们需要的中文标题。

打开在octopress根目录下的Rakefile文件,在文件末尾增加如下代码:

desc "Begin a new post in #{source_dir}/#{posts_dir} with Alias"
task :post, :title, :title_alias do |t, args|
  raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir)
  mkdir_p "#{source_dir}/#{posts_dir}"
  args.with_defaults(:title => 'new-post')
  title = args.title
  title_alias = args.title_alias
  filename = "#{source_dir}/#{posts_dir}/#{Time.now.strftime('%Y-%m-%d')}-#{title.to_url}.#{new_post_ext}"
  if File.exist?(filename)
    abort("rake aborted!") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n'
  end
  puts "Creating new post: #{filename}"
  open(filename, 'w') do |post|
    post.puts "---"
    post.puts "layout: post"
    post.puts "title: \"#{title_alias}\""
    post.puts "date: #{Time.now.strftime('%Y-%m-%d %H:%M')}"
    post.puts "comments: true"
    post.puts "categories: "
    post.puts "---"
  end
end

新的post任务接收两个参数,第一个参数与之前的new_post任务需要的参数完全相同,第二个参数alias就可以设置到markdown文件的title:中。例如我们要建立一个博客,标题为“如何建立Octopress博客”,则可以输入命令:

rake post["How to create octopress blog","如何建立Octopress博客"]

注意,除了第二个参数引号内的内容可以用中文外,其他字符包括双引号、逗号和中括号都应该是Utf-8字符。此外,Title和Alias之间用“,”隔开,“,”后不能加空格。

图片问题

加入图片在Octopress中,支持的Markdown语法为:

{% img [position] [url] [width] [height] %}

position可以设置为left,right或center。url可以是网上的图片url。如果是自己博客的图片,通常建议放在source/images目录下。为了将来更好地维护,建议按照年和月建立两层目录,如2012/12。因为rake generate命令会自动生成博客,放在source/images目录下的图片也会被复制过去。因而在markdown的img语法中,图片的url应该是/images/2012/12/picture.jpg。

代码问题

Octopress支持的代码高亮有很多。我个人还是比较喜欢直接用codeblock标签。虽然每次敲入这个codeblock不太方便,但它胜在灵活见解。例如,粘贴的代码为ruby语言,就可以在代码片段前后分别加上:

{% codeblock lang:ruby %}
# Here is ruby source code
{% endcodeblock %}

摘要问题

如果希望在首页只显示一部分内容,例如摘要,也非常简单。只需要在你希望首页显示的内容最后,输入:

<!--more-->

插件

Octopress官方网站提供了一些插件说明和相关链接,但还有一些第三方的插件是放在这个网站链接下的。我自己也写了一个针对新浪微博的插件,会在下一篇博客中详细介绍。

Comments