diff options
-rw-r--r-- | README | 21 | ||||
-rw-r--r-- | data/global.pl | 77 | ||||
-rw-r--r-- | lib/Multi/RG.pm | 12 | ||||
-rw-r--r-- | lib/VNDB/Handler/Producers.pm | 17 | ||||
-rw-r--r-- | lib/VNDB/Handler/Releases.pm | 2 | ||||
-rw-r--r-- | lib/VNDB/Handler/Staff.pm | 2 | ||||
-rw-r--r-- | lib/VNDB/Handler/Tags.pm | 4 | ||||
-rw-r--r-- | lib/VNDB/Handler/Users.pm | 2 | ||||
-rw-r--r-- | lib/VNDB/Handler/VNEdit.pm | 6 | ||||
-rw-r--r-- | lib/VNDB/Handler/VNPage.pm | 6 | ||||
-rwxr-xr-x | util/jsgen.pl | 6 |
11 files changed, 80 insertions, 75 deletions
@@ -23,27 +23,25 @@ Requirements (perl 5.20 core modules are not listed.) - util/vndb.pl: - Algorithm::Diff::XS - DBI - DBD::Pg - Crypt::URandom + General: Crypt::ScryptKDF + Crypt::URandom + DBD::Pg + DBI Image::Magick JSON::XS + Tie::IxHash + + util/vndb.pl: + Algorithm::Diff::XS TUWF FCGI (optional, for running as a FastCGI script) PerlIO::gzip (optional, for output compression) util/multi.pl: - API: - Crypt::ScryptKDF - JSON::XS APIDump: - JSON::XS PerlIO::gzip Core: - DBI AnyEvent AnyEvent::Pg IRC: @@ -55,16 +53,13 @@ Requirements graphviz (/usr/bin/dot is used by default) util/skingen.pl - Image::Magick CSS::Minifier::XS (optional, minimizes CSS output) util/jsgen.pl - JSON::XS JavaScript::Minifier::XS (optional, minimizes JS output) uglifyjs (optional, slower but better JS compression) util/spritegen.pl - Image::Magick pngcrush (optional) diff --git a/data/global.pl b/data/global.pl index 659f9c59..b03d0dfb 100644 --- a/data/global.pl +++ b/data/global.pl @@ -2,6 +2,15 @@ package VNDB; use utf8; +use strict; +use warnings; +use Tie::IxHash; + +our $ROOT; + +# Convenient wrapper to create an ordered hash +sub ordhash { my %x; tie %x, 'Tie::IxHash', @_; \%x } + # options for TUWF our %O = ( @@ -19,7 +28,7 @@ our %O = ( # VNDB-specific options (object_data) our %S; %S = (%S, - version => `cd $VNDB::ROOT; git describe` =~ /^(.+)$/ && $1, + version => `cd $ROOT; git describe` =~ /^(.+)$/ && $1, url => 'http://vndb.org', # Only used by Multi, web pages infer their own address url_static => 'http://s.vndb.org', skin_default => 'angel', @@ -37,7 +46,7 @@ our %S; permissions => {qw| board 1 boardmod 2 edit 4 tag 16 dbmod 32 tagmod 64 usermod 128 affiliate 256 |}, default_perm => 1+4+16, # Keep synchronised with the default value of users.perm default_tags_cat=> 'cont,tech', - languages => {grep !/^ *$/, split /[\s\r\n]*([^ ]+) +(.+)/, q{ + languages => ordhash(grep !/^ *$/, split /[\s\r\n]*([^ ]+) +(.+)/, q{ ar Arabic ca Catalan cs Czech @@ -66,12 +75,12 @@ our %S; uk Ukrainian vi Vietnamese zh Chinese - }}, - producer_types => { + }), + producer_types => ordhash( co => 'Company', in => 'Individual', ng => 'Amateur group', - }, + ), discussion_boards => [qw|an db ge v p u|], # <- note that some properties of these boards are hard-coded vn_lengths => [ # name time examples @@ -92,33 +101,33 @@ our %S; mv => 'Music Video', }, board_edit_time => 7*24*3600, - vn_relations => { - # id => [ order, reverse, txt ] - seq => [ 0, 'preq', 'Sequel' ], - preq => [ 1, 'seq', 'Prequel' ], - set => [ 2, 'set', 'Same setting' ], - alt => [ 3, 'alt', 'Alternative version' ], - char => [ 4, 'char', 'Shares characters' ], - side => [ 5, 'par', 'Side story' ], - par => [ 6, 'side', 'Parent story' ], - ser => [ 7, 'ser', 'Same series' ], - fan => [ 8, 'orig', 'Fandisc' ], - orig => [ 9, 'fan', 'Original game' ], - }, - prod_relations => { - 'old' => [ 0, 'new', 'Formerly' ], - 'new' => [ 1, 'old', 'Succeeded by' ], - 'spa' => [ 2, 'ori', 'Subsidiary' ], - 'ori' => [ 3, 'spa', 'Parent producer' ], - 'sub' => [ 4, 'par', 'Imprint' ], - 'par' => [ 5, 'sub', 'Parent brand' ], - 'imp' => [ 6, 'ipa', 'Spawned' ], - 'ipa' => [ 7, 'imp', 'Originated from' ], - }, + vn_relations => ordhash( + # id => [ reverse, txt ] + seq => [ 'preq', 'Sequel' ], + preq => [ 'seq', 'Prequel' ], + set => [ 'set', 'Same setting' ], + alt => [ 'alt', 'Alternative version' ], + char => [ 'char', 'Shares characters' ], + side => [ 'par', 'Side story' ], + par => [ 'side', 'Parent story' ], + ser => [ 'ser', 'Same series' ], + fan => [ 'orig', 'Fandisc' ], + orig => [ 'fan', 'Original game' ], + ), + prod_relations => ordhash( + 'old' => [ 'new', 'Formerly' ], + 'new' => [ 'old', 'Succeeded by' ], + 'spa' => [ 'ori', 'Subsidiary' ], + 'ori' => [ 'spa', 'Parent producer' ], + 'sub' => [ 'par', 'Imprint' ], + 'par' => [ 'sub', 'Parent brand' ], + 'imp' => [ 'ipa', 'Spawned' ], + 'ipa' => [ 'imp', 'Originated from' ], + ), age_ratings => [-1, 0, 6..18], release_types => [qw|complete partial trial|], # The 'unk' platform and medium are reserved for "unknown". - platforms => {grep !/^ *$/, split /[\s\r\n]*([^ ]+) +(.+)/, q{ + platforms => ordhash(grep !/^ *$/, split /[\s\r\n]*([^ ]+) +(.+)/, q{ win Windows dos DOS lin Linux @@ -154,8 +163,8 @@ our %S; xbo Xbox One web Website oth Other - }}, - media => { + }), + media => ordhash( #DB qty txt plural (if qty) cd => [ 1, 'CD', 'CDs' ], dvd => [ 1, 'DVD', 'DVDs' ], @@ -168,7 +177,7 @@ our %S; nod => [ 1, 'Nintendo Optical Disc', 'Nintendo Optical Discs' ], in => [ 0, 'Internet download', '' ], otc => [ 0, 'Other', '' ], - }, + ), resolutions => [ [ 'Unknown / console / handheld', '' ], [ 'Non-standard', '' ], @@ -186,11 +195,11 @@ our %S; [ '1280x800', 'widescreen' ], [ '1920x1080', 'widescreen' ], ], - tag_categories => { + tag_categories => ordhash( cont => 'Content', ero => 'Sexual content', tech => 'Technical', - }, + ), # The voiced, animated, and *_status fields are stored in the database by their (numeric) index. voiced => [ 'Unknown', 'Not voiced', 'Only ero scenes voiced', 'Partially voiced', 'Fully voiced' ], animated => [ 'Unknown', 'No animations', 'Simple animations', 'Some fully animated scenes', 'All scenes fully animated' ], diff --git a/lib/Multi/RG.pm b/lib/Multi/RG.pm index 401b5e70..b325cd07 100644 --- a/lib/Multi/RG.pm +++ b/lib/Multi/RG.pm @@ -86,7 +86,7 @@ sub getrel { # id, res, time my($xid, $xrel, $xoff) = @$_; $xoff = 0 if $xoff && $xoff =~ /^f/; - $C{rels}{$id.'-'.$xid} = [ $VNDB::S{ $C{type} eq 'v' ? 'vn_relations' : 'prod_relations' }{$xrel}[1], $xoff ] if $id < $xid; + $C{rels}{$id.'-'.$xid} = [ $VNDB::S{ $C{type} eq 'v' ? 'vn_relations' : 'prod_relations' }{$xrel}[0], $xoff ] if $id < $xid; $C{rels}{$xid.'-'.$id} = [ $xrel, $xoff ] if $id > $xid; # New node? Get its relations too. @@ -179,10 +179,10 @@ sub gv_vnrels { # [older game] -> [newer game] if($_->[5] > $_->[4]) { ($_->[0], $_->[1]) = ($_->[1], $_->[0]); - $_->[2] = $VNDB::S{vn_relations}{$_->[2]}[1]; + $_->[2] = $VNDB::S{vn_relations}{$_->[2]}[0]; } - my $rel = $VNDB::S{vn_relations}{$_->[2]}[2]; - my $rev = $VNDB::S{vn_relations}{ $VNDB::S{vn_relations}{$_->[2]}[1] }[2]; + my $rel = $VNDB::S{vn_relations}{$_->[2]}[1]; + my $rev = $VNDB::S{vn_relations}{ $VNDB::S{vn_relations}{$_->[2]}[0] }[1]; my $style = $_->[3] ? '' : ', style="dotted"'; my $label = $rev ne $rel ? qq|headlabel = "$rel" taillabel = "${rev}" $style| @@ -226,8 +226,8 @@ sub gv_prodrels { my $p1 = $prods->{$1}; my $p2 = $prods->{$2}; - my $rel = $VNDB::S{prod_relations}{$rels->{$_}[0]}[2]; - my $rev = $VNDB::S{prod_relations}{ $VNDB::S{prod_relations}{$rels->{$_}[0]}[1] }[2]; + my $rel = $VNDB::S{prod_relations}{$rels->{$_}[0]}[1]; + my $rev = $VNDB::S{prod_relations}{ $VNDB::S{prod_relations}{$rels->{$_}[0]}[0] }[1]; my $label = $rev ne $rel ? qq|headlabel = "$rev", taillabel = "$rel"| : qq|label = "$rel"|; diff --git a/lib/VNDB/Handler/Producers.pm b/lib/VNDB/Handler/Producers.pm index 29c68d2d..13dd40b0 100644 --- a/lib/VNDB/Handler/Producers.pm +++ b/lib/VNDB/Handler/Producers.pm @@ -68,7 +68,7 @@ sub page { [ desc => diff => qr/[ ,\n\.]/ ], [ relations => join => '<br />', split => sub { my @r = map sprintf('%s: <a href="/p%d" title="%s">%s</a>', - $self->{prod_relations}{$_->{relation}}[2], $_->{id}, xml_escape($_->{original}||$_->{name}), xml_escape shorten $_->{name}, 40 + $self->{prod_relations}{$_->{relation}}[1], $_->{id}, xml_escape($_->{original}||$_->{name}), xml_escape shorten $_->{name}, 40 ), sort { $a->{id} <=> $b->{id} } @{$_[0]}; return @r ? @r : (mt '_revision_empty'); }], @@ -100,8 +100,9 @@ sub page { for (sort { $a->{name} cmp $b->{name} } @{$p->{relations}}); p class => 'center'; br; - for my $r (sort { $self->{prod_relations}{$a}[0] <=> $self->{prod_relations}{$b}[0] } keys %rel) { - txt $self->{prod_relations}{$r}[2].': '; + for my $r (keys %{$self->{prod_relations}}) { + next if !$rel{$r}; + txt $self->{prod_relations}{$r}[1].': '; for (@{$rel{$r}}) { a href => "/p$_->{id}", title => $_->{original}||$_->{name}, shorten $_->{name}, 40; txt ', ' if $_ ne $rel{$r}[$#{$rel{$r}}]; @@ -268,14 +269,14 @@ sub edit { $self->htmlForm({ frm => $frm, action => $pid ? "/p$pid/edit" : '/p/new', editsum => 1 }, 'pedit_geninfo' => [ mt('_pedit_form_generalinfo'), [ select => name => mt('_pedit_form_type'), short => 'type', - options => [ map [ $_, $self->{producer_types}{$_} ], sort keys %{$self->{producer_types}} ] ], + options => [ map [ $_, $self->{producer_types}{$_} ], keys %{$self->{producer_types}} ] ], [ input => name => mt('_pedit_form_name'), short => 'name' ], [ input => name => mt('_pedit_form_original'), short => 'original' ], [ static => content => mt('_pedit_form_original_note') ], [ input => name => mt('_pedit_form_alias'), short => 'alias', width => 400 ], [ static => content => mt('_pedit_form_alias_note') ], [ select => name => mt('_pedit_form_lang'), short => 'lang', - options => [ map [ $_, "$_ ($self->{languages}{$_})" ], sort keys %{$self->{languages}} ] ], + options => [ map [ $_, "$_ ($self->{languages}{$_})" ], keys %{$self->{languages}} ] ], [ input => name => mt('_pedit_form_website'), short => 'website' ], [ input => name => mt('_pedit_form_wikipedia'), short => 'l_wp', pre => 'http://en.wikipedia.org/wiki/' ], [ text => name => mt('_pedit_form_desc').'<br /><b class="standout">'.mt('_inenglish').'</b>', short => 'desc', rows => 6 ], @@ -297,8 +298,8 @@ sub edit { end; td class => 'tc_rel'; Select; - option value => $_, $self->{prod_relations}{$_}[2] - for (sort { $self->{prod_relations}{$a}[0] <=> $self->{prod_relations}{$b}[0] } keys %{$self->{prod_relations}}); + option value => $_, $self->{prod_relations}{$_}[1] + for (keys %{$self->{prod_relations}}); end; end; td class => 'tc_add'; @@ -320,7 +321,7 @@ sub _updreverse { if(exists $$old{$_} and !exists $$new{$_}) { $upd{$_} = undef; } elsif((!exists $$old{$_} and exists $$new{$_}) || ($$old{$_} ne $$new{$_})) { - $upd{$_} = $self->{prod_relations}{$$new{$_}}[1]; + $upd{$_} = $self->{prod_relations}{$$new{$_}}[0]; } } return if !keys %upd; diff --git a/lib/VNDB/Handler/Releases.pm b/lib/VNDB/Handler/Releases.pm index ef639ca1..fd05c069 100644 --- a/lib/VNDB/Handler/Releases.pm +++ b/lib/VNDB/Handler/Releases.pm @@ -388,7 +388,7 @@ sub _form { [ input => short => 'original', name => mt('_redit_form_original'), width => 450 ], [ static => content => mt '_redit_form_original_note' ], [ select => short => 'languages', name => mt('_redit_form_languages'), multi => 1, - options => [ map [ $_, "$_ ($self->{languages}{$_})" ], sort keys %{$self->{languages}} ] ], + options => [ map [ $_, "$_ ($self->{languages}{$_})" ], keys %{$self->{languages}} ] ], [ input => short => 'gtin', name => mt('_redit_form_gtin') ], [ input => short => 'catalog', name => mt('_redit_form_catalog') ], [ input => short => 'website', name => mt('_redit_form_website') ], diff --git a/lib/VNDB/Handler/Staff.pm b/lib/VNDB/Handler/Staff.pm index 5eab1192..178d80cb 100644 --- a/lib/VNDB/Handler/Staff.pm +++ b/lib/VNDB/Handler/Staff.pm @@ -277,7 +277,7 @@ sub edit { [ select => name => mt('_staffe_form_gender'),short => 'gender', options => [ map [ $_, mt("_gender_$_") ], qw(unknown m f) ] ], [ select => name => mt('_staffe_form_lang'), short => 'lang', - options => [ map [ $_, "$_ ($self->{languages}{$_})" ], sort keys %{$self->{languages}} ] ], + options => [ map [ $_, "$_ ($self->{languages}{$_})" ], keys %{$self->{languages}} ] ], [ input => name => mt('_staffe_form_site'), short => 'l_site' ], [ input => name => mt('_staffe_form_wikipedia'), short => 'l_wp', pre => 'http://en.wikipedia.org/wiki/' ], [ input => name => mt('_staffe_form_twitter'), short => 'l_twitter' ], diff --git a/lib/VNDB/Handler/Tags.pm b/lib/VNDB/Handler/Tags.pm index 62a72555..3e6a37d1 100644 --- a/lib/VNDB/Handler/Tags.pm +++ b/lib/VNDB/Handler/Tags.pm @@ -235,7 +235,7 @@ sub tagedit { [ static => content => mt '_tagedit_frm_meta_warn' ] : (), ) : (), [ select => short => 'cat', name => mt('_tagedit_frm_cat'), options => [ - map [$_, $self->{tag_categories}{$_}], sort keys %{$self->{tag_categories}} ] ], + map [$_, $self->{tag_categories}{$_}], keys %{$self->{tag_categories}} ] ], $self->authCan('tagmod') && $tag ? ( [ checkbox => short => 'catrec', name => mt '_tagedit_frm_catrec' ], [ static => content => mt '_tagedit_frm_catrec_warn' ], @@ -582,7 +582,7 @@ sub _tagmod_list { my %my = map +($_->{tag} => $_), @$my; - for my $cat (sort keys %{$self->{tag_categories}}) { + for my $cat (keys %{$self->{tag_categories}}) { my @tags = grep $_->{cat} eq $cat, @$tags; next if !@tags; Tr class => 'tagmod_cat'; diff --git a/lib/VNDB/Handler/Users.pm b/lib/VNDB/Handler/Users.pm index d3e6b9b3..e7fd9a4f 100644 --- a/lib/VNDB/Handler/Users.pm +++ b/lib/VNDB/Handler/Users.pm @@ -453,7 +453,7 @@ sub edit { [ check => short => 'traits_sexual', name => mt '_usere_fsextraits' ], [ check => short => 'tags_all', name => mt '_usere_ftags' ], [ select => short => 'tags_cat', name => mt('_usere_tagcats'), multi => 1, size => 3, - options => [ map [ $_, $self->{tag_categories}{$_} ], sort keys %{$self->{tag_categories}} ] ], + options => [ map [ $_, $self->{tag_categories}{$_} ], keys %{$self->{tag_categories}} ] ], [ select => short => 'spoilers', name => mt('_usere_spoilers'), options => [ map [ $_, mt '_spoilset_'.$_ ], 0..2 ] ], [ select => short => 'skin', name => mt('_usere_skin'), width => 300, options => [ map [ $_, $self->{skins}{$_}[0].($self->debug?" [$_]":'') ], sort { $self->{skins}{$a}[0] cmp $self->{skins}{$b}[0] } keys %{$self->{skins}} ] ], diff --git a/lib/VNDB/Handler/VNEdit.pm b/lib/VNDB/Handler/VNEdit.pm index 854bbf46..b906eafa 100644 --- a/lib/VNDB/Handler/VNEdit.pm +++ b/lib/VNDB/Handler/VNEdit.pm @@ -379,8 +379,8 @@ sub _form { input type => 'checkbox', id => 'official', checked => 'checked'; label for => 'official', mt '_vnedit_rel_official'; Select; - option value => $_, $self->{vn_relations}{$_}[2] - for (sort { $self->{vn_relations}{$a}[0] <=> $self->{vn_relations}{$b}[0] } keys %{$self->{vn_relations}}); + option value => $_, $self->{vn_relations}{$_}[1] + for (keys %{$self->{vn_relations}}); end; txt ' '.mt '_vnedit_rel_of'; end; @@ -434,7 +434,7 @@ sub _updreverse { if(exists $$old{$_} and !exists $$new{$_}) { $upd{$_} = undef; } elsif((!exists $$old{$_} and exists $$new{$_}) || ($$old{$_}[0] ne $$new{$_}[0] || !$$old{$_}[1] != !$$new{$_}[1])) { - $upd{$_} = [ $self->{vn_relations}{ $$new{$_}[0] }[1], $$new{$_}[1] ]; + $upd{$_} = [ $self->{vn_relations}{ $$new{$_}[0] }[0], $$new{$_}[1] ]; } } return if !keys %upd; diff --git a/lib/VNDB/Handler/VNPage.pm b/lib/VNDB/Handler/VNPage.pm index 50f21071..82a0599e 100644 --- a/lib/VNDB/Handler/VNPage.pm +++ b/lib/VNDB/Handler/VNPage.pm @@ -442,7 +442,7 @@ sub page { div id => 'tagops'; # NOTE: order of these links is hardcoded in JS my $tags_cat = $self->authPref('tags_cat') || $self->{default_tags_cat}; - a href => "#$_", $tags_cat =~ /\Q$_/ ? (class => 'tsel') : (), lc $self->{tag_categories}{$_} for sort keys %{$self->{tag_categories}}; + a href => "#$_", $tags_cat =~ /\Q$_/ ? (class => 'tsel') : (), lc $self->{tag_categories}{$_} for keys %{$self->{tag_categories}}; my $spoiler = $self->authPref('spoilers') || 0; a href => '#', class => 'sec'.($spoiler == 0 ? ' tsel' : ''), lc mt '_spoilset_0'; a href => '#', $spoiler == 1 ? (class => 'tsel') : (), lc mt '_spoilset_1'; @@ -532,7 +532,7 @@ sub _revision { [ relations => join => '<br />', split => sub { my @r = map sprintf('[%s] %s: <a href="/v%d" title="%s">%s</a>', mt($_->{official} ? '_vndiff_rel_official' : '_vndiff_rel_unofficial'), - $self->{vn_relations}{$_->{relation}}[2], $_->{id}, xml_escape($_->{original}||$_->{title}), xml_escape shorten $_->{title}, 40 + $self->{vn_relations}{$_->{relation}}[1], $_->{id}, xml_escape($_->{original}||$_->{title}), xml_escape shorten $_->{title}, 40 ), sort { $a->{id} <=> $b->{id} } @{$_[0]}; return @r ? @r : (mt '_revision_empty'); }], @@ -615,7 +615,7 @@ sub _relations { td class => 'relations'; dl; for(sort keys %rel) { - dt $self->{vn_relations}{$_}[2]; + dt $self->{vn_relations}{$_}[1]; dd; for (@{$rel{$_}}) { b class => 'grayedout', mt('_vnpage_relations_unofficial').' ' if !$_->{official}; diff --git a/util/jsgen.pl b/util/jsgen.pl index 2e3b5537..412cec0e 100755 --- a/util/jsgen.pl +++ b/util/jsgen.pl @@ -123,10 +123,10 @@ sub vars { rlist_status => $S{rlist_status}, cookie_prefix => $O{cookie_prefix}, age_ratings => [ map [ $_, l10nstr($lang, $_ == -1 ? ('_unknown') : $_ == 0 ? ('_minage_all') : ('_minage_age', $_)) ], @{$S{age_ratings}} ], - languages => [ map [ $_, $S{languages}{$_} ], sort keys %{$S{languages}} ], - platforms => [ map [ $_, $S{platforms}{$_} ], sort keys %{$S{platforms}} ], + languages => [ map [ $_, $S{languages}{$_} ], keys %{$S{languages}} ], + platforms => [ map [ $_, $S{platforms}{$_} ], keys %{$S{platforms}} ], char_roles => [ map [ $_, l10nstr($lang, "_charrole_$_") ], @{$S{char_roles}} ], - media => [ map [ $_, $S{media}{$_}[1], $S{media}{$_}[0] ], sort keys %{$S{media}} ], + media => [ map [ $_, $S{media}{$_}[1], $S{media}{$_}[0] ], keys %{$S{media}} ], release_types => [ map [ $_, ucfirst $_ ], @{$S{release_types}} ], animated => [ map [ $_, $S{animated}[$_] ], 0..$#{$S{animated}} ], voiced => [ map [ $_, $S{voiced}[$_] ], 0..$#{$S{voiced}} ], |