# # SplitString # 2006/11/10 1.00 First Version # # Copyright(c) 2006 By H.Fujimoto # package MT::Plugin::SplitString; use strict; use MT; use MT::Template::Context; use MT::Plugin; my $plugin = MT::Plugin->new({ name => 'SplitString', version => '1.00', author_name => 'Hajime Fujimoto', author_link => 'http://www.h-fj.com/blog/', description => 'Split string to each character.' }); MT->add_plugin($plugin); MT::Template::Context->add_container_tag(SplitString => \&split_string); MT::Template::Context->add_tag(SplitStringChar => \&split_string_char); # MTSplitString tag sub split_string { my ($ctx, $args, $cond) = @_; my $tokens = $ctx->stash('tokens'); my $builder = $ctx->stash('builder'); # get replace parameter my @regexs = (); my @reps = (); for my $key (keys %$args) { push @regexs, $args->{$key} if ($key =~ /regex(\d*)/); if ($key =~ /replace(\d*)/ && $args->{$key} =~ /(.)[,\|](.*)/) { push @reps, { src => $1, dst => $2 }; } } $ctx->stash('split_regex', \@regexs); $ctx->stash('split_replace', \@reps); # out my $str = $ctx->{__stash}{vars}{$args->{name}}; my @res = (); for (my $i = 0; $i < length $str; $i++) { $ctx->stash('split_char', substr($str, $i, 1)); defined(my $out = $builder->build($ctx, $tokens, $cond)) or return $ctx->error($ctx->errstr); push @res, $out; } join $args->{glue}, @res; } # MTSplitStringChar tag sub split_string_char { my ($ctx, $args) = @_; my $ch = $ctx->stash('split_char'); if (!$args->{original}) { my $regexs = $ctx->stash('split_regex'); my $reps = $ctx->stash('split_replace'); map { $ch = $_->{dst} if ($ch eq $_->{src}); } @$reps; map { eval "\$ch =~ $_"; } @$regexs; } $ch; } 1;