これは何か?
Org-Mode で書かれた文書を他のフォーマットに変換するためのライブラリである。
直接の動機は、Redmine の文書やWikiに、Org-Modeで書いた文書を入れたかったから。 長文になると、textileで書くのは骨が折れる。Org-Mode のアウトライン操作は快適である。
この用途にはOrg-ruby が使えそうだけど、日本語の textile 文書との相性が悪かった。 Org-rubyに手を入れるか自分用を作るか迷ったのだが、Racc の勉強を兼ねて一から作ることにした。
が、構文エラーを出さない方針にしてみると、Racc 等の構文解析ライブラリは使いにくかった。 プログラミング言語じゃないから、あまりガチガチにすると使いにくいし、悩ましい所である。
構成
概要
org-file を、スキャナー、パーサーを通して、構文木を作成する。 出来上がった構文木から、HTMLや、textile 等のフォーマットの文書を構築する。
RDtool の構成と同じ様な形式である。 visitor の部分を置き換えることで、様々なフォーマットへ変換出来るようになる(予定)。
使い方
org-parse コマンド
Usage: org-parse [options] <file>
-h, --help Show this message
-f, --format FORMAT Translate the ORG file to the specified format.(not yet)
-t, --template TEMPLATE Erb template for build the output.
org-parse ライブラリ
以下の様な感じ。
data = IO.read(ARGV[0])
# ソース文字列と、タイトルに使われるファイルのベース名を与える
parser = OrgParse::StructParser.new(data, File.basename(ARGV[0], '.*'))
# 構文解析を実行して、構文木を取得する
root = parser.parse
# ビジターに構文木を渡す。
visitor = OrgParse::HtmlVisitor.new(root, options[:template])
# 結果を得る
puts visitor.build
MEMO
以下は、これからの修正のための覚書
オプション類の扱い
プログラム内でのオプションの記憶場所
オプションや、セクション番号等の情報は、各Nodeに持たせる。 つまり、ビジターで、コンテキストやオプション類の判定を行わないで済む様にする。
- セクション番号を、Section Node に持たせる
- Verse、Example 等は、各 BlockNode 配下のnode 自体が知っている
オプションの指定方法
コマンドラインで指定。 コンフィグファイルを作る?(~/.org-parse-rc) 文書内での指定を最優先する方が正しいか? ../examples/dot.org-parse-rc
オプションの優先順位
- デフォルト設定
- .opt-parse
- コマンドラインオプション
- ソースファイル内の指定
シンタックスハイライト他の gems 対応再考
バグ
ヘッドラインが、<hx> じゃなくて、<ul> を使う部分でバグがある模様。 タイトルが出力されなくなってるorz