md2review+ReVIEW+guard+livereloadで快適ドキュメントライティング
移転しました →
先日はてなで見かけたこちらの記事みて自分なりにやってみたいことがでてきたのでそれについてメモってみます。
Markdown記法+Git+md2review+ReVIEWで原稿・ドキュメント管理 - プログラマになりたい
やりたいことというのはこんな流れです。
- Markdownでドキュメントを書く
- 自動でHTMLに変換しタブをリロード
- PDFに清書(?)する
先の記事の方は手動で変換をかけているようですが、僕はそこを自動化してみようと思います。
pandocについて
そもそも僕は上のようなドキュメントライティングプロセスをpandocを用いて行っていました。それがこちら。
PandocはMS Wordのドキュメントを生成することができるのであるとき仕事で使ったことがありますが、見た目が超見づらいです。正直使い物にはなりませんでした。ですが、Markdownで書いてHTMLで読めるというところはとても良いです。
今回はReVIEWというものがどの程度使えるかを知ってみようと思います。
登場するソフトウェア
Guard
ファイルの変更を監視して、変更があったら何かするといった自動化をサポートするRubyのソフトウェア。
LiveReload
ブラウザで開いているWebページを自動的に更新するツールで、Guardと連携して特定のファイルが更新されたら特定のタブを更新するといった機能を実現できる。
md2review
Markdown形式で書かれたテキストファイルをReVIEW形式に変換するRubyプログラム。
ReVIEW
ReVIEW用のフォーマットからHTMLやTeX、PDFなど様々なフォーマットに変換可能な電子書籍向けフォーマットとそのプログラム群。
サンプル環境
(おそらく)簡単に導入できるであろう環境を作ってみました。
Guardで*.mdと*.htmlを監視する
# Guardfile guard 'shell' do watch(/.*markdown\/(.*)\.md$/) do |m| `./bin/md2review #{m[0]} > review/#{m[1]}.re` Dir.chdir("./review") do `../bin/review-compile --target=html #{m[1]}.re > ../html/#{m[1]}.html` end puts "built #{m[1]}.html" end end guard 'livereload', :apply_js_live => false do watch(%r{html/.+\.(html)}) end
markdown/
以下の*.md
ファイルを監視して、変更があったらmd2review
コマンドでReVIEW形式に一旦変換します。その後review-compile
コマンドでHTMLファイルを生成します。
2番めのwatch文ではhtml
ディレクトリ以下のhtmlファイルを監視しており、htmlに変更があった場合にそのファイルを開いているブラウザタブを更新しにいきます。つまり、Markdown形式のファイルを更新するとブラウザが勝手にリロードして確認できるというわけです。
スタティックファイルをサーブするWebサーバーを起動する
ローカル用のウェブサーバーなのでRubyで気軽に起動する方法をとりました。
bundle exec ruby -run -e httpd -- --port=5000 ./html
スタイルシートを指定する
review-compile
コマンドではスタイルシートを指定することもできます。これをやらないと見た目がプレーンすぎて味気なく、テンションがあがりません。
review-compile --target=html --stylesheet=style.css input.re > output.html
このように書くと生成されるhtmlファイルにstyleタグが生成されます。相対パスで書かれるのでウェブサーバーやhtmlファイルのパスに注意が必要です。
章立て
記事を書きながら使っていて気がついたのですが、複数ファイルあると複数の章立てになるんですね!これはうまく使うとすごく便利?だけど、1ファイルごとに独立させたい場合はちょっと不便なのかも。
pandocとの比較
様々な入出力に対応しているという点ではpandocのほうが優秀かも。だけど、ReVIEWが標榜しているように書籍などの長めの文章を書く際はReVIEWのほうがいいのかな。
今回はReVIEWを使い倒すというわけではなく、ReVIEWをカジュアルに使ってmarkdownでドキュメントを書いてみようという話でした。