MAP | PageMixer ドキュメント > チュートリアル > PageMixer の利用 > "NOP" フィルタ | << | >> |
本節では、 PageMixer フレームワークにおける HTML ページの解析および描画の方法に関して説明します。
本節におけるクラス図を以下に示します。
色づけされているのが本節で定義するクラスで、 それ以外は PageMixer において定義済みです。
本節におけるオブジェクト図を以下に示します。
HTML ページの解析および描画における処理フローは以下のようになります。
Filter
の生成
Renderer
インスタンスの生成
Producer
インスタンスの取得(あるいは生成)
ConsumerContext
インスタンスの生成
Filter
の Renderer
への接続
Filter
および ConsumerContext
を用いた
Producer#produce
の起動
Producer#produce
起動後のシーケンス図を以下に示します。
本チュートリアルでは、 クラスは全てクラス名のみで表記されています。 完全な名称は以下の通りです。
表記 | 完全名 |
---|---|
ConsumerContext | jp.ne.dti.lares.foozy.pagemixer.mixer.ConsumerContext |
Filter | jp.ne.dti.lares.foozy.pagemixer.mixer.Filter |
HashMapConsumerContext | jp.ne.dti.lares.foozy.pagemixer.mixer.HashMapConsumerContext |
LoosePageState | jp.ne.dti.lares.foozy.pagemixer.parser.LoosePageState |
PageParser | jp.ne.dti.lares.foozy.pagemixer.mixer.PageParser |
PageState | jp.ne.dti.lares.foozy.pagemixer.parser.PageState |
Producer | jp.ne.dti.lares.foozy.pagemixer.mixer.Producer |
Renderer | jp.ne.dti.lares.foozy.pagemixer.mixer.Renderer |
Token | jp.ne.dti.lares.foozy.pagemixer.Token |
表記 | 完全名 |
---|---|
Bootstrap | pagemixer.filter.Bootstrap |
Bootstrap.Default | pagemixer.filter.Bootstrap.Default |
NopFilter | pagemixer.filter.NopFilter |
まず始めに、 Token 列を接続先 Consumer に渡す以外には何もしない(NOP:No OPeration) フィルタを定義します。
public class NopFilter extends Filter { public NopFilter(){ super(); } public void consume(ConsumerContext context, Token token){ getConsumer().consume(context, token); } public void flush(ConsumerContext context){ getConsumer().flush(context); } }
"consume
" および "flush
"
の両メソッドは、
接続先 Consumer
の同一シグネチャのメソッドの起動しか行いません。
備考:
実のところ、
同様の機能のフィルタとして
"DefaultFilter
" が既に定義されていますので、
"NOP" フィルタが必要であれば、
こちらを使ってください。
Renderer
の生成PageMixer フレームワークでは、
HTML ページが Token
シーケンスとして扱われます。
しかし、処理結果として HTML ページを提示するためには、
文字列(ないしはバイト列)表現形式が必要とされます。
"Renderer
" クラスは、
コンストラクタで指定された java.io.Writer
に対して Token シーケンスを描画します。
例えば、
標準出力に書き出す Renderer
は以下のようにして生成されます。
Renderer renderer = new Renderer(new OutputStreamWriter(System.out));
Producer
の生成繰り返しますが、
PageMixer フレームワークでは、
HTML ページは "Token
" シーケンスとして扱われます。
そのため、シーケンスを提供する
"Producer
" が必要となります。
指定された HTML ファイルを表現する
シーケンスを提供する Producer
を得るための、
非常に簡単な方法があります。
"PageParser
" および
"LoosePageState
" の利用がそうです。
LoosePageState pageState = new LoosePageState(); PageParser parser = new PageParser(pageState); Producer producer = parser.parse(filename);
"filename
" 変数は、
HTML ページのファイル名を保持するものとします。
注意:
"LoosePageState
" は
その名前の "Loose" が "文法的に Loose" から来ています。
この実装は、 例えば 'h1' 配下の 'table' といった不正なタグ構造を許容するため、 HTML ソースの正当性通知を期待してはいけません。
ConsumerContext
の生成"ConsumerContext
" は、
動的な値や、フィルタ間連携のために使用します。
スタンドアロン環境用に、
java.util.HashMap
を用いた
ConsumerContext
インタフェースの実装として
"HashMapConsumerContext
" クラスがあり、
以下のようにして生成します。
HashMapConsumerContext context = new HashMapConsumerContext();
本節では、この "context" は必要ではありませんが、 このオブジェクトの作り方 (あるいはどのクラスを利用するか)を知ることが重要です。
以上で HTML ページの解析および描画に必要なものが全て揃いましたので、 後は以下の手順を踏むだけです。
NopFilter
の生成
NopFilter
の Renderer
への接続
NopFilter
および ConsumerContext
を用いた Producer#produce
の起動
NopFilter filter = new NopFilter(); // --- (1) filter.connectTo(renderer); // --- (2) producer.produce(context, filter); // --- (3)
実は、
ユーティリティクラスである "Bootstrap
"
あるいはその派生クラスは、
前述の "Renderer
の生成" から
"繋いで混ぜる" までを補助してくれます。
以下のようにして、描画された HTML を標準出力から得ることが出来ます。
Bootstrap.Default
" インスタンスを生成
Filter
を使って "execute(Filter)
" を起動
実行コードは以下の通りです (詳細は pagemixer.filter.NopFilter を参照してください)。
try{ Bootstrap bootstrap = new Bootstrap.Default(filename); bootstrap.execute(new NopFilter()); } catch(Exception e){ e.printStackTrace(System.err); }
MAP | PageMixer ドキュメント > チュートリアル > PageMixer の利用 > "NOP" フィルタ | << | >> |