こないだ決めた呼び出し側の仕様を変更。
WikiParser parser = WikiParser.getParser();
WikiNode node = parser.parse("あいうえお");
out.print(node.toString());
なんとなく、外部インターフェイス的にはこちらの方が自然な気がして。(プロジェクト名も WikiParser だし。。。)
またすぐ元に戻すかもしれないけど。
今回の目標であった「"\n\nあいうえお\nかきくけこ\n\n" を渡して "<p>あいうえお<br>かきくけこ</p>" を取得」はさらっと実装完了。
ここまではさらっと実装でいいんだけど、これから先の構文解析をどのように実装するかが問題。
以前のプロトタイプでは、正規表現でガシガシ分割、処理用のnodeを生成、委譲、と言う方針だったので、ソースはかな~りぐちゃぐちゃ。
拡張性も柔軟性もくそもない感じだったんだけど、今回はそうならないように良く考えなくては。
例によってデザパタ本をパラパラとめくってみて、今後使いそうなパターンをピックアップ。
- 構文解析に Chain of Responsibilityパターン
- 解析結果の出力に Visitorパターン
まだよく読んでみないと分からないけど、構文解析の時には
- 次の部分を処理するのはどなた?
- PreserveNode : 私じゃないよ
- BlockquoteNode : 僕じゃないよ
- ParagraphNode : じゃー、私が処理します。
みたいな流れで処理させればスッキリ書けそう。
出力は今は Object#toString() をオーバーライドして使ってるけど、Visitorを各自実装してもらうことで様々なフォーマットで出力ができるようになる気がするです。
この辺をAPIとしてしっかり仕様決めしてあげれば出力が柔軟になるかな?
#とうぶんは toString() でしょうけど。。。(^_^;;
この2つを組み合わせることの問題は、Visitorが訪問する相手(構文解析を誰が行ったか?)を覚えておかなければならない、もしくは適切に訪問できるよう導いてあげないといけないこと、かな。
この部分を考えるとあんまりうまくいきそうな気がしない。。。
とりあえず次回、ちょろっとやってみますかね~。
でわまた~~。



