第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;
グローバルフィルタで済むところは、素直にグローバルフィルタを使っておくのが良いでしょう。
テキストフィルタは、MT のエントリ編集画面にある"改行設定"に新しい項目を追加することができます。
本来(?)は、
Wiki記法や
はてな記法
などで書かれた文書に、適切にフィルタ処理を施して所望のデータを得る、といった使途に使います。
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 => &sakagesakage に書かれている、と云うこと。
my ($data) = @_;