summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2011-03-19 11:58:57 +0100
committerYorhel <git@yorhel.nl>2011-03-19 11:58:57 +0100
commitb1ea8d0af733887ca06094108ead070ffdcbba08 (patch)
tree48181bdad2c5e06b5c001fd95d6a1eaa8697993f
parenta2165d2808cd1edd6b570a05d7b8d1bbc63b64c7 (diff)
chardb: Added char listing to VN pages
Still many todo's left...
-rw-r--r--data/lang.txt21
-rw-r--r--lib/VNDB/DB/Chars.pm6
-rw-r--r--lib/VNDB/DB/VN.pm9
-rw-r--r--lib/VNDB/Handler/Chars.pm23
-rw-r--r--lib/VNDB/Handler/VNPage.pm42
5 files changed, 85 insertions, 16 deletions
diff --git a/data/lang.txt b/data/lang.txt
index 67da70cb..1e1c7eea 100644
--- a/data/lang.txt
+++ b/data/lang.txt
@@ -5046,6 +5046,13 @@ cs*:
hu*:
nl :
+:_charp_releases
+en : Releases
+ru*:
+cs*:
+hu*:
+nl : Uitgaven
+
:_charp_vns_other
en : All other releases
ru*:
@@ -8124,6 +8131,20 @@ cs*:
hu : Eltávolítás a listából
nl : Verwijder van lijst
+:_vnpage_tab_main
+en : main
+ru*:
+cs*:
+hu*:
+nl : primaire info
+
+:_vnpage_tab_chars
+en : cast
+ru*:
+cs*:
+hu*:
+nl : karakters
+
:_vnpage_rel
en : Releases
ru : Выпуски
diff --git a/lib/VNDB/DB/Chars.pm b/lib/VNDB/DB/Chars.pm
index 39d3eddc..337d0ef8 100644
--- a/lib/VNDB/DB/Chars.pm
+++ b/lib/VNDB/DB/Chars.pm
@@ -26,6 +26,7 @@ sub dbCharGet {
$o{rev} ? ( 'h.rev = ?' => $o{rev} ) : (),
$o{notid} ? ( 'c.id <> ?' => $o{notid} ) : (),
$o{instance} ? ( 'cr.main = ?' => $o{instance} ) : (),
+ $o{vid} ? ( 'cr.id IN(SELECT cid FROM chars_vns WHERE vid = ?)' => $o{vid} ) : (),
$o{trait_inc} ? (
'c.id IN(SELECT cid FROM traits_chars WHERE tid IN(!l) AND spoil <= ? GROUP BY cid HAVING COUNT(tid) = ?)',
[ ref $o{trait_inc} ? $o{trait_inc} : [$o{trait_inc}], $o{traitspoil}, ref $o{trait_inc} ? $#{$o{trait_inc}}+1 : 1 ]) : (),
@@ -68,7 +69,7 @@ sub dbCharGet {
)});
}
- if($o{what} =~ /vns/) {
+ if($o{what} =~ /vns(?:\((\d+)\))?/) {
push @{$r{ delete $_->{cid} }{vns}}, $_ for (@{$self->dbAll(q|
SELECT cv.cid, cv.vid, cv.rid, cv.spoil, cv.role, vr.title AS vntitle, rr.title AS rtitle
FROM chars_vns cv
@@ -76,7 +77,7 @@ sub dbCharGet {
JOIN vn_rev vr ON vr.id = v.latest
LEFT JOIN releases r ON cv.rid = r.id
LEFT JOIN releases_rev rr ON rr.id = r.latest
- WHERE cv.cid IN(!l)|, [ keys %r ]
+ !W|, { 'cv.cid IN(!l)' => [[keys %r]], $1 ? ('cv.vid = ?', $1) : () }
)});
}
}
@@ -110,5 +111,6 @@ sub dbCharImageId {
}
+
1;
diff --git a/lib/VNDB/DB/VN.pm b/lib/VNDB/DB/VN.pm
index 0f6c5731..474066ce 100644
--- a/lib/VNDB/DB/VN.pm
+++ b/lib/VNDB/DB/VN.pm
@@ -7,7 +7,7 @@ use Exporter 'import';
use VNDB::Func 'gtintype', 'normalize_query';
use Encode 'decode_utf8';
-our @EXPORT = qw|dbVNGet dbVNRevisionInsert dbVNImageId dbScreenshotAdd dbScreenshotGet dbScreenshotRandom|;
+our @EXPORT = qw|dbVNGet dbVNRevisionInsert dbVNImageId dbScreenshotAdd dbScreenshotGet dbScreenshotRandom dbVNHasChar|;
# Options: id, rev, char, search, length, lang, olang, plat, tag_inc, tag_exc, tagspoil,
@@ -269,5 +269,12 @@ sub dbScreenshotRandom {
}
+sub dbVNHasChar {
+ my($self, $vid) = @_;
+ return $self->dbRow(
+ 'SELECT 1 AS exists FROM chars c JOIN chars_vns cv ON c.latest = cv.cid WHERE cv.vid = ?', $vid
+ )->{exists};
+}
+
1;
diff --git a/lib/VNDB/Handler/Chars.pm b/lib/VNDB/Handler/Chars.pm
index 0699a50c..04114ffe 100644
--- a/lib/VNDB/Handler/Chars.pm
+++ b/lib/VNDB/Handler/Chars.pm
@@ -4,8 +4,10 @@ package VNDB::Handler::Chars;
use strict;
use warnings;
use TUWF ':html';
+use Exporter 'import';
use VNDB::Func;
+our @EXPORT = ('charTable');
TUWF::register(
qr{c([1-9]\d*)(?:\.([1-9]\d*))?} => \&page,
@@ -66,10 +68,10 @@ sub page {
$self->htmlItemMessage('c', $r);
h1 $r->{name};
h2 class => 'alttitle', $r->{original} if $r->{original};
- _chartable($self, $r);
+ $self->charTable($r);
end;
- # TODO: ordering of these instances?
+ # TODO: ordering of these instances? + spoiler handling
my $inst = [];
if(!$r->{main}) {
$inst = $self->dbCharGet(instance => $r->{id}, what => 'extended traits vns');
@@ -80,7 +82,7 @@ sub page {
if(@$inst) {
div class => 'mainbox';
h1 mt '_charp_instances';
- _chartable($self, $_, 1, $_ != $inst->[0]) for @$inst;
+ $self->charTable($_, 1, $_ != $inst->[0]) for @$inst;
end;
}
@@ -88,8 +90,9 @@ sub page {
}
-sub _chartable {
- my($self, $r, $link, $sep) = @_;
+# Also used from Handler::VNPage
+sub charTable {
+ my($self, $r, $link, $sep, $vn) = @_;
div class => 'chardetails'.($sep ? ' charsep' : '');
@@ -171,26 +174,26 @@ sub _chartable {
# vns
# TODO: handle spoilers!
- if(@{$r->{vns}}) {
+ if(@{$r->{vns}} && (!$vn || $vn && (@{$r->{vns}} > 1 || $r->{vns}[0]{rid}))) {
my %vns;
push @{$vns{$_->{vid}}}, $_ for(sort { !defined($a->{rid})?1:!defined($b->{rid})?-1:$a->{rtitle} cmp $b->{rtitle} } @{$r->{vns}});
Tr ++$i % 2 ? (class => 'odd') : ();
- td class => 'key', mt '_charp_vns';
+ td class => 'key', mt $vn ? '_charp_releases' : '_charp_vns';
td;
my $first = 0;
for my $g (sort { $vns{$a}[0]{vntitle} cmp $vns{$b}[0]{vntitle} } keys %vns) {
br if $first++;
my @r = @{$vns{$g}};
# special case: all releases, no exceptions
- if(@r == 1 && !$r[0]{rid}) {
+ if(!$vn && @r == 1 && !$r[0]{rid}) {
txt mt("_charrole_$r[0]{role}").' - ';
a href => "/v$r[0]{vid}", $r[0]{vntitle};
next;
}
# otherwise, print VN title and list releases separately
- a href => "/v$r[0]{vid}", $r[0]{vntitle};
+ a href => "/v$r[0]{vid}", $r[0]{vntitle} if !$vn;
for(@r) {
- br;
+ br if !$vn || $_ != $r[0];
b class => 'grayedout', '> ';
txt mt("_charrole_$_->{role}").' - ';
if($_->{rid}) {
diff --git a/lib/VNDB/Handler/VNPage.pm b/lib/VNDB/Handler/VNPage.pm
index aa3c0538..2b7b471e 100644
--- a/lib/VNDB/Handler/VNPage.pm
+++ b/lib/VNDB/Handler/VNPage.pm
@@ -10,6 +10,7 @@ use VNDB::Func;
TUWF::register(
qr{v/rand} => \&rand,
qr{v([1-9]\d*)/rg} => \&rg,
+ qr{v([1-9]\d*)/(chars)} => \&page,
qr{v([1-9]\d*)(?:\.([1-9]\d*))?} => \&page,
);
@@ -45,6 +46,9 @@ sub rg {
sub page {
my($self, $vid, $rev) = @_;
+ my $char = $rev && $rev eq 'chars';
+ $rev = undef if $char;
+
my $v = $self->dbVNGet(
id => $vid,
what => 'extended anime relations screenshots rating ranking'.($rev ? ' changes' : ''),
@@ -177,9 +181,21 @@ sub page {
}
end 'div'; # /mainbox
- _releases($self, $v, $r);
- _stats($self, $v);
- _screenshots($self, $v, $r) if @{$v->{screenshots}};
+ my $haschar = $self->dbVNHasChar($v->{id});
+ if($haschar) {
+ ul class => 'maintabs notfirst';
+ li class => 'left '.(!$char ? ' tabselected' : ''); a href => "/v$v->{id}", mt '_vnpage_tab_main'; end;
+ li class => 'left '.( $char ? ' tabselected' : ''); a href => "/v$v->{id}/chars", mt '_vnpage_tab_chars'; end;
+ end;
+ }
+
+ if(!$char) {
+ _releases($self, $v, $r);
+ _stats($self, $v);
+ _screenshots($self, $v, $r) if @{$v->{screenshots}};
+ } else {
+ _chars($self, $haschar, $v);
+ }
$self->htmlFooter;
}
@@ -513,5 +529,25 @@ sub _stats {
}
+sub _chars {
+ my($self, $has, $v) = @_;
+ my $l = $has && $self->dbCharGet(vid => $v->{id}, what => "extended vns($v->{id}) traits");
+ return if !$has;
+ # TODO: spoiler handling + hide unimportant roles by default
+ my %done;
+ my %rol;
+ for my $r (@{$self->{char_roles}}) {
+ $rol{$r} = [ grep grep($_->{role} eq $r, @{$_->{vns}}) && !$done{$_->{id}}++, @$l ];
+ }
+ for my $r (@{$self->{char_roles}}) {
+ next if !@{$rol{$r}};
+ div class => 'mainbox';
+ h1 mt "_charrole_$r";
+ $self->charTable($_, 1, $_ != $rol{$r}[0], 1) for (@{$rol{$r}});
+ end;
+ }
+}
+
+
1;