summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/lang.txt12
-rw-r--r--data/script.js75
-rw-r--r--data/style.css7
-rw-r--r--lib/VNDB/DB/Chars.pm2
-rw-r--r--lib/VNDB/Handler/Chars.pm37
-rw-r--r--lib/VNDB/Handler/VNPage.pm14
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;