title: rbdoc -- Ruby document writer
author: Kazuhiro Yoshida
mailto: moriq.kazuhiro@nifty.ne.jp
%href:rbdoc.txt% is rbdoc source.
1.rbdoc
usage
ruby rbdoc.rb foo.txt > foo.html
1.1. はじめに
これを作ったそもそもの原因は Ruby/Xlib のドキュメントを直接
HTML で書くのに嫌気がさしたことなんだ。
例えば,
%r:
new(x, y, width, height) : Rect rect
新しい四角形を作る。
%
と書いたら,
%r:
new(x, y, width, height) : Rect
rect
新しい四角形を作る。
%
に変換してほしいんだ。あなたもそう思うよね ?
1.1. 特長
書きやすい
source となる plain text は,妙な記号でマークアップする必要
がないシンプルなもの。
読みやすい
plain text は当然として,生成される HTML も読みやすくインデ
ントされる (rbdoc の source はお世辞にも読みやすいとは言え
ないけど ) 。また, lynx でもそれなりの表示を期待できる。
使いやすい
rbdoc は rbdoc.rb のみで構成されている。
速い
rbdoc のパーサは行指向であり単純である。
1.1. 制約
実は rbdoc は作法に厳しい。言い換えると,融通が利かないんだ。困
ったもんだね。
文字コード
Shift_JIS じゃないといけない。これは HTML の charset 指定を
固定しているために起こる弊害である。でも,このあたりの改良
は簡単にできるはずだ。
メソッド名
きっかり 4 カラム目から書く。 2 カラム目には %c:'*'% を付け
る。これで rbdoc はメソッド名と認識する。 ( 逃げ道もある。
%mref:method% 参照 )
インデント
インデントは 2 行を 1 組として扱う。 2 行とは,定義の行と意
味の行のこと。これは,かなり痛い制約である。しかし,この制
約のおかげでまとまりのある文章を書けるのだ,とは言えないだ
ろうか ( 説得力のない言い訳ともいう ) 。
1.1. 使いかた
1.1.1. コメント
%c:#% で始まる行はコメントである。 rbdoc はこの行の記述に関
知しない。
1.1.1. 空行
rbdoc でいう空行は,改行で始まる行である。空白文字を含んで
はいけない。
1.1.1.title, author, mailto
%c:title:% で始まる行はタイトル指定である。このあと改行まで
の文字列が記録される。
%c:author:% で始まる行は著者名指定。
%c:mailto:% で始まる行は連絡先指定。
1.1.1.lang
%c:%%lang=% で始まる行はタイトル指定である。 %c:en% もしく
は %c:jp% と指定することができる。また, %c:lang% 指定は途
中で変更できる。
しかし,もはや %c:lang% 指定は重要でなくなった。通常は無指
定でよい。
将来的には,言語ごとの出力をサポートするようになるだろう。
そのときにまたここの記述も改変しよう。
1.1.1. セクション
行頭に %c: 1.1. % などと書くと,それはセクションになる。
%c: 1. % はレベル 1 , %c: 1.1.1. % はレベル 3 となる。
1.1.1. 段落
上記以外の始まり方をする行は段落の始まりである。
1.1.1. インデント
rbdoc のインデントにはスペースのみ使える。タブは使えない。
4 カラムインデントして, 2 カラム目に %c:*% を付けた行はメ
ソッド定義とみなす。
4 の倍数カラムインデントした行は定義部とみなす。定義部の後
には意味部がくる。意味部は定義部よりも 2 だけ深いインデント
を持つ。では,奇数カラムなら?そのときは -1 した位置と同じ
深さになる。
前の行と同じ深さだけインデントした行は,前の行に継続する。
1.1.1. ハイフネーション
%c:lang% に %c:jp% を指定した場合,継続は前後の空白を全て消
去する形で行うので,英単語が連続する場合は問題になる。そん
なときはハイフン %c:'-'% を末尾に付ければよい。 rbdoc は,
末尾のハイフンをスペースに変換してくれる。
%c:lang% に %c:en% を指定した場合は, %c:jp% の場合とは全く
逆の動作になる。すなわち,継続はスペースを挟む形で行われ,
これを抑制するために末尾のハイフンを用いる。つまり,一般的
なハイフネーションを行うわけである。
%c:lang% が無指定の場合は,継続する文字列の末尾と先頭にある
文字を調べ,両方とも 2 byte 文字であるときには空白を入れず
にそのまま連結し,それ以外は空白を入れる。ハイフネーション
は %c:en% の場合と同様に行う。このモードが最も使いやすいと
思われるので,結論としては「 %c:lang% は指定しなくてよい」
と言える。なあんだ。
1.1.1. 修飾
書式
%c:%%:%%%
に指定できる文字
e, c, v, s, html, href, mref, method, nil
e
eval src
c
記号。 code tag で src を囲む。
v
変数。 var tag で src を囲む。
s
強調。 strong tag で src を囲む。
html
HTML を %html: そのまま % 埋め込む。
href
リンクを張る。 src は %c:foo.html! ふう % のように
%c:!% をデリミタとして後ろにラベルを記述できる。この場
合,ラベルは %c: ふう % となる。ラベル指定を省略すると
,リンク先 URL がそのままラベルとなる。
mref
メソッドへのリンクを張る。 src には %c: Xlib::XOR %,
%c: Array.new %, %c: File#open % のように指定できる。な
お, %c: equal? % は %c: equal_p % , %c: chop! % は
%c: chop_bang % ,というように rbdoc は 末尾の %c:'?',
'!'% を適切に修正する。
%method:method%
メソッド名専用の機能。 mref に対応するアンカー名を作成
する。 4 カラムインデントして, 2 カラム目に %c:*% を付
けた行は自動的に %c:%%method:%%% で囲まれる。最初
の %c:'(' or '{' or ' '% までをメソッド名とみなす。
しかしながら,メソッド名が頻繁に出てくる文書 ( 拡張ライ
ブラリのドキュメントとか ) の場合には,いちいち %c:'*'%
を付けるのは面倒である。そんな時には
%c:%%method_switch=true% を指定してほしい。そうすれば
%c:'*'% を付けることの意味は逆転する。すなわち,
%c:'*'% を付けないとメソッド名,付けると通常の定義部と
rbdoc は認識してくれる。
なお,ここでの %c:'*'% は HTML 上では表示されない。
nil
何もしない。なぜ何もしないものが必要なのかと言えば埋め
込みドキュメントを任意のレベルで使いたいという要望に答
えるためである。まあ初めは気にしなくていい。
src に %c:'%%'% を使いたいときは代わりに %c:'%%%%'% を置い
てほしい。
1.1.1. 埋め込みドキュメント
書式
%nil:%
%r:
%%:
...
%%
%
に指定できる文字
r, html, ruby, c, e, item, enum
いくつかの方法で plain text そのままの形で表示するような
HTML を生成できる。
r
pre tag で src を囲む。
html
HTML を %html: そのまま % 埋め込む。
ruby
r の応用。 Ruby スクリプトを表示するのに使う。
c
r の応用。 C プログラムを表示するのに使う。
e
eval src
item
記号付き箇条書。インデントをつけると階層構造になる。
enum
番号付き箇条書。インデントをつけると階層構造になる。
src に %c:'%%'% を使いたいときはそのまま %c:'%%'% でよい。
ただし,行頭の %c:%%% は終端を表すので, %c:%%%%% とする必
要がある。
ruby の例を挙げる。
%r:
%ruby:
def html_encode(src)
src.gsub! /, '<'
src.gsub! />/, '>'
src.gsub! /&/, '&'
end
%%
%
%ruby:
def html_encode(src)
src.gsub! /, '<'
src.gsub! />/, '>'
src.gsub! /&/, '&'
end
%
html の例を挙げる。
%r:
%html:
&
let's enjoy rbdoc!
%%
%
%html:
&
let's enjoy rbdoc!
%
1.1. コンセプト
rbdoc を作成するにあたって前提においたことを挙げる。
%enum:
1 path
source 1 line で意味解析できる
rbdoc-tag は nest できない
CSS を活用する
HTML で pre tag になる rbdoc-tag は here-document にする
%