MovableType プラグインの作り方 - 第3回:フィルタ

Posted by
ぴろり
Posted at
2006/03/31 14:28
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
MovableType カテゴリ

 第3回はフィルタについての説明です。フィルタ(filter)とは、入力されたデータを篩(ふるい)に掛けて選別を行い、所望の出力データを得るための処理です。これまで説明した変数タグコンテナタグ条件タグと、今回説明するフィルタを以って、MT の標準プラグインで拡張できる範囲は、あらかた網羅できたことになります。

この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  

グローバルフィルタ

 グローバルフィルタ(global filter)とは、 encode_htmlupper_case のように変数タグで使用され、 その変数タグの出力結果に何らかの影響を与えるものです。 グローバルフィルタは、"グローバル"の名の通り、あらゆる変数タグに指定することができます (果たしてそれが意味あるものかは別にして)。
 次の例は、変数タグ中の特定の文字を置換します(sample_3_1.pl)
package MT::Plugin::myplugin_3_1;

use MT::Template::Context;
MT::Template::Context->add_global_filter (HG => &HG);

sub HG {
	my ($data, $arg, $ctx) = @_;
	$data =窶セ s/。/フゥーーー!! /g;
	$data =窶セ s/」/オッケ縲懊€・!」/g;
	$data =窶セ s/w/セイセイ/g;
	$data;
}

1;

 このフィルタは次のように使用することができます。

<$MTEntryBody HG="1"$>

sample_3_1.pl は UTF-8 で書かれています。 の文字コードに合わせて、を保存し直してください。

コードの詳細

MT::Template::Context->add_global_filter (HG => &HG);
 HG という名前のグローバルフィルタを定義し、 その処理は HG に書かれている、ということ。
my ($data, $arg, $ctx) = @_;
 フィルタに入力された文字列、フィルタへの引数、現在のコンテクストを取得します。おまじない。
$data =~ s/。/フゥーーー!! /g;
 入力された文字列中の読点"。"を全て"フゥーーー!!"に置き換えます。
$data;
 処理された結果を出力します。

グローバルフィルタの引数

 グローバルフィルタでも、その動作を変更できるよう引数を取ることができます。 $arg には、HG="..." で指定された値が代入されているので、 この値を使用してフィルタの動作を変化させることが可能です(sample_3_2.pl)
package MT::Plugin::myplugin_3_2;

use MT::Template::Context;
MT::Template::Context->add_global_filter (star => &star);

sub star {
	my ($data, $arg, $ctx) = @_;
	my $star = '☆彡' x $arg;
	$star. $data. $star;
}

1;

コードの詳細

my $star = '☆彡' x $arg;
 $arg で指定された回数だけ、 '☆彡'を繰り返し、これを $star に代入します。
$star. $data. $star;
 入力された文字列の前後に $star で囲んで出力します。

コンテナタグによる実現

 グローバルフィルタと同様の機能を、 コンテナタグとして無理矢理書き換えてみると、 次のようになるでしょう(sample_3_2a.pl)
package MT::Plugin::myplugin_3_2a;

use MT::Template::Context;
MT::Template::Context->add_container_tag (MakeHG => &HG);

sub HG {
	my ($ctx, $args, $cond) = @_;
	my $builder = $ctx->stash('builder');
	my $tokens  = $ctx->stash('tokens');
	my $out = $builder->build ($ctx, $tokens, $cond);
	return $ctx->error ($builder->errstr) if !defined $out;

	$out =窶セ s/。/フゥーーー!! /g;
	$out =窶セ s/」/オッケ縲懊€・!」/g;
	$out =窶セ s/w/セイセイ/g;
	$out;
}

1;

 グローバルフィルタで済むところは、素直にグローバルフィルタを使っておくのが良いでしょう。

テキストフィルタ

 テキストフィルタは、MT のエントリ編集画面にある"改行設定"に新しい項目を追加することができます。 本来(?)は、 Wiki記法はてな記法 などで書かれた文書に、適切にフィルタ処理を施して所望のデータを得る、といった使途に使います。
 ここでは、入力されたテキストを逆毛語化する、 逆毛語フィルタを作ってみます(sample_3_3.pl)
package MT::Plugin::myplugin_3_3;

MT->add_text_filter ('sakage', {
		label => '逆毛語',
		on_format => &sakage,
});

sub sakage {
	my ($data) = @_;
	$data =窶セ s/、/www/g;
	$data =窶セ s/。/wwっうぇwっうぇw/g;
	$data =窶セ s/!/!!!1!11!/g;
	$data;
}

1;

sample_3_3.pl は UTF-8 で書かれています。 の文字コードに合わせて、を保存し直してください。

コードの詳細

MT->add_text_filter ('sakage'
 sakageという内部名でテキストフィルタを追加します。 グローバルフィルタfilter="..."で指定する場合に使用します。
label => '逆毛語'
 "改行設定"ドロップダウンリストに表示されるフィルタ名称です。
on_format => &sakage
 フィルタが選択された時に、適用する処理は sakage に書かれている、と云うこと。
my ($data) = @_;
 入力された生のデータ。これに対してフィルタ処理を行います。 この辺りはグローバルフィルタと同じです。

サンプルファイルの

 この記事で使用したのプログラムコードを ダウンロードできます。
この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  


この記事を読んだ人はこんな記事も読んでいます記事リコメンデーションについて

カバー画像:MovableType プラグインの作り方 - 第4回:その他の機能1

関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。