summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/docs/73
-rw-r--r--data/script.js15
-rw-r--r--lib/VNDB/DB/Chars.pm4
-rw-r--r--lib/VNDB/DB/Producers.pm2
-rw-r--r--lib/VNDB/DB/ULists.pm11
-rw-r--r--lib/VNDB/DB/VN.pm2
-rw-r--r--lib/VNDB/Handler/Discussions.pm2
-rw-r--r--lib/VNDB/Handler/Traits.pm2
-rw-r--r--lib/VNDB/Handler/VNPage.pm3
-rw-r--r--lib/VNDB/Util/Misc.pm72
-rw-r--r--lib/VNDBUtil.pm5
-rw-r--r--util/sql/staff.sql2
12 files changed, 105 insertions, 18 deletions
diff --git a/data/docs/7 b/data/docs/7
index f5046101..21def6c4 100644
--- a/data/docs/7
+++ b/data/docs/7
@@ -51,8 +51,9 @@
<dl>
<dt>Yorhel</dt><dd>Main developer.</dd>
<dt>QCyph</dt><dd>Contributed the character filters.</dd>
- <dt>3dB</dt><dd>Contributed the current user authentication code and post throttling on the discussion board.</dd>
+ <dt>3dB</dt><dd>Contributed an improved user authentication code and post throttling on the discussion board.</dd>
<dt>SpaceRanger</dt><dd>Contributed the visual novel release comparison page, userlist columns to the VN list and dx.x.x link formatting.</dd>
+ <dt>morkt</dt><dd>Contributed improvements to the BBCode used on the forums.</dd>
</dl>
<br />
diff --git a/data/script.js b/data/script.js
index 6f8b497d..b84316f3 100644
--- a/data/script.js
+++ b/data/script.js
@@ -1738,7 +1738,7 @@ function ctrLoad() {
}
}
if(q.length > 0)
- ajax('/xml/traits.xml?r=100;'+q.join(';'), function (ht) {
+ ajax('/xml/traits.xml?r=200;'+q.join(';'), function (ht) {
var t = ht.responseXML.getElementsByTagName('item');
for(var i=0; i<t.length; i++)
ctrAdd(t[i], v[t[i].getAttribute('id')]);
@@ -3181,6 +3181,7 @@ if(byId('expandall')) {
if(byId('charspoil_sel')) {
var k = byClass('charspoil');
var h = byName(byId('charspoil_sel'), 'a');
+ var t = byClass('table', 'stripe');
var setall = function(spoil) {
for(var i=0; i<k.length; i++)
setClass(k[i], 'hidden',
@@ -3189,6 +3190,18 @@ if(byId('charspoil_sel')) {
hasClass(k[i], 'charspoil_1') ? spoil < 1 : spoil < 2);
for(var i=0; i<h.length; 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);
+ }
+ }
};
for(var i=0; i<h.length; i++) {
h[i].num = i;
diff --git a/lib/VNDB/DB/Chars.pm b/lib/VNDB/DB/Chars.pm
index cea16258..2f7de43f 100644
--- a/lib/VNDB/DB/Chars.pm
+++ b/lib/VNDB/DB/Chars.pm
@@ -25,7 +25,8 @@ sub dbCharGet {
my %where = (
!$o{id} && !$o{rev} ? ( 'c.hidden = FALSE' => 1 ) : (),
- $o{id} ? ( 'c.id = ?' => $o{id} ) : (),
+ $o{id} ? (
+ 'c.id IN(!l)' => [ ref $o{id} ? $o{id} : [$o{id}] ] ) : (),
$o{rev} ? ( 'h.rev = ?' => $o{rev} ) : (),
$o{notid} ? ( 'c.id <> ?' => $o{notid} ) : (),
$o{instance} ? ( 'cr.main = ?' => $o{instance} ) : (),
@@ -157,6 +158,5 @@ sub dbCharImageId {
}
-
1;
diff --git a/lib/VNDB/DB/Producers.pm b/lib/VNDB/DB/Producers.pm
index 4c4c1145..3ff70ae1 100644
--- a/lib/VNDB/DB/Producers.pm
+++ b/lib/VNDB/DB/Producers.pm
@@ -25,7 +25,7 @@ sub dbProducerGet {
!$o{id} && !$o{rev} ? (
'p.hidden = FALSE' => 1 ) : (),
$o{id} ? (
- 'p.id = ?' => $o{id} ) : (),
+ 'p.id IN(!l)' => [ ref $o{id} ? $o{id} : [$o{id}] ] ) : (),
$o{search} ? (
'(pr.name ILIKE ? OR pr.original ILIKE ? OR pr.alias ILIKE ?)', [ map '%'.$o{search}.'%', 1..3 ] ) : (),
$o{char} ? (
diff --git a/lib/VNDB/DB/ULists.pm b/lib/VNDB/DB/ULists.pm
index a0cf4f18..6831e579 100644
--- a/lib/VNDB/DB/ULists.pm
+++ b/lib/VNDB/DB/ULists.pm
@@ -101,18 +101,17 @@ sub dbVNListList {
);
if(@$rel) {
- my %rel = map {
- $_->{languages}=[];
- $_->{latest}, $_->{languages}
- } @$rel;
-
+ my %rel = map { $_->{latest} => [] } @$rel;
push(@{$rel{$_->{rid}}}, $_->{lang}) for (@{$self->dbAll(q|
SELECT rid, lang
FROM releases_lang
WHERE rid IN(!l)|,
[ keys %rel ]
)});
- push @{$vns{$_->{vid}}}, $_ for @$rel;
+ for(@$rel) {
+ $_->{languages} = $rel{$_->{latest}};
+ push @{$vns{$_->{vid}}}, $_;
+ }
}
}
diff --git a/lib/VNDB/DB/VN.pm b/lib/VNDB/DB/VN.pm
index e08b85e3..b3b55598 100644
--- a/lib/VNDB/DB/VN.pm
+++ b/lib/VNDB/DB/VN.pm
@@ -32,7 +32,7 @@ sub dbVNGet {
my @where = (
$o{id} ? (
- 'v.id = ?' => $o{id} ) : (),
+ 'v.id IN(!l)' => [ ref $o{id} ? $o{id} : [$o{id}] ] ) : (),
$o{rev} ? (
'c.rev = ?' => $o{rev} ) : (),
$o{char} ? (
diff --git a/lib/VNDB/Handler/Discussions.pm b/lib/VNDB/Handler/Discussions.pm
index 477e6bfa..e1645fd5 100644
--- a/lib/VNDB/Handler/Discussions.pm
+++ b/lib/VNDB/Handler/Discussions.pm
@@ -215,7 +215,7 @@ sub edit {
# create/edit post
my %post = (
- msg => $frm->{msg},
+ msg => $self->bbSubstLinks($frm->{msg}),
hidden => $num != 1 && $frm->{hidden},
lastmod => !$num || $frm->{nolastmod} ? 0 : time,
);
diff --git a/lib/VNDB/Handler/Traits.pm b/lib/VNDB/Handler/Traits.pm
index 5fff855d..33bde43d 100644
--- a/lib/VNDB/Handler/Traits.pm
+++ b/lib/VNDB/Handler/Traits.pm
@@ -407,7 +407,7 @@ sub traitxml {
my $f = $self->formValidate(
{ get => 'q', required => 0, maxlength => 500 },
{ get => 'id', required => 0, multi => 1, template => 'int' },
- { get => 'r', required => 0, default => 15, template => 'int', min => 1, max => 100 },
+ { get => 'r', required => 0, default => 15, template => 'int', min => 1, max => 200 },
);
return $self->resNotFound if $f->{_err} || (!$f->{q} && !$f->{id} && !$f->{id}[0]);
diff --git a/lib/VNDB/Handler/VNPage.pm b/lib/VNDB/Handler/VNPage.pm
index 89b48a91..f75d02d7 100644
--- a/lib/VNDB/Handler/VNPage.pm
+++ b/lib/VNDB/Handler/VNPage.pm
@@ -3,7 +3,7 @@ package VNDB::Handler::VNPage;
use strict;
use warnings;
-no warnings 'experimental::smartmatch';
+no if $] >= 5.018, warnings => 'experimental::smartmatch';
use feature qw{ switch };
use TUWF ':html', 'xml_escape';
use VNDB::Func;
@@ -649,6 +649,7 @@ sub page {
my $haschar = $self->dbVNHasChar($v->{id});
my $hasstaff = $self->dbVNHasStaff($v->{id});
if($haschar || $hasstaff || $self->authCan('edit')) {
+ clearfloat; # fix tabs placement when tags are hidden
ul class => 'maintabs notfirst';
if($haschar || $hasstaff) {
li class => 'left '.(!($char || $staff) && ' tabselected'); a href => "/v$v->{id}#main", name => 'main', mt '_vnpage_tab_main'; end;
diff --git a/lib/VNDB/Util/Misc.pm b/lib/VNDB/Util/Misc.pm
index 48bc226d..2ffd7827 100644
--- a/lib/VNDB/Util/Misc.pm
+++ b/lib/VNDB/Util/Misc.pm
@@ -7,7 +7,7 @@ use Exporter 'import';
use TUWF ':html';
use VNDB::Func;
-our @EXPORT = qw|filFetchDB ieCheck|;
+our @EXPORT = qw|filFetchDB ieCheck bbSubstLinks|;
my %filfields = (
@@ -143,5 +143,75 @@ sub ieCheck {
return 0;
}
+
+sub bbSubstLinks {
+ my ($self, $msg) = @_;
+
+ # pre-parse vndb links within message body
+ my (%lookup, %links);
+ while ($msg =~ m/(?:^|\s)\K([vcpgi])([1-9][0-9]*)\b/g) {
+ $lookup{$1}{$2} = 1;
+ }
+ return $msg unless %lookup;
+ my @opt = (results => 50);
+ # lookup parsed links
+ if ($lookup{v}) {
+ $links{"v$_->{id}"} = $_->{title} for (@{$self->dbVNGet(id => [keys %{$lookup{v}}], @opt)});
+ }
+ if ($lookup{c}) {
+ $links{"c$_->{id}"} = $_->{name} for (@{$self->dbCharGet(id => [keys %{$lookup{c}}], @opt)});
+ }
+ if ($lookup{p}) {
+ $links{"p$_->{id}"} = $_->{name} for (@{$self->dbProducerGet(id => [keys %{$lookup{p}}], @opt)});
+ }
+ if ($lookup{g}) {
+ $links{"g$_->{id}"} = $_->{name} for (@{$self->dbTagGet(id => [keys %{$lookup{g}}], @opt)});
+ }
+ if ($lookup{i}) {
+ $links{"i$_->{id}"} = $_->{name} for (@{$self->dbTraitGet(id => [keys %{$lookup{i}}], @opt)});
+ }
+ return $msg unless %links;
+ my($result, @open) = ('', 'first');
+
+ while($msg =~ m{
+ (?:\b([tdvprcugi][1-9]\d*)(?:\.[1-9]\d*)?\b) | # 1. id
+ (\[[^\s\]]+\]) | # 2. tag
+ ((?:https?|ftp)://[^><"\n\s\]\[]+[\d\w=/-]) # 3. url
+ }x) {
+ my($match, $id, $tag) = ($&, $1, $2);
+ $result .= $`;
+ $msg = $';
+
+ if($open[$#open] ne 'raw' && $open[$#open] ne 'code') {
+ # handle tags
+ if($tag) {
+ $tag = lc $tag;
+ if($tag eq '[raw]') {
+ push @open, 'raw';
+ } elsif($tag eq '[quote]') {
+ push @open, 'quote';
+ } elsif($tag eq '[code]') {
+ push @open, 'code';
+ } elsif($tag eq '[/quote]' && $open[$#open] eq 'quote') {
+ pop @open;
+ } elsif($match =~ m{\[url=((https?://|/)[^\]>]+)\]}i) {
+ push @open, 'url';
+ } elsif($tag eq '[/url]' && $open[$#open] eq 'url') {
+ pop @open;
+ }
+ } elsif($id && !grep(/^(?:quote|url)/, @open) && $links{$id}) {
+ $match = sprintf '[url=/%s]%s[/url]', $match, $links{$id};
+ }
+ }
+ pop @open if($tag && $open[$#open] eq 'raw' && lc$tag eq '[/raw]');
+ pop @open if($tag && $open[$#open] eq 'code' && lc$tag eq '[/code]');
+
+ $result .= $match;
+ }
+ $result .= $msg;
+
+ return $result;
+}
+
1;
diff --git a/lib/VNDBUtil.pm b/lib/VNDBUtil.pm
index 82da52e6..7bec05b2 100644
--- a/lib/VNDBUtil.pm
+++ b/lib/VNDBUtil.pm
@@ -27,6 +27,9 @@ sub shorten {
# [code] .. [/code]
# v+, v+.+
# http://../
+# XXX: Make sure to sync any changes in the formating with
+# VNDB::Util::Misc::bbSubstLinks() if necessary. Or, alternatively, abstract
+# parsing into a separate function as per http://beta.vndb.org/t5564.12
sub bb2html {
my($raw, $maxlength, $charspoil) = @_;
$raw =~ s/\r//g;
@@ -116,7 +119,7 @@ sub bb2html {
next;
}
# id
- if(($id || $exid || $longid) && (!$result || substr($raw, $last-1-length($match), 1) !~ /[\w]/) && substr($raw, $last, 1) !~ /[\w]/) {
+ if(($id || $exid || $longid) && !grep(/url/, @open) && (!$result || substr($raw, $last-1-length($match), 1) !~ /[\w]/) && substr($raw, $last, 1) !~ /[\w]/) {
(my $lnk = $match) =~ s/^d(\d+)\.(\d+)\.(\d+)$/d$1#$2.$3/;
$length += length $lnk;
last if $maxlength && $length > $maxlength;
diff --git a/util/sql/staff.sql b/util/sql/staff.sql
index 972765ea..0c91deb4 100644
--- a/util/sql/staff.sql
+++ b/util/sql/staff.sql
@@ -59,7 +59,7 @@ ALTER TABLE vn_seiyuu ADD FOREIGN KEY (vid) REFERENCES vn_rev
CREATE INDEX vn_staff_vid ON vn_staff (vid);
CREATE INDEX vn_staff_aid ON vn_staff (aid);
-CREATE INDEX staff_alias_orig ON staff_alias (translate(original,' ',''));
+--CREATE INDEX staff_alias_orig ON staff_alias (translate(original,' ',''));
CREATE TRIGGER hidlock_update BEFORE UPDATE ON staff FOR EACH ROW WHEN (OLD.latest IS DISTINCT FROM NEW.latest) EXECUTE PROCEDURE update_hidlock();