]> Dogcows Code - chaz/p5-CGI-Ex/blobdiff - lib/CGI/Ex/JSONDump.pm
CGI::Ex 2.11
[chaz/p5-CGI-Ex] / lib / CGI / Ex / JSONDump.pm
index 69222bf85bdeb46ab150908394c75e65093d277e..9242ad92246c68c3486c5e8ba0c83136d09a7594 100644 (file)
@@ -7,7 +7,7 @@ CGI::Ex::JSONDump - Comprehensive data to JSON dump.
 =cut
 
 ###----------------------------------------------------------------###
-#  Copyright 2006 - Paul Seamons                                     #
+#  Copyright 2007 - Paul Seamons                                     #
 #  Distributed under the Perl Artistic License without warranty      #
 ###----------------------------------------------------------------###
 
@@ -17,7 +17,7 @@ use strict;
 use base qw(Exporter);
 
 BEGIN {
-    $VERSION  = '2.05';
+    $VERSION  = '2.11';
 
     @EXPORT = qw(JSONDump);
     @EXPORT_OK = @EXPORT;
@@ -103,7 +103,7 @@ sub js_escape {
     return 'null'  if ! defined $str;
 
     ### allow things that look like numbers to show up as numbers (and those that aren't quite to not)
-    return $str if $str =~ /^ -? (?: \d{0,13} \. \d* [1-9] | \d{1,13}) $/x;
+    return $str if $str =~ /^ -? (?: [1-9][0-9]{0,12} | 0) (?: \. \d* [1-9])? $/x;
 
     my $quote = $self->{'single_quote'} ? "'" : '"';
 
@@ -117,7 +117,8 @@ sub js_escape {
     utf8::decode($str) if $self->{'utf8'} && &utf8::decode;
 
     ### escape <html> and </html> tags in the text
-    $str =~ s{(</? (?: htm | scrip | !-))}{$1$quote+$quote}gx;
+    $str =~ s{(</? (?: htm | scrip | !-) | --(?=>) )}{$1$quote+$quote}gx
+        if ! $self->{'no_tag_splitting'};
 
     ### add nice newlines (unless pretty is off)
     if ($self->{'str_nl'} && length($str) > 80) {
@@ -228,7 +229,7 @@ include whitespace to make them more readable.
      {
        "a" : [
          1,
-         2,
+         2
        ]
      }
 
@@ -296,7 +297,7 @@ with unknown types will not be included in the javascript output.
 
 Should contain an arrayref of keys or a hashref whose keys are the
 keys to skip.  Default is unset.  Any keys of hashrefs (including
-nested hashrefs) that are in the skip_keys item will not be included
+nested hashrefs) that are listed in the skip_keys item will not be included
 in the javascript output.
 
     JSONDump({a => 1, b => 1}, {skip_keys => ['a'], pretty => 0});
@@ -319,7 +320,7 @@ be included in the javascript output.
 
 =item indent
 
-The level to indent each nested data structure level if pretty is true.  Default is "  ".
+The level to indent each nested data structure level if pretty is true.  Default is "  " (two spaces).
 
 =item hash_nl
 
@@ -336,11 +337,11 @@ The whitespace to add after each arrayref entry if pretty is true.  Default is "
 =item str_nl
 
 The whitespace to add in between newline separated strings if pretty is true or the output line is
-greater than 80 characters.  Default is "\n".
+greater than 80 characters.  Default is "\n" (if pretty is true).
 
     JSONDump("This is a long string\n"
              ."with plenty of embedded newlines\n"
-             ."and is greater than 80 characters.\n", {pretty => 1, str_nl => "\n"});
+             ."and is greater than 80 characters.\n", {pretty => 1});
 
     Would print
 
@@ -348,8 +349,41 @@ greater than 80 characters.  Default is "\n".
       +"with plenty of embedded newlines\n"
       +"and is greater than 80 characters.\n"
 
+    JSONDump("This is a long string\n"
+             ."with plenty of embedded newlines\n"
+             ."and is greater than 80 characters.\n", {pretty => 1, str_nl => ""});
+
+    Would print
+
+    "This is a long string\nwith plenty of embedded newlines\nand is greater than 80 characters.\n"
+
 If the string is less than 80 characters, or if str_nl is set to "", then the escaped
-string will be contained on a single line.
+string will be contained on a single line.  Setting pretty to 0 effectively sets str_nl equal to "".
+
+=item no_tag_splitting
+
+Default off.  If JSON is embedded in an HTML document and the JSON contains C<< <html> >>,
+C<< </html> >>, C<< <script> >>, C<< </script> >>, C<< <!-- >>, or , C<< --> >> tags, they are
+split apart with a quote, a +, and a quote.  This allows the embedded tags to not affect
+the currently playing JavaScript.
+
+However, if the JSON that is output is intended for deserialization by another non-javascript-engine
+JSON parser, this splitting behavior may cause errors when the JSON is imported.  To avoid the splitting
+behavior in these cases you can use the no_tag_splitting flag to turn off the behavior.
+
+    JSONDump("<html><!-- comment --><script></script></html>");
+
+    Would print
+
+    "<htm"+"l><!-"+"- comment --"+"><scrip"+"t></scrip"+"t></htm"+"l>"
+
+    With the flag
+
+    JSONDump("<html><!-- comment --><script></script></html>", {no_tag_splitting => 1});
+
+    Would print
+
+    "<html><!-- comment --><script></script></html>"
 
 =back
 
This page took 0.019578 seconds and 4 git commands to generate.