Data-JavaScript-1.16/ 0000700 0601751 0601001 00000000000 15101701160 013526 5 ustar belg4mit None Data-JavaScript-1.16/CHANGES 0000700 0601751 0601001 00000007070 15101700667 014543 0 ustar belg4mit None Revision history for Perl extension Data::JavaScript.
1.16 Sun Nov 2 10:19:35 EST 2025
- Debian patch for Perl 5.42 warning
- Fix unquoted period reported by jwrightrecs, which matches real num regexp
- Unquote numbers in scientific notation for brevity of output
(Maybe older JSON did not support them, and that's why they were wrapped?)
- Remove 404 issue tracker from YAML.
Wayback machine shows title only of three tickets circa 2010,
the first two of which are from MSTEMLE / manchicken
1. Update documentation
2. Add support for modern JavaScript data structures
3. single . as value isn't quoted - jwrightrecs
1.15 Sun Oct 11 11:37:15 EDT 2020
- Adding skip check to the perlcritic test to avoid cpan tester issues.
1.14 Fri Oct 8 23:33:20 EDT 2020
- Modernized codebase
- Added CI
1.13 Thu Aug 14 11:01:10 EDT 2008
- Finished implementing import
- "Simplified"/unified __quotemeta code forks
1.12 Wed Aug 13 22:48:12 EDT 2008
- Some minor refactoring, including the removal of a dependency on
Exporter
- Fixed a misnumbered test in 1_11, which was intended to be a
development release.
- Escape based on reports of certain stupid browsers
ceasing to parse JavaScript upon encountering this string,
even in strings.
- Added explicit license
1_11 Tue Nov 15 14:30:22 EST 2005
- Touched up documentation
- Fixed syntax errors for hash key names that are also JS keywords
Reported by Kevin J. of Activestate
- Hash keys are now dumped in alphabetical order, this makes code
easier to debug (as suggested by Scott Wessels) and is necessary
for thorough testing.
- Special characters tab, newline, carriage return, ", and \ are
now escaped in place instead of as hex: \t, \n, \r, \", \\
1.10 Sun Nov 13 03:50 EST 2005
- Touched up documentation
- Explicitly requires Perl 5
- Previously undocumented, "private", quotemeta is now __quotemeta
though you may still import and use it
- Defaults to JavaScript1.3 compatible code with Unicode and undefined
support, specifc JS=>1.2 on the use line for backwards compatbility.
- Removed unnecessary evaluation of numeric elements, this fixes octal
interpretation of zipcodes, etc. Still, zipcodes such as 02137 would
be *correctly* evaluated by the client as 1119. However, in keeping
with the principle of least surprise any purely numeric string with
a leading zero will be treated as a string and quoted. If you really
meant to send a literal octal value, you can always eval the var
Similarly, engineering and hex notations are passed through to
strings as well.
Thanks for reports from Javier Arturo Rodriguez, Marius Feraru,
Joseph Annino, Alan Fairless, Kevin J.
- quotemeta has been completely rewritten with support for Unicode
Thanks for reports from Slaven Rezic, Marius Feraru, Sean Burke
1.08 Thu Feb 13 09:04:27 EST 2003
- Touched up the documentation
1.07 Sat Feb 8 12:40:16 EST 2003
- Added means to control how undef is dumped, suggested by Slaven Rezic
In doing so I have removed the undocumented feature that a list
was silently transformed into a list reference.
- Touched up the documentation
****
Ariel Brosh passed away a few months ago. I volunteered to maintain this
module as it was the inspiration for my own Data::JavaScript::LiteObject
http://use.perl.org/article.pl?sid=03/01/12/226258&mode=nested
****
1.04 Thu Jul 19 2001
- Fixed quoting back, thanks to Garick Hamlin
1.00 Mon Jun 12 21:03:29 2000
- original version; created by h2xs 1.19
Data-JavaScript-1.16/CONTRIBUTING.md 0000700 0601751 0601001 00000002511 13700235246 015773 0 ustar belg4mit None # Contributing
Your contributions are absolutely welcome!
**NOTE**: The default branch on this repository is `main`.
## In order to contribute, please:
0. If you'd like to fix a problem you found, please make sure that an issue exists for it first.
1. Fork the repository on github
2. Make your changes
3. Submit a PR to `main`.
4. Make sure your PR mentions the issue you're resolving so that we can close issues.
5. Please use `perltidy` with the `.perltidyrc` in this repository.
6. Please use `perlcritic --harsh`
## When you're contributing, please observe our code quality standards (they're pretty light).
1. Do your best not to drop code coverage. There are a lot of folks who use the module, and we want to make sure everyone has a great experience.
2. Please run `make test` prior to submitting any PRs. If your tests don't pass, we can't merge your branch.
3. Please try to stick to the formatting in the file you are modifying as closely as possible.
4. Don't forget that we have a number of users, so check Travis-CI if you don't have access to multiple OS' for testing.
## Other requests
1. If you're looking for something to do, please consider adding test coverage or finding an issue to resolve.
4. Please do not submit PRs which include massive formatting changes. Those are no fun to code review.
Thank you for contributing!
Data-JavaScript-1.16/example.pl 0000700 0601751 0601001 00000000717 10336433516 015542 0 ustar belg4mit None use Data::JavaScript;
$hash = {'string' => 'Joseph',
'array' => [qw(0 1 2 3 4 5 6 7 8 9 a b c d e f)],
'capitals' => {'Sverige' => 'Stockholm',
'Norge' => 'Oslo',
'Danmark' => 'Koebenhavn'},
'and' => [[0, 0], [0, 1]],
'or' => [[0, 1], [1, 1]],
'xor' => [[0, 1], [1, 0]]};
$hash->{'ref'} = $hash;
print scalar(jsdump("facts", $hash, 31.4e-1));
Data-JavaScript-1.16/lib/ 0000700 0601751 0601001 00000000000 15101701150 014273 5 ustar belg4mit None Data-JavaScript-1.16/lib/Data/ 0000700 0601751 0601001 00000000000 15101701150 015144 5 ustar belg4mit None Data-JavaScript-1.16/lib/Data/JavaScript.pm 0000700 0601751 0601001 00000021601 15101700425 017557 0 ustar belg4mit None package Data::JavaScript; ## no critic (PodSpelling)
use Modern::Perl;
use Readonly;
use Scalar::Util 'reftype';
our $VERSION = '1.16';
# Exporter
Readonly our @EXPORT => qw(jsdump hjsdump);
Readonly our @EXPORT_OK => '__quotemeta';
Readonly our %EXPORT_TAGS => (
all => [ @EXPORT, @EXPORT_OK ],
compat => [@EXPORT],
);
# Magic numbers
Readonly my $MIN_ENCODE_REQUIRE_BREAKPOINT => 5.007;
Readonly my $JSCOMPAT_DEFAULT_VERSION => 1.3;
Readonly my $JSCOMPAT_UNDEFINED_MISSING => 1.2;
# This is a context variable which holds on to configs.
my %opt = ( JS => $JSCOMPAT_DEFAULT_VERSION ); # TODO: This is super out-dated.
if ( $] >= $MIN_ENCODE_REQUIRE_BREAKPOINT ) { require Encode; }
sub import {
my ( $package, @args ) = @_;
# Let's get the stuff we're going to import
my @explicit_imports = ();
my @import = ();
my %allowable = map { $_ => 1 } ( @EXPORT, @EXPORT_OK );
# This is the madness for the JS version
for my $arg (@args) {
if ( ref $arg eq 'HASH' ) {
if ( exists $arg->{JS} ) { $opt{JS} = $arg->{JS}; }
if ( exists $arg->{UNDEF} ) { $opt{UNDEF} = $arg->{UNDEF}; }
}
elsif ( not ref $arg ) {
push @explicit_imports, $arg;
}
}
$opt{UNDEF} ||= $opt{JS} > $JSCOMPAT_UNDEFINED_MISSING ? 'undefined' : q('');
#use (); #imports nothing, as package is not supplied
if ( defined $package ) {
if ( scalar @explicit_imports ) {
# Run through the explicitly exported symbols
for my $explicit_import (@explicit_imports) {
# Looks like a tag
if ( substr( $explicit_import, 0, 1 ) eq q/:/ ) {
my $tag = substr $explicit_import, 1;
# Only do things for the actually exported tags.
if ( not exists $EXPORT_TAGS{$tag} ) { next; }
push @import, @{ $EXPORT_TAGS{$tag} };
}
# Not a tag
elsif ( exists $allowable{$explicit_import} ) {
#only user-specfied subset of @EXPORT, @EXPORT_OK
push @import, $explicit_import;
}
}
}
else {
@import = @EXPORT;
}
my $caller = caller;
no strict 'refs'; ## no critic (ProhibitNoStrict)
for my $func (@import) {
*{"$caller\::$func"} = \&{$func};
}
use strict 'refs';
}
return;
}
sub hjsdump {
my @input = @_;
my @res = (
qq(),
'', '',
);
return wantarray ? @res : join qq/\n/, @res, q//;
}
sub jsdump {
my ( $sym, @input ) = @_;
return "var $sym;\n" if ( not scalar @input );
my ( $elem, $undef ) = @input;
my %dict = ();
my @res = __jsdump( $sym, $elem, \%dict, $undef );
$res[0] = qq/var $res[0]/;
return wantarray ? @res : join qq/\n/, @res, q//;
}
sub __quotemeta {
my ($input) = @_;
## ENCODER!
if ( $] < $MIN_ENCODE_REQUIRE_BREAKPOINT ) {
$input =~ s{
([^ \x21-\x5B\x5D-\x7E]+)
}{
sprintf(join('', '\x%02X' x length$1), unpack'C*',$1)
}gexsm;
}
else {
if ( $opt{JS} >= $JSCOMPAT_DEFAULT_VERSION && Encode::is_utf8($input) ) {
$input =~ s{
([\x{0080}-\x{fffd}]+)
}{
sprintf '\u%0*v4X', '\u', $1
}gexms;
}
{
use bytes;
$input =~ s{
((?:[^ \x21-\x7E]|(?:\\(?!u)))+)
}{
sprintf '\x%0*v2X', '\x', $1
}gexms;
}
}
#This is kind of ugly/inconsistent output for munged UTF-8
#tr won't work because we need the escaped \ for JS output
$input =~ s/\\x09/\\t/gxms;
$input =~ s/\\x0A/\\n/gxms;
$input =~ s/\\x0D/\\r/gxms;
$input =~ s/"/\\"/gxms;
$input =~ s/\\x5C/\\\\/gxms;
#Escape for stupid browsers that stop parsing
$input =~ s{}{\\x3C\\x2Fscript\\x3E}gxms;
return $input;
}
sub __jsdump {
my ( $sym, $elem, $dict, $undef ) = @_;
my $ref = ref $elem;
if ( not $ref ) {
if ( not defined $elem ) {
return qq($sym = @{[defined($undef) ? $undef : $opt{UNDEF}]};);
}
#Translated from $Regexp::Common::RE{num}{real}
if ( $elem ne '.' &&
$elem =~ /^[+-]?(?:(?=\d|[.])\d*(?:[.]\d{0,})?)(?:[eE][+-]?\d+)?$/xsm ) {
if( $elem =~ /^0\d+$/xsm ){
return qq($sym = "$elem";) }
return qq($sym = $elem;);
}
#Fall-back to quoted string
return qq($sym = ") . __quotemeta($elem) . '";';
}
#Circular references
if( $dict->{$elem} ){
return qq($sym = $dict->{$elem};) }
$dict->{$elem} = $sym;
#isa over ref in case we're given objects
if ( $ref eq 'ARRAY' || reftype $elem eq 'ARRAY' ) {
my @list = ("$sym = new Array;");
my $n = 0;
foreach my $one ( @{$elem} ) {
my $newsym = "$sym\[$n]";
push @list, __jsdump( $newsym, $one, $dict, $undef );
$n++;
}
return @list;
}
elsif ( $ref eq 'HASH' || reftype $elem eq 'HASH' ) {
my @list = ("$sym = new Object;");
foreach my $k ( sort keys %{$elem} ) {
my $old_k;
$k = __quotemeta( $old_k = $k );
my $newsym = qq($sym\["$k"]);
push @list, __jsdump( $newsym, $elem->{$old_k}, $dict, $undef );
}
return @list;
}
else {
return "//Unknown reference: $sym=$ref";
}
}
1;
## no critic (RequirePodSections)
__END__
=head1 NAME
Data::JavaScript - Dump perl data structures into JavaScript code
=head1 SYNOPSIS
# Compatibility mode
{
use Data::JavaScript; # Use defaults
my @code = jsdump('my_array', $array_ref); # Return array for formatting
my $code = jsdump('my_object', $hash_ref); # Return convenient string
my $html = hjsdump('my_stuff', $reference); # Convenience wrapper
};
=head1 DESCRIPTION
This module is mainly intended for CGI programming, when a perl script
generates a page with client side JavaScript code that needs access to
structures created on the server.
It works by creating one line of JavaScript code per datum. Therefore,
structures cannot be created anonymously and need to be assigned to
variables. However, this format enables dumping large structures.
The module can output code for different versions of JavaScript.
It currently supports 1.1, 1.3 and you specify the version on the
C