Home of: [工房 "藤車"] > [SourceForge.net における PageMixer]

シーケンスの刈り込み

本節では、 PageMixer フレームワークにおける HTML ページの刈り込み方に関して説明します。 説明には、 HTML ページの "<span>" および対応する "</span>" に挟まれた部分を取り除くフィルタを用います。


<p><span class="Auth-Welcome">ようこそ !</span></p>

Before processing

<p></p>

After processing

言い換えるなら、 このフィルタは、シーケンス全体のうち "span" と名付けられた開始タグ Token および対応する終了タグ Token に挟まれた Token 部分シーケンスを刈り込みます。

概要

クラス図

本節におけるクラス図を以下に示します。

クラス図
クラス図 (クリックで拡大表示)

色づけされているのが本節で定義するクラスで、 それ以外は PageMixer において定義済みです。

オブジェクト図

本節におけるオブジェクト図を以下に示します。

オブジェクト図
オブジェクト図 (クリックで拡大表示)

シーケンス図

本節におけるシーケンス図を以下に示します。

シーケンス図
シーケンス図 (クリックで拡大表示)

クラス名

本チュートリアルでは、 クラスは全てクラス名のみで表記されています。 完全な名称は以下の通りです。

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 ページの該当する部分全ての部分を取り除くのは、 得策ではありません。

そこで、対象となる部分シーケンスに以下の条件を定めます。

備考:本チュートリアルでは、 処理対象となる 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")

SequenceWatcher の間を刈り込むための "span"

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 の派生クラス

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" は、 シーケンスが刈り込まれるべきか否かを意味する論理値です。


次節「シーケンスへのデータはめ込み」へ