summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README21
-rw-r--r--data/global.pl77
-rw-r--r--lib/Multi/RG.pm12
-rw-r--r--lib/VNDB/Handler/Producers.pm17
-rw-r--r--lib/VNDB/Handler/Releases.pm2
-rw-r--r--lib/VNDB/Handler/Staff.pm2
-rw-r--r--lib/VNDB/Handler/Tags.pm4
-rw-r--r--lib/VNDB/Handler/Users.pm2
-rw-r--r--lib/VNDB/Handler/VNEdit.pm6
-rw-r--r--lib/VNDB/Handler/VNPage.pm6
-rwxr-xr-xutil/jsgen.pl6
11 files changed, 80 insertions, 75 deletions
diff --git a/README b/README
index 39a060a4..33099e3b 100644
--- a/README
+++ b/README
@@ -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}} ],