オレオレ Visitor for RD

青年団体で、自組織サイトの管理セクションに配属されました。基本的にボランティア。昨今の経済情勢上、デザインテンプレート以外はほぼ内製。そして、元旦開設。

なので、素人集団である以上、相当の試行錯誤が必要だと思うのですが、なまじっか目だけは肥えているものだから仕様への希望ばっかで、不思議なことに「作る」という実際の行動に今もって移ろうとしないのです。

ただただ時間だけが過ぎて行くという有り様で、挙句の果てに「技術的な内容のメールはスルーしていいか?」というメールまで来る始末。

こうなると、仕事柄「一人で作っている」という未来が訪ずれる可能性が高いものの、予算はデザインテンプレートで使い切っているので金は無い、という最低・最悪の状況なので、とにかく工夫するしかありません。

当初は、自分の方のサーバに CMS でも入れておいて、そちらで更新した後、ページを保存、ftp 転送、というスキームも考えてみましたが、いまいち手作業感が拭えません。

やはりここは、軽量マークアップから HTML に変換。そして、画像などその他諸々をまとめて一気に転送、というのが理想的。

実は、以前からこの手の「ドキュメント生成」的な作業を自動化したかったので、ここは一つ「自分のために取り組んでみましょう」ということで、おっぱじめてみました。


まず、軽量マークアップは何を採用するか。

取り敢えず、時間も無いことなので、経験が無いものは排除ですな。であれば、昔取った杵柄で python の rest か ruby の rd が私の選択肢。

markdown とか、textile とか、wiki記法とか、軽量マークアップは世に数多くあれども、rest は中でも非常に優れた部類、と個人的には思っています。

ただ、多バイト文字での表作成が....見た目とバイト数は絶対違いますから、あの記法ですと、どうしてもキッチリ合わせられず、非常にツラいのです。

コードのドキュメントとは異なり、今回のような用途においては表を使用することが割りと多いので、やはり自在かつ簡易に作ることができる、というコトは非常に重要な要素だったりします。

その点では、rd の標準ではありませんが、RTtool はデリミタ方式で表計算との親和性も高い、という中々の優れものだったりします。よって、rd を採用することとしました。

RTtool

ちなみに、てっきり rd の開発は止まっているものと思い込んでいましたが、何とアップデートされているのですね。

RAA - rdtool

やはり、最新版の方が気分的に良いですから 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 = { "<" => "&lt;", ">" => "&gt;", "&" => "&amp;" }

  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 の生成自体は上手くいっているので、さほど気にすべき問題ではないとは思うのですが....

やはりエラーというのは、あまりよろしくはありませんので、今後の課題ですね。