オレオレ Visitor for RD
某青年団体で、自組織サイトの管理セクションに配属されました。基本的にボランティア。昨今の経済情勢上、デザインテンプレート以外はほぼ内製。そして、元旦開設。
なので、素人集団である以上、相当の試行錯誤が必要だと思うのですが、なまじっか目だけは肥えているものだから仕様への希望ばっかで、不思議なことに「作る」という実際の行動に今もって移ろうとしないのです。
ただただ時間だけが過ぎて行くという有り様で、挙句の果てに「技術的な内容のメールはスルーしていいか?」というメールまで来る始末。
こうなると、仕事柄「一人で作っている」という未来が訪ずれる可能性が高いものの、予算はデザインテンプレートで使い切っているので金は無い、という最低・最悪の状況なので、とにかく工夫するしかありません。
当初は、自分の方のサーバに CMS でも入れておいて、そちらで更新した後、ページを保存、ftp 転送、というスキームも考えてみましたが、いまいち手作業感が拭えません。
やはりここは、軽量マークアップから HTML に変換。そして、画像などその他諸々をまとめて一気に転送、というのが理想的。
実は、以前からこの手の「ドキュメント生成」的な作業を自動化したかったので、ここは一つ「自分のために取り組んでみましょう」ということで、おっぱじめてみました。
まず、軽量マークアップは何を採用するか。
取り敢えず、時間も無いことなので、経験が無いものは排除ですな。であれば、昔取った杵柄で python の rest か ruby の rd が私の選択肢。
markdown とか、textile とか、wiki記法とか、軽量マークアップは世に数多くあれども、rest は中でも非常に優れた部類、と個人的には思っています。
ただ、多バイト文字での表作成が....見た目とバイト数は絶対違いますから、あの記法ですと、どうしてもキッチリ合わせられず、非常にツラいのです。
コードのドキュメントとは異なり、今回のような用途においては表を使用することが割りと多いので、やはり自在かつ簡易に作ることができる、というコトは非常に重要な要素だったりします。
その点では、rd の標準ではありませんが、RTtool はデリミタ方式で表計算との親和性も高い、という中々の優れものだったりします。よって、rd を採用することとしました。
ちなみに、てっきり rd の開発は止まっているものと思い込んでいましたが、何とアップデートされているのですね。
やはり、最新版の方が気分的に良いですから ebuild をちょっと手直し。バージョン番号を修正するだけ。下記のように少々の修正を加えましたが、気分の範囲内でしょう(w
# cp -r /usr/portage/dev-ruby/rdtool ${PORTDIR_OVERLAY}/dev-ruby/ # cd ${PORTDIR_OVERLAY}/dev-ruby/rdtool # mv rdtool-0.6.20.ebuild rdtool-0.6.22.ebuild # emacs rdtool-0.6.22.ebuild # diff rdtool-0.6.20.ebuild rdtool-0.6.22.ebuild 3c3 < # $Header: /var/cvsroot/gentoo-x86/dev-ruby/rdtool/rdtool-0.6.20.ebuild,v 1.1 2007/07/08 07:52:51 graaff Exp $ --- > # $Header: /var/cvsroot/gentoo-x86/dev-ruby/rdtool/rdtool-0.6.22.ebuild,v 1.1 2007/07/08 07:52:51 graaff Exp $ 8c8 < HOMEPAGE="http://raa.ruby-lang.org/project/rdtool" --- > HOMEPAGE="http://raa.ruby-lang.org/project/RDtool"
後は、digest を取っておくだけ。
# ebuild rdtool-0.6.22.ebuild digest
さぁ、準備は完了です!
後は、rd でどんどん記述して、せっかくの ruby ですから make ではなくて rake で依存関係の有るものをどんどんまとめて、と行きたいところなのですが、ここで一つ問題があります。
HTML を吐き出す軽量マークアップのコマンドにありがちなのですが、テンプレートが決め打ちなので、レイアウトは css で調整する以外に方法が無い点です。また仮に css を用いたとしても id や class を個別に打てる訳ではないので、自ずと限界に到達します。
以前からこの問題を解決することができなかったので、懸案であり続けていたのですが、今回はそうも行きません。
hpricot で目的のタグ(例えば body)の内部を抽出して、erb でレイアウトテンプレートと合成させる、ということを rake の中で処理させるのですが、どちらかといえば、生成されたファイルをまとめることが本業の rake の性質から鑑みると、用途違い、というか、「あまり美しくない」という感じがします。
Google 先生によれば、同じような悩みをお持ちの方はいらっしゃるのですね。256倍本にも載っていた「オレオレ Visitor」を作成した方が、どうも一番手っ取り早そうで、一番美しいような気がします。
RubyのRD形式で書かれた文字列をHTMLに変換したいです。 上記の目的を果たすようなライブラリがあれば教えてください。 コマンドではなく、スクリプト中でRDで書かれている.. - 人力検索はてな
基本的なオブジェクトのテンプレートは下記の通り。256倍本に準じました。
=begin = rd2html-my-template-lib.rb =end require "rd/rdfmt" require 'rd/rd2html-lib' module RD class RD2HTMLMyTemplateVisitor < RD2HTMLVisitor # must-have constants OUTPUT_SUFFIX = "html" INCLUDE_SUFFIX = ["html"] METACHAR = { "<" => "<", ">" => ">", "&" => "&" } end # RD2HTMLVisitor end # RD $Visitor_Class = RD::RD2HTMLMyTemplateVisitor $RD2_Sub_OptionParser = "rd/rd2html-opt" =begin == script info. RD to HTML translate library for rdfmt.rb $Id: rd2html-my-template-lib.rb,v 1.1 2008/11/28 01:55:27 root Exp root $ =end
後は、RD2HTMLVisitor の修正が必要なメソッドを順次オーバーライドして行けばイイだけです。例えば、doctype を変更したければ、
def doctype_decl %|<!DOCTYPE HTML \n| + %| PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"\n| + %| "http://www.w3.org/TR/html4/loose.dtd">| end private :doctype_decl
という感じ。おかげで、キレイな出力を手に入れることができるようになりました。しかし、元は rd という手軽さ。
いやぁ、オブジェクト指向万歳〜
何で、タダみたいな仕事を、オレ一人だけで頑張らなぁあかんの? と、ちょっと鬱っていましたが、何でも真剣に取り組んでみるものです。真剣であればあるほど、得るものが必ず何かあるものですね。
/usr/lib/ruby/1.8/optparse.rb:352: warning: multiple values for a block parameter (3 for 1) from /usr/lib/ruby/1.8/optparse.rb:352
ただ、このエラーがどうしても取れないんですよね〜
オプションの --with-part を使用した場合に必ず発生しています。HTML の生成自体は上手くいっているので、さほど気にすべき問題ではないとは思うのですが....
やはりエラーというのは、あまりよろしくはありませんので、今後の課題ですね。