summaryrefslogtreecommitdiff
path: root/util/jsgen.pl
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2010-11-25 17:22:58 +0100
committerYorhel <git@yorhel.nl>2010-11-25 17:38:16 +0100
commit625871cba8a2fe71c70b3d2946a5f37993d1f263 (patch)
tree1288db3b6ea43467251a6039a26e861326f0babe /util/jsgen.pl
parent7004c8352cda3c81e547aabc037fd9ec7f03172c (diff)
JS: Split script.js into a separate file for each language
This greatly reduces the size of the Javascript file. The compressed size has been reduced with about 9kB, and is now a total of 14kB for en.js. A nice property of this is that more translations can be added without increasing the JS size. While I was at it, I made jsgen.pl also replace mt() function calls in cases where an exact TL string was requested without any additional arguments and/or formatting codes. This helped reduce the compressed size by about 1kB. My aim is to keep *all* the JS code of VNDB smaller than the jQuery core library, as a general "fuck you" towards users of large and bloated JS libraries. We must keep the VNDB page loading times lower than that of other sites, after all!
Diffstat (limited to 'util/jsgen.pl')
-rwxr-xr-xutil/jsgen.pl117
1 files changed, 62 insertions, 55 deletions
diff --git a/util/jsgen.pl b/util/jsgen.pl
index 4d82bc95..fd216d7e 100755
--- a/util/jsgen.pl
+++ b/util/jsgen.pl
@@ -22,57 +22,57 @@ use LangFile;
use VNDB::L10N;
-sub l10n {
- # parse the .js code to find the l10n keys to use
- my $js = shift;
- my @keys;
- push @keys, $1 ? quotemeta($1) : qr/$2/ while($js =~ m{(?:mt\('([a-z0-9_]+)'[,\)]|l10n /([^/]+)/)}g);
- # also add the _lang_* for all languages for which we have a translation
- my $jskeys_lang = join '|', VNDB::L10N::languages();
- push @keys, qr/_lang_(?:$jskeys_lang)/;
- # fetch the corresponding text from lang.txt
- my %lang; # key1 => { lang1 => .., lang2 => .. }, key2 => { .. }
+my %lang; # lang1 => { key1 => .., key22 => .. }, lang2 => { .. }
+
+sub l10n_load {
+ # fetch all text from lang.txt
my $lang = LangFile->new(read => "$ROOT/data/lang.txt");
- my $cur; # 0 = none/excluded, 1 = TL lines
my $key;
while((my $l = $lang->read())) {
my $type = shift @$l;
- if($type eq 'key') {
- my $k = shift @$l;
- $cur = grep $k =~ /$_/, @keys;
- $key = $k;
- }
- if($type eq 'tl' && $cur) {
- my($lang, $sync, $val) = @$l;
- next if !$val;
- $lang{$key}{$lang} = $val;
- }
+ $key = shift @$l if $type eq 'key';
+ $lang{$l->[0]}{$key} = $l->[2] if $type eq 'tl';
}
+}
+
+
+sub l10n {
+ my($lang, $js) = @_;
- # generate JS code
+ # parse the .js code and replace mt()'s that can be modified in-place, otherwise add to the @keys
+ my @keys;
+ $js =~ s{(?:mt\('([a-z0-9_]+)'([,\)])|l10n /([^/]+)/)}#
+ my($k, $s, $q) = ($1, $2, $3);
+ my $v = $k ? $lang{$lang}{$k} || $lang{'en'}{$k} : '';
+ if($q) { $q ne '<perl regex>' && push @keys, qr/$q/; '' }
+ elsif($s eq ')' && $v && $v !~ /[\~\[\]]/) {
+ $v =~ s/"/\\"/g;
+ $v =~ s/\n/\\n/g;
+ qq{"$v"}
+ } else {
+ push @keys, quotemeta($k);
+ "mt('$k'$s"
+ }
+ #eg;
+ # also add the _lang_* for all languages for which we have a translation
+ my $jskeys_lang = join '|', VNDB::L10N::languages();
+ push @keys, qr/_lang_(?:$jskeys_lang)/;
+
+ # generate header
my $r = "L10N_STR = {\n";
my $first = 1;
- for my $key (sort keys %lang) {
+ for my $key (sort keys %{$lang{$lang}}) {
+ next if !grep $key =~ /$_/, @keys;
$r .= ",\n" if !$first;
$first = 0;
- $r .= sprintf qq| %s: {\n|, $key !~ /^[a-z0-9_]+$/ ? "'$key'" : $key;;
- my $firstk = 1;
- for (sort keys %{$lang{$key}}) {
- $r .= ",\n" if !$firstk;
- $firstk = 0;
- my $lang = $_;
- $lang = qq{"$lang"} if $lang =~ /^(?:as|do|if|in|is)$/; # reserved two-char words
- my $val = $lang{$key}{$_};
- $val =~ s/"/\\"/g;
- $val =~ s/\n/\\n/g;
- $r .= sprintf qq| %s: "%s"|, $lang, $val;
- }
- $r .= "\n }";
+ my $val = $lang{$lang}{$key} || $lang{'en'}{$key};
+ $val =~ s/"/\\"/g;
+ $val =~ s/\n/\\n/g;
+ $r .= sprintf qq| %s: "%s"|, $key !~ /^[a-z0-9_]+$/ ? "'$key'" : $key, $val;
}
- $r .= "\n};\n";
- $r .= 'L10N_LANG = [ '.join(', ', map qq{"$_"}, VNDB::L10N::languages()).' ];';
- return "$r\n";
+ $r .= "\n};";
+ return ("$r\n", $js);
}
@@ -98,24 +98,31 @@ sub resolutions {
sub jsgen {
- # JavaScript::Minifier::XS doesn't correctly handle perl's unicode,
- # so just do everything in raw bytes instead.
- open my $JS, '<', "$ROOT/data/script.js" or die $!;
+ l10n_load();
+ my $common = '';
+ $common .= resolutions();
+ $common .= sprintf "rlst_rstat = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{rlst_rstat}};
+ $common .= sprintf "rlst_vstat = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{rlst_vstat}};
+ $common .= sprintf "cookie_prefix = '%s';\n", $S{cookie_prefix};
+ $common .= sprintf "age_ratings = [ %s ];\n", join ',', map !defined $_ ? -1 : $_, @{$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 "media = [ %s ];\n", join ', ', map qq{"$_"}, sort keys %{$S{media}};
+ $common .= sprintf "release_types = [ %s ];\n", join ', ', map qq{"$_"}, sort @{$S{release_types}};
+ $common .= sprintf "L10N_LANG = [ %s ];\n", join(', ', map qq{"$_"}, VNDB::L10N::languages());
+
+ open my $JS, '<:utf8', "$ROOT/data/script.js" or die $!;
my $js .= join '', <$JS>;
close $JS;
- my $head = encode_utf8(l10n($js)) . "\n";
- $head .= sprintf "rlst_rstat = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{rlst_rstat}};
- $head .= sprintf "rlst_vstat = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{rlst_vstat}};
- $head .= sprintf "cookie_prefix = '%s';\n", $S{cookie_prefix};
- $head .= sprintf "age_ratings = [ %s ];\n", join ',', map !defined $_ ? -1 : $_, @{$S{age_ratings}};
- $head .= sprintf "languages = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{languages}};
- $head .= sprintf "platforms = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{platforms}};
- $head .= sprintf "media = [ %s ];\n", join ', ', map qq{"$_"}, sort keys %{$S{media}};
- $head .= sprintf "release_types = [ %s ];\n", join ', ', map qq{"$_"}, sort @{$S{release_types}};
- $head .= resolutions();
- open my $NEWJS, '>', "$ROOT/static/f/script.js" or die $!;
- print $NEWJS $JavaScript::Minifier::XS::VERSION ? JavaScript::Minifier::XS::minify($head.$js) : $head.$js;
- close $NEWJS;
+
+ for my $l (VNDB::L10N::languages()) {
+ my($head, $body) = l10n($l, $js);
+ # JavaScript::Minifier::XS doesn't correctly handle perl's unicode, so manually encode
+ my $content = encode_utf8($head . $common . $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;
+ }
}
jsgen;