#
# 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;
