作者: うぇいく
日時: 2006/7/6(13:12)
いろいろな言語のパーサを思い起こすに、大抵は・・・・
・独立した関数である
・基底クラスの関数である
のようです。なので、パーサに関しては、分散しない(できない)という
ことで落ち着きそうです。もし、各Classにパーサを分散するとしても、
自分のタグで処理すべき部分が渡された際に、どう取り込むか という
ことになるかと思います。
# 構造的にあわなければException。
toTextについては、以下のいずれかになるかと思います。
・基底クラスに基本形を実装し、違うものはoverrideする
・基底クラスでは純粋仮想関数にし、全てで実装する
・基底クラスでは純粋仮想関数にし、中間的なsubクラスで実装し、各タグの
 クラスは、中間的なsubクラスの子にする
htmlのタグと展開という点では、最初の方法が良いと思いますが、
どうでしょうか(もちろん、基底クラスへの実装には、bodyだからとか
pだからといった例外処理は入れません。例外が必要なら、subClassでorverride
する と。)
# 開くタグと閉じるタグがあるのが基本形ですかね?
----- Original Message -----
>Date: Thu, 06 Jul 2006 12:06:10 +0900 (JST)
>From: 閑舎 <raku@...>
>Subject: [TSfree:1655] Re: HTML 変換器を
> PHP で作ると
>To: TSfree@...
>
>
>うぇいくさん、こんにちは。
>
>うぇいく <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/
>
>