MT plug-in開発の勉強(aws.plの修正)

Goodpicで本が売れていると聞いて、それならば(笑)自分もやってみようと昨日から amazon web serviceのプラグイン、aws.pl(ひらたさん作)をインストールして使おうとしている。ところがなかなかうまく行かない。

今日は急がば廻れで、MT plug-inの作り方について勉強をはじめてみた。

自分の環境は

MT2.64+日本語パッチ
perl 5.8.0

Developing Movable Type Plug-ins

さて、ここの例が早速うまく動かない(苦笑)


package MT::Plugin::HelloWorld;
use MT::Template::Context;
MT::Template::Context->add_tag(HelloWorld => \&hello_world);

sub hello_world {
my $ctx = shift;
my $args = shift;
return "Hello " defined($args->{world})?$args->{world}:'World';
}
1;


最後の、 return "Hello " defined($args->{world})?$args->{world}:'World';を


my $str = defined($args->{world})?$args->{world}:'World';
return "Hello $str";


に変えると動いた。

The Stash


package MT::Plugin::SimpleLoop;
use MT::Template::Context;
MT::Template::Context->add_container_tag(SimpleLoop => \&loop );
MT::Template::Context->add_tag(SimpleLoopIndex => \&loop_index );

sub loop {
my $ctx = shift;
my $args = shift;
my $content = '';
my $builder = $ctx->stash('builder');
my $tokens = $ctx->stash('tokens');
for my $i(1..$args->{loops}) {
$ctx->stash('loop_index',$i);
my $out = $builder->build($ctx, $tokens);
$content .= $out;
}
}

sub loop_index {
my $ctx = shift;
return $ctx->stash('loop_index');
}
1;

こちらも動かない(笑) 

本家 movable typeの方を見ると、
Movable Type User Manual: PROGRAMMATIC INTERFACES


MT::Template::Context->add_container_tag(Loop => sub {
my $ctx = shift;
my $res = '';
my $builder = $ctx->stash('builder');
my $tokens = $ctx->stash('tokens');
for my $i (1..5) {
$ctx->stash('i_value', $i);
defined(my $out = $builder->build($ctx, $tokens))
or return $ctx->error($ctx->errstr);
$res .= $out;
}
$res;
});
MT::Template::Context->add_tag(LoopIValue => sub {
my $ctx = shift;
$ctx->stash('i_value');
});


となっている。違いはなんだろうと思い、


sub loop {
my $ctx = shift;
my $args = shift;
my $content = '';
my $builder = $ctx->stash('builder');
my $tokens = $ctx->stash('tokens');
for my $i(1..$args->{loops}) {
$ctx->stash('loop_index',$i);
my $out = $builder->build($ctx, $tokens);
$content .= $out;
}
return $content;
}


のように、赤字の部分を追加して動くようになった。

perlのバージョンの違いによって、parserの挙動が違うのかな?ひらたさんのところとかねこくん(Goodpic)は perl 5.6.1を利用しているそう。

(追記)
aws.plが動くようになりました。148行目付近


#$res .= sprintf($out);
$res .= $out;
if ($q{lastn}>0) { $q{lastn}--; }
last if ($q{lastn} == 0);
}
#if ($charset ne 'utf8') { $res = Jcode->new($res, 'utf8')->$charset(); }
$res = Jcode->new($res, 'utf8')->$charset();
#sprintf($res);
return $res;

コメントアウトした部分の下が修正部分です。

さあ、これからどんどん本やCDを紹介するぞ!?