{"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