diff options
Diffstat (limited to 'util/jsgen.pl')
-rwxr-xr-x | util/jsgen.pl | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/util/jsgen.pl b/util/jsgen.pl new file mode 100755 index 00000000..1ad8fb53 --- /dev/null +++ b/util/jsgen.pl @@ -0,0 +1,97 @@ +#!/usr/bin/perl + +package VNDB; + +use strict; +use warnings; +use Encode 'encode_utf8'; +use Cwd 'abs_path'; +eval { require JavaScript::Minifier::XS; }; + +our($ROOT, %S); +BEGIN { ($ROOT = abs_path $0) =~ s{/util/jsgen\.pl$}{}; } +require $ROOT.'/data/global.pl'; + +use lib "$ROOT/lib"; +use lib "$ROOT/yawf/lib"; +use LangFile; + +# The VNDB::L10N module is not really suited to be used outside the VNDB::* +# framework, but it's the central location that defines which languages we have +# and in what order to display them. +use VNDB::L10N; + + +my $jskeys_lang = join '|', VNDB::L10N::languages(); +my $jskeys = qr{^(?: + _lang_(?:$jskeys_lang)| + _js_.+| + _menu_emptysearch| + _vnpage_uopt_(?:10?vote|rel.+)| + _rlst_[vr]stat_.+| + _vnedit_rel_(?:isa|of|addbut|del|none|findformat|novn|double)| + _redit_form_med_.+| + _vnedit_scr_.+| + _tagv_(?:add|spoil\d|notfound|nometa|double)| + _redit_form_vn_(?:addbut|remove|none|vnformat|notfound|double)| + _redit_form_prod_(?:addbut|remove|none|pformat|notfound|double)| + _pedit_rel_(?:addbut|del|none|findformat|notfound|double) + )$}x; + +sub l10n { + # Using JSON::XS or something may be shorter and less error prone, + # although I would have less power over the output (mostly the quoting of the keys) + + my $lang = LangFile->new(read => "$ROOT/data/lang.txt"); + my @r; + push @r, 'L10N_STR = {'; + my $cur; # undef = none/excluded, 1 = awaiting first TL line, 2 = after first TL line + my %lang; + while((my $l = $lang->read())) { + my $type = shift @$l; + if($type eq 'key') { + my $key = shift @$l; + push @r, ' }' if $cur; + $cur = $key =~ $jskeys ? 1 : undef; + if($cur) { + $r[$#r] .= ',' if $r[$#r] =~ /}$/; + # let's assume key names don't trigger a reserved word in JS + $key = qq{"$key"} if $key !~ /^[a-z_][a-z0-9_]*$/i; + push @r, qq| $key: {|; + } + } + $lang{$l->[0]} = 1 if $type eq 'tl'; + if($type eq 'tl' && $cur) { + my($lang, $sync, $val) = @$l; + next if !$val; + $val =~ s/"/\\"/g; + $val =~ s/\n/\\n/g; + $r[$#r] .= ',' if $cur == 2; + $lang = qq{"$l->[0]"} if $lang =~ /^(?:as|do|if|in|is)$/; # reserved two-char words + push @r, qq| $lang: "$val"|; + $cur = 2; + } + } + push @r, ' }' if $cur; + push @r, '};'; + push @r, 'L10N_LANG = [ '.join(', ', map qq{"$_"}, VNDB::L10N::languages()).' ];'; + return join "\n", @r; +} + + +sub jsgen { + # JavaScript::Minifier::XS doesn't correctly handle perl's unicode, + # so just do everything in raw bytes instead. + my $js = encode_utf8(l10n()) . "\n"; + $js .= sprintf "rlst_rstat = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{rlst_rstat}}; + $js .= sprintf "rlst_vstat = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{rlst_vstat}}; + open my $JS, '<', "$ROOT/data/script.js" or die $!; + $js .= join '', <$JS>; + close $JS; + open my $NEWJS, '>', "$ROOT/static/f/script.js" or die $!; + print $NEWJS $JavaScript::Minifier::XS::VERSION ? JavaScript::Minifier::XS::minify($js) : $js; + close $NEWJS; +} + +jsgen; + |