[Catalyst] I18N with quotation marks
Jose Luis Martinez
jlmartinez-lists-catalyst at capside.com
Fri Jul 3 10:27:05 GMT 2009
Ton Voon escribió:
> For javascript in <script> blocks, you should use single quotes for the
> string value and pass through an escape_js filter, eg:
>
> <script>
> var string = '[% c.loc("May have single quotes or \ in it") | escape_js
> %]';
> </script>
Instead of forcing yourself to use single quoted strings in javascript,
you can escape single quotes AND double quotes :)
<script>
alert('I\'m a string with \\ and lots of \"things\"');
alert("I\'m a string with \\ and lots of \"things\"");
</script>
return the same output.
And to make it more solid...
You would expect that:
<script>
alert('I\'m a </script> string');
</script>
would show you a nice alert. You're wrong :) At least FF3 and IE fail. I
suppose that it's very normal (because the browser's parser understands
nothing about the string context of the javascript, and thinks the
<script> tag ends just in the middle of your script.
The solution is as easy as to "hide" the script tag from the parser.
<script>
alert('I\'m a <\/script> string');
</script>
Note: I don't know if it's better to escape all "/", or all "</" or just
"</script>" instances in the string. Any thoughts?
> $Template::Stash::SCALAR_OPS->{escape_js} = sub {
> my $s = shift;
> $s =~ s/\\/\\\\/g;
> $s =~ s/'/\\'/g;
> return $s;
> };
Maybe it's more efficient to do this in one pass?
$s =~ s/(\\|'|"|\/)/\\$1/g;
Just my 2 cents,
Jose Luis Martinez
jlmartinez at capside.com
More information about the Catalyst
mailing list