CGIMini::JavaScript::Variable

Perlの構造体をJavaScriptな形式に変換。
使い方は至って簡単

my $jsvar = CGIMini::JavaScript::Variable->new( foo => [ 'one', 'two', 'three' ]);
print $jsvar->output;

結果は
var foo = ['one','two','three'];
とな。

package CGIMini::JavaScript::Variable;

use strict;

sub new{
    my $class = shift;
    my $name  = shift;
    my $var   = shift;
    
    return bless({ name => $name, var => $var }, $class);
}

sub output{
    my $self = shift;
    return 'var ' . $self->{name} . ' = ' . _dump($self->{var}) . ';';
}

sub _dump{
    my $struct = shift;
    my $r = UNIVERSAL::isa($struct, 'UNIVERSAL') ? _ref_obj($struct) : ref($struct);
    
    return
        ( $r eq 'ARRAY' )  ? '[' . join(',', map{ _dump($_) }@$struct) . ']' :
        ( $r eq 'HASH' )   ? '{' . join(',', map{ _dump($_) . ':' . _dump($struct->{$_}) }keys %$struct) . '}' :
                             "'" . _esc($struct) . "'";
}

sub _ref_obj{
    my $obj = shift;
    return
        $obj->isa('ARRAY')  ? 'ARRAY' :
        $obj->isa('HASH')   ? 'HASH' :
                              '';
}

sub _esc{
    my $str  = shift;
    
    $str =~ s/\\/\\\\/g;
    $str =~ s/'/\\'/g;
    $str =~ s/([\r\n])/\\$1/g;
    
    return $str;
}

1;