diff options
-rw-r--r-- | data/lang.txt | 12 | ||||
-rw-r--r-- | data/script.js | 75 | ||||
-rw-r--r-- | data/style.css | 7 | ||||
-rw-r--r-- | lib/VNDB/DB/Chars.pm | 2 | ||||
-rw-r--r-- | lib/VNDB/Handler/Chars.pm | 37 | ||||
-rw-r--r-- | lib/VNDB/Handler/VNPage.pm | 14 |
6 files changed, 91 insertions, 56 deletions
diff --git a/data/lang.txt b/data/lang.txt index a719fc96..8935c6a7 100644 --- a/data/lang.txt +++ b/data/lang.txt @@ -9378,6 +9378,18 @@ tr : Henüz resim yüklenmemiş uk : Ще не завантажено жодного зображення it : Nessuna immagine caricata +:_charp_sexual +en : Show sexual traits +ru*: +cs*: +hu*: +nl*: +de*: +es*: +tr*: +uk*: +it*: + :_charp_alias en : Aliases ru : Алиасы diff --git a/data/script.js b/data/script.js index 0db40c02..81698ef7 100644 --- a/data/script.js +++ b/data/script.js @@ -3211,44 +3211,71 @@ if(byId('expandall')) { } -// charspoil handling -if(byId('charspoil_sel')) { +// char spoil/sexual preferences +if(byId('charops')) { (function() { var k = byClass('charspoil'); - var h = byName(byId('charspoil_sel'), 'a'); + var h = byName(byId('charops'), 'a'); var t = byClass('table', 'stripe'); - var setall = function(spoil) { + var spoil; + var sexual; + var fixcomma = function(c) { + var l = byName(c, 'span'); + var first = 1; + for(var i=0; i<l.length; i+=2) + if(!hasClass(l[i], 'hidden')) { + setClass(l[i+1], 'hidden', first); + first = 0; + } + }; + var restripe = function() { + for(var i=0; i<t.length; i++) { + var b = byName(t[i], 'tbody'); + if(!b.length) + continue; + setClass(t[i], 'stripe', false); + var r = 1; + var rows = byName(b[0], 'tr'); + for(var j=0; j<rows.length; j++) + if(!hasClass(rows[j], 'nostripe') && !hasClass(rows[j], 'hidden')) { + if(hasClass(rows[j], 'charspoil')) + fixcomma(byName(rows[j], 'td')[1]); + setClass(rows[j], 'odd', r++&1); + } + } + }; + var setall = function() { for(var i=0; i<k.length; i++) setClass(k[i], 'hidden', + !sexual && hasClass(k[i], 'sexual') ? true : hasClass(k[i], 'charspoil_0') ? false : hasClass(k[i], 'charspoil_-1') ? spoil > 1 : hasClass(k[i], 'charspoil_1') ? spoil < 1 : spoil < 2); - for(var i=0; i<h.length; i++) + for(var i=0; i<3; i++) setClass(h[i], 'sel', spoil == i); - if(k.length) { - for(var i=0; i<t.length; i++) { - var b = byName(t[i], 'tbody'); - if(!b.length) continue; - setClass(t[i], 'stripe', false); - var r = 1; - var rows = byName(b[0], 'tr'); - for(var j=0; j<rows.length; j++) - if(!hasClass(rows[j], 'nostripe') && !hasClass(rows[j], 'hidden')) - setClass(rows[j], 'odd', r++&1); - } - } + if(h[3]) + setClass(h[3], 'sel', sexual); + if(k.length) + restripe(); + return false; }; - var set = 0; - for(var i=0; i<h.length; i++) { + for(var i=0; i<3; i++) { h[i].num = i; h[i].onclick = function() { - setall(this.num); - return false; + spoil = this.num; + return setall(); }; if(hasClass(h[i], 'sel')) - set = i; + spoil = i; }; - setall(set); -} + if(h[3]) { + h[3].onclick = function() { + sexual = !sexual; + return setall(); + }; + sexual = hasClass(h[3], 'sel'); + } + setall(); +})(); } // mouse-over price information / disclaimer diff --git a/data/style.css b/data/style.css index 2879a15c..d6fe3ae7 100644 --- a/data/style.css +++ b/data/style.css @@ -526,9 +526,10 @@ div.charimg p { text-align: center; padding: 0px; margin: 0; } div.chardetails table { float: left; width: 530px; } div.chardetails table td.key { width: 80px; } div.chardetails.charsep { padding-top: 5px; margin-top: 5px; border-top: 1px solid $border$ } -#charspoil_sel { clear: right; float: right; } -#charspoil_sel a { margin: 0 0 0 10px; border: 0; outline: none } -#charspoil_sel a.sel { color: $maintext$; } +#charops { clear: right; float: right; } +#charops a { margin: 0 0 0 10px; border: 0; outline: none } +#charops a.sel { color: $maintext$; } +#charops a.sec { border-left: 1px solid $border$; padding-left: 10px } diff --git a/lib/VNDB/DB/Chars.pm b/lib/VNDB/DB/Chars.pm index 2f7de43f..3db5f869 100644 --- a/lib/VNDB/DB/Chars.pm +++ b/lib/VNDB/DB/Chars.pm @@ -87,7 +87,7 @@ sub dbCharGet { if($o{what} =~ /traits/) { push @{$r{ delete $_->{cid} }{traits}}, $_ for (@{$self->dbAll(q| - SELECT ct.cid, ct.tid, ct.spoil, t.name, t."group", tg.name AS groupname + SELECT ct.cid, ct.tid, ct.spoil, t.name, t.sexual, t."group", tg.name AS groupname FROM chars_traits ct JOIN traits t ON t.id = ct.tid LEFT JOIN traits tg ON tg.id = t."group" diff --git a/lib/VNDB/Handler/Chars.pm b/lib/VNDB/Handler/Chars.pm index c59d44b9..cb5e6638 100644 --- a/lib/VNDB/Handler/Chars.pm +++ b/lib/VNDB/Handler/Chars.pm @@ -7,7 +7,7 @@ use TUWF ':html', 'uri_escape'; use Exporter 'import'; use VNDB::Func; -our @EXPORT = ('charTable', 'charBrowseTable'); +our @EXPORT = ('charOps', 'charTable', 'charBrowseTable'); TUWF::register( qr{c([1-9]\d*)(?:\.([1-9]\d*))?} => \&page, @@ -66,10 +66,7 @@ sub page { div class => 'mainbox'; $self->htmlItemMessage('c', $r); - my $spoil = $self->authPref('spoilers')||0; - p id => 'charspoil_sel'; - a href => '#', $spoil == $_ ? (class => 'sel') : (), mt "_spoilset_$_" for (0..2); - end; + $self->charOps(1); h1 $r->{name}; h2 class => 'alttitle', $r->{original} if $r->{original}; $self->charTable($r); @@ -94,6 +91,17 @@ sub page { } +sub charOps { + my($self, $sexual) = @_; + my $spoil = $self->authPref('spoilers')||0; + p id => 'charops'; + # Note: Order of these links is hardcoded in JS + a href => '#', $spoil == $_ ? (class => 'sel') : (), mt "_spoilset_$_" for (0..2); + a href => '#', class => 'sec sel', mt '_charp_sexual' if $sexual; + end; +} + + # Also used from Handler::VNPage sub charTable { my($self, $r, $link, $sep, $vn, $spoil) = @_; @@ -151,8 +159,6 @@ sub charTable { } # traits - # TODO: handle 'sexual' traits - # TODO: fix striping of the table with hidden trait groups (due to spoilers) my %groups; my @groups; for (@{$r->{traits}}) { @@ -162,20 +168,19 @@ sub charTable { } for my $g (@groups) { my $minspoil = 5; - $minspoil = $minspoil > $_->{spoil} ? $_->{spoil} : $minspoil for(@{$groups{$g}}); - Tr class => charspoil($minspoil); + my $fullsex = 1; + for(@{$groups{$g}}) { + $minspoil = $minspoil > $_->{spoil} ? $_->{spoil} : $minspoil; + $fullsex = 0 if !$_->{sexual}; + } + Tr class => charspoil($minspoil).($fullsex ? ' sexual' : ''); td class => 'key'; a href => '/i'.($groups{$g}[0]{group}||$groups{$g}[0]{tid}), $groups{$g}[0]{groupname} || $groups{$g}[0]{name}; end; td; for (0..$#{$groups{$g}}) { my $t = $groups{$g}[$_]; - span class => charspoil $t->{spoil}; + span class => charspoil($t->{spoil}).($t->{sexual} ? ' sexual' : ''); + span ', '; a href => "/i$t->{tid}", $t->{name}; - # spoiler setting of the comma = max(current, min(@remaining_spoil)) - # since it is in the current <span>, which has 'current', only the second part is relevant if it is > current - my $min_remaining = 5; - $min_remaining = $min_remaining > $groups{$g}[$_]{spoil} ? $groups{$g}[$_]{spoil} : $min_remaining for($_+1..$#{$groups{$g}}); - span class => charspoil($min_remaining), ', ' if $min_remaining != 5 && $min_remaining > $t->{spoil}; - txt ', ' if $min_remaining != 5 && $min_remaining <= $t->{spoil}; end; } end; diff --git a/lib/VNDB/Handler/VNPage.pm b/lib/VNDB/Handler/VNPage.pm index 16904efc..f4b4b6e5 100644 --- a/lib/VNDB/Handler/VNPage.pm +++ b/lib/VNDB/Handler/VNPage.pm @@ -898,12 +898,7 @@ sub _chars { for my $r (@{$self->{char_roles}}) { next if !@{$rol{$r}}; div class => 'mainbox'; - if(!$first++) { - my $spoil = $self->authPref('spoilers')||0; - p id => 'charspoil_sel'; - a href => '#', $spoil == $_ ? (class => 'sel') : (), mt "_spoilset_$_" for (0..2); - end; - } + $self->charOps(1) if !$first++; h1 mt "_charrole_$r", scalar @{$rol{$r}}; for my $c (@{$rol{$r}}) { my $minspoil = 5; @@ -948,12 +943,7 @@ sub _staff { my($has_spoilers, $has_notes); $has_spoilers ||= $_->{spoil}, $has_notes ||= $_->{note} for @{$v->{seiyuu}}; div class => 'mainbox staff cast'; - if($has_spoilers) { - my $spoil = $self->authPref('spoilers')||0; - p id => 'charspoil_sel'; - a href => '#', $spoil == $_ ? (class => 'sel') : (), mt "_spoilset_$_" for (0..2); - end; - } + $self->charOps(0) if $has_spoilers; h1 mt '_vnpage_cast'; table class => 'stripe'; thead; |