diff options
author | Yorhel <git@yorhel.nl> | 2011-03-19 11:58:57 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2011-03-19 11:58:57 +0100 |
commit | b1ea8d0af733887ca06094108ead070ffdcbba08 (patch) | |
tree | 48181bdad2c5e06b5c001fd95d6a1eaa8697993f | |
parent | a2165d2808cd1edd6b570a05d7b8d1bbc63b64c7 (diff) |
chardb: Added char listing to VN pages
Still many todo's left...
-rw-r--r-- | data/lang.txt | 21 | ||||
-rw-r--r-- | lib/VNDB/DB/Chars.pm | 6 | ||||
-rw-r--r-- | lib/VNDB/DB/VN.pm | 9 | ||||
-rw-r--r-- | lib/VNDB/Handler/Chars.pm | 23 | ||||
-rw-r--r-- | lib/VNDB/Handler/VNPage.pm | 42 |
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; |