OrgParse * これは何か? [[http://orgmode.org][Org-Mode]] で書かれた文書を他のフォーマットに変換するためのライブラリである。 ** 何故作ったか。 直接の動機は、Redmine の文書やWikiに、Org-Modeで書いた文書を入れたかったから。 長文になると、textileで書くのは骨が折れる。Org-Mode のアウトライン操作は快適である。 この用途には[[http://orgmode.org/worg/org-tutorials/org-ruby.php][Org-ruby]] が使えそうだけど、日本語の textile 文書との相性が悪かった。 Org-rubyに手を入れるか自分用を作るか迷ったのだが、Racc の勉強を兼ねて一から作ることにした。 が、構文エラーを出さない方針にしてみると、Racc 等の構文解析ライブラリは使いにくかった。 プログラミング言語じゃないから、あまりガチガチにすると使いにくいし、悩ましい所である。 * 構成 ** 概要 org-file を、スキャナー、パーサーを通して、構文木を作成する。 出来上がった構文木から、HTMLや、textile 等のフォーマットの文書を構築する。 #+BEGIN_DOT images/org-parse-struct.png -Tpng digraph structure { graph [rankdir = LR]; "org-file" [shape = box]; output [shape = box]; tree [shape = box]; "org-file" -> parser; parser -> tree; tree -> visitor; visitor -> output; } #+END_DOT RDtool の構成と同じ様な形式である。 visitor の部分を置き換えることで、様々なフォーマットへ変換出来るようになる(予定)。 * 使い方 ** org-parse コマンド #+begin_example Usage: org-parse [options] -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. #+end_example ** org-parse ライブラリ 以下の様な感じ。 #+begin_example 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 #+end_example * MEMO 以下は、これからの修正のための覚書 ** オプション類の扱い *** プログラム内でのオプションの記憶場所 オプションや、セクション番号等の情報は、各Nodeに持たせる。 つまり、ビジターで、コンテキストやオプション類の判定を行わないで済む様にする。 - セクション番号を、Section Node に持たせる - Verse、Example 等は、各 BlockNode 配下のnode 自体が知っている *** オプションの指定方法 コマンドラインで指定。 コンフィグファイルを作る?(~/.org-parse-rc) 文書内での指定を最優先する方が正しいか? [[../examples/dot.org-parse-rc]] *** オプションの優先順位 - デフォルト設定 - .opt-parse - コマンドラインオプション - ソースファイル内の指定