PureBuilder2(3) Markdown for Blog
有用なユーティリティコード
- TOP
- Old Archives
- PureBuilder2(3) Markdown for Blog
今やブログは主に Markdownで書かれている。
当初、blogtr
というPuredoc用のスクリプトを書いたが、ブログ程度であれば圧倒的にMarkdownで事足りることが多いからだ。
実のところ、ACCSコンテンツなどでもMarkdownで十分なケースは多く、そのためにPureBuilder2はMarkdownをサポートする。
Markdownを変換し、ヘッダーを操作するblogmd
はPureBuilder1.5で既に実装されたが、これはPandocを使ったスクリプトである。
PureBuilder2は全面的にRubyでいく予定であるため、MarkdownトランスレータにはKramdownを使用している。
これに合わせてKramdownを採用することにした。 機能的にはほとんど変わらないが、唯一の違いとして、手前に
* TOC
{:toc}
を入れるようにした。 これにより、KramdownはTOCを自動生成する。Pandocにはなかった便利な機能で、ちゃんとオフセットしたTOCを生成してくれる。
ちなみに、PureBuilderのMarkdown用ライブラリがKramdownをモンキーパッチングで拡張し、自動的にPureDocオブジェクトのメタ情報としてヘッダーを埋め込むので、XHTPureDocを使ってTOCを作ることもできなくはない。
まだpush予定はないため、コードを掲載する。
#!/usr/bin/ruby
# -*- mode: ruby; coding: UTF-8 -*-
require "purebuilder/purebuilder"
require "kramdown"
require "optparse"
opt = {}
op = OptionParser.new
op.on("-m", "--marshal") {|v| opt[:marshal] = true }
op.on("-M", "--without-meta") {|v| opt[:marshal] = false }
op.parse!(ARGV)
# String for Kramdown's TOC
TOC_PREFIX = "* TOC\n{:toc}\n\n"
# Get article file
sourcefile = ARGV.length == 1 ? ARGV[0] : nil
sourcestr = ARGF.read
pbp = PureBuilder::Parser.new(sourcestr, sourcefile)
pbp.proc_header
html = Kramdown::Document.new(TOC_PREFIX + sourcestr.gsub(//m, "") ).to_html
if opt[:marshal]
Marshal.dump({body: html, head: DOC.meta}, STDOUT)
else
puts html
end
これだけ見るとシンプルだが、PureBuilderとの関係が深く、結構中まで突っ込んでみることになってしまった。 PureBuilderの設計があまりよくないのかもしれないとも思ったが、そもそもPureBuilderのMarkdownサポートは「MarkdownをPureDocに見せかける」ものなので、PureBuilderとPureDocの密結合はやむをえまい。
これで初めて動かすこととなったPureBuilderだが、これによってPureBuilder、さらにPureBuilder登場によって修正されたPureDocのバグが発見され、デバッグにかなりの手間を費やした。
基本的にはシンプルだが、オプションへの対応を加えたため、いくらか複雑化した。 オプションは、将来的にパイプしてAPI経由でのブログアップロードに対応するため、メタを含めたMarshalで渡すためのものだ。