WikiForme第3設計案

また書き直すつもりですか。そうですか。0.1→0.2で全部書き直してますよ。3度書き直すと良いものができる。ホントか?
Ruby 1.8の件はどうするか。Class.newで作ったクラスでクラス変数が使えるか否かで、だいぶ違ってくるのだけど…。1.8を捨てる否か…むむむ。



このほどは3層構造で。

  1. Wiki記法→中間表現
  2. 中間表現→要素割り当て
  3. 要素割り当て→フォーマット変換

中間表現はシリアライズして保存しておけるので、場合によっては1はスキップ可。編集時には中間表現からWiki記法への逆変換もいるので、必要なクラスは以下。

  • IOレイヤークラス
  • 中間表現クラス
  • フォーマットバンドルクラス
  • Wiki記法→中間表現(Normalize)
  • 中間表現→Wiki記法(Reverse Normalize)
  • 中間表現→IOレイヤー(Serialize)
  • IOレイヤー→中間表現(Desirialize)
  • 中間表現→要素割り当て(Parse)
  • 要素割り当て→フォーマット変換(Processメソッド)

IOレイヤー

  1. 名前を渡すと、each {}が使える何かを返してくれる(Normalize用)
  2. 名前を渡すと、write(str)が使える何かを返してくれる(Serialize用)
  3. 名前を渡すと、read()が使える何かを返してくれる(Deserialize用)

を満たす何か。
とりあえずは、名前をファイル名として解釈して、ファイルを開くクラスがあれば動く。目論見としては、DBを抽象化。
SerializeとDeserializeは、文字列でなくXMLを渡す/得るようにするかも。その方がIOレイヤー側の自由度が高い(=パフォーマンスを上げる余地)


Normalize

  1. initializeでフォーマットバンドル(articleとか)とsyntax.yamlファイル(のロード結果)を受け取る
  2. normalize(source, syntax)メソッドで中間表現クラスのオブジェクトを返す

を満たす何か。syntax.yamlファイルを使うのは、このクラスとReverse Normalizeクラスだけ。
sourceは、each{}が使える何か。eachで1行ずつ取り出して処理。
multiline要素を処理するのはこのレイヤー。


Reverse Normalize

  1. initializeでフォーマットバンドルとsyntax.yamlファイル(のロード結果)を受け取る
  2. reverse_normalize(name, syntax)メソッドでWiki記法のオブジェクト(文字列の配列とか。1行ずつeach{}が使えるモノ)を返す

を満たす何か。Normalize + Reverse Normalizeで記法の変換ができる。


Parse

  1. initializeでフォーマットバンドルを受け取る
  2. parse(obj)で、中間表現を受け取り、構文ツリーを返す

を満たす何か。親要素補完をやるのはこのレイヤー。action要素の処理もこのレイヤー。

最後に構文ツリーの一番根の要素のprocessメソッドを呼び出す。めでたしめでたし。SerializeとDeserializeは、中間表現クラスにメソッドを追加すればいいことに気付いた。
フォーマットバンドルもクラスにまとめないとな。