summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2015-08-10 02:57:06 +0200
committerYorhel <git@yorhel.nl>2015-08-10 02:58:48 +0200
commit87aa6dfecae8f0319f6244646fb14c6ff9f9a0dc (patch)
tree1506ca78a3cbad7027a2c6386a13dd2eb2a44ca9
parenteabd513285a111442a11f7e62a53a48eb8931054 (diff)
js: Move generated variables into global VARS structure
This removes one source of namespace polution, and makes it more clear which code is using the variables.
-rw-r--r--README2
-rw-r--r--data/js/charvns.js4
-rw-r--r--data/js/filter.js34
-rw-r--r--data/js/lib.js8
-rw-r--r--data/js/main.js1
-rw-r--r--data/js/misc.js4
-rw-r--r--data/js/vnreldropdown.js6
-rw-r--r--data/js/vnscr.js10
-rw-r--r--data/js/vnstaff.js6
-rwxr-xr-xutil/jsgen.pl90
10 files changed, 83 insertions, 82 deletions
diff --git a/README b/README
index 627db769..1d755a2a 100644
--- a/README
+++ b/README
@@ -30,6 +30,7 @@ Requirements
Crypt::URandom
Crypt::ScryptKDF
Image::Magick
+ JSON::XS
TUWF
FCGI (optional, for running as a FastCGI script)
PerlIO::gzip (optional, for output compression)
@@ -58,6 +59,7 @@ Requirements
CSS::Minifier::XS (optional, minimizes CSS output)
util/jsgen.pl
+ JSON::XS
JavaScript::Minifier::XS (optional, minimizes JS output)
util/spritegen.pl
diff --git a/data/js/charvns.js b/data/js/charvns.js
index 1d750389..e1251dcb 100644
--- a/data/js/charvns.js
+++ b/data/js/charvns.js
@@ -77,8 +77,8 @@ function cvnRelAdd(vid, rid, role, spoil) {
}
var lsel = tag('select', {onchange:cvnSerialize});
- for(var i=0; i<char_roles.length; i++) // l10n /^_charrole_/
- lsel.appendChild(tag('option', {value: char_roles[i], selected:char_roles[i]==role}, mt('_charrole_'+char_roles[i])));
+ for(var i=0; i<VARS.char_roles.length; i++) // l10n /^_charrole_/
+ lsel.appendChild(tag('option', {value: VARS.char_roles[i], selected:VARS.char_roles[i]==role}, mt('_charrole_'+VARS.char_roles[i])));
// l10n /_spoil_\d+/
var ssel = tag('select', {onchange:cvnSerialize});
diff --git a/data/js/filter.js b/data/js/filter.js
index 74447145..2b9252c5 100644
--- a/data/js/filter.js
+++ b/data/js/filter.js
@@ -436,13 +436,13 @@ function filFTagInput(name, label, type) {
}
function filChars() {
- var gend = genders;
+ var gend = VARS.genders;
for(var i=0; i<gend.length; i++) // l10n /_gender_.+/
gend[i] = [ gend[i], mt('_gender_'+gend[i]) ];
- var bloodt = blood_types;
+ var bloodt = VARS.blood_types;
for(var i=0; i<bloodt.length; i++) // l10n /_bloodt_.+/
bloodt[i] = [ bloodt[i], bloodt[i] == 'unknown' ? mt('_unknown') : mt('_bloodt_'+bloodt[i]) ];
- var roles = char_roles;
+ var roles = VARS.char_roles;
for(var i=0; i<roles.length; i++) // l10n /_charrole_.+/
roles[i] = [ roles[i], mt('_charrole_'+roles[i]) ];
@@ -479,27 +479,27 @@ function filChars() {
}
function filReleases() {
- var types = release_types;
+ var types = VARS.release_types;
for(var i=0; i<types.length; i++) // l10n /_rtype_.+/
types[i] = [ types[i], mt('_rtype_'+types[i]) ];
- var ages = age_ratings;
+ var ages = VARS.age_ratings;
for(var i=0; i<ages.length; i++)
ages[i] = [ ages[i], ages[i] == -1 ? mt('_unknown') : ages[i] == 0 ? mt('_minage_all') : mt('_minage_age', ages[i]) ];
- var lang = languages;
+ var lang = VARS.languages;
for(var i=0; i<lang.length; i++) // l10n /_lang_.+/
lang[i] = [ lang[i], mt('_lang_'+lang[i]) ];
- var plat = platforms;
+ var plat = VARS.platforms;
for(var i=0; i<plat.length; i++) // l10n /_plat_.+/
plat[i] = [ plat[i], mt('_plat_'+plat[i]) ];
plat.splice(0, 0, [ 'unk', mt('_unknown') ]);
- var med = media;
+ var med = VARS.media;
for(var i=0; i<med.length; i++) // l10n /_med_.+/
med[i] = [ med[i], mt('_med_'+med[i]) ];
med.splice(0, 0, [ 'unk', mt('_unknown') ]);
- var voi = voiced;
+ var voi = VARS.voiced;
for(var i=0; i<voi.length; i++) // l10n /_voiced_.+/
voi[i] = [ voi[i], voi[i] == 0 ? mt('_unknown') : mt('_voiced_'+voi[i]) ];
- var ani = animated;
+ var ani = VARS.animated;
for(var i=0; i<ani.length; i++) // l10n /_animated_.+/
ani[i] = [ ani[i], ani[i] == 0 ? mt('_unknown') : mt('_animated_'+ani[i]) ];
return [
@@ -516,7 +516,7 @@ function filReleases() {
[ mt('_rbrowse_minage'), filFSelect('minage', mt('_rbrowse_minage'), 15, ages) ],
[ mt('_rbrowse_language'), filFSelect('lang', mt('_rbrowse_language'), 20, lang) ],
[ mt('_rbrowse_olang'), filFSelect('olang', mt('_rbrowse_olang'), 20, lang) ],
- [ mt('_rbrowse_resolution'), filFSelect('resolution', mt('_rbrowse_resolution'), 15, resolutions) ],
+ [ mt('_rbrowse_resolution'), filFSelect('resolution', mt('_rbrowse_resolution'), 15, VARS.resolutions) ],
[ mt('_rbrowse_platform'), filFSelect('plat', mt('_rbrowse_platform'), 20, plat) ],
[ mt('_rbrowse_medium'), filFSelect('med', mt('_rbrowse_medium'), 10, med) ],
[ mt('_rbrowse_voiced'), filFSelect('voiced', mt('_rbrowse_voiced'), 5, voi) ],
@@ -528,13 +528,13 @@ function filReleases() {
}
function filVN() {
- var lang = languages;
+ var lang = VARS.languages;
for(var i=0; i<lang.length; i++) // l10n /_lang_.+/
lang[i] = [ lang[i], mt('_lang_'+lang[i]) ];
- var plat = platforms;
+ var plat = VARS.platforms;
for(var i=0; i<plat.length; i++) // l10n /_plat_.+/
plat[i] = [ plat[i], mt('_plat_'+plat[i]) ];
- var len = vn_lengths;
+ var len = VARS.vn_lengths;
for(var i=0; i<len.length; i++) // l10n /_vnlength_.+/
len[i] = [ len[i], len[i] == 0 ? mt('_unknown') : mt('_vnlength_'+len[i]) ];
@@ -575,12 +575,12 @@ function filStaff() {
['f', mt('_gender_f')],
];
var roles = [];
- for(var i=0; i<staff_roles.length; i++) { // l10n /_credit_.+/
- if(staff_roles[i] == 'staff') {
+ for(var i=0; i<VARS.staff_roles.length; i++) { // l10n /_credit_.+/
+ if(VARS.staff_roles[i] == 'staff') {
roles.push(['seiyuu', mt('_credit_seiyuu')]);
roles.push(['staff', mt('_credit_other')]);
} else
- roles.push([ staff_roles[i], mt('_credit_'+staff_roles[i]) ]);
+ roles.push([ VARS.staff_roles[i], mt('_credit_'+VARS.staff_roles[i]) ]);
}
return [
mt('_sbrowse_fil_title'),
diff --git a/data/js/lib.js b/data/js/lib.js
index 5919b102..650f4713 100644
--- a/data/js/lib.js
+++ b/data/js/lib.js
@@ -27,11 +27,11 @@ function ajax(url, func, async) {
function setCookie(n,v) {
var date = new Date();
date.setTime(date.getTime()+(365*24*60*60*1000));
- document.cookie = cookie_prefix+n+'='+v+'; expires='+date.toGMTString()+'; path=/';
+ document.cookie = VARS.cookie_prefix+n+'='+v+'; expires='+date.toGMTString()+'; path=/';
}
function getCookie(n) {
var l = document.cookie.split(';');
- n = cookie_prefix+n;
+ n = VARS.cookie_prefix+n;
for(var i=0; i<l.length; i++) {
var c = l[i];
while(c.charAt(0) == ' ')
@@ -169,10 +169,10 @@ function shorten(v, l) {
/* maketext function, less powerful than the Perl equivalent:
* - Only supports [_n], ~[, ~]
* - When it finds [quant,_n,..], it will only return the first argument (and doesn't support ~ in an argument)
- * assumes that a TL structure called 'L10N_STR' is defined in the header of this file */
+ */
function mt() {
var key = arguments[0];
- var val = L10N_STR[key] ? L10N_STR[key] : key;
+ var val = VARS.l10n_str[key] ? VARS.l10n_str[key] : key;
for(var i=1; i<arguments.length; i++) {
var expr = '[_'+i+']';
while(val.indexOf(expr) >= 0)
diff --git a/data/js/main.js b/data/js/main.js
index 0304da5a..e1ea13e6 100644
--- a/data/js/main.js
+++ b/data/js/main.js
@@ -48,6 +48,7 @@
* sal -> Staff aliases editor
*/
+VARS = /*VARS*/;
// Reusable library functions
//include lib.js
diff --git a/data/js/misc.js b/data/js/misc.js
index a43853f1..ef18fe90 100644
--- a/data/js/misc.js
+++ b/data/js/misc.js
@@ -248,8 +248,8 @@ if(byId('lang_select')) {
var curlang = byName(d, 'acronym')[0].className.substr(11, 2);
ddInit(d, 'bottom', function(lnk) {
var lst = tag('ul', null);
- for(var i=0; i<L10N_LANG.length; i++) {
- var ln = L10N_LANG[i];
+ for(var i=0; i<VARS.l10n_lang.length; i++) {
+ var ln = VARS.l10n_lang[i];
var icon = tag('acronym', {'class':'icons lang '+ln[0]}, ' ');
lst.appendChild(tag('li', {'class':'lang_selector'}, curlang == ln[0]
? tag('i', icon, mt('_lang_'+ln[0]))
diff --git a/data/js/vnreldropdown.js b/data/js/vnreldropdown.js
index f3065dd6..8d7a9fef 100644
--- a/data/js/vnreldropdown.js
+++ b/data/js/vnreldropdown.js
@@ -5,12 +5,12 @@ function rlDropDown(lnk) {
return null;
var o = tag('ul', null);
- for(var i=0; i<rlist_status.length; i++) {
- var val = rlist_status[i] == 0 ? mt('_unknown') : mt('_rlist_status_'+rlist_status[i]); // l10n /_rlist_status_\d+/
+ for(var i=0; i<VARS.rlist_status.length; i++) {
+ var val = VARS.rlist_status[i] == 0 ? mt('_unknown') : mt('_rlist_status_'+VARS.rlist_status[i]); // l10n /_rlist_status_\d+/
if(st == val)
o.appendChild(tag('li', tag('i', val)));
else
- o.appendChild(tag('li', tag('a', {href:'#', rl_rid:relid, rl_act:rlist_status[i], onclick:rlMod}, val)));
+ o.appendChild(tag('li', tag('a', {href:'#', rl_rid:relid, rl_act:VARS.rlist_status[i], onclick:rlMod}, val)));
}
if(st != '--')
o.appendChild(tag('li', tag('a', {href:'#', rl_rid:relid, rl_act:-1, onclick:rlMod}, mt('_vnpage_uopt_reldel'))));
diff --git a/data/js/vnscr.js b/data/js/vnscr.js
index 7d4a2146..3855ab45 100644
--- a/data/js/vnscr.js
+++ b/data/js/vnscr.js
@@ -90,13 +90,13 @@ function scrSet(tr, width, height) {
var odd = true;
if(dim == '256x384') // special-case NDS resolution (not in the DB)
odd = false;
- for(var j=0; j<resolutions.length && odd; j++) {
- if(typeof resolutions[j][1] != 'object') {
- if(resolutions[j][0] == dim)
+ for(var j=0; j<VARS.resolutions.length && odd; j++) {
+ if(typeof VARS.resolutions[j][1] != 'object') {
+ if(VARS.resolutions[j][0] == dim)
odd = false;
} else {
- for(var k=1; k<resolutions[j].length; k++)
- if(resolutions[j][k][1] == dim)
+ for(var k=1; k<VARS.resolutions[j].length; k++)
+ if(VARS.resolutions[j][k][1] == dim)
odd = false;
}
}
diff --git a/data/js/vnstaff.js b/data/js/vnstaff.js
index 3ee610e3..11542a81 100644
--- a/data/js/vnstaff.js
+++ b/data/js/vnstaff.js
@@ -25,9 +25,9 @@ function vnsAdd(staff, role, note) {
var tbl = byId('credits_tbl');
var rlist = tag('select', {onchange:vnsSerialize});
- for (var i = 0; i < staff_roles.length; i++) // l10n /^_credit_/
- rlist.appendChild(tag('option', {value:staff_roles[i], selected:staff_roles[i]==role},
- mt('_credit_'+staff_roles[i])));
+ for (var i = 0; i < VARS.staff_roles.length; i++) // l10n /^_credit_/
+ rlist.appendChild(tag('option', {value:VARS.staff_roles[i], selected:VARS.staff_roles[i]==role},
+ mt('_credit_'+VARS.staff_roles[i])));
tbl.appendChild(tag('tr', {id:'vns_a'+staff.aid},
tag('td', {'class':'tc_name'},
diff --git a/util/jsgen.pl b/util/jsgen.pl
index 1a003aea..d8095839 100755
--- a/util/jsgen.pl
+++ b/util/jsgen.pl
@@ -6,6 +6,7 @@ use strict;
use warnings;
use Encode 'encode_utf8';
use Cwd 'abs_path';
+use JSON::XS;
eval { require JavaScript::Minifier::XS; };
our($ROOT, %S, %O);
@@ -55,45 +56,62 @@ sub l10n {
}
#eg;
- # generate header
- my $r = "L10N_STR = {\n";
- my $first = 1;
+ my %keys;
for my $key (sort keys %{$lang{$lang}}) {
next if !grep $key =~ /$_/, @keys;
- $r .= ",\n" if !$first;
- $first = 0;
my $val = $lang{$lang}{$key} || $lang{'en'}{$key};
$val =~ s/"/\\"/g;
$val =~ s/\n/\\n/g;
$val =~ s/\[index,.+$// if $key =~ /^_vnlength_/; # special casing the VN lengths, since the JS mt() doesn't handle [index]
- $r .= sprintf qq| %s: "%s"|, $key !~ /^[a-z0-9_]+$/ ? "'$key'" : $key, $val;
+ $keys{$key} = $val;
}
- $r .= "\n};";
- return ("$r\n", $js);
+ (\%keys, $js);
}
# screen resolution information, suitable for usage in filFSelect()
sub resolutions {
my $ln = shift;
- my $res_cat = '';
- my $resolutions = '';
- my $comma = 0;
+ my $cat = '';
+ my @r;
+ my $push = \@r;
for my $i (0..$#{$S{resolutions}}) {
my $r = $S{resolutions}[$i];
- if($res_cat ne $r->[1]) {
- my $cat = $r->[1] =~ /^_/ ? $lang{$ln}{$r->[1]}||$lang{'en'}{$r->[1]} : $r->[1];
- $resolutions .= ']' if $res_cat;
- $resolutions .= ",['$cat',";
- $res_cat = $r->[1];
- $comma = 0;
+ if($cat ne $r->[1]) {
+ push @r, [$r->[1] =~ /^_/ ? $lang{$ln}{$r->[1]}||$lang{'en'}{$r->[1]} : $r->[1]];
+ $cat = $r->[1];
+ $push = $r[$#r];
}
my $n = $r->[0] =~ /^_/ ? $lang{$ln}{$r->[0]}||$lang{'en'}{$r->[0]} : $r->[0];
- $resolutions .= ($comma ? ',' : '')."[$i,'$n']";
- $comma = 1;
+ push @$push, [$i, $n];
}
- $resolutions .= ']' if $res_cat;
- return "resolutions = [ $resolutions ];\n";
+ \@r
+}
+
+
+sub vars {
+ my($lang, $l10n) = @_;
+ my %vars = (
+ rlist_status => $S{rlist_status},
+ cookie_prefix => $O{cookie_prefix},
+ age_ratings => $S{age_ratings},
+ languages => $S{languages},
+ platforms => $S{platforms},
+ char_roles => $S{char_roles},
+ media => [sort keys %{$S{media}}],
+ release_types => $S{release_types},
+ animated => $S{animated},
+ voiced => $S{voiced},
+ vn_lengths => $S{vn_lengths},
+ blood_types => $S{blood_types},
+ genders => $S{genders},
+ char_roles => $S{char_roles},
+ staff_roles => $S{staff_roles},
+ resolutions => scalar resolutions($lang),
+ l10n_lang => [ map [ $_, $lang{$_}{"_lang_$_"}||$lang{en}{"_lang_$_"} ], VNDB::L10N::languages() ],
+ l10n_str => $l10n,
+ );
+ JSON::XS->new->encode(\%vars);
}
@@ -110,39 +128,19 @@ sub readjs {
sub jsgen {
- l10n_load();
- my $common = '';
- $common .= sprintf "rlist_status = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{rlist_status}};
- $common .= sprintf "cookie_prefix = '%s';\n", $O{cookie_prefix};
- $common .= sprintf "age_ratings = [ %s ];\n", join ',', @{$S{age_ratings}};
- $common .= sprintf "languages = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{languages}};
- $common .= sprintf "platforms = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{platforms}};
- $common .= sprintf "char_roles = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{char_roles}};
- $common .= sprintf "media = [ %s ];\n", join ', ', map qq{"$_"}, sort keys %{$S{media}};
- $common .= sprintf "release_types = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{release_types}};
- $common .= sprintf "animated = [ %s ];\n", join ', ', @{$S{animated}};
- $common .= sprintf "voiced = [ %s ];\n", join ', ', @{$S{voiced}};
- $common .= sprintf "vn_lengths = [ %s ];\n", join ', ', @{$S{vn_lengths}};
- $common .= sprintf "blood_types = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{blood_types}};
- $common .= sprintf "genders = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{genders}};
- $common .= sprintf "char_roles = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{char_roles}};
- $common .= sprintf "staff_roles = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{staff_roles}};
- $common .= sprintf "L10N_LANG = [ %s ];\n", join(', ', map
- sprintf('["%s","%s"]', $_, $lang{$_}{"_lang_$_"}||$lang{en}{"_lang_$_"}),
- VNDB::L10N::languages());
-
my $js = readjs 'main.js';
for my $l (VNDB::L10N::languages()) {
- my($head, $body) = l10n($l, $js);
- $head .= resolutions($l);
+ my($l10n, $body) = l10n($l, $js);
+ $body =~ s{/\*VARS\*/}{vars($l, $l10n)}eg;
+
# JavaScript::Minifier::XS doesn't correctly handle perl's unicode, so manually encode
- my $content = encode_utf8($head . $common . $body);
+ my $content = encode_utf8($body);
open my $NEWJS, '>', "$ROOT/static/f/js/$l.js" or die $!;
print $NEWJS $JavaScript::Minifier::XS::VERSION ? JavaScript::Minifier::XS::minify($content) : $content;
close $NEWJS;
}
}
+l10n_load;
jsgen;
-