第3回はフィルタについての説明です。フィルタ(filter)とは、入力されたデータを篩(ふるい)に掛けて選別を行い、所望の出力データを得るための処理です。これまで説明した変数タグ、コンテナタグ、条件タグと、今回説明するフィルタを以って、MT の標準プラグインで拡張できる範囲は、あらかた網羅できたことになります。
encode_html
や upper_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
で囲んで出力します。
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;
グローバルフィルタで済むところは、素直にグローバルフィルタを使っておくのが良いでしょう。
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) = @_;