突然心血来潮,想要将博客从目前的 Acrylamid 迁移到 Jekyll,于是经历了一番折腾。
两个 Static Site Generator 所使用的文件结构和格式各不相同:
- 文件结构不同
Acrylamid 使用
content/:year/:month/:slug.md
的文件结构存储文章源文件, 而 Jekyll 使用的是_source/:year-:month-:day-:slug.md
的形式 - YAML Front Matter 不同 Acrylamid 中会包含 slug 而 Jekyll 不会,而且 Jekyll 还要指定 layout
而 Acrylamid 又没有提供导出的功能,而手工修改肯定不是咱大程序员的作风呀,因为只能借助 脚本了,鉴于这两年来接触 Ruby On Rails 比较多,所以考虑使用 Ruby 脚本来操作迁移的过程。
#!/usr/bin/env ruby
require 'yaml'
require 'fileutils'
SOURCE_DIR = '/home/greatghoul/Workspace/greatghoul/blog/content/'
TARGET_DIR = '/home/greatghoul/Workspace/blog/_posts/'
def parse_file(filename)
puts "Parsing #{filename}"
content = File.read(filename)
if match = content.match(/^(?<metadata>---\s*\n.*?\n?)^(---\s*$\n?)/m)
meta = YAML.load(match[:metadata])
body = match.post_match
return meta, body
end
end
def jekyll_filename(meta)
date = meta['date'].split(' ').first
slug = meta['slug'].strip
File.join(TARGET_DIR, "#{date}-#{slug}.md")
end
def jekyll_yaml_front_matter(meta)
header = ['---', 'layout: post', '---']
meta.each do |k, v|
case k
when 'title', 'date'
header.insert(-2, "#{k}: #{v}")
when 'tags'
header.insert(-2, "#{k}: #{v.join(' ')}")
end
end
header.join("\n")
end
def jekyll_content(meta, body)
jekyll_yaml_front_matter(meta) + "\n\n" + body
end
Dir["#{SOURCE_DIR}**/*.md"].each do |filename|
puts "Processing #{filename}"
meta, body = parse_file(filename)
target_filename = jekyll_filename(meta)
puts "Writing #{target_filename} ..."
File.write(target_filename, jekyll_content(meta, body))
end
成功迁移!不过发现 Jekyll 编译的速度好慢呀,已经超出了忍受的界限,在编译速度上 Acrylamid 处理的还是很赞的,只编译更改的部分,速度会快很多,尤其是在文章比较多的时候,尤为明显。
另外,我还需要移植我目前博客的皮肤,两个工具的模板引擎也不相同,要移植起来也不轻松。 这时候我突然又想移植到 Middleman 上面,因为前段时间看到 叶玎玎 的博客用的就是这个。
当然,又是一番折腾,结果发现 middleman 配置和移植起来也挺麻烦,静下以来吃个雪糕顺便想一想, Acrylamid 已经满足我所有的需要了,我为什么要折腾,不如洗洗睡吧。
No Zuo No Die!