うぇいくさん、こんにちは。
うぇいく <weyk@...> さん wrote.
> 1番、おや? と思うところは、各タグ(PやBODY)に関する処理の
> 実装がBlockに含まれている点です。以降、サポートするタグを増やす
> ごとにBlockが肥大していくことになり、メンテも大変です。
> 各subClassが、自分で取り込める部分のみとりだすparseをサポートし、
> それを元に戻す(?)部分のみのtoTextを提供してつくりになるのでは
> ないかとおもうのですが・・・(自分のことは自分が知っている)
最初に思いつくのは、確かにおっしゃるような構造で、
Body, P
のそれぞれが parse, toText という関数をもつ、単純なものだと思います。が、
もう少しやってみると、様子が変わってきます。
HTML のタグには、非常に似た振舞いをするものが多く見られます。Body, P, Li
などは、広い範囲で次のタグを探します。これに対し、B, I などといったタグ
の守備範囲は狭いものです。Pre などは内部の toText が通常とは違うことにな
るでしょうが、他の圧倒的に多くのタグの toText は共通です。
で、Body や P の parse, toText はそっくりなわけで、それなら共通するもの
はその特徴から Block, Inline といった基底クラスを作り、その継承でいくほ
うがいいのでは、となったわけです。
parse がやることは 2 つあって、
-次のタグの開始位置をみつけ、現タグの終了ポイントを明確にし、変換すべき
テキストの長さを決定する。
-次のタグの種類を見極め、そのタグの構造体を作り、そこへのポインタ next
を決定する。合わせて、現タグが終了なのか、次のタグの親となるのか、といっ
た関係を決定する(サンプルにはそこまでの処理は入れてません)。
Block の parse は示した例では原始的ですので、もう少し詳しく処理する必要
があります。
--
本田博通(閑舎)
テキストとスクリプトの http://www.rakunet.org/TSNET/