ホーム >> 左脳Script >> Movable Type >> Plugin開発 >> mtタグ の任意展開、展開抑制 の方法

mtタグ の任意展開、展開抑制 の方法


Movable Type プラグイン開発における、「プラグインの設定で指定した任意の文字列を自作タグの位置に展開」「自作のコンテナタグ中のmtタグを無視(又は、只の文字列として展開)する事」 について、調べて検証した事を纏めておきます。


展開

Movable Type プラグイン開発において、「プラグインの設定で指定した任意の文字列を自作タグの位置に展開」なんて動作をさせたい場合が多々あると思います。

そこで、我等が「EvalTemplate」のコードを見てみると・・・

EvalTemplate の心臓部である、「mtタグ の展開コード」は以下。

MT::Template::Context->add_global_filter('eval' => sub {
    my ($text, $argument, $context) = @_;

    if ($argument) {
        my $builder = $context->stash('builder');
        my $tokens = $builder->compile($context, $text) or die($builder->errstr);

        defined($text = $builder->build($context, $tokens)) or die($builder->errstr);
    }

    return $text;
});

このコードから見るに、任意の文字列をテンプレートコードとしてコンパイル(解釈&展開)するには、以下のような記述が在れば良いようです。

my $tokens = $builder->compile($context, 任意の文字列);
$text = $builder->build($context, $tokens);
展開された、文字列は $text へ格納されます。

これを実証する試験プラグインのコードが以下。

package MT::Plugin::test;

use MT::Template::Context;

use vars qw($VERSION @ISA);

@ISA = qw(MT::Plugin);
$VERSION = '0.0-20090611';

my $plugin = new MT::Plugin::test({
  name => 'Tag TEST 2009/06/11',
  version => $VERSION,
  description => 'Tag TEST 2009/06/11',
  author_name => 'N-yagi',
  author_link => 'http://n-yagi.0r2.net/script/',
});
MT->add_plugin($plugin);

MT::Template::Context->add_tag(test0 => \&test0);
MT::Template::Context->add_tag(test1 => \&test1);

sub test0
{
	return	'<$mt:BlogName$>';
}

sub test1
{
	my ($context, $args) = @_;
	my	$builder	=	$context->stash('builder');
	#
	my	$string	=	'<$mt:BlogName$>';
	#
	my	$tokens	=	$builder->compile($context, $string);
	$string	=	$builder->build($context, $tokens);
	#
	return	$string;
}

1;

実際の試験記事。

<$mt:test0$>
<$mt:test1$>
実行結果。

<$mt:BlogName$>
左脳Script

これを利用すれば、任意のmtタグを含む文字列を展開適応させることが出来ますね。


抑制

では、これとは逆に、自作のコンテナタグ中のmtタグを無視(又は、只の文字列として展開)する事は可能でしょうか?

一般的に、コンテナタグのコードは以下のような形になっています。

MT::Template::Context->add_container_tag(test2 => \&test2);

sub test2
{
    my  ($context,$args,$cond)  =   @_;
    #
    my  $builder    =   $context->stash('builder');
    my  $tokens     =   $context->stash('tokens');
    my  $result     =   $builder->build($context,$tokens,$cond);
    #
    return  $result;
}
この例では、なんの加工もしていませんが、普通?ならば $result に格納されている文字列を、置換などで加工し、結果として出力する事と思います。

この時、このコンテナタグの内側の記述を解釈しているのが、「$builder->build($context,$tokens,$cond)」の部分です。

ここでコンな記述をすると・・・

<mt:test2><$mt:BlogUrl$></mt:test2>
当然の如く、このように展開されます。

http://n-yagi.0r2.net/script/

一般的なコンテナタグでは、むしろこの動作をする方が好都合です。

しかし、例えばこのブログを含め、Movable Type のテンプレートやプラグインのソースコードをネタにしているブログなどでは、記事の中に展開されたくないmtタグがある場合があると思います。
大抵は、手動で「<」を「&lt;」に変換するなどの対処をしている事でしょう。


ここで、MT::Template::Context が、保持している「uncompiled」という値を使います。
このuncompiledを使って、mtタグの展開をしないタグを実現したのが以下のコード。

MT::Template::Context->add_container_tag(test3 => \&test3);

sub test3
{
    my  ($context,$args,$cond)  =   @_;
    #
    my  $result =   $context->stash('uncompiled');
    #
    return  $result;
}

以下の記述が、

<mt:test3><$mt:BlogUrl$></mt:test3>
このように、そのまま展開されます。

<$mt:BlogUrl$>

タグ内部の記述が、一切展開されずにそのまま出力されます。EvalTemplate なんのそのです。




参考

ここで公開したコードは、Movable Type バージョン 4.25 で検証しました。

自分の場合、プラグイン作成において、動作の途中にどうしても展開されたくない機能が欲しくなり(手動で<を変換する、と言う方法では対処できない)、これに関する記事の検索などしてみたのですが、そのような記事が殆どありません(2009年6月10日時点)でした。

唯一に近い記事がコチラ。アドレスを残しておきます。
そしてここで注意!
この記事で説明したuncompiledは、公式のドキュメントに記述がありません。どのバージョンから使えるのか、今後使い続けられる保障があるのか、全く未知数です。



ともあれ、Movable Type プラグインを作る上で、解っていると使える方法であると思います。是非ご活用下さい。



トラックバック(1)

トラックバックURL: http://n-yagi.0r2.net/sanoupulurun/mt-tb.cgi/157

【現在進行中の記事です】ちょっと作ってみる事にする。以下その時に参考にした事など... 続きを読む

コメントする

ホーム >> 左脳Script >> Movable Type >> Plugin開発 >> mtタグ の任意展開、展開抑制 の方法

アーカイブ

このブログ記事について

このページは、n-yagiが2009年6月11日 15:58に書いたブログ記事です。

ひとつ前のブログ記事は「Adsense再々々々々々申請?!」です。

次のブログ記事は「コード表示用 Plugin」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。