From 85a55d309c201906669595e1ec0f60bcb2016072 Mon Sep 17 00:00:00 2001 From: Yorhel Date: Sun, 30 Nov 2008 13:43:31 +0100 Subject: Added small VN browser + search --- lib/ChangeLog | 3 +- lib/VNDB/DB/VN.pm | 6 ++- lib/VNDB/Func.pm | 13 ++++++- lib/VNDB/Handler/VNBrowse.pm | 89 ++++++++++++++++++++++++++++++++++++++++++++ lib/VNDB/Util/LayoutHTML.pm | 2 +- static/f/style.css | 5 +++ 6 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 lib/VNDB/Handler/VNBrowse.pm diff --git a/lib/ChangeLog b/lib/ChangeLog index 0816732d..5b4a017a 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -17,8 +17,9 @@ TODO: - Database changes: - Added caching of edit and vote counts in users.c_votes and .c_changes - Split users.flags into users.show_nsfw and .show_list (boolean type) + - Global statistics are cached in stats_cache - URL changes: - - /p doesn't work anymore, use /p/all + - /p and /v don't work anymore, use /[pv]/all - /u/list/* -> /u/* and /u/list -> /u/list/all - Revert URL changed from /x99/edit?rev=1 to /x99.1/edit - /v+/stats and /v+/scr moved into /v+ diff --git a/lib/VNDB/DB/VN.pm b/lib/VNDB/DB/VN.pm index 73abee82..358a470c 100644 --- a/lib/VNDB/DB/VN.pm +++ b/lib/VNDB/DB/VN.pm @@ -8,7 +8,7 @@ use Exporter 'import'; our @EXPORT = qw|dbVNGet dbVNAdd dbVNEdit dbVNImageId dbScreenshotAdd dbScreenshotGet|; -# Options: id, rev, search, results, page, order, what +# Options: id, rev, char, search, results, page, order, what # What: extended categories anime relations screenshots relgraph changes sub dbVNGet { my($self, %o) = @_; @@ -22,6 +22,10 @@ sub dbVNGet { 'v.id = ?' => $o{id} ) : (), $o{rev} ? ( 'c.rev = ?' => $o{rev} ) : (), + $o{char} ? ( + 'LOWER(SUBSTR(vr.title, 1, 1)) = ?' => $o{char} ) : (), + defined $o{char} && !$o{char} ? ( + '(ASCII(vr.title) < 97 OR ASCII(vr.title) > 122) AND (ASCII(vr.title) < 65 OR ASCII(vr.title) > 90)' => 1 ) : (), # don't fetch hidden items unless we ask for an ID !$o{id} && !$o{rev} ? ( 'v.hidden = FALSE' => 0 ) : (), diff --git a/lib/VNDB/Func.pm b/lib/VNDB/Func.pm index d2f86cf1..ac555d1d 100644 --- a/lib/VNDB/Func.pm +++ b/lib/VNDB/Func.pm @@ -5,7 +5,7 @@ use strict; use warnings; use Exporter 'import'; use POSIX 'strftime'; -our @EXPORT = qw| shorten date datestr userstr bb2html |; +our @EXPORT = qw| shorten date datestr monthstr userstr bb2html |; # I would've done this as a #define if this was C... @@ -46,6 +46,17 @@ sub datestr { return qq|$str|; } +# same as datestr(), but different output format: +# e.g.: 'Jan 2009', '2009', 'unknown', 'TBA' +sub monthstr { + my $date = sprintf '%08d', shift||0; + my($y, $m) = ($1, $2) if $date =~ /^([0-9]{4})([0-9]{2})/; + return 'TBA' if $y == 9999; + return 'unknown' if $y == 0; + return $y if $m == 99; + return strftime '%b %Y', 0, 0, 0, 0, $m-1, $y-1900, 0, 0, 0; +} + # Arguments: (uid, username), or a hashref containing that info sub userstr { diff --git a/lib/VNDB/Handler/VNBrowse.pm b/lib/VNDB/Handler/VNBrowse.pm new file mode 100644 index 00000000..20471c6e --- /dev/null +++ b/lib/VNDB/Handler/VNBrowse.pm @@ -0,0 +1,89 @@ + +package VNDB::Handler::VNBrowse; + +use strict; +use warnings; +use YAWF ':html'; +use VNDB::Func; + + +YAWF::register( + qr{v/([a-z0]|all)} => \&list, +); + + +sub list { + my($self, $char) = @_; + + my $f = $self->formValidate( + { name => 's', required => 0, default => 'title', enum => [ qw|title rel| ] }, + { name => 'o', required => 0, default => 'a', enum => [ 'a','d' ] }, + { name => 'p', required => 0, default => 1, template => 'int' }, + { name => 'q', required => 0, default => '' }, + ); + return 404 if $f->{_err}; + + my($list, $np) = $self->dbVNGet( + $char ne 'all' ? ( char => $char ) : (), + $f->{q} ? ( search => $f->{q} ) : (), + results => 50, + page => $f->{p}, + order => ($f->{s} eq 'rel' ? 'c_released' : 'title').($f->{o} eq 'a' ? ' ASC' : ' DESC'), + ); + + $self->htmlHeader(title => 'Browse visual novels'); + + div class => 'mainbox'; + h1 'Browse visual novels'; + form class => 'search', action => '/v/all', 'accept-charset' => 'UTF-8', method => 'get'; + fieldset; + input type => 'text', name => 'q', id => 'q', class => 'text', value => $f->{q}; + input type => 'submit', class => 'submit', value => 'Search!'; + end; + end; + p class => 'browseopts'; + for ('all', 'a'..'z', 0) { + a href => "/v/$_", $_ eq $char ? (class => 'optselected') : (), $_ ? uc $_ : '#'; + } + end; + end; + + $self->htmlBrowse( + class => 'vnbrowse', + items => $list, + options => $f, + nextpage => $np, + pageurl => "/v/$char?o=$f->{o};s=$f->{s};q=$f->{q}", + sorturl => "/v/$char?q=$f->{q}", + header => [ + [ 'Title', 'title' ], + [ '', 0 ], + [ '', 0 ], + [ 'Released', 'rel' ], + ], + row => sub { + my($s, $n, $l) = @_; + Tr $n % 2 ? (class => 'odd') : (); + td class => 'tc1'; + a href => '/v'.$l->{id}, title => $l->{original}||$l->{title}, shorten $l->{title}, 100; + end; + td class => 'tc2'; + $_ ne 'oth' && acronym class => "icons $_", title => $self->{platforms}{$_}, ' ' + for (sort split /\//, $l->{c_platforms}); + end; + td class => 'tc3'; + acronym class => "icons lang $_", title => $self->{languages}{$_}, ' ' + for (reverse sort split /\//, $l->{c_languages}); + end; + td class => 'tc4'; + lit monthstr $l->{c_released}; + end; + end; + }, + ); + $self->htmlFooter; +} + + +1; + diff --git a/lib/VNDB/Util/LayoutHTML.pm b/lib/VNDB/Util/LayoutHTML.pm index 4307731d..758ce444 100644 --- a/lib/VNDB/Util/LayoutHTML.pm +++ b/lib/VNDB/Util/LayoutHTML.pm @@ -48,7 +48,7 @@ sub _menu { h2 'Menu'; div; a href => '/', 'Home'; br; - a href => '#', 'Visual novels'; br; + a href => '/v/all', 'Visual novels'; br; a href => '/p/all', 'Producers'; br; a href => '/u/all', 'Users'; br; a href => '/hist', 'Recent changes'; br; diff --git a/static/f/style.css b/static/f/style.css index e04dee4a..93232f7d 100644 --- a/static/f/style.css +++ b/static/f/style.css @@ -621,6 +621,11 @@ form #jt_box_categories li li b { width: 13px; font-weight: bold; } #scr_table select { width: 400px; } +/* VN browse */ + +.vnbrowse .tc2 { text-align: right } + + /***** Producer page/list *******/ -- cgit v1.2.3