MAP | PageMixer ドキュメント > チュートリアル > PageMixer の利用 > シーケンスの刈り込み | << | >> |
本節では、
PageMixer フレームワークにおける
HTML ページの刈り込み方に関して説明します。
説明には、
HTML ページの
"<span>
" および対応する
"</span>
" に挟まれた部分を取り除くフィルタを用います。
<p><span class="Auth-Welcome">ようこそ !</span></p>
<p></p>
言い換えるなら、
このフィルタは、シーケンス全体のうち
"span
" と名付けられた開始タグ
Token および対応する終了タグ Token に挟まれた
Token 部分シーケンスを刈り込みます。
本節におけるクラス図を以下に示します。
色づけされているのが本節で定義するクラスで、 それ以外は PageMixer において定義済みです。
本節におけるオブジェクト図を以下に示します。
本節におけるシーケンス図を以下に示します。
本チュートリアルでは、 クラスは全てクラス名のみで表記されています。 完全な名称は以下の通りです。
表記 | 完全名 |
---|---|
ConsumerContext | jp.ne.dti.lares.foozy.pagemixer.mixer.ConsumerContext |
HTMLSymbolSet | jp.ne.dti.lares.foozy.pagemixer.HTMLSymbolSet |
SequenceEditFilter | jp.ne.dti.lares.foozy.pagemixer.SequenceEditFilter |
SequenceTrimFilter | jp.ne.dti.lares.foozy.pagemixer.mixer.SequenceTrimFilter |
SequenceWatcher | jp.ne.dti.lares.foozy.pagemixer.mixer.SequenceWatcher |
表記 | 完全名 |
---|---|
Bootstrap | pagemixer.filter.Bootstrap |
WelcomeTrimFilter | pagemixer.filter.WelcomeTrimFilter |
SequenceWatcher
の生成前述のように、
本節では、
"<span>
" および対応する
"</span>
"
に挟まれた部分を取り除くフィルタを作成します。
しかし、
与えられた HTML ページの該当する部分全ての部分を取り除くのは、
得策ではありません。
そこで、対象となる部分シーケンスに以下の条件を定めます。
span
" 開始/終了タグの間で、
class
" 属性を持っており、
Auth-Welcome
" であること
備考:本チュートリアルでは、
処理対象となる token あるいは token 部分列の特定に
"class
" 属性を利用しています。
勿論、
別の属性(例えば "ID
")を利用しても良いですし、
HTML 文書における対象特定には
"ID
" 属性を用いるべきだ、
と考える方がいるかもしれません。
また、"class
" 属性は表現上の修飾等にのみ使用すべきだ、
とも考えるかもしれません。
しかし、"ID
" 属性は、
HTML 文書内における一意性の意味合いを含んでいるように見受けられます。
「PageMixer フレームワークの利用においては、
対象が同一 HTML 文書内に一度しか現れるべきでは無い」
との誤解を防ぐために、
"class
" 属性を利用しています。
本チュートリアルでは、
PageMixer フレームワークにおいては、
フィルタリング機能とフィルタリング対象を見つけ出す機能が、
別の機能として扱われることを一度説明しました。
そして、部分シーケンスのフィルタリングに関しては、
"SequenceEditFilter
" および
"SequenceWatcher
"
がその機能を実装します。
始めに、
処理対象となる部分シーケンスにおける最初と最後の
Token がどれであるかを
SequenceEditFilter
に伝えるための
SequenceWatcher
インスタンスを生成します。
本節のような場合、
"SequenceWatcher
" としては
"SequenceWatcher.NameAttr
" が利用されます。
これは "最初の Token の名前と属性で監視しているシーケンス監視クラス"
のことです。
new SequenceWatcher.NameAttr(HTMLSymbolSet.SET.SPAN, HTMLSymbolSet.SET.CLASS, "Auth-Welcome")
SequenceTrimFilter
の具象化次に、
指定された SequenceWatcher
が見つけ出した部分シーケンスを刈り込むために、
"SequenceTrimFilter
"
の派生クラスを定義します。
SequenceTrimFilter
は、
部分シーケンスの刈り込みに特化した
SequenceEditFilter
派生クラスの一つで、
それ自身にも2つの派生クラスのバリエーションがあります。
その一つが、
部分シーケンス全体を刈り込む
SequenceTrimFilter.Whole
で、
もう一つが、
最初と最後の Token を残して部分シーケンスを刈り込む
SequenceTrimFilter.Inside
です。
本節においては、
新しく定義するクラスを、
SequenceTrimFilter.Whole
の派生クラスとして定義します。
public class WelcomeTrimFilter
extends SequenceTrimFilter.Whole
{
final
private Object key_;
final static
private HTMLSymbolSet SET = HTMLSymbolSet.SET;
final static
private String ATTR_VALUE = "Auth-Welcome";
////////////////////////////////////////
public WelcomeTrimFilter(Object key){
super(new SequenceWatcher.NameAttr(SET.SPAN,
SET.CLASS,
ATTR_VALUE));
key_ = key;
}
/////////////////////////////////
// class Whole の具象化
protected boolean shouldTrim(ConsumerContext context){
return (null == context.getValue(key_));
}
}
SequenceTrimFilter.Whole
を具象化するためには、
"shouldTrim(ConsumerContext)
"
メソッドを定義しなければなりません。
このメソッドの戻り値は、
その時点においてシーケンスを刈り込むか否かを示す値であり、
これにより、刈り込み可否の決定を、
コンストラクション段階ではなく実行時において行うことができます。
上記の例では、 刈り込みの実施は、 context が指定されたキーで識別される値を持っているか否かに依存しています。
以上で必要なものが全て揃いました。 実行コードは以下のようになります (詳細は WelcomeTrimFilter を参照してください)。
try{ // 刈り込み条件設定/取得用のキー final Object key = "Auth.Welcome"; Bootstrap bootstrap = new Bootstrap.Default(filename) { protected void prepare(ConsumerContext context) { // "trimmed" は部分シーケンスの // 刈り込みの有無を保持 if(!trimmed){ // (ダミー)値をコンテキストに設定 context.setValue(key, key); } } }; // フィルタの適用 bootstrap.execute(new WelcomeTrimFilter(key)); } catch(Exception e){ e.printStackTrace(System.err); }
入力用のサンプル HTML ファイルは、
配布物中の "src/demo/servlet/war/WEB-INF/page/demosite
"
配下にある
"index.ja.html
" です。
上記コードでは、
"trimmed
" は、
シーケンスが刈り込まれるべきか否かを意味する論理値です。
MAP | PageMixer ドキュメント > チュートリアル > PageMixer の利用 > シーケンスの刈り込み | << | >> |