1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
package VNDB::Handler::Misc;
use strict;
use warnings;
use TUWF ':html', ':xml', 'uri_escape';
use VNDB::Func;
use VNDB::Types;
TUWF::register(
qr{nospam}, \&nospam,
qr{xml/prefs\.xml}, \&prefs,
qr{opensearch\.xml}, \&opensearch,
# redirects for old URLs
qr{u([1-9]\d*)/tags}, sub { $_[0]->resRedirect("/g/links?u=$_[1]", 'perm') },
qr{(.*[^/]+)/+}, sub { $_[0]->resRedirect("/$_[1]", 'perm') },
qr{([pv])}, sub { $_[0]->resRedirect("/$_[1]/all", 'perm') },
qr{v/search}, sub { $_[0]->resRedirect("/v/all?q=".uri_escape($_[0]->reqGet('q')||''), 'perm') },
qr{notes}, sub { $_[0]->resRedirect('/d8', 'perm') },
qr{faq}, sub { $_[0]->resRedirect('/d6', 'perm') },
qr{v([1-9]\d*)/(?:stats|scr)},
sub { $_[0]->resRedirect("/v$_[1]", 'perm') },
qr{u/list(/[a-z0]|/all)?},
sub { my $l = defined $_[1] ? $_[1] : '/all'; $_[0]->resRedirect("/u$l", 'perm') },
);
sub nospam {
my $self = shift;
$self->htmlHeader(title => 'Could not send form', noindex => 1);
div class => 'mainbox';
h1 'Could not send form';
div class => 'warning';
h2 'Error';
p 'The form could not be sent, please make sure you have Javascript enabled in your browser.';
end;
end;
$self->htmlFooter;
}
sub prefs {
my $self = shift;
return if !$self->authCheckCode;
return $self->resNotFound if !$self->authInfo->{id};
my $f = $self->formValidate(
{ get => 'key', enum => [qw|filter_vn filter_release|] },
{ get => 'value', required => 0, maxlength => 2000 },
);
return $self->resNotFound if $f->{_err};
$self->authPref($f->{key}, $f->{value});
# doesn't really matter what we return, as long as it's XML
$self->resHeader('Content-type' => 'text/xml');
xml;
tag 'done', '';
}
sub opensearch {
my $self = shift;
my $h = $self->reqBaseURI();
$self->resHeader('Content-Type' => 'application/opensearchdescription+xml');
xml;
tag 'OpenSearchDescription',
xmlns => 'http://a9.com/-/spec/opensearch/1.1/', 'xmlns:moz' => 'http://www.mozilla.org/2006/browser/search/';
tag 'ShortName', 'VNDB';
tag 'LongName', 'VNDB.org visual novel search';
tag 'Description', 'Search visual vovels on VNDB.org';
tag 'Image', width => 16, height => 16, type => 'image/x-icon', "$h/favicon.ico";
tag 'Url', type => 'text/html', method => 'get', template => "$h/v/all?q={searchTerms}", undef;
tag 'Url', type => 'application/opensearchdescription+xml', rel => 'self', template => "$h/opensearch.xml", undef;
tag 'Query', role => 'example', searchTerms => 'Tsukihime', undef;
tag 'moz:SearchForm', "$h/v/all";
end 'OpenSearchDescription';
}
1;
|