{"abc":"abc\'abc"}
####
'{"abc":"abc\'abc"}'
##
##
{
my %translations = (
"\r" => "\\r",
"\n" => "\\n",
"'" => "\\'",
"\\" => "\\\\",
);
my $meta_chars_class = join '', map quotemeta, keys %translations;
my $meta_chars_re = qr/([$meta_chars_class])/;
sub text_to_jslit {
my $text = shift;
$text =~ s/$meta_chars_re/$translations{$1}/g;
return "'$text'";
}
}
##
##
package Template::Plugin::JavaScriptLiteral;
use strict;
use warnings;
use Template::Plugin::Filter qw( );
our @ISA = 'Template::Plugin::Filter';
my %translations = (
"\r" => "\\r",
"\n" => "\\n",
"'" => "\\'",
"\\" => "\\\\",
);
my $meta_chars_class = join '', map quotemeta, keys %translations;
my $meta_chars_re = qr/([$meta_chars_class])/;
sub init {
my $self = shift;
$self->install_filter('jslit');
return $self;
}
sub filter {
my ($self, $text) = @_;
$text =~ s/$meta_chars_re/$translations{$1}/g;
return "'$text'";
}
1;
##
##
// PARAMS: { data => { abc => "abc'abc" } }
[% USE JSON %]
[% USE JavaScriptLiteral %]
var json = [% data | json | jslit %];
alert(json); // {"abc":"abc'abc"}
##
##
// PARAMS: { data => { abc => "abc'abc" } }
[% USE JSON %]
var data = [% data | json %];
alert(data.abc); // abc'abc