diff options
author | Yorhel <git@yorhel.nl> | 2015-08-10 02:57:06 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2015-08-10 02:58:48 +0200 |
commit | 87aa6dfecae8f0319f6244646fb14c6ff9f9a0dc (patch) | |
tree | 1506ca78a3cbad7027a2c6386a13dd2eb2a44ca9 | |
parent | eabd513285a111442a11f7e62a53a48eb8931054 (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-- | README | 2 | ||||
-rw-r--r-- | data/js/charvns.js | 4 | ||||
-rw-r--r-- | data/js/filter.js | 34 | ||||
-rw-r--r-- | data/js/lib.js | 8 | ||||
-rw-r--r-- | data/js/main.js | 1 | ||||
-rw-r--r-- | data/js/misc.js | 4 | ||||
-rw-r--r-- | data/js/vnreldropdown.js | 6 | ||||
-rw-r--r-- | data/js/vnscr.js | 10 | ||||
-rw-r--r-- | data/js/vnstaff.js | 6 | ||||
-rwxr-xr-x | util/jsgen.pl | 90 |
10 files changed, 83 insertions, 82 deletions
@@ -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; - |