diff options
-rw-r--r-- | data/docs/7 | 3 | ||||
-rw-r--r-- | data/script.js | 15 | ||||
-rw-r--r-- | lib/VNDB/DB/Chars.pm | 4 | ||||
-rw-r--r-- | lib/VNDB/DB/Producers.pm | 2 | ||||
-rw-r--r-- | lib/VNDB/DB/ULists.pm | 11 | ||||
-rw-r--r-- | lib/VNDB/DB/VN.pm | 2 | ||||
-rw-r--r-- | lib/VNDB/Handler/Discussions.pm | 2 | ||||
-rw-r--r-- | lib/VNDB/Handler/Traits.pm | 2 | ||||
-rw-r--r-- | lib/VNDB/Handler/VNPage.pm | 3 | ||||
-rw-r--r-- | lib/VNDB/Util/Misc.pm | 72 | ||||
-rw-r--r-- | lib/VNDBUtil.pm | 5 | ||||
-rw-r--r-- | util/sql/staff.sql | 2 |
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(); |