summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2011-02-04 11:46:00 +0100
committerYorhel <git@yorhel.nl>2011-02-04 11:46:00 +0100
commit7a5283dc5cb35aca7cefe3348d8697e29aedda15 (patch)
tree207a89f89c128ce61082a3a019b391b4cb8374c7
parent422451344f20a69b43b6fc4c51f89a5174ef8760 (diff)
parent876119b300473a5232b5fcc60eb403afe36e6163 (diff)
Merge branch 'beta'2.17
Conflicts: ChangeLog
-rw-r--r--.gitmodules3
-rw-r--r--ChangeLog14
-rw-r--r--Makefile7
-rw-r--r--README8
-rw-r--r--data/global.pl7
-rw-r--r--data/lang.txt749
-rw-r--r--data/script.js58
-rw-r--r--data/style.css5
-rw-r--r--lib/Multi/Feed.pm44
-rw-r--r--lib/Multi/IRC.pm3
-rw-r--r--lib/Multi/RG.pm13
-rw-r--r--lib/VNDB/DB/Releases.pm4
-rw-r--r--lib/VNDB/DB/Tags.pm98
-rw-r--r--lib/VNDB/DB/Users.pm6
-rw-r--r--lib/VNDB/Func.pm5
-rw-r--r--lib/VNDB/Handler/Discussions.pm57
-rw-r--r--lib/VNDB/Handler/Misc.pm117
-rw-r--r--lib/VNDB/Handler/Producers.pm69
-rw-r--r--lib/VNDB/Handler/Releases.pm108
-rw-r--r--lib/VNDB/Handler/Tags.pm193
-rw-r--r--lib/VNDB/Handler/ULists.pm100
-rw-r--r--lib/VNDB/Handler/Users.pm102
-rw-r--r--lib/VNDB/Handler/VNBrowse.pm30
-rw-r--r--lib/VNDB/Handler/VNEdit.pm119
-rw-r--r--lib/VNDB/Handler/VNPage.pm42
-rw-r--r--lib/VNDB/L10N.pm2
-rw-r--r--lib/VNDB/Plugin/TransAdmin.pm39
-rw-r--r--lib/VNDB/Util/Auth.pm24
-rw-r--r--lib/VNDB/Util/BrowseHTML.pm14
-rw-r--r--lib/VNDB/Util/CommonHTML.pm46
-rw-r--r--lib/VNDB/Util/FormHTML.pm32
-rw-r--r--lib/VNDB/Util/LayoutHTML.pm29
-rw-r--r--lib/VNDB/Util/Misc.pm55
-rw-r--r--lib/VNDBUtil.pm11
-rwxr-xr-xutil/jsgen.pl1
-rw-r--r--util/sql/func.sql1
-rw-r--r--util/sql/schema.sql1
-rw-r--r--util/updates/update_2.17.sql8
-rwxr-xr-xutil/vndb.pl47
m---------yawf0
40 files changed, 1173 insertions, 1098 deletions
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index aeada7bf..00000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "yawf"]
- path = yawf
- url = git://g.blicky.net/yawf.git
diff --git a/ChangeLog b/ChangeLog
index 5b561891..d51f3801 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,18 @@
-2.17 - ?
+2.18 -
+
+2.17 - 2011-02-04
+ - Allow moderators to overrule VN tag votes
+ - Added 'released' release filter
+ - Changed order of the filter action buttons
+ - Slightly re-organized lang.txt
- Fixed perl warning on /u+/votes batchedit with nothing selected
- Don't update the 'date' when changing a VN vote
+ - Switched to TUWF
+ - Order "all notifications" with new notifications first
+ - Added /t/all - a listing of all recently replied to threads
+ - Added error message when selected meta tags on VN filters
+ - Display warning for non-standard resolutions of uploaded screenshots
+ - Don't save uploaded image to a temporary location before checks
- Bugfix: Correctly randomize screenshots on homepage with filters
- Bugfix: Don't show NSFW screenshots on homepage with filters
- Bugfix-API: Use ~ for the get vn search filter instead of =
diff --git a/Makefile b/Makefile
index 4afd0f59..3e62d98d 100644
--- a/Makefile
+++ b/Makefile
@@ -38,7 +38,7 @@
.PHONY: all dirs js skins robots chmod chmod-tladmin multi-stop multi-start multi-restart\
- sql-import update-2.10 update-2.11 update-2.12 update-2.13 update-2.14 update-2.15 update-2.16
+ sql-import update-2.10 update-2.11 update-2.12 update-2.13 update-2.14 update-2.15 update-2.16 update-2.17
all: dirs js skins robots data/config.pl
@@ -163,3 +163,8 @@ update-2.16: all
$(multi-stop)
${runpsql} < util/updates/update_2.16.sql
$(multi-start)
+
+update-2.17: all
+ $(multi-stop)
+ ${runpsql} < util/updates/update_2.17.sql
+ $(multi-start)
diff --git a/README b/README
index fc70f650..1155ee3f 100644
--- a/README
+++ b/README
@@ -14,16 +14,15 @@ Requirements
Linux, or an OS that resembles Linux. Chances are VNDB won't run on Windows.
PostgreSQL 9.0+ (don't try older versions or other SQL databases, it won't work)
perl 5.12 recommended, 5.10 may also work
- A webserver that works with YAWF (lighttpd and Apache are known to work)
+ A webserver that works with TUWF (lighttpd and Apache are known to work)
(perl 5.12 core modules are not listed.)
util/vndb.pl:
Algorithm::Diff::Fast
- CGI::Minimal (required by YAWF)
- CGI::Cookie::XS (required by YAWF)
DBI
DBD::Pg
+ TUWF (get it from http://g.blicky.net/tuwf.git/)
FCGI (optional, for running as a FastCGI script)
PerlIO::gzip (optional, for output compression)
@@ -35,8 +34,6 @@ Requirements
DBD::Pg
POE
POE::Component::Pg (get it from http://g.blicky.net/poco-pg.git/)
- Feed:
- XML::Writer
IRC:
POE::Component::IRC
Image:
@@ -45,7 +42,6 @@ Requirements
PerlIO::gzip
RG:
XML::Parser
- XML::Writer
graphviz (/usr/bin/dot is used by default)
util/skingen.pl
diff --git a/data/global.pl b/data/global.pl
index f898599e..971db80a 100644
--- a/data/global.pl
+++ b/data/global.pl
@@ -9,6 +9,11 @@ our %O = (
db_login => [ 'dbi:Pg:dbname=vndb', 'vndb', 'passwd' ],
debug => 1,
logfile => $ROOT.'/data/log/vndb.log',
+ cookie_prefix => 'vndb_',
+ cookie_defaults => {
+ domain => '.vndb.org',
+ path => '/',
+ },
);
@@ -18,8 +23,6 @@ our %S = (%S,
url => 'http://vndb.org',
url_static => 'http://s.vndb.org',
skin_default => 'angel',
- cookie_domain => '.vndb.org',
- cookie_prefix => 'vndb_',
global_salt => 'any-private-string-here',
form_salt => 'a-different-private-string-here',
regen_static => 0,
diff --git a/data/lang.txt b/data/lang.txt
index 16e3cc8a..e689020d 100644
--- a/data/lang.txt
+++ b/data/lang.txt
@@ -99,82 +99,11 @@ ends with ']'. The following options are supported:
#############################################################################
-## Global strings ##
+## Database Values ##
#############################################################################
# data/global.pl - used in many places
-# Date/time format
-# See http://www.opengroup.org/onlinepubs/007908799/xsh/strftime.html for the formatting codes
-# (I recommend to keep the yyyy-mm-dd format, though, see http://www.cl.cam.ac.uk/~mgk25/iso-time.html)
-
-:_datetime_compact
-en : %Y-%m-%d
-ru : %d.%m.%Y
-cs : %Y-%m-%d
-hu :
-nl :
-
-:_datetime_full
-en : %Y-%m-%d at %R
-ru : %d.%m.%Y, %R
-cs : %Y-%m-%d v %R
-hu : %Y-%m-%d - %R-kor
-nl : %Y-%m-%d om %R
-
-
-# Age display
-
-:_age_years
-en : [_1] [quant,_1,year,years] ago
-ru : [_1] [quant,_1,год,года,лет] назад
-cs : před [_1] [quant,_1,rokem,roky,roky]
-hu : [_1] [quant,_1,éve,éve]
-nl : [_1] [quant,_1,jaar,jaren] geleden
-
-:_age_months
-en : [_1] [quant,_1,month,months] ago
-ru : [_1] [quant,_1,месяц,месяца,месяцев] назад
-cs : před [_1] [quant,_1,měsícem,měsíci,měsíci]
-hu : [_1] [quant,_1,hónapja,hónapja]
-nl : [_1] [quant,_1,maand,maanden] geleden
-
-:_age_weeks
-en : [_1] [quant,_1,week,weeks] ago
-ru : [_1] [quant,_1,неделя,недели,недель] назад
-cs : před [_1] [quant,_1,týdnem,týdny,týdny]
-hu : [_1] [quant,_1,hete,hete]
-nl : [_1] [quant,_1,week,weken] geleden
-
-:_age_days
-en : [_1] [quant,_1,day,days] ago
-ru : [_1] [quant,_1,день,дня,дней] назад
-cs : před [_1] [quant,_1,dnem,dny,dny]
-hu : [_1] [quant,_1,napja,napja]
-nl : [_1] [quant,_1,dag,dagen] geleden
-
-:_age_hours
-en : [_1] [quant,_1,hour,hours] ago
-ru : [_1] [quant,_1,час,часа,часов] назад
-cs : před [_1] [quant,_1,hodinou,hodinami,hodinami]
-hu : [_1] [quant,_1,órája,órája]
-nl : [_1] [quant,_1,uur,uren] geleden
-
-:_age_min
-en : [_1] min ago
-ru : [_1] [quant,_1,минута,минуты,минут] назад
-cs : před [_1] min
-hu : [_1] perce
-nl : [_1] min. geleden
-
-:_age_sec
-en : [_1] sec ago
-ru : [_1] [quant,_1,секунда,секунды,секунд] назад
-cs : před [_1] s
-hu : [_1] másodperce
-nl : [_1] sec. geleden
-
-
# user ranks
:_urank_0
@@ -1208,6 +1137,85 @@ hu : Lemondva
nl : Opgegeven
+
+
+#############################################################################
+## Global UI strings ##
+#############################################################################
+# used in many places
+
+
+# Date/time format
+# See http://www.opengroup.org/onlinepubs/007908799/xsh/strftime.html for the formatting codes
+# (I recommend to keep the yyyy-mm-dd format, though, see http://www.cl.cam.ac.uk/~mgk25/iso-time.html)
+
+:_datetime_compact
+en : %Y-%m-%d
+ru : %d.%m.%Y
+cs : %Y-%m-%d
+hu :
+nl :
+
+:_datetime_full
+en : %Y-%m-%d at %R
+ru : %d.%m.%Y, %R
+cs : %Y-%m-%d v %R
+hu : %Y-%m-%d - %R-kor
+nl : %Y-%m-%d om %R
+
+
+# Age display
+
+:_age_years
+en : [_1] [quant,_1,year,years] ago
+ru : [_1] [quant,_1,год,года,лет] назад
+cs : před [_1] [quant,_1,rokem,roky,roky]
+hu : [_1] [quant,_1,éve,éve]
+nl : [_1] [quant,_1,jaar,jaren] geleden
+
+:_age_months
+en : [_1] [quant,_1,month,months] ago
+ru : [_1] [quant,_1,месяц,месяца,месяцев] назад
+cs : před [_1] [quant,_1,měsícem,měsíci,měsíci]
+hu : [_1] [quant,_1,hónapja,hónapja]
+nl : [_1] [quant,_1,maand,maanden] geleden
+
+:_age_weeks
+en : [_1] [quant,_1,week,weeks] ago
+ru : [_1] [quant,_1,неделя,недели,недель] назад
+cs : před [_1] [quant,_1,týdnem,týdny,týdny]
+hu : [_1] [quant,_1,hete,hete]
+nl : [_1] [quant,_1,week,weken] geleden
+
+:_age_days
+en : [_1] [quant,_1,day,days] ago
+ru : [_1] [quant,_1,день,дня,дней] назад
+cs : před [_1] [quant,_1,dnem,dny,dny]
+hu : [_1] [quant,_1,napja,napja]
+nl : [_1] [quant,_1,dag,dagen] geleden
+
+:_age_hours
+en : [_1] [quant,_1,hour,hours] ago
+ru : [_1] [quant,_1,час,часа,часов] назад
+cs : před [_1] [quant,_1,hodinou,hodinami,hodinami]
+hu : [_1] [quant,_1,órája,órája]
+nl : [_1] [quant,_1,uur,uren] geleden
+
+:_age_min
+en : [_1] min ago
+ru : [_1] [quant,_1,минута,минуты,минут] назад
+cs : před [_1] min
+hu : [_1] perce
+nl : [_1] min. geleden
+
+:_age_sec
+en : [_1] sec ago
+ru : [_1] [quant,_1,секунда,секунды,секунд] назад
+cs : před [_1] s
+hu : [_1] másodperce
+nl : [_1] sec. geleden
+
+
# Age ratings
:_minage_null
@@ -1242,182 +1250,7 @@ hu : (p.l. [_1])
nl : (o.a. [_1])
-# Form messages
-
-:_formerr_e_login_failed
-en : Invalid username or password
-ru : Некорректное имя пользователя или пароль
-cs : Neplatné uživatelské jméno nebo heslo
-hu : Hibás felhasználónév vagy jelszó
-nl : Ongeldige gebruikersnaam of wachtwoord
-
-:_formerr_e_nomail
-en : No user found with that email address
-ru : Пользователя с такой электронной почтой не существует
-cs : Uživatel s touto e-mailovou adresou nebyl nalezen
-hu : Nem található felhasználó ezzel az email címmel
-nl : Geen gebruiker met dat email adres
-
-:_formerr_e_passmatch
-en : Passwords do not match
-ru : Пароли не совпадают
-cs : Hesla nejsou stejná
-hu : A jelszavak nem egyeznek meg
-nl : Wachtwoorden komen niet overeen
-
-:_formerr_e_usrexists
-en : Someone already has this username, please choose something else
-ru : Кто-то уже зарегистрировал такой ник, пожалуйста, выберите другой
-cs : Toto uživatelské jméno už je v užívání, vyberte prosím jiné
-hu : Már foglalt ez a felhasználónév, kérlek válassz másikat
-nl : Gebruikersnaam al bezet, probeer iets anders
-
-:_formerr_e_mailexists
-en : Someone already registered with that email address
-ru : Кто-то уже регистрировался с таким адресом электронной почты
-cs : Tuto e-mailovou adresu již někdo k registraci použil
-hu : Valaki már regisztrált ezzel az email címmel
-nl : Iemand heeft zich al geregistreerd met dat emailadres
-
-:_formerr_e_noimage
-en : Image must be in JPEG or PNG format
-ru : Изображение должно быть в формате JPEG или PNG
-cs : Obrázek musí být v JPEG nebo PNG formátu
-hu : A kép muszáj JPEG vagy PNG formátumba legyen
-nl : Plaatje moet in JPEG of PNG formaat zijn
-
-:_formerr_e_toolarge
-en : Image is too large, only 500kB allowed
-ru : Изображение слишком большое, 500 кб - максимально допустимый предел
-cs : Obrázek je moc velký, je povoleno pouze 500kB
-hu : A kép túl nagy, 500kb a megengedett
-nl : Plaatje is te groot, max. 500kB toegestaan
-
-:_formerr_e_oneaday
-en : You can only register one account from the same IP within 24 hours
-ru : Вы можете зарегистрировать учётную запись с одного и того же IP лишь по прошествии 24 часов
-cs : V rámci 24 hodin si lze z jedné IP adresy zaregistrovat pouze jeden účet
-hu : 24 óra alatt csak egy fiókot hozhatsz létre ugyanazzal az IP-vel
-nl : Per dag mag je maar één account aanmaken vanaf hetzelfde IP
-
-:_formerr_e_notanswer
-en : Question was not correctly answered. Are you sure you are a human?
-ru : Неправильный ответ. А вы точно человек?
-cs : Na otázku jste neodpověděli správně. Jste si jisti, že jste člověk?
-hu : A kérdésre a válasz helytelen. Biztos vagy benne, hogy ember vagy?
-nl : Vraag was incorrect beantwoord. Weet je zeker dat je een mens bent?
-
-:_formerr_e_nochanges
-en : No changes, please don't create an entry that is fully identical to another
-ru : Изменения отсутствуют, пожалуйста, не создавайте идентичных копий записей
-cs : Nenalezeny změny, netvořte prosím záznam, který je plně totožný s jiným
-hu : Nem történt változtatás, kérlek ne készíts egy bejegyzést ami teljesen megegyezik egy másikkal
-nl : Geen veranderingen aangebracht, maak a.u.b. geen item aan die exact hetzelfde is als een ander
-
-:_formerr_e_doublepost
-en : Please wait 30 seconds before making another post
-ru : Прежде чем публиковать очередное сообщение, пожалуйста, подождите 30 секунд
-cs : Před posláním dalšího příspěvku počkejte prosím 30 sekund
-hu : Kérlek várj 30 másodpercet mielőtt új hozzászólást küldesz
-nl : Wacht a.u.b. 30 seconden voordat je een nieuwe post maakt
-
-:_formerr_e_badeditsum
-en : Please read [url,/d5.4,the guidelines] on how to use the edit summary.
-ru : Пожалуйста, прочтите [url,/d5.4,руководство] о том, как использовать поле "Суммарно о правке".
-cs*:
-hu : Légyszíves olvasdd el a szerkesztési összegzés [url,/d5.4, útmutatóját].
-nl : Lees a.u.b. [url,/d5.4,de richtlijnen] over het gebruik van de samenvatting.
-
-:_formerr_title
-en : Error
-ru : Ошибка
-cs : Chyba
-hu : Hiba
-nl :
-
-:_formerr_subtitle
-en : Form could not be sent:
-ru : Невозможно отправить форму:
-cs : Dokument nemohl být odeslán:
-hu : Az űrlapot nem sikerült elküldeni:
-nl : Formulier kon niet verzonden worden:
-
-:_formerr_required
-en : [_1] is a required field!
-ru : [_1] - обязательное поле!
-cs : [_1] je pole, které musí být vyplněno!
-hu : [_1] kitöltése kötelező!
-nl : [_1] is een verplicht veld!
-
-:_formerr_minlength
-en : [_1]: should have at least [_2] characters
-ru : [_1]: [quant,_2,необходим,необходимы,необходимо] хотя бы [_2] [quant,_2,символ,символа,символов]
-cs : [_1]: musí mít minimálně [_2] znaků
-hu : [_1]: legalább [_2] karaktert kell tartalmazzon
-nl : [_1]: moet minimaal [_2] tekens bevatten
-
-:_formerr_maxlength
-en : [_1]: only [_2] characters allowed
-ru : [_1]: [quant,_2,разрешён,разрешены,разрешено] лишь [_2] [quant,_2,символ,символа,символов]
-cs : [_1]: je povoleno maximálně [_2] znaků
-hu : [_1]: csakis [_2] karakterek megengedettek
-nl : [_1]: maximaal [_2] tekens toegestaan
-
-:_formerr_enum
-en : [_1] must be one of the following: [_2]
-ru : Поле '[_1]' должно соответствовать одному из следующих значений: [_2]
-cs : [_1] musí být z následujícího seznamu: [_2]
-hu : [_1] muszáj az alábbiak közül valamelyik legyen: [_2]
-nl : [_1] moet één van het volgende zijn: [_2]
-
-:_formerr_wrongboard
-en : Wrong board: [_1]
-ru : Некорректная доска: [_1]
-cs : Špatný board: [_1]
-hu : Rossz alfórum: [_1]
-nl : Onbekend forum: [_1]
-
-:_formerr_tagexists
-en : Tag [url,_1,_2] already exists!
-ru : Тег [url,_1,_2] уже существует!
-cs : Tag [url,_1,_2] již existuje!
-hu : A(z) [url,_1,_2] címke már létezik!
-nl : Tag [url,_1,_2] bestaat al!
-
-:_formerr_tpl_mail
-en : Invalid email address
-ru : Некорректный адрес электронной почты
-cs : Neplatná e-mailová adresa
-hu : Érvénytelen email cím
-nl : Ongeldig emailadres
-
-:_formerr_tpl_url
-en : [_1]: Invalid URL
-ru : [_1]: Некорректная ссылка
-cs : [_1]: Neplatná URL
-hu : [_1]: Érvénytelen hivatkozás
-nl : [_1]: Ongeldige URL
-
-:_formerr_tpl_asciiprint
-en : [_1] may only contain ASCII characters
-ru : Поле '[_1]' может содержать лишь символы диапазона ASCII
-cs : [_1] smí obsahovat pouze znaky ASCII
-hu : [_1] kizárólag ASCII karaktereket tartalmazhat
-nl : [_1] mag alleen ASCII tekens bevatten
-
-:_formerr_tpl_int
-en : [_1]: Not a valid number
-ru : [_1] не является правильным числом
-cs : [_1]: Neplatné číslo
-hu : [_1]: Nem egy érvényes szám
-nl : [_1]: Geen geldig nummer
-
-:_formerr_tpl_pname
-en : [_1] can only contain lowercase alphanumeric characters and a hyphen, and must start with a character
-ru : Поле '[_1]' может содержать лишь символы буквенно-цифрового диапазона в нижнем регистре и чёрточку и должно начинаться с буквы
-cs : [_1] smí obsahovat pouze malá písmena, čísla a pomlčku, a musí začínat písmenem
-hu : [_1] egy karakterrel kell kezdődjön és csak kisbetűs alfanumerikus karaktereket és egy kötőjelet tartalmazhat
-nl : [_1] mag alleen kleine letters, cijfers of koppeltekens bevatten, en moet beginnen met een letter
+# misc. form stuff
:_form_tab_all
en : All items
@@ -1485,6 +1318,13 @@ cs : Nahrává se...
hu : Betöltés...
nl : Laden...
+:_js_close
+en : close
+ru : закрыть
+cs : zavřít
+hu : bezárás
+nl : sluiten
+
:_js_date_year
en : -year-
ru : -год-
@@ -1513,13 +1353,6 @@ cs : Žádné výsledky...
hu : Nincs eredmény...
nl : Geen resultaten...
-:_js_iv_close
-en : close
-ru : закрыть
-cs : zavřít
-hu : bezárás
-nl : sluiten
-
:_js_iv_prev
en : previous
ru : назад
@@ -1548,6 +1381,65 @@ cs : čeká na schválení
hu : moderálásra vár
nl : ongemodereerd
+:_js_ds_tag_nometa
+en : Can't use meta tags here!
+ru : Использование мета-тегов здесь запрещено!
+cs : Zde se nedají použít meta-tagy!
+hu : Itt nem használhatsz meta címkéket!
+nl : Meta tags kunnen hier niet gebruikt worden!
+
+
+# Filter selector
+
+:_js_fil_filters
+en : Filters
+ru : Фильтры
+cs : Filtry
+hu : Szűrők
+nl :
+
+:_js_fil_apply
+en : Apply
+ru : Применить
+cs : Použít
+hu : Alkalmaz
+nl : Zoek
+
+:_js_fil_reset
+en : Reset
+ru : Очистить
+cs : Vymazat
+hu : Törlés
+nl :
+
+:_js_fil_save
+en : Save as default
+ru : Запомнить по умолчанию
+cs*:
+hu : Mentés alapértelmezet ként
+nl : Opslaan als standaard
+
+:_js_fil_savenote
+en : Your saved filters will be applied automatically to several other parts of the site as well, such as the homepage. To change these filters, come back to this page and use the "Save as default" button again. To remove your saved filters, hit "Reset" and then save.
+ru : Сохранённые фильтры также будут автоматически применены к другим частям сайта, например, к заглавной странице. Для их изменения вновь откройте эту страницу и щёлкните кнопку "Запомнить по умолчанию". Чтобы избавиться от сохранённых фильтров, щёлкните "Сброс" и сохраните настройки.
+cs*:
+hu : Az általad lementet szűrők automatikusan alkalmazva lesznek a honlap többi részén is, mint pl. a főoldalon. Ha meg akarod változtatni ezeket a szűrőket, akkor gyere vissza erre az oldalra és klikkelj újra a "Mentés alapértelmezet ként" gombra. A szűrőket a "Törlés" gombbal tudod eltávolítani, majd mentsd le újra.
+nl : Je opgeslagen filters worden ook automatisch toegepast op een aantal andere delen van de site, waaronder de homepagina. Om deze filters te veranderen, ga terug naar deze pagina en gebruik de "Opslaan als standaard" knop weer. Om je opgeslagen filters te verwijderen, klik op "Reset" en sla je instellingen weer op.
+
+:_js_fil_boolor
+en : Boolean or, selecting more gives more results
+ru : логическое 'или', чем больше выбрано, тем больше даёт результатов
+cs : boolean nebo, výběr více dá více výsledků
+hu : Boole féle értékhalmaz(igaz/hamis), ha többet jelölsz be, több eredményt ad ki
+nl : Booleaanse 'of', meerdere selecties geven meer resultaten
+
+:_js_fil_booland
+en : Boolean and, selecting more gives less results
+ru : логическое 'и', чем больше выбрано, тем меньше даёт результатов
+cs : Boolean a, výběr více dá méně výsledků
+hu : Boole féle értékhalmaz(igaz/hamis), s ha többet választasz ki akkor kevesebb találatot ad
+nl : Booleaanse 'en', meerdere selecties geven minder resultaten
+
# title of the syndication icon (this thing -> http://en.wikipedia.org/wiki/Atom_feed)
@@ -1559,6 +1451,42 @@ hu : Atom Hírfolyam
nl :
+# Short message reminding the user to post in ENGLISH (Used at about every message/description input field)
+
+:_inenglish
+en : English please!
+ru : Пожалуйста, пишите на английском!
+cs : Prosíme, anglicky!
+hu : Kérlek angolul válaszolj!
+nl : Engels a.u.b.!
+
+
+# Messages about editing on the VN/Release/Producer pages (right beneath the tabs)
+
+:_itemmsg_locked
+en : Locked for editing
+ru : Правка заблокирована
+cs : Zamčeno pro editaci
+hu : Lezárva
+nl : Gesloten voor wijzigingen
+
+:_itemmsg_login
+en : You need to be [url,_1,logged in] to edit this page
+ru : Чтобы редактировать эту страницу, вы должны быть [url,_1,авторизованы]
+cs : Pro editaci této stránky musíte být [url,_1,přihlášen]
+hu : Be kell legyél [url,_1, jelentkezve], hogy szerkeszthesd ezt az oldalt
+nl : Je moet [url,_1,ingelogd] zijn om deze pagina te wijzigen
+
+:_itemmsg_denied
+en : You are not allowed to edit this page
+ru : Вам запрещено редактировать эту страницу
+cs : Nemáte oprávnění editovat tuto stránku
+hu : Nincs engedélyed, hogy szerkeszd ezt az oldalt
+nl : Je bent niet toegestaan om wijzigingen aan te brengen
+
+
+
+
#############################################################################
## Main website layout ##
#############################################################################
@@ -2532,6 +2460,14 @@ cs : Diskuse pro [_1]
hu : [_1]-hoz kapcsolódó beszélgetések
nl : Gerelateerde discussies voor [_1]
+# also used on the discussion board index (/t)
+:_disboard_item_all
+en : All boards
+ru*:
+cs*:
+hu*:
+nl : Alle fora
+
:_disboard_rootlink
en : Discussion board
ru : Форум
@@ -3740,13 +3676,6 @@ nl : Sorry, geen items gevonden die aan je filters voldoen. Je kan wat filters u
Houd er ook rekening mee dat we niet alle informatie hebben over alle uitgaven, dus filteren op o.a. schermresolutie zal alle uitgaven waarvan we dit niet weten niet weergeven, ook al heeft het wel wat je zoekt.
-:_rbrowse_filters
-en : Filters
-ru : Фильтры
-cs : Filtry
-hu : Szűrők
-nl :
-
:_rbrowse_fil_title
en : Release filters
ru : Фильтры выпусков
@@ -3761,13 +3690,6 @@ cs : Obecné
hu : Általános
nl : Algemeen
-:_rbrowse_close
-en : close
-ru : закрыть
-cs : zavřít
-hu : bezár
-nl : sluiten
-
:_rbrowse_type
en : Release type
ru : Тип выпуска
@@ -3852,6 +3774,27 @@ cs : Vydáno před
hu : Kiadva előtt
nl : Uitgegeven voor
+:_rbrowse_released
+en : Release date
+ru*:
+cs*:
+hu*:
+nl : Uitgavedatum
+
+:_rbrowse_released_yes
+en : Past (already released)
+ru*:
+cs*:
+hu*:
+nl : Verleden (al uitgegeven)
+
+:_rbrowse_released_no
+en : Future (to be released)
+ru*:
+cs*:
+hu*:
+nl : Toekomst (nog niet uitgegeven)
+
:_rbrowse_minage
en : Age rating
ru : Возрастной рейтинг
@@ -3880,13 +3823,6 @@ cs : Rozlišení obrazovky
hu : Felbontás
nl : Schermresolutie
-:_rbrowse_boolor
-en : Boolean or, selecting more gives more results
-ru : логическое 'или', чем больше выбрано, тем больше даёт результатов
-cs : boolean nebo, výběr více dá více výsledků
-hu : Boole féle értékhalmaz(igaz/hamis), ha többet jelölsz be, több eredményt ad ki
-nl : Booleaanse 'of', meerdere selecties geven meer resultaten
-
:_rbrowse_platform
en : Platform
ru : Платформы
@@ -3929,34 +3865,6 @@ cs : Ero scény
hu : Ero jelenetek
nl : Erotische scenes
-:_rbrowse_filsave
-en : Save as default
-ru : Запомнить по умолчанию
-cs*:
-hu : Mentés alapértelmezet ként
-nl : Opslaan als standaard
-
-:_rbrowse_apply
-en : Apply
-ru : Применить
-cs : Použít
-hu : Alkalmaz
-nl : Zoek
-
-:_rbrowse_reset
-en : Reset
-ru : Очистить
-cs : Vymazat
-hu : Törlés
-nl :
-
-:_rbrowse_savenote
-en : Your saved filters will be applied automatically to several other parts of the site as well, such as the homepage. To change these filters, come back to this page and use the "Save as default" button again. To remove your saved filters, hit "Reset" and then save.
-ru : Сохранённые фильтры также будут автоматически применены к другим частям сайта, например, к заглавной странице. Для их изменения вновь откройте эту страницу и щёлкните кнопку "Запомнить по умолчанию". Чтобы избавиться от сохранённых фильтров, щёлкните "Сброс" и сохраните настройки.
-cs*:
-hu : Az általad lementet szűrők automatikusan alkalmazva lesznek a honlap többi részén is, mint pl. a főoldalon. Ha meg akarod változtatni ezeket a szűrőket, akkor gyere vissza erre az oldalra és klikkelj újra a "Mentés alapértelmezet ként" gombra. A szűrőket a "Törlés" gombbal tudod eltávolítani, majd mentsd le újra.
-nl : Je opgeslagen filters worden ook automatisch toegepast op een aantal andere delen van de site, waaronder de homepagina. Om deze filters te veranderen, ga terug naar deze pagina en gebruik de "Opslaan als standaard" knop weer. Om je opgeslagen filters te verwijderen, klik op "Reset" en sla je instellingen weer op.
-
@@ -4671,13 +4579,6 @@ cs : Předmět nenalezen!
hu : A tárgy nem található!
nl : Tag niet gevonden!
-:_tagv_nometa
-en : Can't use meta tags here!
-ru : Использование мета-тегов здесь запрещено!
-cs : Zde se nedají použít meta-tagy!
-hu : Itt nem használhatsz meta címkéket!
-nl : Meta tags kunnen hier niet gebruikt worden!
-
:_tagv_double
en : Tag is already present!
ru : Тег уже указан!
@@ -5938,13 +5839,6 @@ cs : Tagy
hu : Címkék
nl :
-:_vnbrowse_booland
-en : Boolean and, selecting more gives less results
-ru : логическое 'и', чем больше выбрано, тем меньше даёт результатов
-cs : Boolean a, výběr více dá méně výsledků
-hu : Boole féle értékhalmaz(igaz/hamis), s ha többet választasz ki akkor kevesebb találatot ad
-nl : Booleaanse 'en', meerdere selecties geven minder resultaten
-
:_vnbrowse_tagactive
en : These filters are ignored on tag pages (when set as default).
ru : Эти фильтры недействительны на страницах тегов (по умолчанию).
@@ -6450,6 +6344,13 @@ cs : Plná velikost: [_1]
hu : Teljes méret: [_1]
nl : Volledige grootte: [_1]
+:_vnedit_scr_nonstandard
+en : WARNING: Odd resolution! Please check whether the image has been cropped correctly.
+ru*:
+cs*:
+hu*:
+nl : WAARSCHUWING: Vreemde resolutie! Controleer a.u.b. of de plaatje goed is gecropped.
+
:_vnedit_scr_nsfw
en : This screenshot is NSFW
ru : Этот скриншот НБДР (NSFW)
@@ -7279,30 +7180,6 @@ nl : Je wijzigd een verouderde versie van deze [index,_1,visual novel,uitgave,pr
Als je dit opslaat, zullen alle wijzigingen na deze revisie teruggedraait worden.
-# Messages about editing on the VN/Release/Producer pages (right beneath the tabs)
-
-:_itemmsg_locked
-en : Locked for editing
-ru : Правка заблокирована
-cs : Zamčeno pro editaci
-hu : Lezárva
-nl : Gesloten voor wijzigingen
-
-:_itemmsg_login
-en : You need to be [url,_1,logged in] to edit this page
-ru : Чтобы редактировать эту страницу, вы должны быть [url,_1,авторизованы]
-cs : Pro editaci této stránky musíte být [url,_1,přihlášen]
-hu : Be kell legyél [url,_1, jelentkezve], hogy szerkeszthesd ezt az oldalt
-nl : Je moet [url,_1,ingelogd] zijn om deze pagina te wijzigen
-
-:_itemmsg_denied
-en : You are not allowed to edit this page
-ru : Вам запрещено редактировать эту страницу
-cs : Nemáte oprávnění editovat tuto stránku
-hu : Nincs engedélyed, hogy szerkeszd ezt az oldalt
-nl : Je bent niet toegestaan om wijzigingen aan te brengen
-
-
# User didn't pass the spam protection
:_nospam_title
@@ -7344,16 +7221,6 @@ hu : Kérem nyomva meg a böngészője vissza gombját, frissítse az oldalt és
nl : Ga terug naar de vorige pagina, vernieuw deze en probeer het opnieuw.
-# Short message reminding the user to post in ENGLISH (Used at about every message/description input field)
-
-:_inenglish
-en : English please!
-ru : Пожалуйста, пишите на английском!
-cs : Prosíme, anglicky!
-hu : Kérlek angolul válaszolj!
-nl : Engels a.u.b.!
-
-
# No browser support to display the relation graphs
:_rg_notsupp
@@ -7371,4 +7238,182 @@ hu : A böngésződ szar, nem képes megjeleníteni a szép összefüggés grafi
nl : Je browser is troep, het heeft niet de benodigde functionaliteit om onze mooie grafiekjes weer te geven.
+# Form messages
+
+:_formerr_e_login_failed
+en : Invalid username or password
+ru : Некорректное имя пользователя или пароль
+cs : Neplatné uživatelské jméno nebo heslo
+hu : Hibás felhasználónév vagy jelszó
+nl : Ongeldige gebruikersnaam of wachtwoord
+
+:_formerr_e_nomail
+en : No user found with that email address
+ru : Пользователя с такой электронной почтой не существует
+cs : Uživatel s touto e-mailovou adresou nebyl nalezen
+hu : Nem található felhasználó ezzel az email címmel
+nl : Geen gebruiker met dat email adres
+
+:_formerr_e_passmatch
+en : Passwords do not match
+ru : Пароли не совпадают
+cs : Hesla nejsou stejná
+hu : A jelszavak nem egyeznek meg
+nl : Wachtwoorden komen niet overeen
+
+:_formerr_e_usrexists
+en : Someone already has this username, please choose something else
+ru : Кто-то уже зарегистрировал такой ник, пожалуйста, выберите другой
+cs : Toto uživatelské jméno už je v užívání, vyberte prosím jiné
+hu : Már foglalt ez a felhasználónév, kérlek válassz másikat
+nl : Gebruikersnaam al bezet, probeer iets anders
+
+:_formerr_e_mailexists
+en : Someone already registered with that email address
+ru : Кто-то уже регистрировался с таким адресом электронной почты
+cs : Tuto e-mailovou adresu již někdo k registraci použil
+hu : Valaki már regisztrált ezzel az email címmel
+nl : Iemand heeft zich al geregistreerd met dat emailadres
+
+:_formerr_e_noimage
+en : Image must be in JPEG or PNG format
+ru : Изображение должно быть в формате JPEG или PNG
+cs : Obrázek musí být v JPEG nebo PNG formátu
+hu : A kép muszáj JPEG vagy PNG formátumba legyen
+nl : Plaatje moet in JPEG of PNG formaat zijn
+
+:_formerr_e_toolarge
+en : Image is too large, only 500kB allowed
+ru : Изображение слишком большое, 500 кб - максимально допустимый предел
+cs : Obrázek je moc velký, je povoleno pouze 500kB
+hu : A kép túl nagy, 500kb a megengedett
+nl : Plaatje is te groot, max. 500kB toegestaan
+
+:_formerr_e_oneaday
+en : You can only register one account from the same IP within 24 hours
+ru : Вы можете зарегистрировать учётную запись с одного и того же IP лишь по прошествии 24 часов
+cs : V rámci 24 hodin si lze z jedné IP adresy zaregistrovat pouze jeden účet
+hu : 24 óra alatt csak egy fiókot hozhatsz létre ugyanazzal az IP-vel
+nl : Per dag mag je maar één account aanmaken vanaf hetzelfde IP
+
+:_formerr_e_notanswer
+en : Question was not correctly answered. Are you sure you are a human?
+ru : Неправильный ответ. А вы точно человек?
+cs : Na otázku jste neodpověděli správně. Jste si jisti, že jste člověk?
+hu : A kérdésre a válasz helytelen. Biztos vagy benne, hogy ember vagy?
+nl : Vraag was incorrect beantwoord. Weet je zeker dat je een mens bent?
+
+:_formerr_e_nochanges
+en : No changes, please don't create an entry that is fully identical to another
+ru : Изменения отсутствуют, пожалуйста, не создавайте идентичных копий записей
+cs : Nenalezeny změny, netvořte prosím záznam, který je plně totožný s jiným
+hu : Nem történt változtatás, kérlek ne készíts egy bejegyzést ami teljesen megegyezik egy másikkal
+nl : Geen veranderingen aangebracht, maak a.u.b. geen item aan die exact hetzelfde is als een ander
+
+:_formerr_e_doublepost
+en : Please wait 30 seconds before making another post
+ru : Прежде чем публиковать очередное сообщение, пожалуйста, подождите 30 секунд
+cs : Před posláním dalšího příspěvku počkejte prosím 30 sekund
+hu : Kérlek várj 30 másodpercet mielőtt új hozzászólást küldesz
+nl : Wacht a.u.b. 30 seconden voordat je een nieuwe post maakt
+
+:_formerr_e_badeditsum
+en : Please read [url,/d5.4,the guidelines] on how to use the edit summary.
+ru : Пожалуйста, прочтите [url,/d5.4,руководство] о том, как использовать поле "Суммарно о правке".
+cs*:
+hu : Légyszíves olvasdd el a szerkesztési összegzés [url,/d5.4, útmutatóját].
+nl : Lees a.u.b. [url,/d5.4,de richtlijnen] over het gebruik van de samenvatting.
+
+:_formerr_title
+en : Error
+ru : Ошибка
+cs : Chyba
+hu : Hiba
+nl :
+
+:_formerr_subtitle
+en : Form could not be sent:
+ru : Невозможно отправить форму:
+cs : Dokument nemohl být odeslán:
+hu : Az űrlapot nem sikerült elküldeni:
+nl : Formulier kon niet verzonden worden:
+
+:_formerr_required
+en : [_1] is a required field!
+ru : [_1] - обязательное поле!
+cs : [_1] je pole, které musí být vyplněno!
+hu : [_1] kitöltése kötelező!
+nl : [_1] is een verplicht veld!
+
+:_formerr_minlength
+en : [_1]: should have at least [_2] characters
+ru : [_1]: [quant,_2,необходим,необходимы,необходимо] хотя бы [_2] [quant,_2,символ,символа,символов]
+cs : [_1]: musí mít minimálně [_2] znaků
+hu : [_1]: legalább [_2] karaktert kell tartalmazzon
+nl : [_1]: moet minimaal [_2] tekens bevatten
+
+:_formerr_maxlength
+en : [_1]: only [_2] characters allowed
+ru : [_1]: [quant,_2,разрешён,разрешены,разрешено] лишь [_2] [quant,_2,символ,символа,символов]
+cs : [_1]: je povoleno maximálně [_2] znaků
+hu : [_1]: csakis [_2] karakterek megengedettek
+nl : [_1]: maximaal [_2] tekens toegestaan
+
+:_formerr_enum
+en : [_1] must be one of the following: [_2]
+ru : Поле '[_1]' должно соответствовать одному из следующих значений: [_2]
+cs : [_1] musí být z následujícího seznamu: [_2]
+hu : [_1] muszáj az alábbiak közül valamelyik legyen: [_2]
+nl : [_1] moet één van het volgende zijn: [_2]
+
+:_formerr_wrongboard
+en : Wrong board: [_1]
+ru : Некорректная доска: [_1]
+cs : Špatný board: [_1]
+hu : Rossz alfórum: [_1]
+nl : Onbekend forum: [_1]
+
+:_formerr_tagexists
+en : Tag [url,_1,_2] already exists!
+ru : Тег [url,_1,_2] уже существует!
+cs : Tag [url,_1,_2] již existuje!
+hu : A(z) [url,_1,_2] címke már létezik!
+nl : Tag [url,_1,_2] bestaat al!
+
+:_formerr_tpl_mail
+en : Invalid email address
+ru : Некорректный адрес электронной почты
+cs : Neplatná e-mailová adresa
+hu : Érvénytelen email cím
+nl : Ongeldig emailadres
+
+:_formerr_tpl_url
+en : [_1]: Invalid URL
+ru : [_1]: Некорректная ссылка
+cs : [_1]: Neplatná URL
+hu : [_1]: Érvénytelen hivatkozás
+nl : [_1]: Ongeldige URL
+
+:_formerr_tpl_asciiprint
+en : [_1] may only contain ASCII characters
+ru : Поле '[_1]' может содержать лишь символы диапазона ASCII
+cs : [_1] smí obsahovat pouze znaky ASCII
+hu : [_1] kizárólag ASCII karaktereket tartalmazhat
+nl : [_1] mag alleen ASCII tekens bevatten
+
+:_formerr_tpl_int
+en : [_1]: Not a valid number
+ru : [_1] не является правильным числом
+cs : [_1]: Neplatné číslo
+hu : [_1]: Nem egy érvényes szám
+nl : [_1]: Geen geldig nummer
+
+:_formerr_tpl_pname
+en : [_1] can only contain lowercase alphanumeric characters and a hyphen, and must start with a character
+ru : Поле '[_1]' может содержать лишь символы буквенно-цифрового диапазона в нижнем регистре и чёрточку и должно начинаться с буквы
+cs : [_1] smí obsahovat pouze malá písmena, čísla a pomlčku, a musí začínat písmenem
+hu : [_1] egy karakterrel kell kezdődjön és csak kisbetűs alfanumerikus karaktereket és egy kötőjelet tartalmazhat
+nl : [_1] mag alleen kleine letters, cijfers of koppeltekens bevatten, en moet beginnen met een letter
+
+
# vim: set ft=none:
diff --git a/data/script.js b/data/script.js
index a946a4f3..0cadd300 100644
--- a/data/script.js
+++ b/data/script.js
@@ -136,7 +136,8 @@ function addBody(el) {
function setContent() {
setText(arguments[0], '');
for(var i=1; i<arguments.length; i++)
- arguments[0].appendChild(tag(arguments[i]));
+ if(arguments[i] != null)
+ arguments[0].appendChild(tag(arguments[i]));
}
function getText(obj) {
return obj.textContent || obj.innerText || '';
@@ -216,7 +217,7 @@ function ivInit() {
tag('b', {id:'ivimg'}, ''),
tag('br', null),
tag('a', {href:'#', id:'ivfull'}, ''),
- tag('a', {href:'#', onclick: ivClose, id:'ivclose'}, mt('_js_iv_close')),
+ tag('a', {href:'#', onclick: ivClose, id:'ivclose'}, mt('_js_close')),
tag('a', {href:'#', onclick: ivView, id:'ivprev'}, '« '+mt('_js_iv_prev')),
tag('a', {href:'#', onclick: ivView, id:'ivnext'}, mt('_js_iv_next')+' »')
));
@@ -1106,6 +1107,19 @@ function scrCheckStatus() {
)
);
+ // check full resolution with the list of DB-defined resolutions
+ var odd = true;
+ for(var j=0; j<resolutions.length && odd; j++) {
+ if(typeof resolutions[j][1] != 'object') {
+ if(resolutions[j][0] == dim)
+ odd = false;
+ } else {
+ for(var k=1; k<resolutions[j].length; k++)
+ if(resolutions[j][k][1] == dim)
+ odd = false;
+ }
+ }
+
// content
var rel = tag('select', {onchange: scrSerialize, 'class':'scr_relsel'});
for(var j=0; j<scrRel.length; j++)
@@ -1116,6 +1130,7 @@ function scrCheckStatus() {
' (', tag('a', {href: '#', onclick:scrDel}, mt('_vnedit_scr_remove')), ')',
tag('br', null),
mt('_vnedit_scr_fullsize', dim),
+ odd ? tag('b', {'class':'standout', 'style':'font-weight: bold'}, ' '+mt('_vnedit_scr_nonstandard')) : null,
tag('br', null),
tag('br', null),
tag('input', {type:'checkbox', onclick:scrSerialize, id:nsfwid, name:nsfwid, checked: tr.scr_nsfw>0, 'class':'scr_nsfw'}),
@@ -1331,7 +1346,7 @@ function tglAdd() {
if(items.length < 1)
return alert(mt('_tagv_notfound'));
if(items[0].getAttribute('meta') == 'yes')
- return alert(mt('_tagv_nometa'));
+ return alert(mt('_js_ds_tag_nometa'));
var name = items[0].firstChild.nodeValue;
var id = items[0].getAttribute('id');
@@ -1344,9 +1359,13 @@ function tglAdd() {
ddInit(spoil, 'tagmod', tglSpoilDD);
spoil.onclick = tglSpoilNext;
+ var ismod = byClass(byId('tagtable').parentNode, 'td', 'tc_myover').length;
+
byId('tagtable').appendChild(tag('tr', {id:'tgl_'+id},
tag('td', {'class':'tc_tagname'}, tag('a', {href:'/g'+id}, name)),
- vote, spoil,
+ vote,
+ ismod ? tag('td', {'class':'tc_myover'}, ' ') : null,
+ spoil,
tag('td', {'class':'tc_allvote'}, ' '),
tag('td', {'class':'tc_allspoil'}, ' '),
tag('td', {'class':'tc_allwho'}, '')
@@ -1779,23 +1798,22 @@ function filLoad() {
fil_cats[i] = a;
}
- // TODO: _rbrowse_ -> generalize (this isn't specific to the release browser)
addBody(tag('div', { id: 'fil_div', 'class':'hidden' },
- tag('a', {href:'#', onclick:filShow, 'class':'close'}, mt('_rbrowse_close')),
+ tag('a', {href:'#', onclick:filShow, 'class':'close'}, mt('_js_close')),
tag('h3', l[0]),
p,
tag('b', {'class':'ruler'}, null),
c,
tag('b', {'class':'ruler'}, null),
- PREF_CODE != '' ? tag('input', {type:'button', 'class':'submit', value: mt('_rbrowse_filsave'), onclick:filSaveDefault }) : null,
- tag('input', {type:'button', 'class':'submit', value: mt('_rbrowse_apply'), onclick:function () {
+ tag('input', {type:'button', 'class':'submit', value: mt('_js_fil_apply'), onclick:function () {
var f = byId('fil');
while(f.nodeName.toLowerCase() != 'form')
f = f.parentNode;
f.submit();
}}),
- tag('input', {type:'button', 'class':'submit', value: mt('_rbrowse_reset'), onclick:function () { byId('fil').value = ''; filDeSerialize()} }),
- tag('p', {id:'fil_savenote', 'class':'hidden'}, mt('_rbrowse_savenote'))
+ tag('input', {type:'button', 'class':'submit', value: mt('_js_fil_reset'), onclick:function () { byId('fil').value = ''; filDeSerialize()} }),
+ PREF_CODE != '' ? tag('input', {type:'button', 'class':'submit', value: mt('_js_fil_save'), onclick:filSaveDefault }) : null,
+ tag('p', {id:'fil_savenote', 'class':'hidden'}, '')
));
filSelectCat(1);
byId('filselect').onclick = filShow;
@@ -1804,12 +1822,13 @@ function filLoad() {
function filSaveDefault() {
var but = this;
- but.value = mt('_js_loading');
+ var note = byId('fil_savenote');
+ setText(note, mt('_js_loading'));
but.enabled = false;
setClass(byId('fil_savenote'), 'hidden', false);
var type = byId('filselect').href.match(/#r$/) ? 'release' : 'vn';
ajax('/xml/prefs.xml?formcode='+PREF_CODE+';key=filter_'+type+';value='+byId('fil').value, function (hr) {
- but.value = mt('_rbrowse_filsave');
+ setText(note, mt('_js_fil_savenote'));
but.enable = true;
});
}
@@ -1947,7 +1966,7 @@ function filFSelect(c, n, lines, opts) {
s.appendChild(g);
}
}
- return [ c, lines > 1 ? [ n, mt('_rbrowse_boolor') ] : n, s,
+ return [ c, lines > 1 ? [ n, mt('_js_fil_boolor') ] : n, s,
function (c) {
var l = [];
for(var i=0; i<c.options.length; i++)
@@ -2054,8 +2073,12 @@ function filFTagInput(name, label) {
));
},
function(item, obj) {
- addtag(byName(obj.parentNode, 'ul')[0], item.getAttribute('id'), item.firstChild.nodeValue);
- filSelectField(obj);
+ if(item.getAttribute('meta') == 'yes')
+ alert(mt('_js_ds_tag_nometa'));
+ else {
+ addtag(byName(obj.parentNode, 'ul')[0], item.getAttribute('id'), item.firstChild.nodeValue);
+ filSelectField(obj);
+ }
return '';
},
function(o) { filSelectField(o); false }
@@ -2104,7 +2127,8 @@ function filReleases() {
filFOptions('freeware', mt('_rbrowse_freeware'),[ [1, mt('_rbrowse_freeware_yes')], [0, mt('_rbrowse_freeware_no')] ]),
filFOptions('doujin', mt('_rbrowse_doujin'), [ [1, mt('_rbrowse_doujin_yes')], [0, mt('_rbrowse_doujin_no')] ]),
[ 'date_after', mt('_rbrowse_dateafter'), dateLoad(null, filSelectField), function (c) { return [c.date_val] }, dateSet ],
- [ 'date_before', mt('_rbrowse_datebefore'), dateLoad(null, filSelectField), function (c) { return [c.date_val] }, dateSet ]
+ [ 'date_before', mt('_rbrowse_datebefore'), dateLoad(null, filSelectField), function (c) { return [c.date_val] }, dateSet ],
+ filFOptions('released', mt('_rbrowse_released'),[ [1, mt('_rbrowse_released_yes')], [0, mt('_rbrowse_released_no')] ])
],
[ mt('_rbrowse_minage'), filFSelect('minage', mt('_rbrowse_minage'), 15, ages) ],
[ mt('_rbrowse_language'), filFSelect('lang', mt('_rbrowse_language'), 20, lang) ],
@@ -2138,7 +2162,7 @@ function filVN() {
filFOptions('hasani', mt('_vnbrowse_anime'), [[1, mt('_vnbrowse_anime_yes')],[0, mt('_vnbrowse_anime_no')]])
],
[ mt('_vnbrowse_tags'),
- [ '', ' ', tag(mt('_vnbrowse_booland')) ],
+ [ '', ' ', tag(mt('_js_fil_booland')) ],
[ '', ' ', PREF_CODE != '' ? tag(mt('_vnbrowse_tagactive')) : null ],
filFTagInput('tag_inc', mt('_vnbrowse_taginc')),
filFTagInput('tag_exc', mt('_vnbrowse_tagexc')),
diff --git a/data/style.css b/data/style.css
index b7fbaffa..f64596c0 100644
--- a/data/style.css
+++ b/data/style.css
@@ -87,6 +87,7 @@ p.locked {
margin: 0!important;
}
b.grayedout { font-weight: normal; color: $grayedout$ }
+i.grayedout { font-style: normal; color: $grayedout$ }
#maincontent h2 b {
font: 11px "Tahoma";
font-weight: normal;
@@ -951,6 +952,9 @@ div.uposts td.tc4 b { margin-left: 10px }
.browse.taglinks .tc1 { width: 70px }
.browse.taglinks .tc3 { width: 90px }
+.browse.taglinks .tc3 { width: 90px }
+.browse.taglinks .ignored .taglvl.taglvlsel { background-color: #222 }
+.browse.taglinks .ignored .taglvl.taglvl0 { color: $grayedout$!important }
.browse.taglinks .setfil { font-size: 8px; padding-right: 3px }
/***** VN tagmod *****/
@@ -961,6 +965,7 @@ table.tgl .tc_you { border-right: 1px solid $border$; border-left: 1px solid $bo
table.tgl .tc_others { border-left: 1px solid $border$; width: 150px; text-align: center }
table.tgl .tc_tagname { min-width: 200px; border-right: 1px solid $border$ }
table.tgl .tc_myvote { padding-left: 30px!important }
+table.tgl .tc_myover { padding: 0!important }
table.tgl .tc_myspoil { border-right: 1px solid $border$; padding-right: 30px!important; text-align: right; padding-left: 10px!important; cursor: pointer }
table.tgl .tc_allvote { padding-left: 30px!important; }
table.tgl .tc_allvote i { font-style: normal; font-size: 8px }
diff --git a/lib/Multi/Feed.pm b/lib/Multi/Feed.pm
index c97d87d8..12631497 100644
--- a/lib/Multi/Feed.pm
+++ b/lib/Multi/Feed.pm
@@ -8,7 +8,7 @@ package Multi::Feed;
use strict;
use warnings;
use POE;
-use XML::Writer;
+use TUWF::XML;
use POSIX 'strftime';
use Time::HiRes 'time';
use VNDBUtil 'bb2html';
@@ -104,33 +104,33 @@ sub write_atom { # num, res, feed, time
}
my $data;
- my $x = XML::Writer->new(OUTPUT => \$data, DATA_MODE => 1, DATA_INDENT => 2);
- $x->xmlDecl('UTF-8');
- $x->startTag(feed => xmlns => 'http://www.w3.org/2005/Atom', 'xml:lang' => 'en', 'xml:base' => $VNDB::S{url}.'/');
- $x->dataElement(title => $VNDB::S{atom_feeds}{$feed}[1]);
- $x->dataElement(updated => datetime($updated));
- $x->dataElement(id => $VNDB::S{url}.$VNDB::S{atom_feeds}{$feed}[2]);
- $x->emptyTag(link => rel => 'self', type => 'application/atom+xml', href => "$VNDB::S{url}/feeds/$feed.atom");
- $x->emptyTag(link => rel => 'alternate', type => 'text/html', href => $VNDB::S{atom_feeds}{$feed}[2]);
+ my $x = TUWF::XML->new(write => sub { $data .= shift }, pretty => 2);
+ $x->xml();
+ $x->tag(feed => xmlns => 'http://www.w3.org/2005/Atom', 'xml:lang' => 'en', 'xml:base' => $VNDB::S{url}.'/');
+ $x->tag(title => $VNDB::S{atom_feeds}{$feed}[1]);
+ $x->tag(updated => datetime($updated));
+ $x->tag(id => $VNDB::S{url}.$VNDB::S{atom_feeds}{$feed}[2]);
+ $x->tag(link => rel => 'self', type => 'application/atom+xml', href => "$VNDB::S{url}/feeds/$feed.atom", undef);
+ $x->tag(link => rel => 'alternate', type => 'text/html', href => $VNDB::S{atom_feeds}{$feed}[2], undef);
for(@$r) {
- $x->startTag('entry');
- $x->dataElement(id => $VNDB::S{url}.$_->{id});
- $x->dataElement(title => $_->{title});
- $x->dataElement(updated => $_->{updated}?datetime($_->{updated}):datetime($_->{published}));
- $x->dataElement(published => datetime($_->{published})) if $_->{published};
+ $x->tag('entry');
+ $x->tag(id => $VNDB::S{url}.$_->{id});
+ $x->tag(title => $_->{title});
+ $x->tag(updated => $_->{updated}?datetime($_->{updated}):datetime($_->{published}));
+ $x->tag(published => datetime($_->{published})) if $_->{published};
if($_->{username}) {
- $x->startTag('author');
- $x->dataElement(name => $_->{username});
- $x->dataElement(uri => '/u'.$_->{uid}) if $_->{uid};
- $x->endTag('author');
+ $x->tag('author');
+ $x->tag(name => $_->{username});
+ $x->tag(uri => '/u'.$_->{uid}) if $_->{uid};
+ $x->end;
}
- $x->emptyTag(link => rel => 'alternate', type => 'text/html', href => $_->{id});
- $x->dataElement(summary => bb2html($_->{summary}, 200), type => 'html') if $_->{summary};
- $x->endTag('entry');
+ $x->tag(link => rel => 'alternate', type => 'text/html', href => $_->{id}, undef);
+ $x->tag('summary', type => 'html', bb2html($_->{summary}, 200)) if $_->{summary};
+ $x->end('entry');
}
- $x->endTag('feed');
+ $x->end('feed');
open my $f, '>:utf8', "$VNDB::ROOT/www/feeds/$feed.atom" || die $!;
print $f $data;
diff --git a/lib/Multi/IRC.pm b/lib/Multi/IRC.pm
index 22e4021b..2967724c 100644
--- a/lib/Multi/IRC.pm
+++ b/lib/Multi/IRC.pm
@@ -15,7 +15,8 @@ use POE qw|
|;
use POE::Component::IRC::Common ':ALL';
use Time::HiRes 'time';
-use VNDBUtil 'normalize_query', 'uri_escape';
+use VNDBUtil 'normalize_query';
+use TUWF::Misc 'uri_escape';
use constant {
diff --git a/lib/Multi/RG.pm b/lib/Multi/RG.pm
index a04ae062..e8ef52ee 100644
--- a/lib/Multi/RG.pm
+++ b/lib/Multi/RG.pm
@@ -10,7 +10,7 @@ use warnings;
use POE 'Wheel::Run', 'Filter::Stream';
use Encode 'encode_utf8';
use XML::Parser;
-use XML::Writer;
+use TUWF::XML;
use Time::HiRes 'time';
@@ -147,7 +147,7 @@ sub savegraph {
# - Remove first <polygon> element (emulates the background color)
# - Replace stroke and fill attributes with classes (so that coloring is done in CSS)
my $svg = '';
- my $w = XML::Writer->new(OUTPUT => \$svg);
+ my $w = TUWF::XML->new(write => sub { $svg .= shift });
my $p = XML::Parser->new;
$p->setHandlers(
Start => sub {
@@ -160,24 +160,21 @@ sub savegraph {
delete @attr{qw|stroke fill xmlns xmlns:xlink|};
delete $attr{id} if $attr{id} && $attr{id} !~ /^node_[vp]\d+$/;
- $el eq 'path' || $el eq 'polygon'
- ? $w->emptyTag("svg:$el", %attr)
- : $w->startTag("svg:$el", %attr);
+ $w->tag("svg:$el", %attr, $el eq 'path' || $el eq 'polygon' ? undef : ());
},
End => sub {
my($expat, $el) = @_;
return if $el eq 'title' || $expat->in_element('title');
return if $el eq 'polygon' && $expat->depth == 2;
- $w->endTag("svg:$el") if $el ne 'path' && $el ne 'polygon';
+ $w->end("svg:$el") if $el ne 'path' && $el ne 'polygon';
},
Char => sub {
my($expat, $str) = @_;
return if $expat->in_element('title');
- $w->characters($str) if $str !~ /^[\s\t\r\n]*$/s;
+ $w->txt($str) if $str !~ /^[\s\t\r\n]*$/s;
}
);
$p->parsestring($_[HEAP]{svg});
- $w->end();
# save the processed SVG in the database and fetch graph ID
$_[KERNEL]->post(pg => query => 'INSERT INTO relgraphs (svg) VALUES (?) RETURNING id', [ $svg ], 'finish');
diff --git a/lib/VNDB/DB/Releases.pm b/lib/VNDB/DB/Releases.pm
index ffffb2a6..87685ce6 100644
--- a/lib/VNDB/DB/Releases.pm
+++ b/lib/VNDB/DB/Releases.pm
@@ -10,7 +10,7 @@ use VNDB::Func 'gtintype';
our @EXPORT = qw|dbReleaseGet dbReleaseRevisionInsert|;
-# Options: id vid pid rev unreleased page results what med sort reverse date_before date_after
+# Options: id vid pid rev released page results what med sort reverse date_before date_after
# plat lang olang type minage search resolution freeware doujin voiced ani_story ani_ero
# What: extended changes vn producers platforms media
# Sort: title released minage
@@ -37,7 +37,7 @@ sub dbReleaseGet {
defined $o{voiced} ? ( 'rr.voiced IN(!l)' => [ ref $o{voiced} ? $o{voiced} : [$o{voiced}] ] ) : (),
defined $o{ani_story} ? ( 'rr.ani_story IN(!l)' => [ ref $o{ani_story} ? $o{ani_story} : [$o{ani_story}] ] ) : (),
defined $o{ani_ero} ? ( 'rr.ani_ero IN(!l)' => [ ref $o{ani_ero} ? $o{ani_ero} : [$o{ani_ero}] ] ) : (),
- defined $o{unreleased} ? ( 'rr.released !s ?' => [ $o{unreleased} ? '>' : '<=', strftime('%Y%m%d', gmtime) ] ) : (),
+ defined $o{released} ? ( 'rr.released !s ?' => [ $o{released} ? '<=' : '>', strftime('%Y%m%d', gmtime) ] ) : (),
$o{lang} ? (
'rr.id IN(SELECT irl.rid FROM releases_lang irl JOIN releases ir ON ir.latest = irl.rid WHERE irl.lang IN(!l))' => [ ref $o{lang} ? $o{lang} : [ $o{lang} ] ] ) : (),
$o{olang} ? (
diff --git a/lib/VNDB/DB/Tags.pm b/lib/VNDB/DB/Tags.pm
index b3e16960..b7792eb8 100644
--- a/lib/VNDB/DB/Tags.pm
+++ b/lib/VNDB/DB/Tags.pm
@@ -176,7 +176,7 @@ sub dbTagLinks {
);
my @select = (
- qw|tv.tag tv.vid tv.uid tv.vote tv.spoiler|, "EXTRACT('epoch' from tv.date) AS date",
+ qw|tv.tag tv.vid tv.uid tv.vote tv.spoiler tv.ignore|, "EXTRACT('epoch' from tv.date) AS date",
$o{what} =~ /details/ ? (qw|vr.title u.username t.name|) : (),
);
@@ -202,95 +202,63 @@ sub dbTagLinks {
# Change a user's tags for a VN entry
-# Arguments: uid, vid, [ [ tag, vote, spoiler ], .. ]
sub dbTagLinkEdit {
- my($self, $uid, $vid, $new) = @_;
-
- # compare with the old votes and determine which to delete, and/or insert
- my %old = map +($_->{tag}, [ $_->{vote}, $_->{spoiler} // -1 ]),
- @{$self->dbTagLinks(vid => $vid, uid => $self->authInfo->{id})};
- my %new = map +($_->[0], [ $_->[1], $_->[2] ]), @$new;
-
- my(%delete, %update, %insert);
- for my $tag (keys %old, keys %new) {
- if($old{$tag} && !$new{$tag}) {
- $delete{$tag} = 1;
- } elsif(!$old{$tag} && $new{$tag}) {
- $insert{$tag} = $new{$tag};
- } elsif($old{$tag}[0] != $new{$tag}[0] || $old{$tag}[1] != $new{$tag}[1]) {
- $update{$tag} = $new{$tag};
- }
- }
+ my($self, $uid, $vid, $insert, $update, $delete, $overrule) = @_;
+
+ # overrule
+ # 1. set ignore flag for everyone except $uid
+ $self->dbExec('UPDATE tags_vn SET ignore = ? WHERE tag = ? AND vid = ? AND uid <> ?',
+ $overrule->{$_}?1:0, $_, $vid, $uid) for(keys %$overrule);
+ # 2. make sure $uid isn't ignored when others are set to ignore
+ # (this happens when a mod takes over an other mods' overrule)
+ $self->dbExec('UPDATE tags_vn SET ignore = false WHERE tag = ? AND vid = ? AND uid = ?',
+ $_, $vid, $uid) for(grep $overrule->{$_}, keys %$overrule);
+
+ # delete
+ $self->dbExec('DELETE FROM tags_vn WHERE vid = ? AND uid = ? AND tag IN(!l)',
+ $vid, $uid, [ keys %$delete ]) if keys %$delete;
- # spoiler '-1' -> NULL
- $new{$_}[1] == -1 && ($new{$_}[1] = undef) for keys %new;
+ # insert
+ my $val = join ',', map '(?,?,?,?,?,?)', keys %$insert;
+ $self->dbExec("INSERT INTO tags_vn (tag, vid, uid, vote, spoiler, ignore) VALUES $val", map
+ +($_, $vid, $uid, $insert->{$_}[0], $insert->{$_}[1]<0?undef:$insert->{$_}[1], $insert->{$_}[2]?1:0),
+ keys %$insert) if keys %$insert;
- # perform the changes
- $self->dbExec('DELETE FROM tags_vn WHERE vid = ? AND uid = ? AND tag IN(!l)',
- $vid, $uid, [ keys %delete ]) if keys %delete;
- $self->dbExec('INSERT INTO tags_vn (tag, vid, uid, vote, spoiler) VALUES (?, ?, ?, ?, ?)',
- $_, $vid, $uid, $insert{$_}[0], $insert{$_}[1]) for (keys %insert);
+ # update
$self->dbExec('UPDATE tags_vn SET vote = ?, spoiler = ?, date = NOW() WHERE tag = ? AND vid = ? AND uid = ?',
- $update{$_}[0], $update{$_}[1], $_, $vid, $uid) for (keys %update);
+ $update->{$_}[0], $update->{$_}[1]<0?undef:$update->{$_}[1], $_, $vid, $uid) for (keys %$update);
}
-# Fetch all tags related to a VN or User
-# Argument: %options->{ uid vid minrating results what page sort reverse }
-# what: vns
-# sort: name, count, rating
+# Fetch all tags related to a VN
+# Argument: %options->{ vid minrating results what page sort reverse }
+# sort: name, rating
sub dbTagStats {
my($self, %o) = @_;
$o{results} ||= 10;
$o{page} ||= 1;
- $o{what} ||= '';
-
- my %where = (
- $o{uid} ? (
- 'tv.uid = ?' => $o{uid} ) : (),
- $o{vid} ? (
- 'tv.vid = ?' => $o{vid} ) : (),
- );
+ my $rating = 'avg(CASE WHEN tv.ignore THEN NULL ELSE tv.vote END)';
my $order = sprintf {
name => 't.name %s',
- count => 'count(*) %s',
- rating => 'avg(tv.vote) %s',
+ rating => "$rating %s",
}->{ $o{sort}||'name' }, $o{reverse} ? 'DESC' : 'ASC';
- my($r, $np) = $self->dbPage(\%o, q|
- SELECT t.id, t.name, count(*) as cnt, avg(tv.vote) as rating, COALESCE(avg(tv.spoiler), 0) as spoiler
+ my($r, $np) = $self->dbPage(\%o, qq|
+ SELECT t.id, t.name, count(*) as cnt, $rating as rating,
+ COALESCE(avg(CASE WHEN tv.ignore THEN NULL ELSE tv.spoiler END), 0) as spoiler,
+ bool_or(tv.ignore) AS overruled
FROM tags t
JOIN tags_vn tv ON tv.tag = t.id
- !W
+ WHERE tv.vid = ?
GROUP BY t.id, t.name
!s
ORDER BY !s|,
- \%where, defined $o{minrating} ? "HAVING avg(tv.vote) > $o{minrating}" : '',
- $order
+ $o{vid}, defined $o{minrating} ? "HAVING $rating > $o{minrating}" : '', $order
);
- if(@$r && $o{what} =~ /vns/ && $o{uid}) {
- my %r = map {
- $_->{vns} = [];
- ($_->{id}, $_->{vns})
- } @$r;
-
- push @{$r{$_->{tag}}}, $_ for (@{$self->dbAll(q|
- SELECT tv.tag, tv.vote, tv.spoiler, vr.vid, vr.title, vr.original
- FROM tags_vn tv
- JOIN vn v ON v.id = tv.vid
- JOIN vn_rev vr ON vr.id = v.latest
- WHERE tv.uid = ?
- AND tv.tag IN(!l)
- ORDER BY vr.title ASC|,
- $o{uid}, [ keys %r ]
- )});
- }
-
return wantarray ? ($r, $np) : $r;
}
-
1;
diff --git a/lib/VNDB/DB/Users.pm b/lib/VNDB/DB/Users.pm
index bd7db201..36ae02af 100644
--- a/lib/VNDB/DB/Users.pm
+++ b/lib/VNDB/DB/Users.pm
@@ -178,7 +178,7 @@ sub dbSessionUpdateLastUsed {
}
-# %options->{ uid id what results page }
+# %options->{ uid id what results page reverse }
# what: titles
sub dbNotifyGet {
my($s, %o) = @_;
@@ -210,8 +210,8 @@ sub dbNotifyGet {
FROM notifications n
!s
!W
- ORDER BY n.id
- |, join(', ', @select), join(' ', @join), \%where);
+ ORDER BY n.id !s
+ |, join(', ', @select), join(' ', @join), \%where, $o{reverse} ? 'DESC' : 'ASC');
return wantarray ? ($r, $np) : $r;
}
diff --git a/lib/VNDB/Func.pm b/lib/VNDB/Func.pm
index 17d69cd5..435f0fec 100644
--- a/lib/VNDB/Func.pm
+++ b/lib/VNDB/Func.pm
@@ -3,7 +3,7 @@ package VNDB::Func;
use strict;
use warnings;
-use YAWF ':html';
+use TUWF ':html';
use Exporter 'import';
use POSIX 'strftime', 'ceil', 'floor';
use VNDBUtil;
@@ -59,9 +59,8 @@ sub tagscore {
# short wrapper around maketext()
-# (not thread-safe, in the same sense as YAWF::XML. But who cares about threads, anyway?)
sub mt {
- return $YAWF::OBJ->{l10n}->maketext(@_);
+ return $TUWF::OBJ->{l10n}->maketext(@_);
}
diff --git a/lib/VNDB/Handler/Discussions.pm b/lib/VNDB/Handler/Discussions.pm
index 0b5daa6c..6f6cb385 100644
--- a/lib/VNDB/Handler/Discussions.pm
+++ b/lib/VNDB/Handler/Discussions.pm
@@ -3,15 +3,15 @@ package VNDB::Handler::Discussions;
use strict;
use warnings;
-use YAWF ':html', 'xml_escape';
+use TUWF ':html', 'xml_escape';
use POSIX 'ceil';
use VNDB::Func;
-YAWF::register(
+TUWF::register(
qr{t([1-9]\d*)(?:/([1-9]\d*))?} => \&thread,
qr{t([1-9]\d*)\.([1-9]\d*)} => \&redirect,
- qr{t/(db|an|ge|[vpu])([1-9]\d*)?} => \&board,
+ qr{t/(all|db|an|ge|[vpu])([1-9]\d*)?} => \&board,
qr{t([1-9]\d*)/reply} => \&edit,
qr{t([1-9]\d*)\.([1-9]\d*)/edit} => \&edit,
qr{t/(db|an|ge|[vpu])([1-9]\d*)?/new} => \&edit,
@@ -24,10 +24,10 @@ sub thread {
$page ||= 1;
my $t = $self->dbThreadGet(id => $tid, what => 'boardtitles')->[0];
- return 404 if !$t->{id} || $t->{hidden} && !$self->authCan('boardmod');
+ return $self->resNotFound if !$t->{id} || $t->{hidden} && !$self->authCan('boardmod');
my $p = $self->dbPostGet(tid => $tid, results => 25, page => $page, what => 'user');
- return 404 if !$p->[0];
+ return $self->resNotFound if !$p->[0];
$self->htmlHeader(title => $t->{title}, noindex => 1);
div class => 'mainbox';
@@ -46,7 +46,7 @@ sub thread {
end;
}
end;
- end;
+ end 'div';
$self->htmlBrowseNavigate("/t$tid/", $page, [ $t->{count}, 25 ], 't', 1);
div class => 'mainbox thread';
@@ -82,7 +82,7 @@ sub thread {
end;
}
end;
- end;
+ end 'div';
$self->htmlBrowseNavigate("/t$tid/", $page, [ $t->{count}, 25 ], 'b', 1);
if($t->{locked}) {
@@ -105,7 +105,7 @@ sub thread {
input type => 'submit', value => mt('_thread_quickreply_full'), class => 'submit', name => 'fullreply';
end;
end;
- end;
+ end 'form';
} elsif(!$self->authCan('board')) {
div class => 'mainbox';
h1 mt '_thread_noreply_title';
@@ -135,7 +135,7 @@ sub edit {
# in case we start a new thread, parse boards
my $board = '';
if($tid !~ /^\d+$/) {
- return 404 if $tid =~ /(db|an|ge)/ && $num || $tid =~ /[vpu]/ && !$num;
+ return $self->resNotFound if $tid =~ /(db|an|ge)/ && $num || $tid =~ /[vpu]/ && !$num;
$board = $tid.($num||'');
$tid = 0;
$num = 0;
@@ -143,10 +143,10 @@ sub edit {
# get thread and post, if any
my $t = $tid && $self->dbThreadGet(id => $tid, what => 'boards')->[0];
- return 404 if $tid && !$t->{id};
+ return $self->resNotFound if $tid && !$t->{id};
my $p = $num && $self->dbPostGet(tid => $tid, num => $num, what => 'user')->[0];
- return 404 if $num && !$p->{num};
+ return $self->resNotFound if $num && !$p->{num};
# are we allowed to perform this action?
return $self->htmlDenied if !$self->authCan('board')
@@ -159,16 +159,16 @@ sub edit {
return if !$self->authCheckCode;
$frm = $self->formValidate(
!$tid || $num == 1 ? (
- { name => 'title', maxlength => 50 },
- { name => 'boards', maxlength => 50 },
+ { post => 'title', maxlength => 50 },
+ { post => 'boards', maxlength => 50 },
) : (),
$self->authCan('boardmod') ? (
- { name => 'locked', required => 0 },
- { name => 'hidden', required => 0 },
- { name => 'nolastmod', required => 0 },
+ { post => 'locked', required => 0 },
+ { post => 'hidden', required => 0 },
+ { post => 'nolastmod', required => 0 },
) : (),
- { name => 'msg', maxlenght => 5000 },
- { name => 'fullreply', required => 0 },
+ { post => 'msg', maxlength => 32768 },
+ { post => 'fullreply', required => 0 },
);
$frm->{_err} = 1 if $frm->{fullreply};
@@ -270,23 +270,23 @@ sub edit {
sub board {
my($self, $type, $iid) = @_;
$iid ||= '';
- return 404 if $type =~ /(db|an|ge)/ && $iid;
+ return $self->resNotFound if $type =~ /(db|an|ge|all)/ && $iid;
my $f = $self->formValidate(
- { name => 'p', required => 0, default => 1, template => 'int' },
+ { get => 'p', required => 0, default => 1, template => 'int' },
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
my $obj = !$iid ? undef :
$type eq 'u' ? $self->dbUserGet(uid => $iid, what => 'hide_list')->[0] :
$type eq 'p' ? $self->dbProducerGet(id => $iid)->[0] :
$self->dbVNGet(id => $iid)->[0];
- return 404 if $iid && !$obj;
+ return $self->resNotFound if $iid && !$obj;
my $ititle = $obj && ($obj->{title}||$obj->{name}||$obj->{username});
- my $title = !$obj ? mt("_dboard_$type") : mt '_disboard_item_title', $ititle;
+ my $title = !$obj ? mt($type eq 'all' ? '_disboard_item_all' : "_dboard_$type") : mt '_disboard_item_title', $ititle;
my($list, $np) = $self->dbThreadGet(
- type => $type,
+ $type ne 'all' ? (type => $type) : (),
$iid ? (iid => $iid) : (),
results => 50,
page => $f->{p},
@@ -302,7 +302,7 @@ sub board {
p;
a href => '/t', mt '_disboard_rootlink';
txt ' > ';
- a href => "/t/$type", mt "_dboard_$type";
+ a href => "/t/$type", mt $type eq 'all' ? '_disboard_item_all' : "_dboard_$type";
if($iid) {
txt ' > ';
a style => 'font-weight: bold', href => "/t/$type$iid", "$type$iid";
@@ -316,10 +316,10 @@ sub board {
br; br;
a href => "/t/$type$iid/new", mt '_disboard_createyourown';
} else {
- a href => '/t/'.($iid ? $type.$iid : $type ne 'ge' ? 'db' : $type).'/new', mt '_disboard_startnew';
+ a href => '/t/'.($iid ? $type.$iid : $type ne 'ge' ? 'db' : $type).'/new', mt '_disboard_startnew' if $type ne 'all';
}
end;
- end;
+ end 'div';
_threadlist($self, $list, $f, $np, "/t/$type$iid", $type.$iid) if @$list;
@@ -334,6 +334,7 @@ sub index {
div class => 'mainbox';
h1 mt '_disindex_title';
p class => 'browseopts';
+ a href => '/t/all', mt '_disboard_item_all';
a href => '/t/'.$_, mt "_dboard_$_"
for (@{$self->{discussion_boards}});
end;
@@ -400,7 +401,7 @@ sub _threadlist {
lit $self->{l10n}->date($o->{ldate});
end;
end;
- end;
+ end 'tr';
}
);
}
diff --git a/lib/VNDB/Handler/Misc.pm b/lib/VNDB/Handler/Misc.pm
index 5df5ab10..062e3ae4 100644
--- a/lib/VNDB/Handler/Misc.pm
+++ b/lib/VNDB/Handler/Misc.pm
@@ -4,18 +4,17 @@ package VNDB::Handler::Misc;
use strict;
use warnings;
-use YAWF ':html', ':xml', 'xml_escape';
+use TUWF ':html', ':xml', 'xml_escape', 'uri_escape';
use VNDB::Func;
use POSIX 'strftime';
-YAWF::register(
+TUWF::register(
qr{}, \&homepage,
qr{(?:([upvr])([1-9]\d*)/)?hist}, \&history,
qr{d([1-9]\d*)}, \&docpage,
qr{setlang}, \&setlang,
qr{nospam}, \&nospam,
- qr{we-dont-like-ie}, \&iemessage,
qr{xml/prefs\.xml}, \&prefs,
qr{opensearch\.xml}, \&opensearch,
@@ -23,7 +22,7 @@ YAWF::register(
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]->reqParam('q')||''), '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)},
@@ -61,7 +60,7 @@ sub homepage {
end;
}
end;
- end;
+ end 'div';
table class => 'mainbox threelayout';
Tr;
@@ -83,7 +82,7 @@ sub homepage {
end;
}
end;
- end;
+ end 'td';
# Announcements
td;
@@ -101,12 +100,12 @@ sub homepage {
lit bb2html $post->{msg}, 150;
end;
}
- end;
+ end 'td';
# Recent posts
td;
h1;
- a href => '/t', mt '_home_recentposts'; txt ' ';
+ a href => '/t/all', mt '_home_recentposts'; txt ' ';
a href => '/feeds/posts.atom'; cssicon 'feed', mt '_atom_feed'; end;
end;
my $posts = $self->dbThreadGet(what => 'lastpost boardtitles', results => 10, sort => 'lastpost', reverse => 1, notusers => 1);
@@ -121,9 +120,9 @@ sub homepage {
end;
}
end;
- end;
+ end 'td';
- end;
+ end 'tr';
Tr;
# Random visual novels
@@ -139,14 +138,14 @@ sub homepage {
end;
}
end;
- end;
+ end 'td';
# Upcoming releases
td;
h1;
- a href => strftime('/r?fil=date_after-%Y%m%d;o=a;s=released', gmtime), mt '_home_upcoming';
+ a href => '/r?fil=released-0;o=a;s=released', mt '_home_upcoming';
end;
- my $upcoming = $self->filFetchDB(release => undef, undef, {results => 10, unreleased => 1, what => 'platforms'});
+ my $upcoming = $self->filFetchDB(release => undef, undef, {results => 10, released => 0, what => 'platforms'});
ul;
for (@$upcoming) {
li;
@@ -159,14 +158,14 @@ sub homepage {
end;
}
end;
- end;
+ end 'td';
# Just released
td;
h1;
- a href => strftime('/r?fil=date_before-%Y%m%d;o=d;s=released', gmtime), mt '_home_justreleased';
+ a href => '/r?fil=released-1;o=d;s=released', mt '_home_justreleased';
end;
- my $justrel = $self->filFetchDB(release => undef, undef, {results => 10, sort => 'released', reverse => 1, unreleased => 0, what => 'platforms'});
+ my $justrel = $self->filFetchDB(release => undef, undef, {results => 10, sort => 'released', reverse => 1, released => 1, what => 'platforms'});
ul;
for (@$justrel) {
li;
@@ -179,10 +178,10 @@ sub homepage {
end;
}
end;
- end;
+ end 'td';
- end; # /tr
- end; # /table
+ end 'tr';
+ end 'table';
$self->htmlFooter;
}
@@ -194,14 +193,14 @@ sub history {
$id ||= 0;
my $f = $self->formValidate(
- { name => 'p', required => 0, default => 1, template => 'int' },
- { name => 'm', required => 0, default => !$type, enum => [ 0, 1 ] },
- { name => 'h', required => 0, default => 0, enum => [ -1..1 ] },
- { name => 't', required => 0, default => '', enum => [ 'v', 'r', 'p' ] },
- { name => 'e', required => 0, default => 0, enum => [ -1..1 ] },
- { name => 'r', required => 0, default => 0, enum => [ 0, 1 ] },
+ { get => 'p', required => 0, default => 1, template => 'int' },
+ { get => 'm', required => 0, default => !$type, enum => [ 0, 1 ] },
+ { get => 'h', required => 0, default => 0, enum => [ -1..1 ] },
+ { get => 't', required => 0, default => '', enum => [ 'v', 'r', 'p' ] },
+ { get => 'e', required => 0, default => 0, enum => [ -1..1 ] },
+ { get => 'r', required => 0, default => 0, enum => [ 0, 1 ] },
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
# get item object and title
my $obj = $type eq 'u' ? $self->dbUserGet(uid => $id, what => 'hide_list')->[0] :
@@ -209,7 +208,7 @@ sub history {
$type eq 'r' ? $self->dbReleaseGet(id => $id)->[0] :
$type eq 'v' ? $self->dbVNGet(id => $id)->[0] : undef;
my $title = mt $type ? ('_hist_title_item', $obj->{title} || $obj->{name} || $obj->{username}) : '_hist_title';
- return 404 if $type && !$obj->{id};
+ return $self->resNotFound if $type && !$obj->{id};
# get the edit history
my($list, $np) = $self->dbRevisionGet(
@@ -274,7 +273,7 @@ sub history {
a $f->{r} ? (class => 'optselected') : (), href => $u->(r => 1), mt '_hist_filter_increl';
end;
}
- end;
+ end 'div';
$self->htmlBrowseHist($list, $f, $np, $u->());
$self->htmlFooter;
@@ -287,7 +286,7 @@ sub docpage {
my $l = '.'.$self->{l10n}->language_tag();
my $f = sprintf('%s/data/docs/%d', $VNDB::ROOT, $did);
my $F;
- open($F, '<:utf8', $f.$l) or open($F, '<:utf8', $f) or return 404;
+ open($F, '<:utf8', $f.$l) or open($F, '<:utf8', $f) or return $self->resNotFound;
my @c = <$F>;
close $F;
@@ -343,8 +342,8 @@ sub docpage {
sub setlang {
my $self = shift;
- my $lang = $self->formValidate({name => 'lang', required => 1, enum => [ VNDB::L10N::languages ]});
- return 404 if $lang->{_err};
+ my $lang = $self->formValidate({get => 'lang', required => 1, enum => [ VNDB::L10N::languages ]});
+ return $self->resNotFound if $lang->{_err};
$lang = $lang->{lang};
my $browser = VNDB::L10N->get_handle()->language_tag();
@@ -354,9 +353,7 @@ sub setlang {
if($lang ne $self->{l10n}->language_tag()) {
$self->authInfo->{id}
? $self->authPref(l10n => $lang eq $browser ? undef : $lang)
- : $self->resHeader('Set-Cookie', sprintf 'l10n=%s; expires=%s; path=/; domain=%s',
- $lang, $lang eq $browser ? 'Sat, 01-Jan-2000 00:00:00 GMT' : 'Sat, 01-Jan-2030 00:00:00 GMT',
- $self->{cookie_domain});
+ : $self->resCookie(l10n => $lang eq $browser ? undef : $lang, expires => time()+31536000);
}
}
@@ -377,57 +374,15 @@ sub nospam {
}
-sub iemessage {
- my $self = shift;
-
- if($self->reqParam('i-still-want-access')) {
- (my $ref = $self->reqHeader('Referer') || '/') =~ s/^\Q$self->{url}//;
- $ref = '/' if $ref eq '/we-dont-like-ie';
- $self->resRedirect($ref, 'temp');
- $self->resHeader('Set-Cookie', "ie-sucks=1; path=/; domain=$self->{cookie_domain}");
- return;
- }
-
- html;
- head;
- title 'Your browser sucks';
- style type => 'text/css',
- q|body { background: black }|
- .q|div { position: absolute; left: 50%; top: 50%; width: 500px; margin-left: -250px; height: 180px; margin-top: -90px; background-color: #012; border: 1px solid #258; text-align: center; }|
- .q|p { color: #ddd; margin: 10px; font: 9pt "Tahoma"; }|
- .q|h1 { color: #258; font-size: 14pt; font-family: "Futura", "Century New Gothic", "Arial", Serif; font-weight: normal; margin: 10px 0 0 0; } |
- .q|a { color: #fff }|;
- end;
- body;
- div;
- h1 'Oops, we were too lazy to support your browser!';
- p;
- lit qq|We decided to stop supporting Internet Explorer 6 and 7, as it's a royal pain in |
- .qq|the ass to make our site look good in a browser that doesn't want to cooperate with us.<br />|
- .qq|You can try one of the following free alternatives: |
- .qq|<a href="http://www.mozilla.com/firefox/">Firefox</a>, |
- .qq|<a href="http://www.opera.com/">Opera</a>, |
- .qq|<a href="http://www.apple.com/safari/">Safari</a>, or |
- .qq|<a href="http://www.google.com/chrome">Chrome</a>.<br /><br />|
- .qq|If you're really stubborn about using Internet Explorer, upgrading to version 8 will also work.<br /><br />|
- .qq|...and if you're mad, you can also choose to ignore this warning and |
- .qq|<a href="/we-dont-like-ie?i-still-want-access=1">open the site anyway</a>.|;
- end;
- end;
- end;
- end;
-}
-
-
sub prefs {
my $self = shift;
return if !$self->authCheckCode;
- return 404 if !$self->authInfo->{id};
+ return $self->resNotFound if !$self->authInfo->{id};
my $f = $self->formValidate(
- { name => 'key', enum => [qw|filter_vn filter_release|] },
- { name => 'value', required => 0, maxlength => 2000 },
+ { get => 'key', enum => [qw|filter_vn filter_release|] },
+ { get => 'value', required => 0, maxlength => 2000 },
);
- return 404 if $f->{_err};
+ 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
@@ -452,7 +407,7 @@ sub opensearch {
tag 'Url', type => 'application/opensearchdescription+xml', rel => 'self', template => $self->{url}.'/opensearch.xml', undef;
tag 'Query', role => 'example', searchTerms => 'Tsukihime', undef;
tag 'moz:SearchForm', $self->{url}.'/v/all';
- end;
+ end 'OpenSearchDescription';
}
diff --git a/lib/VNDB/Handler/Producers.pm b/lib/VNDB/Handler/Producers.pm
index f7a46c2d..5030c1a3 100644
--- a/lib/VNDB/Handler/Producers.pm
+++ b/lib/VNDB/Handler/Producers.pm
@@ -3,11 +3,11 @@ package VNDB::Handler::Producers;
use strict;
use warnings;
-use YAWF ':html', ':xml', 'xml_escape';
+use TUWF ':html', ':xml', 'xml_escape', 'html_escape';
use VNDB::Func;
-YAWF::register(
+TUWF::register(
qr{p([1-9]\d*)/rg} => \&rg,
qr{p([1-9]\d*)(?:\.([1-9]\d*))?} => \&page,
qr{p(?:([1-9]\d*)(?:\.([1-9]\d*))?/edit|/new)}
@@ -21,7 +21,7 @@ sub rg {
my($self, $pid) = @_;
my $p = $self->dbProducerGet(id => $pid, what => 'relgraph')->[0];
- return 404 if !$p->{id} || !$p->{rgraph};
+ return $self->resNotFound if !$p->{id} || !$p->{rgraph};
my $title = mt '_prodrg_title', $p->{name};
return if $self->htmlRGHeader($title, 'p', $p);
@@ -40,6 +40,7 @@ sub rg {
$self->htmlFooter;
}
+
sub page {
my($self, $pid, $rev) = @_;
@@ -48,7 +49,7 @@ sub page {
what => 'extended relations'.($rev ? ' changes' : ''),
$rev ? ( rev => $rev ) : ()
)->[0];
- return 404 if !$p->{id};
+ return $self->resNotFound if !$p->{id};
$self->htmlHeader(title => $p->{name}, noindex => $rev);
$self->htmlMainTabs(p => $p);
@@ -82,34 +83,34 @@ sub page {
h2 class => 'alttitle', $p->{original} if $p->{original};
p class => 'center';
txt mt '_prodpage_langtype', mt("_lang_$p->{lang}"), mt "_ptype_$p->{type}";
- txt "\n".mt '_prodpage_aliases', $p->{alias} if $p->{alias};
+ lit '<br />'.html_escape mt '_prodpage_aliases', $p->{alias} if $p->{alias};
my @links = (
$p->{website} ? [ 'homepage', $p->{website} ] : (),
$p->{l_wp} ? [ 'wikipedia', "http://en.wikipedia.org/wiki/$p->{l_wp}" ] : (),
);
- txt "\n" if @links;
+ br if @links;
for(@links) {
a href => $_->[1], mt "_prodpage_$_->[0]";
txt ' - ' if $_ ne $links[$#links];
}
- end;
+ end 'p';
if(@{$p->{relations}}) {
my %rel;
push @{$rel{$_->{relation}}}, $_
for (sort { $a->{name} cmp $b->{name} } @{$p->{relations}});
p class => 'center';
- txt "\n";
+ br;
for my $r (sort { $self->{prod_relations}{$a}[0] <=> $self->{prod_relations}{$b}[0] } keys %rel) {
txt mt("_prodrel_$r").': ';
for (@{$rel{$r}}) {
a href => "/p$_->{id}", title => $_->{original}||$_->{name}, shorten $_->{name}, 40;
txt ', ' if $_ ne $rel{$r}[$#{$rel{$r}}];
}
- txt "\n";
+ br;
}
- end;
+ end 'p';
}
if($p->{desc}) {
@@ -117,7 +118,7 @@ sub page {
lit bb2html $p->{desc};
end;
}
- end;
+ end 'div';
_releases($self, $p);
@@ -186,11 +187,11 @@ sub _releases {
txt ' ';
}
end;
- end;
+ end 'tr';
}
}
- end;
- end;
+ end 'table';
+ end 'div';
}
@@ -200,7 +201,7 @@ sub edit {
my($self, $pid, $rev) = @_;
my $p = $pid && $self->dbProducerGet(id => $pid, what => 'changes extended relations', $rev ? (rev => $rev) : ())->[0];
- return 404 if $pid && !$p->{id};
+ return $self->resNotFound if $pid && !$p->{id};
$rev = undef if !$p || $p->{cid} == $p->{latest};
return $self->htmlDenied if !$self->authCan('edit')
@@ -216,18 +217,18 @@ sub edit {
if($self->reqMethod eq 'POST') {
return if !$self->authCheckCode;
$frm = $self->formValidate(
- { name => 'type', enum => $self->{producer_types} },
- { name => 'name', maxlength => 200 },
- { name => 'original', required => 0, maxlength => 200, default => '' },
- { name => 'alias', required => 0, maxlength => 500, default => '' },
- { name => 'lang', enum => $self->{languages} },
- { name => 'website', required => 0, maxlength => 250, default => '', template => 'url' },
- { name => 'l_wp', required => 0, maxlength => 150, default => '' },
- { name => 'desc', required => 0, maxlength => 5000, default => '' },
- { name => 'prodrelations', required => 0, maxlength => 5000, default => '' },
- { name => 'editsum', required => 0, maxlength => 5000 },
- { name => 'ihid', required => 0 },
- { name => 'ilock', required => 0 },
+ { post => 'type', enum => $self->{producer_types} },
+ { post => 'name', maxlength => 200 },
+ { post => 'original', required => 0, maxlength => 200, default => '' },
+ { post => 'alias', required => 0, maxlength => 500, default => '' },
+ { post => 'lang', enum => $self->{languages} },
+ { post => 'website', required => 0, maxlength => 250, default => '', template => 'url' },
+ { post => 'l_wp', required => 0, maxlength => 150, default => '' },
+ { post => 'desc', required => 0, maxlength => 5000, default => '' },
+ { post => 'prodrelations', required => 0, maxlength => 5000, default => '' },
+ { post => 'editsum', required => 0, maxlength => 5000 },
+ { post => 'ihid', required => 0 },
+ { post => 'ilock', required => 0 },
);
push @{$frm->{_err}}, 'badeditsum' if !$frm->{editsum} || lc($frm->{editsum}) eq lc($frm->{desc});
if(!$frm->{_err}) {
@@ -306,7 +307,7 @@ sub edit {
a href => '#', mt '_pedit_rel_addbut';
end;
end;
- end;
+ end 'table';
}],
]);
$self->htmlFooter;
@@ -344,10 +345,10 @@ sub list {
my($self, $char) = @_;
my $f = $self->formValidate(
- { name => 'p', required => 0, default => 1, template => 'int' },
- { name => 'q', required => 0, default => '' },
+ { get => 'p', required => 0, default => 1, template => 'int' },
+ { get => 'q', required => 0, default => '' },
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
my($list, $np) = $self->dbProducerGet(
$char ne 'all' ? ( char => $char ) : (),
@@ -391,7 +392,7 @@ sub list {
}
}
clearfloat;
- end;
+ end 'div';
$self->htmlBrowseNavigate($pageurl, $f->{p}, $np, 'b');
$self->htmlFooter;
}
@@ -401,8 +402,8 @@ sub list {
sub pxml {
my $self = shift;
- my $q = $self->formValidate({ name => 'q', maxlength => 500 });
- return 404 if $q->{_err};
+ my $q = $self->formValidate({ get => 'q', maxlength => 500 });
+ return $self->resNotFound if $q->{_err};
$q = $q->{q};
my($list, $np) = $self->dbProducerGet(
diff --git a/lib/VNDB/Handler/Releases.pm b/lib/VNDB/Handler/Releases.pm
index 4b5a3374..a3ecbd42 100644
--- a/lib/VNDB/Handler/Releases.pm
+++ b/lib/VNDB/Handler/Releases.pm
@@ -3,11 +3,11 @@ package VNDB::Handler::Releases;
use strict;
use warnings;
-use YAWF ':html';
+use TUWF ':html', 'uri_escape';
use VNDB::Func;
-YAWF::register(
+TUWF::register(
qr{r([1-9]\d*)(?:\.([1-9]\d*))?} => \&page,
qr{(v)([1-9]\d*)/add} => \&edit,
qr{r} => \&browse,
@@ -24,7 +24,7 @@ sub page {
what => 'vn extended producers platforms media'.($rev ? ' changes' : ''),
$rev ? (rev => $rev) : (),
)->[0];
- return 404 if !$r->{id};
+ return $self->resNotFound if !$r->{id};
$self->htmlHeader(title => $r->{title}, noindex => $rev);
$self->htmlMainTabs('r', $r);
@@ -250,10 +250,10 @@ sub _infotable {
option value => -1, mt '_relinfo_user_del' if $rl;
end;
end;
- end;
+ end 'tr';
}
- end;
+ end 'table';
}
@@ -272,11 +272,11 @@ sub edit {
}
my $r = $rid && $self->dbReleaseGet(id => $rid, what => 'vn extended producers platforms media changes', $rev ? (rev => $rev) : ())->[0];
- return 404 if $rid && !$r->{id};
+ return $self->resNotFound if $rid && !$r->{id};
$rev = undef if !$r || $r->{cid} == $r->{latest};
my $v = $vid && $self->dbVNGet(id => $vid)->[0];
- return 404 if $vid && !$v->{id};
+ return $self->resNotFound if $vid && !$v->{id};
return $self->htmlDenied if !$self->authCan('edit')
|| $rid && ($r->{locked} && !$self->authCan('lock') || $r->{hidden} && !$self->authCan('del'));
@@ -298,31 +298,31 @@ sub edit {
if($self->reqMethod eq 'POST') {
return if !$self->authCheckCode;
$frm = $self->formValidate(
- { name => 'type', enum => $self->{release_types} },
- { name => 'patch', required => 0, default => 0 },
- { name => 'freeware', required => 0, default => 0 },
- { name => 'doujin', required => 0, default => 0 },
- { name => 'title', maxlength => 250 },
- { name => 'original', required => 0, default => '', maxlength => 250 },
- { name => 'gtin', required => 0, default => '0',
+ { post => 'type', enum => $self->{release_types} },
+ { post => 'patch', required => 0, default => 0 },
+ { post => 'freeware', required => 0, default => 0 },
+ { post => 'doujin', required => 0, default => 0 },
+ { post => 'title', maxlength => 250 },
+ { post => 'original', required => 0, default => '', maxlength => 250 },
+ { post => 'gtin', required => 0, default => '0',
func => [ \&gtintype, 'Not a valid JAN/UPC/EAN code' ] },
- { name => 'catalog', required => 0, default => '', maxlength => 50 },
- { name => 'languages', multi => 1, enum => $self->{languages} },
- { name => 'website', required => 0, default => '', maxlength => 250, template => 'url' },
- { name => 'released', required => 0, default => 0, template => 'int' },
- { name => 'minage' , required => 0, default => -1, enum => $self->{age_ratings} },
- { name => 'notes', required => 0, default => '', maxlength => 10240 },
- { name => 'platforms', required => 0, default => '', multi => 1, enum => $self->{platforms} },
- { name => 'media', required => 0, default => '' },
- { name => 'resolution',required => 0, default => 0, enum => [ 0..$#{$self->{resolutions}} ] },
- { name => 'voiced', required => 0, default => 0, enum => $self->{voiced} },
- { name => 'ani_story', required => 0, default => 0, enum => $self->{animated} },
- { name => 'ani_ero', required => 0, default => 0, enum => $self->{animated} },
- { name => 'producers', required => 0, default => '' },
- { name => 'vn', maxlength => 5000 },
- { name => 'editsum', required => 0, maxlength => 5000 },
- { name => 'ihid', required => 0 },
- { name => 'ilock', required => 0 },
+ { post => 'catalog', required => 0, default => '', maxlength => 50 },
+ { post => 'languages', multi => 1, enum => $self->{languages} },
+ { post => 'website', required => 0, default => '', maxlength => 250, template => 'url' },
+ { post => 'released', required => 0, default => 0, template => 'int' },
+ { post => 'minage' , required => 0, default => -1, enum => $self->{age_ratings} },
+ { post => 'notes', required => 0, default => '', maxlength => 10240 },
+ { post => 'platforms', required => 0, default => '', multi => 1, enum => $self->{platforms} },
+ { post => 'media', required => 0, default => '' },
+ { post => 'resolution',required => 0, default => 0, enum => [ 0..$#{$self->{resolutions}} ] },
+ { post => 'voiced', required => 0, default => 0, enum => $self->{voiced} },
+ { post => 'ani_story', required => 0, default => 0, enum => $self->{animated} },
+ { post => 'ani_ero', required => 0, default => 0, enum => $self->{animated} },
+ { post => 'producers', required => 0, default => '' },
+ { post => 'vn', maxlength => 5000 },
+ { post => 'editsum', required => 0, maxlength => 5000 },
+ { post => 'ihid', required => 0 },
+ { post => 'ilock', required => 0 },
);
push @{$frm->{_err}}, 'badeditsum' if !$frm->{editsum} || lc($frm->{editsum}) eq lc($frm->{notes});
@@ -456,7 +456,7 @@ sub _form {
option value => 3, mt '_redit_form_prod_both';
end; end;
td class => 'tc_add'; a id => 'producer_add', href => '#', mt '_redit_form_prod_addbut'; end;
- end; end;
+ end; end 'table';
}],
],
@@ -480,14 +480,14 @@ sub browse {
my $self = shift;
my $f = $self->formValidate(
- { name => 'p', required => 0, default => 1, template => 'int' },
- { name => 'o', required => 0, default => 'a', enum => ['a', 'd'] },
- { name => 'q', required => 0, default => '', maxlength => 500 },
- { name => 's', required => 0, default => 'title', enum => [qw|released minage title|] },
- { name => 'fil',required => 0, default => '' },
+ { get => 'p', required => 0, default => 1, template => 'int' },
+ { get => 'o', required => 0, default => 'a', enum => ['a', 'd'] },
+ { get => 'q', required => 0, default => '', maxlength => 500 },
+ { get => 's', required => 0, default => 'title', enum => [qw|released minage title|] },
+ { get => 'fil',required => 0 },
);
- return 404 if $f->{_err};
- $f->{fil} = $self->authPref('filter_release') if !grep $_ eq 'fil', $self->reqParam();
+ return $self->resNotFound if $f->{_err};
+ $f->{fil} //= $self->authPref('filter_release');
my %compat = _fil_compat($self);
my($list, $np) = !$f->{q} && !$f->{fil} && !keys %compat ? ([], 0) : $self->filFetchDB(release => $f->{fil}, \%compat, {
@@ -505,11 +505,11 @@ sub browse {
h1 mt '_rbrowse_title';
$self->htmlSearchBox('r', $f->{q});
a id => 'filselect', href => '#r';
- lit '<i>&#9656;</i> '.mt('_rbrowse_filters').'<i></i>';
+ lit '<i>&#9656;</i> '.mt('_js_fil_filters').'<i></i>';
end;
input type => 'hidden', class => 'hidden', name => 'fil', id => 'fil', value => $f->{fil};
end;
- end;
+ end 'form';
my $uri = sprintf '/r?q=%s;fil=%s', uri_escape($f->{q}), $f->{fil};
$self->htmlBrowse(
@@ -541,7 +541,7 @@ sub browse {
a href => "/r$l->{id}", title => $l->{original}||$l->{title}, shorten $l->{title}, 90;
b class => 'grayedout', ' (patch)' if $l->{patch};
end;
- end;
+ end 'tr';
},
) if @$list;
if(($f->{q} || $f->{fil}) && !@$list) {
@@ -561,18 +561,18 @@ sub _fil_compat {
my $self = shift;
my %c;
my $f = $self->formValidate(
- { name => 'ln', required => 0, multi => 1, default => '', enum => $self->{languages} },
- { name => 'pl', required => 0, multi => 1, default => '', enum => $self->{platforms} },
- { name => 'me', required => 0, multi => 1, default => '', enum => [ keys %{$self->{media}} ] },
- { name => 'tp', required => 0, default => '', enum => [ '', @{$self->{release_types}} ] },
- { name => 'pa', required => 0, default => 0, enum => [ 0..2 ] },
- { name => 'fw', required => 0, default => 0, enum => [ 0..2 ] },
- { name => 'do', required => 0, default => 0, enum => [ 0..2 ] },
- { name => 'ma_m', required => 0, default => 0, enum => [ 0, 1 ] },
- { name => 'ma_a', required => 0, default => 0, enum => $self->{age_ratings} },
- { name => 'mi', required => 0, default => 0, template => 'int' },
- { name => 'ma', required => 0, default => 99999999, template => 'int' },
- { name => 're', required => 0, multi => 1, default => 0, enum => [ 1..$#{$self->{resolutions}} ] },
+ { get => 'ln', required => 0, multi => 1, default => '', enum => $self->{languages} },
+ { get => 'pl', required => 0, multi => 1, default => '', enum => $self->{platforms} },
+ { get => 'me', required => 0, multi => 1, default => '', enum => [ keys %{$self->{media}} ] },
+ { get => 'tp', required => 0, default => '', enum => [ '', @{$self->{release_types}} ] },
+ { get => 'pa', required => 0, default => 0, enum => [ 0..2 ] },
+ { get => 'fw', required => 0, default => 0, enum => [ 0..2 ] },
+ { get => 'do', required => 0, default => 0, enum => [ 0..2 ] },
+ { get => 'ma_m', required => 0, default => 0, enum => [ 0, 1 ] },
+ { get => 'ma_a', required => 0, default => 0, enum => $self->{age_ratings} },
+ { get => 'mi', required => 0, default => 0, template => 'int' },
+ { get => 'ma', required => 0, default => 99999999, template => 'int' },
+ { get => 're', required => 0, multi => 1, default => 0, enum => [ 1..$#{$self->{resolutions}} ] },
);
return () if $f->{_err};
$c{minage} = [ grep $_ >= 0 && ($f->{ma_m} ? $f->{ma_a} >= $_ : $f->{ma_a} <= $_), @{$self->{age_ratings}} ] if $f->{ma_a} || $f->{ma_m};
diff --git a/lib/VNDB/Handler/Tags.pm b/lib/VNDB/Handler/Tags.pm
index ad736027..6a4cb760 100644
--- a/lib/VNDB/Handler/Tags.pm
+++ b/lib/VNDB/Handler/Tags.pm
@@ -4,11 +4,11 @@ package VNDB::Handler::Tags;
use strict;
use warnings;
-use YAWF ':html', ':xml';
+use TUWF ':html', ':xml', 'xml_escape';
use VNDB::Func;
-YAWF::register(
+TUWF::register(
qr{g([1-9]\d*)}, \&tagpage,
qr{g([1-9]\d*)/(edit)}, \&tagedit,
qr{g([1-9]\d*)/(add)}, \&tagedit,
@@ -27,16 +27,16 @@ sub tagpage {
my($self, $tag) = @_;
my $t = $self->dbTagGet(id => $tag, what => 'parents(0) childs(2) aliases')->[0];
- return 404 if !$t;
+ return $self->resNotFound if !$t;
my $f = $self->formValidate(
- { name => 's', required => 0, default => 'tagscore', enum => [ qw|title rel pop tagscore rating| ] },
- { name => 'o', required => 0, default => 'd', enum => [ 'a','d' ] },
- { name => 'p', required => 0, default => 1, template => 'int' },
- { name => 'm', required => 0, default => -1, enum => [qw|0 1 2|] },
+ { get => 's', required => 0, default => 'tagscore', enum => [ qw|title rel pop tagscore rating| ] },
+ { get => 'o', required => 0, default => 'd', enum => [ 'a','d' ] },
+ { get => 'p', required => 0, default => 1, template => 'int' },
+ { get => 'm', required => 0, default => -1, enum => [qw|0 1 2|] },
);
- return 404 if $f->{_err};
- my $tagspoil = $self->reqCookie($self->{cookie_prefix}.'tagspoil');
+ return $self->resNotFound if $f->{_err};
+ my $tagspoil = $self->reqCookie('tagspoil');
$f->{m} = $tagspoil =~ /^[0-2]$/ ? $tagspoil : 0 if $f->{m} == -1;
my($list, $np) = $t->{meta} || $t->{state} != 2 ? ([],0) : $self->filFetchDB(vn => undef, undef, {
@@ -69,7 +69,7 @@ sub tagpage {
p mt '_tagp_pending_msg';
end;
}
- end;
+ end 'div';
}
div class => 'mainbox';
@@ -84,9 +84,10 @@ sub tagpage {
txt ' > ';
a href => "/g$_->{id}", $_->{name};
}
- txt " > $t->{name}\n";
+ txt " > $t->{name}";
+ br;
}
- end;
+ end 'p';
if($t->{description}) {
p class => 'description';
@@ -95,11 +96,12 @@ sub tagpage {
}
if(@{$t->{aliases}}) {
p class => 'center';
- b mt('_tagp_aliases')."\n";
- txt "$_\n" for (@{$t->{aliases}});
+ b mt('_tagp_aliases');
+ br;
+ lit xml_escape($_).'<br />' for (@{$t->{aliases}});
end;
}
- end;
+ end 'div';
_childtags($self, $t) if @{$t->{childs}};
@@ -112,9 +114,11 @@ sub tagpage {
a href => "/g$t->{id}?m=1", $f->{m} == 1 ? (class => 'optselected') : (), onclick => "setCookie('tagspoil', 1);return true;", mt '_tagp_spoil1';
a href => "/g$t->{id}?m=2", $f->{m} == 2 ? (class => 'optselected') : (), onclick => "setCookie('tagspoil', 2);return true;", mt '_tagp_spoil2';
end;
- p "\n\n".mt '_tagp_novn' if !@$list;
- p "\n".mt '_tagp_cached';
- end;
+ if(!@$list) {
+ p; br; br; txt mt '_tagp_novn'; end;
+ }
+ p; br; txt mt '_tagp_cached'; end;
+ end 'div';
$self->htmlBrowseVN($list, $f, $np, "/g$t->{id}?m=$f->{m}", 1) if @$list;
}
@@ -164,12 +168,12 @@ sub _childtags {
end;
}
end;
- end;
+ end 'li';
}
- end;
+ end 'ul';
clearfloat;
br;
- end;
+ end 'div';
}
@@ -179,7 +183,7 @@ sub tagedit {
my($frm, $par);
if($act && $act eq 'add') {
$par = $self->dbTagGet(id => $tag)->[0];
- return 404 if !$par;
+ return $self->resNotFound if !$par;
$frm->{parents} = $par->{name};
$tag = undef;
}
@@ -187,18 +191,18 @@ sub tagedit {
return $self->htmlDenied if !$self->authCan('tag') || $tag && !$self->authCan('tagmod');
my $t = $tag && $self->dbTagGet(id => $tag, what => 'parents(1) aliases addedby')->[0];
- return 404 if $tag && !$t;
+ return $self->resNotFound if $tag && !$t;
if($self->reqMethod eq 'POST') {
return if !$self->authCheckCode;
$frm = $self->formValidate(
- { name => 'name', required => 1, maxlength => 250, regex => [ qr/^[^,]+$/, 'A comma is not allowed in tag names' ] },
- { name => 'state', required => 0, default => 0, enum => [ 0..2 ] },
- { name => 'meta', required => 0, default => 0 },
- { name => 'alias', required => 0, maxlength => 1024, default => '', regex => [ qr/^[^,]+$/s, 'No comma allowed in aliases' ] },
- { name => 'description', required => 0, maxlength => 10240, default => '' },
- { name => 'parents', required => !$self->authCan('tagmod'), default => '' },
- { name => 'merge', required => 0, default => '' },
+ { post => 'name', required => 1, maxlength => 250, regex => [ qr/^[^,]+$/, 'A comma is not allowed in tag names' ] },
+ { post => 'state', required => 0, default => 0, enum => [ 0..2 ] },
+ { post => 'meta', required => 0, default => 0 },
+ { post => 'alias', required => 0, maxlength => 1024, default => '', regex => [ qr/^[^,]+$/s, 'No comma allowed in aliases' ] },
+ { post => 'description', required => 0, maxlength => 10240, default => '' },
+ { post => 'parents', required => !$self->authCan('tagmod'), default => '' },
+ { post => 'merge', required => 0, default => '' },
);
my @aliases = split /[\t\s]*\n[\t\s]*/, $frm->{alias};
my @parents = split /[\t\s]*,[\t\s]*/, $frm->{parents};
@@ -289,13 +293,13 @@ sub taglist {
my $self = shift;
my $f = $self->formValidate(
- { name => 's', required => 0, default => 'name', enum => ['added', 'name'] },
- { name => 'o', required => 0, default => 'a', enum => ['a', 'd'] },
- { name => 'p', required => 0, default => 1, template => 'int' },
- { name => 't', required => 0, default => -1, enum => [ -1..2 ] },
- { name => 'q', required => 0, default => '' },
+ { get => 's', required => 0, default => 'name', enum => ['added', 'name'] },
+ { get => 'o', required => 0, default => 'a', enum => ['a', 'd'] },
+ { get => 'p', required => 0, default => 1, template => 'int' },
+ { get => 't', required => 0, default => -1, enum => [ -1..2 ] },
+ { get => 'q', required => 0, default => '' },
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
my($t, $np) = $self->dbTagGet(
sort => $f->{s}, reverse => $f->{o} eq 'd',
@@ -321,7 +325,7 @@ sub taglist {
if(!@$t) {
p mt '_tagb_noresults';
}
- end;
+ end 'div';
if(@$t) {
$self->htmlBrowse(
class => 'taglist',
@@ -345,7 +349,7 @@ sub taglist {
b class => 'grayedout', ' '.mt '_tagb_note_del' if $l->{state} == 1;
}
end;
- end;
+ end 'tr';
}
);
}
@@ -357,14 +361,14 @@ sub taglinks {
my $self = shift;
my $f = $self->formValidate(
- { name => 'p', required => 0, default => 1, template => 'int' },
- { name => 'o', required => 0, default => 'd', enum => ['a', 'd'] },
- { name => 's', required => 0, default => 'date', enum => [qw|date tag|] },
- { name => 'v', required => 0, default => 0, template => 'int' },
- { name => 'u', required => 0, default => 0, template => 'int' },
- { name => 't', required => 0, default => 0, template => 'int' },
+ { get => 'p', required => 0, default => 1, template => 'int' },
+ { get => 'o', required => 0, default => 'd', enum => ['a', 'd'] },
+ { get => 's', required => 0, default => 'date', enum => [qw|date tag|] },
+ { get => 'v', required => 0, default => 0, template => 'int' },
+ { get => 'u', required => 0, default => 0, template => 'int' },
+ { get => 't', required => 0, default => 0, template => 'int' },
);
- return 404 if $f->{_err} || $f->{p} > 100;
+ return $self->resNotFound if $f->{_err} || $f->{p} > 100;
my($list, $np) = $self->dbTagLinks(
what => 'details',
@@ -420,10 +424,10 @@ sub taglinks {
a href => "/v$o->{id}", $o->{title};
end;
}
- end;
+ end 'ul';
}
p mt '_taglink_fil_add' unless $f->{v} && $f->{u} && $f->{t};
- end;
+ end 'div';
$self->htmlBrowse(
class => 'taglinks',
@@ -450,7 +454,7 @@ sub taglinks {
a href => $url->(u=>$l->{uid}), class => 'setfil', '> ' if !$f->{u};
a href => "/u$l->{uid}", $l->{username};
end;
- td class => 'tc3';
+ td class => 'tc3'.($l->{ignore}?' ignored':'');
tagscore $l->{vote};
end;
td class => 'tc4';
@@ -473,23 +477,61 @@ sub vntagmod {
my($self, $vid) = @_;
my $v = $self->dbVNGet(id => $vid)->[0];
- return 404 if !$v || $v->{hidden};
+ return $self->resNotFound if !$v || $v->{hidden};
return $self->htmlDenied if !$self->authCan('tag');
+ my $tags = $self->dbTagStats(vid => $vid, results => 9999);
+ my $my = $self->dbTagLinks(vid => $vid, uid => $self->authInfo->{id});
+
if($self->reqMethod eq 'POST') {
return if !$self->authCheckCode;
my $frm = $self->formValidate(
- { name => 'taglinks', required => 0, default => '', maxlength => 10240, regex => [ qr/^[1-9][0-9]*,-?[1-3],-?[0-2]( [1-9][0-9]*,-?[1-3],-?[0-2])*$/, 'meh' ] }
+ { post => 'taglinks', required => 0, default => '', maxlength => 10240, regex => [ qr/^[1-9][0-9]*,-?[1-3],-?[0-2]( [1-9][0-9]*,-?[1-3],-?[0-2])*$/, 'meh' ] },
+ { post => 'overrule', required => 0, multi => 1, template => 'int' },
);
- return 404 if $frm->{_err};
- $self->dbTagLinkEdit($self->authInfo->{id}, $vid, [ map [ split /,/ ], split / /, $frm->{taglinks}]);
- }
+ return $self->resNotFound if $frm->{_err};
+
+ # convert some data in a more convenient structure for faster lookup
+ my %tags = map +($_->{id} => $_), @$tags;
+ my %old = map +($_->{tag} => $_), @$my;
+ my %new = map { my($tag, $vote, $spoiler) = split /,/; ($tag => [ $vote, $spoiler ]) } split / /, $frm->{taglinks};
+ my %over = !$self->authCan('tagmod') || !$frm->{overrule}[0] ? () : (map $new{$_} ? ($_ => 1) : (), @{$frm->{overrule}});
+
+ # hashes which need to be filled, indicating what should be changed to the DB
+ my %delete; # tag => 1
+ my %update; # tag => [ vote, spoiler ] (ignore flag is untouched)
+ my %insert; # tag => [ vote, spoiler, ignore ]
+ my %overrule; # tag => 0/1
+
+ for my $t (keys %old, keys %new) {
+ my $prev_over = $old{$t} && !$old{$t}{ignore} && $tags{$t}{overruled};
+
+ # overrule checkbox has changed? make sure to (de-)overrule the tag votes
+ $overrule{$t} = $over{$t}?1:0 if (!$prev_over && $over{$t}) || ($prev_over && !$over{$t});
+
+ # tag deleted?
+ if($old{$t} && !$new{$t}) {
+ $delete{$t} = 1;
+ next;
+ }
- my $my = $self->dbTagLinks(vid => $vid, uid => $self->authInfo->{id});
- my $tags = $self->dbTagStats(vid => $vid, results => 9999);
+ # and insert or update the vote
+ if(!$old{$t} && $new{$t}) {
+ # determine whether this vote is going to be ignored or not
+ my $ign = $tags{$t}{overruled} && !$prev_over && !$over{$t};
+ $insert{$t} = [ $new{$t}[0], $new{$t}[1], $ign ];
+ } elsif($old{$t}{vote} != $new{$t}[0] || (defined $old{$t}{spoiler} ? $old{$t}{spoiler} : -1) != $new{$t}[1]) {
+ $update{$t} = [ $new{$t}[0], $new{$t}[1] ];
+ }
+ }
+ $self->dbTagLinkEdit($self->authInfo->{id}, $vid, \%insert, \%update, \%delete, \%overrule);
+
+ # need to re-fetch the tags and tag links, as these have been modified
+ $tags = $self->dbTagStats(vid => $vid, results => 9999);
+ $my = $self->dbTagLinks(vid => $vid, uid => $self->authInfo->{id});
+ }
- my $frm;
my $title = mt '_tagv_title', $v->{title};
$self->htmlHeader(title => $title, noindex => 1);
@@ -504,26 +546,27 @@ sub vntagmod {
li mt '_tagv_msg_cache';
end;
end;
- end;
- $self->htmlForm({ frm => $frm, action => "/v$vid/tagmod", nosubmit => 1 }, tagmod => [ mt('_tagv_frm_title'),
+ end 'div';
+ $self->htmlForm({ action => "/v$vid/tagmod", nosubmit => 1 }, tagmod => [ mt('_tagv_frm_title'),
[ hidden => short => 'taglinks', value => '' ],
[ static => nolabel => 1, content => sub {
table class => 'tgl';
thead;
Tr;
td '';
- td colspan => 2, class => 'tc_you', mt '_tagv_col_you';
+ td colspan => $self->authCan('tagmod') ? 3 : 2, class => 'tc_you', mt '_tagv_col_you';
td colspan => 3, class => 'tc_others', mt '_tagv_col_others';
end;
Tr;
td class => 'tc_tagname', mt '_tagv_col_tag';
td class => 'tc_myvote', mt '_tagv_col_rating';
+ td class => 'tc_myover', 'O' if $self->authCan('tagmod');
td class => 'tc_myspoil', mt '_tagv_col_spoiler';
td class => 'tc_allvote', mt '_tagv_col_rating';
td class => 'tc_allspoil', mt '_tagv_col_spoiler';
td class => 'tc_allwho', '';
end;
- end;
+ end 'thead';
tfoot; Tr;
td colspan => 6;
input type => 'submit', class => 'submit', value => mt('_tagv_save'), style => 'float: right';
@@ -534,17 +577,25 @@ sub vntagmod {
lit mt '_tagv_addmsg';
end;
end;
- end; end;
+ end; end 'tfoot';
tbody id => 'tagtable';
for my $t (sort { $a->{name} cmp $b->{name} } @$tags) {
my $m = (grep $_->{tag} == $t->{id}, @$my)[0] || {};
Tr id => "tgl_$t->{id}";
td class => 'tc_tagname'; a href => "/g$t->{id}", $t->{name}; end;
td class => 'tc_myvote', $m->{vote}||0;
+ if($self->authCan('tagmod')) {
+ td class => 'tc_myover';
+ input type => 'checkbox', name => 'overrule', value => $t->{id},
+ $m->{vote} && !$m->{ignore} && $t->{overruled} ? (checked => 'checked') : ()
+ if $t->{cnt} > 1;
+ end;
+ }
td class => 'tc_myspoil', defined $m->{spoiler} ? $m->{spoiler} : -1;
td class => 'tc_allvote';
- tagscore !$m->{vote} ? $t->{rating} : $t->{cnt} == 1 ? 0 : ($t->{rating}*$t->{cnt} - $m->{vote}) / ($t->{cnt}-1);
- i ' ('.($t->{cnt} - ($m->{vote} ? 1 : 0)).')';
+ tagscore $t->{rating};
+ i $t->{overruled} ? (class => 'grayedout') : (), " ($t->{cnt})";
+ b class => 'standout', style => 'font-weight: bold', ' !' if $t->{overruled};
end;
td class => 'tc_allspoil', sprintf '%.2f', $t->{spoiler};
td class => 'tc_allwho';
@@ -552,8 +603,8 @@ sub vntagmod {
end;
end;
}
- end;
- end;
+ end 'tbody';
+ end 'table';
} ],
]);
$self->htmlFooter;
@@ -623,7 +674,7 @@ sub tagindex {
end;
}
li;
- txt "\n";
+ br;
a href => '/g/list?t=0;o=d;s=added', mt '_tagidx_queue_link';
txt ' - ';
a href => '/g/list?t=1;o=d;s=added', mt '_tagidx_denied';
@@ -631,8 +682,8 @@ sub tagindex {
end;
end;
- end; # /tr
- end; # /table
+ end 'tr';
+ end 'table';
$self->htmlFooter;
}
@@ -671,10 +722,10 @@ sub tagxml {
my $self = shift;
my $f = $self->formValidate(
- { name => 'q', required => 0, maxlength => 500 },
- { name => 'id', required => 0, multi => 1, template => 'int' },
+ { get => 'q', required => 0, maxlength => 500 },
+ { get => 'id', required => 0, multi => 1, template => 'int' },
);
- return 404 if $f->{_err} || (!$f->{q} && !$f->{id} && !$f->{id}[0]);
+ return $self->resNotFound if $f->{_err} || (!$f->{q} && !$f->{id} && !$f->{id}[0]);
my($list, $np) = $self->dbTagGet(
!$f->{q} ? () : $f->{q} =~ /^g([1-9]\d*)/ ? (id => $1) : $f->{q} =~ /^name:(.+)$/ ? (name => $1) : (search => $f->{q}),
diff --git a/lib/VNDB/Handler/ULists.pm b/lib/VNDB/Handler/ULists.pm
index 764d515b..94007a73 100644
--- a/lib/VNDB/Handler/ULists.pm
+++ b/lib/VNDB/Handler/ULists.pm
@@ -3,11 +3,11 @@ package VNDB::Handler::ULists;
use strict;
use warnings;
-use YAWF ':html', ':xml';
+use TUWF ':html', ':xml';
use VNDB::Func;
-YAWF::register(
+TUWF::register(
qr{v([1-9]\d*)/vote}, \&vnvote,
qr{v([1-9]\d*)/wish}, \&vnwish,
qr{v([1-9]\d*)/list}, \&vnlist_e,
@@ -27,9 +27,9 @@ sub vnvote {
return if !$self->authCheckCode;
my $f = $self->formValidate(
- { name => 'v', enum => [ -1, 1..10 ] }
+ { get => 'v', enum => [ -1, 1..10 ] }
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
$self->dbVoteDel($uid, $id) if $f->{v} == -1;
$self->dbVoteAdd($id, $uid, $f->{v}) if $f->{v} > 0;
@@ -46,9 +46,9 @@ sub vnwish {
return if !$self->authCheckCode;
my $f = $self->formValidate(
- { name => 's', enum => [ -1, @{$self->{wishlist_status}} ] }
+ { get => 's', enum => [ -1, @{$self->{wishlist_status}} ] }
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
$self->dbWishListDel($uid, $id) if $f->{s} == -1;
$self->dbWishListAdd($id, $uid, $f->{s}) if $f->{s} != -1;
@@ -65,9 +65,9 @@ sub vnlist_e {
return if !$self->authCheckCode;
my $f = $self->formValidate(
- { name => 'e', enum => [ -1, @{$self->{vnlist_status}} ] }
+ { get => 'e', enum => [ -1, @{$self->{vnlist_status}} ] }
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
$self->dbVNListDel($uid, $id) if $f->{e} == -1;
$self->dbVNListAdd($uid, $id, $f->{e}) if $f->{e} != -1;
@@ -82,9 +82,9 @@ sub rlist_e {
my $rid = $id;
if(!$rid) {
my $f = $self->formValidate(
- { name => 'id', required => 1, template => 'int' }
+ { get => 'id', required => 1, template => 'int' }
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
$rid = $f->{id};
}
@@ -93,9 +93,9 @@ sub rlist_e {
return if !$self->authCheckCode;
my $f = $self->formValidate(
- { name => 'e', required => 1, enum => [ -1, @{$self->{rlist_status}} ] }
+ { get => 'e', required => 1, enum => [ -1, @{$self->{rlist_status}} ] }
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
$self->dbRListDel($uid, $rid) if $f->{e} == -1;
$self->dbRListAdd($uid, $rid, $f->{e}) if $f->{e} >= 0;
@@ -116,24 +116,24 @@ sub votelist {
my($self, $type, $id) = @_;
my $obj = $type eq 'v' ? $self->dbVNGet(id => $id)->[0] : $self->dbUserGet(uid => $id, what => 'hide_list')->[0];
- return 404 if !$obj->{id};
+ return $self->resNotFound if !$obj->{id};
my $own = $type eq 'u' && $self->authInfo->{id} && $self->authInfo->{id} == $id;
- return 404 if $type eq 'u' && !$own && !(!$obj->{hide_list} || $self->authCan('usermod'));
+ return $self->resNotFound if $type eq 'u' && !$own && !(!$obj->{hide_list} || $self->authCan('usermod'));
my $f = $self->formValidate(
- { name => 'p', required => 0, default => 1, template => 'int' },
- { name => 'o', required => 0, default => 'd', enum => ['a', 'd'] },
- { name => 's', required => 0, default => 'date', enum => [qw|date title vote|] },
- { name => 'c', required => 0, default => 'all', enum => [ 'all', 'a'..'z', 0 ] },
+ { get => 'p', required => 0, default => 1, template => 'int' },
+ { get => 'o', required => 0, default => 'd', enum => ['a', 'd'] },
+ { get => 's', required => 0, default => 'date', enum => [qw|date title vote|] },
+ { get => 'c', required => 0, default => 'all', enum => [ 'all', 'a'..'z', 0 ] },
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
if($own && $self->reqMethod eq 'POST') {
return if !$self->authCheckCode;
my $frm = $self->formValidate(
- { name => 'vid', required => 1, multi => 1, template => 'int' },
- { name => 'batchedit', required => 1, enum => [ -2, -1, 1..10 ] },
+ { post => 'vid', required => 1, multi => 1, template => 'int' },
+ { post => 'batchedit', required => 1, enum => [ -2, -1, 1..10 ] },
);
my @vid = grep $_ && $_ > 0, @{$frm->{vid}};
if(!$frm->{_err} && @vid && $frm->{batchedit} > -2) {
@@ -210,7 +210,7 @@ sub votelist {
option value => -1, 'revoke';
end;
end;
- end;
+ end 'tr';
}) : (),
);
end if $own;
@@ -223,21 +223,21 @@ sub wishlist {
my $own = $self->authInfo->{id} && $self->authInfo->{id} == $uid;
my $u = $self->dbUserGet(uid => $uid, what => 'hide_list')->[0];
- return 404 if !$u || !$own && !(!$u->{hide_list} || $self->authCan('usermod'));
+ return $self->resNotFound if !$u || !$own && !(!$u->{hide_list} || $self->authCan('usermod'));
my $f = $self->formValidate(
- { name => 'p', required => 0, default => 1, template => 'int' },
- { name => 'o', required => 0, default => 'd', enum => [ 'a', 'd' ] },
- { name => 's', required => 0, default => 'wstat', enum => [qw|title added wstat|] },
- { name => 'f', required => 0, default => -1, enum => [ -1, @{$self->{wishlist_status}} ] },
+ { get => 'p', required => 0, default => 1, template => 'int' },
+ { get => 'o', required => 0, default => 'd', enum => [ 'a', 'd' ] },
+ { get => 's', required => 0, default => 'wstat', enum => [qw|title added wstat|] },
+ { get => 'f', required => 0, default => -1, enum => [ -1, @{$self->{wishlist_status}} ] },
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
if($own && $self->reqMethod eq 'POST') {
return if !$self->authCheckCode;
my $frm = $self->formValidate(
- { name => 'sel', required => 0, default => 0, multi => 1, template => 'int' },
- { name => 'batchedit', required => 1, enum => [ -1, @{$self->{wishlist_status}} ] },
+ { post => 'sel', required => 0, default => 0, multi => 1, template => 'int' },
+ { post => 'batchedit', required => 1, enum => [ -1, @{$self->{wishlist_status}} ] },
);
if(!$frm->{_err} && @{$frm->{sel}} && $frm->{sel}[0]) {
$self->dbWishListDel($uid, $frm->{sel}) if $frm->{batchedit} == -1;
@@ -269,7 +269,7 @@ sub wishlist {
$_ == -1 ? mt '_wishlist_prio_all' : mt "_wish_$_"
for (-1, @{$self->{wishlist_status}});
end;
- end;
+ end 'div';
if($own) {
my $code = $self->authGetCode("/u$uid/wish");
@@ -315,7 +315,7 @@ sub wishlist {
end;
}) : (),
);
- end if $own;
+ end 'form' if $own;
$self->htmlFooter;
}
@@ -325,26 +325,26 @@ sub vnlist {
my $own = $self->authInfo->{id} && $self->authInfo->{id} == $uid;
my $u = $self->dbUserGet(uid => $uid, what => 'hide_list')->[0];
- return 404 if !$u || !$own && !(!$u->{hide_list} || $self->authCan('usermod'));
+ return $self->resNotFound if !$u || !$own && !(!$u->{hide_list} || $self->authCan('usermod'));
my $f = $self->formValidate(
- { name => 'p', required => 0, default => 1, template => 'int' },
- { name => 'o', required => 0, default => 'a', enum => [ 'a', 'd' ] },
- { name => 's', required => 0, default => 'title', enum => [ 'title', 'vote' ] },
- { name => 'c', required => 0, default => 'all', enum => [ 'all', 'a'..'z', 0 ] },
- { name => 'v', required => 0, default => 0, enum => [ -1..1 ] },
- { name => 't', required => 0, default => -1, enum => [ -1, @{$self->{vnlist_status}} ] },
+ { get => 'p', required => 0, default => 1, template => 'int' },
+ { get => 'o', required => 0, default => 'a', enum => [ 'a', 'd' ] },
+ { get => 's', required => 0, default => 'title', enum => [ 'title', 'vote' ] },
+ { get => 'c', required => 0, default => 'all', enum => [ 'all', 'a'..'z', 0 ] },
+ { get => 'v', required => 0, default => 0, enum => [ -1..1 ] },
+ { get => 't', required => 0, default => -1, enum => [ -1, @{$self->{vnlist_status}} ] },
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
if($own && $self->reqMethod eq 'POST') {
return if !$self->authCheckCode;
my $frm = $self->formValidate(
- { name => 'vid', required => 0, default => 0, multi => 1, template => 'int' },
- { name => 'rid', required => 0, default => 0, multi => 1, template => 'int' },
- { name => 'not', required => 0, default => '', maxlength => 2000 },
- { name => 'vns', required => 1, enum => [ -2, -1, @{$self->{vnlist_status}}, 999 ] },
- { name => 'rel', required => 1, enum => [ -2, -1, @{$self->{rlist_status}} ] },
+ { post => 'vid', required => 0, default => 0, multi => 1, template => 'int' },
+ { post => 'rid', required => 0, default => 0, multi => 1, template => 'int' },
+ { post => 'not', required => 0, default => '', maxlength => 2000 },
+ { post => 'vns', required => 1, enum => [ -2, -1, @{$self->{vnlist_status}}, 999 ] },
+ { post => 'rel', required => 1, enum => [ -2, -1, @{$self->{rlist_status}} ] },
);
my @vid = grep $_ > 0, @{$frm->{vid}};
my @rid = grep $_ > 0, @{$frm->{rid}};
@@ -404,7 +404,7 @@ sub vnlist {
a href => $url->(t => -1), -1 == $f->{t} ? (class => 'optselected') : (), mt '_rlist_all';
a href => $url->(t => $_), $_ == $f->{t} ? (class => 'optselected') : (), mt '_vnlist_status_'.$_ for @{$self->{vnlist_status}};
end;
- end;
+ end 'div';
_vnlist_browse($self, $own, $list, $np, $f, $url, $uid);
$self->htmlFooter;
@@ -458,7 +458,7 @@ sub _vnlist_browse {
lit $txt;
end;
td class => 'tc8', $i->{vote} || '-';
- end;
+ end 'tr';
for (@{$i->{rels}}) {
Tr class => "collapse relhid collapse_vid$i->{vid}".($n%2 ? '':' odd');
@@ -476,7 +476,7 @@ sub _vnlist_browse {
end;
td class => 'tc6', $_->{status} ? mt '_rlist_status_'.$_->{status} : '';
td class => 'tc7_8', colspan => 2, '';
- end;
+ end 'tr';
}
},
@@ -505,11 +505,11 @@ sub _vnlist_browse {
input type => 'submit', value => mt '_rlist_update';
end;
td class => 'tc7_8', colspan => 2, mt '_rlist_releasenote';
- end;
+ end 'tr';
}) : (),
);
- end if $own;
+ end 'form' if $own;
}
1;
diff --git a/lib/VNDB/Handler/Users.pm b/lib/VNDB/Handler/Users.pm
index 044c72b2..75ddb547 100644
--- a/lib/VNDB/Handler/Users.pm
+++ b/lib/VNDB/Handler/Users.pm
@@ -3,12 +3,12 @@ package VNDB::Handler::Users;
use strict;
use warnings;
-use YAWF ':html', 'xml_escape';
+use TUWF ':html', 'xml_escape';
use VNDB::Func;
use POSIX 'floor';
-YAWF::register(
+TUWF::register(
qr{u([1-9]\d*)} => \&userpage,
qr{u/login} => \&login,
qr{u([1-9]\d*)/logout} => \&logout,
@@ -28,7 +28,7 @@ sub userpage {
my($self, $uid) = @_;
my $u = $self->dbUserGet(uid => $uid, what => 'stats hide_list')->[0];
- return 404 if !$u->{id};
+ return $self->resNotFound if !$u->{id};
my $votes = $u->{c_votes} && $self->dbVoteStats(uid => $uid);
@@ -113,8 +113,8 @@ sub userpage {
}
end;
end;
- end;
- end;
+ end 'table';
+ end 'div';
if(!$u->{hide_list} && $votes) {
div class => 'mainbox';
@@ -142,8 +142,8 @@ sub login {
my $frm;
if($self->reqMethod eq 'POST') {
$frm = $self->formValidate(
- { name => 'usrname', required => 1, minlength => 2, maxlength => 15 },
- { name => 'usrpass', required => 1, minlength => 4, maxlength => 64, template => 'asciiprint' },
+ { post => 'usrname', required => 1, minlength => 2, maxlength => 15 },
+ { post => 'usrpass', required => 1, minlength => 4, maxlength => 64, template => 'asciiprint' },
);
(my $ref = $self->reqHeader('Referer')||'/') =~ s/^\Q$self->{url}//;
@@ -166,7 +166,7 @@ sub login {
sub logout {
my $self = shift;
my $uid = shift;
- return 404 if !$self->authInfo->{id} || $self->authInfo->{id} != $uid;
+ return $self->resNotFound if !$self->authInfo->{id} || $self->authInfo->{id} != $uid;
$self->authLogout;
}
@@ -180,7 +180,7 @@ sub newpass {
if($self->reqMethod eq 'POST') {
return if !$self->authCheckCode;
$frm = $self->formValidate(
- { name => 'mail', required => 1, template => 'mail' },
+ { post => 'mail', required => 1, template => 'mail' },
);
if(!$frm->{_err}) {
$u = $self->dbUserGet(mail => $frm->{mail})->[0];
@@ -238,12 +238,12 @@ sub register {
if($self->reqMethod eq 'POST') {
return if !$self->authCheckCode;
$frm = $self->formValidate(
- { name => 'usrname', template => 'pname', minlength => 2, maxlength => 15 },
- { name => 'mail', template => 'mail' },
- { name => 'usrpass', minlength => 4, maxlength => 64, template => 'asciiprint' },
- { name => 'usrpass2', minlength => 4, maxlength => 64, template => 'asciiprint' },
- { name => 'type', regex => [ qr/^[1-3]$/ ] },
- { name => 'answer', template => 'int' },
+ { post => 'usrname', template => 'pname', minlength => 2, maxlength => 15 },
+ { post => 'mail', template => 'mail' },
+ { post => 'usrpass', minlength => 4, maxlength => 64, template => 'asciiprint' },
+ { post => 'usrpass2', minlength => 4, maxlength => 64, template => 'asciiprint' },
+ { post => 'type', regex => [ qr/^[1-3]$/ ] },
+ { post => 'answer', template => 'int' },
);
my $num = $self->{stats}{[qw|vn releases producers|]->[ $frm->{type} - 1 ]};
push @{$frm->{_err}}, 'notanswer' if !$frm->{_err} && ($frm->{answer} > $num || $frm->{answer} < $num*0.995);
@@ -292,7 +292,7 @@ sub edit {
# fetch user info (cached if uid == loggedin uid)
my $u = $self->authInfo->{id} == $uid ? $self->authInfo : $self->dbUserGet(uid => $uid, what => 'extended prefs')->[0];
- return 404 if !$u->{id};
+ return $self->resNotFound if !$u->{id};
# check POST data
my $frm;
@@ -300,17 +300,17 @@ sub edit {
return if !$self->authCheckCode;
$frm = $self->formValidate(
$self->authCan('usermod') ? (
- { name => 'usrname', template => 'pname', minlength => 2, maxlength => 15 },
- { name => 'rank', enum => [ 1..$#{$self->{user_ranks}} ] },
- { name => 'ign_votes', required => 0, default => 0 },
+ { post => 'usrname', template => 'pname', minlength => 2, maxlength => 15 },
+ { post => 'rank', enum => [ 1..$#{$self->{user_ranks}} ] },
+ { post => 'ign_votes', required => 0, default => 0 },
) : (),
- { name => 'mail', template => 'mail' },
- { name => 'usrpass', required => 0, minlength => 4, maxlength => 64, template => 'asciiprint' },
- { name => 'usrpass2', required => 0, minlength => 4, maxlength => 64, template => 'asciiprint' },
- { name => 'hide_list', required => 0, default => 0, enum => [0,1] },
- { name => 'show_nsfw', required => 0, default => 0, enum => [0,1] },
- { name => 'skin', required => 0, default => '', enum => [ '', keys %{$self->{skins}} ] },
- { name => 'customcss', required => 0, maxlength => 2000, default => '' },
+ { post => 'mail', template => 'mail' },
+ { post => 'usrpass', required => 0, minlength => 4, maxlength => 64, template => 'asciiprint' },
+ { post => 'usrpass2', required => 0, minlength => 4, maxlength => 64, template => 'asciiprint' },
+ { post => 'hide_list', required => 0, default => 0, enum => [0,1] },
+ { post => 'show_nsfw', required => 0, default => 0, enum => [0,1] },
+ { post => 'skin', required => 0, default => '', enum => [ '', keys %{$self->{skins}} ] },
+ { post => 'customcss', required => 0, maxlength => 2000, default => '' },
);
push @{$frm->{_err}}, 'passmatch'
if ($frm->{usrpass} || $frm->{usrpass2}) && (!$frm->{usrpass} || !$frm->{usrpass2} || $frm->{usrpass} ne $frm->{usrpass2});
@@ -338,7 +338,7 @@ sub edit {
# create the page
$self->htmlHeader(title => mt('_usere_title'), noindex => 1);
$self->htmlMainTabs('u', $u, 'edit');
- if($self->reqParam('d')) {
+ if($self->reqGet('d')) {
div class => 'mainbox';
h1 mt '_usere_saved_title';
div class => 'notice';
@@ -379,10 +379,10 @@ sub posts {
# fetch user info (cached if uid == loggedin uid)
my $u = $self->authInfo->{id} && $self->authInfo->{id} == $uid ? $self->authInfo : $self->dbUserGet(uid => $uid, what => 'hide_list')->[0];
- return 404 if !$u->{id};
+ return $self->resNotFound if !$u->{id};
my $f = $self->formValidate(
- { name => 'p', required => 0, default => 1, template => 'int' }
+ { get => 'p', required => 0, default => 1, template => 'int' }
);
my($posts, $np) = $self->dbPostGet(uid => $uid, hide => 1, what => 'thread', page => $f->{p}, sort => 'date', reverse => 1);
@@ -436,7 +436,7 @@ sub delete {
if(!$act) {
my $code = $self->authGetCode("/u$uid/del/o");
my $u = $self->dbUserGet(uid => $uid, what => 'hide_list')->[0];
- return 404 if !$u->{id};
+ return $self->resNotFound if !$u->{id};
$self->htmlHeader(title => 'Delete user', noindex => 1);
$self->htmlMainTabs('u', $u, 'del');
div class => 'mainbox';
@@ -473,12 +473,12 @@ sub list {
my($self, $char) = @_;
my $f = $self->formValidate(
- { name => 's', required => 0, default => 'username', enum => [ qw|username registered votes changes tags| ] },
- { name => 'o', required => 0, default => 'a', enum => [ 'a','d' ] },
- { name => 'p', required => 0, default => 1, template => 'int' },
- { name => 'q', required => 0, default => '', maxlength => 50 },
+ { get => 's', required => 0, default => 'username', enum => [ qw|username registered votes changes tags| ] },
+ { get => 'o', required => 0, default => 'a', enum => [ 'a','d' ] },
+ { get => 'p', required => 0, default => 1, template => 'int' },
+ { get => 'q', required => 0, default => '', maxlength => 50 },
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
$self->htmlHeader(noindex => 1, title => mt '_ulist_title');
@@ -534,7 +534,7 @@ sub list {
td class => 'tc5';
lit !$l->{c_tags} ? 0 : qq|<a href="/g/links?u=$l->{id}">$l->{c_tags}</a>|;
end;
- end;
+ end 'tr';
},
);
$self->htmlFooter;
@@ -548,21 +548,20 @@ sub notifies {
return $self->htmlDenied if !$u->{id} || $uid != $u->{id};
my $f = $self->formValidate(
- { name => 'p', required => 0, default => 1, template => 'int' },
- { name => 'r', required => 0, default => 0, enum => [0,1] },
-
+ { get => 'p', required => 0, default => 1, template => 'int' },
+ { get => 'r', required => 0, default => 0, enum => [0,1] },
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
# changing the notification settings
my $saved;
- if($self->reqMethod() eq 'POST' && $self->reqParam('set')) {
+ if($self->reqMethod() eq 'POST' && $self->reqPost('set')) {
return if !$self->authCheckCode;
my $frm = $self->formValidate(
- { name => 'notify_nodbedit', required => 0, default => 1, enum => [0,1] },
- { name => 'notify_announce', required => 0, default => 0, enum => [0,1] }
+ { post => 'notify_nodbedit', required => 0, default => 1, enum => [0,1] },
+ { post => 'notify_announce', required => 0, default => 0, enum => [0,1] }
);
- return 404 if $frm->{_err};
+ return $self->resNotFound if $frm->{_err};
$self->authPref($_, $frm->{$_}) for ('notify_nodbedit', 'notify_announce');
$saved = 1;
@@ -570,11 +569,11 @@ sub notifies {
} elsif($self->reqMethod() eq 'POST') {
return if !$self->authCheckCode;
my $frm = $self->formValidate(
- { name => 'notifysel', multi => 1, required => 0, template => 'int' },
- { name => 'markread', required => 0 },
- { name => 'remove', required => 0 }
+ { post => 'notifysel', multi => 1, required => 0, template => 'int' },
+ { post => 'markread', required => 0 },
+ { post => 'remove', required => 0 }
);
- return 404 if $frm->{_err};
+ return $self->resNotFound if $frm->{_err};
my @ids = grep $_, @{$frm->{notifysel}};
$self->dbNotifyMarkRead(@ids) if @ids && $frm->{markread};
$self->dbNotifyRemove(@ids) if @ids && $frm->{remove};
@@ -587,6 +586,7 @@ sub notifies {
results => 25,
what => 'titles',
read => $f->{r} == 1 ? undef : 0,
+ reverse => $f->{r} == 1,
);
$self->htmlHeader(title => mt('_usern_title'), noindex => 1);
@@ -634,7 +634,7 @@ sub notifies {
: 'item_edit'),
sprintf('<i>%s</i>', xml_escape $l->{c_title}), sprintf('<i>%s</i>', xml_escape $l->{username});
end;
- end;
+ end 'tr';
},
footer => sub {
Tr;
@@ -664,7 +664,7 @@ sub notifies {
input type => 'submit', name => 'set', value => mt '_usern_set_submit';
end;
end;
- end;
+ end 'form';
$self->htmlFooter;
}
@@ -673,7 +673,7 @@ sub readnotify {
my($self, $uid, $nid) = @_;
return $self->htmlDenied if !$self->authInfo->{id} || $uid != $self->authInfo->{id};
my $n = $self->dbNotifyGet(uid => $uid, id => $nid)->[0];
- return 404 if !$n->{iid};
+ return $self->resNotFound if !$n->{iid};
$self->dbNotifyMarkRead($n->{id}) if !$n->{read};
# NOTE: for t+.+ IDs, this will create a double redirect, which is rather awkward...
$self->resRedirect("/$n->{ltype}$n->{iid}".($n->{subid}?".$n->{subid}":''), 'perm');
diff --git a/lib/VNDB/Handler/VNBrowse.pm b/lib/VNDB/Handler/VNBrowse.pm
index 8a63b79b..97dc4e69 100644
--- a/lib/VNDB/Handler/VNBrowse.pm
+++ b/lib/VNDB/Handler/VNBrowse.pm
@@ -3,11 +3,11 @@ package VNDB::Handler::VNBrowse;
use strict;
use warnings;
-use YAWF ':html';
+use TUWF ':html', 'uri_escape';
use VNDB::Func;
-YAWF::register(
+TUWF::register(
qr{v/([a-z0]|all)} => \&list,
);
@@ -16,16 +16,16 @@ sub list {
my($self, $char) = @_;
my $f = $self->formValidate(
- { name => 's', required => 0, default => 'tagscore', enum => [ qw|title rel pop tagscore rating| ] },
- { name => 'o', required => 0, enum => [ 'a','d' ] },
- { name => 'p', required => 0, default => 1, template => 'int' },
- { name => 'q', required => 0, default => '' },
- { name => 'sq', required => 0, default => '' },
- { name => 'fil',required => 0, default => '' },
+ { get => 's', required => 0, default => 'tagscore', enum => [ qw|title rel pop tagscore rating| ] },
+ { get => 'o', required => 0, enum => [ 'a','d' ] },
+ { get => 'p', required => 0, default => 1, template => 'int' },
+ { get => 'q', required => 0, default => '' },
+ { get => 'sq', required => 0, default => '' },
+ { get => 'fil',required => 0 },
);
- return 404 if $f->{_err};
+ return $self->resNotFound if $f->{_err};
$f->{q} ||= $f->{sq};
- $f->{fil} = $self->authPref('filter_vn') if !grep $_ eq 'fil', $self->reqParam();
+ $f->{fil} //= $self->authPref('filter_vn');
my %compat = _fil_compat($self);
return $self->resRedirect('/'.$1.$2.(!$3 ? '' : $1 eq 'd' ? '#'.$3 : '.'.$3), 'temp')
@@ -60,11 +60,11 @@ sub list {
end;
a id => 'filselect', href => '#v';
- lit '<i>&#9656;</i> '.mt('_rbrowse_filters').'<i></i>'; # TODO: it's not *r*browse
+ lit '<i>&#9656;</i> '.mt('_js_fil_filters').'<i></i>';
end;
input type => 'hidden', class => 'hidden', name => 'fil', id => 'fil', value => $f->{fil};
end;
- end; # /form
+ end 'form';
$self->htmlBrowseVN($list, $f, $np, "/v/$char?q=$quri;fil=$f->{fil}", $f->{fil} =~ /tag_inc-/);
$self->htmlFooter(prefs => ['filter_vn']);
@@ -75,9 +75,9 @@ sub _fil_compat {
my $self = shift;
my %c;
my $f = $self->formValidate(
- { name => 'ln', required => 0, multi => 1, enum => $self->{languages}, default => '' },
- { name => 'pl', required => 0, multi => 1, enum => $self->{platforms}, default => '' },
- { name => 'sp', required => 0, default => $self->reqCookie($self->{cookie_prefix}.'tagspoil') =~ /^([0-2])$/ ? $1 : 0, enum => [0..2] },
+ { get => 'ln', required => 0, multi => 1, enum => $self->{languages}, default => '' },
+ { get => 'pl', required => 0, multi => 1, enum => $self->{platforms}, default => '' },
+ { get => 'sp', required => 0, default => $self->reqCookie('tagspoil') =~ /^([0-2])$/ ? $1 : 0, enum => [0..2] },
);
return () if $f->{_err};
$c{lang} //= $f->{ln} if $f->{ln}[0];
diff --git a/lib/VNDB/Handler/VNEdit.pm b/lib/VNDB/Handler/VNEdit.pm
index b93c544d..82f7e169 100644
--- a/lib/VNDB/Handler/VNEdit.pm
+++ b/lib/VNDB/Handler/VNEdit.pm
@@ -3,11 +3,11 @@ package VNDB::Handler::VNEdit;
use strict;
use warnings;
-use YAWF ':html', ':xml';
+use TUWF ':html', ':xml';
use VNDB::Func;
-YAWF::register(
+TUWF::register(
qr{v(?:([1-9]\d*)(?:\.([1-9]\d*))?/edit|/new)}
=> \&edit,
qr{xml/vn\.xml} => \&vnxml,
@@ -19,7 +19,7 @@ sub edit {
my($self, $vid, $rev) = @_;
my $v = $vid && $self->dbVNGet(id => $vid, what => 'extended screenshots relations anime changes', $rev ? (rev => $rev) : ())->[0];
- return 404 if $vid && !$v->{id};
+ return $self->resNotFound if $vid && !$v->{id};
$rev = undef if !$vid || $v->{cid} == $v->{latest};
return $self->htmlDenied if !$self->authCan('edit')
@@ -38,23 +38,23 @@ sub edit {
if($self->reqMethod eq 'POST') {
return if !$self->authCheckCode;
$frm = $self->formValidate(
- { name => 'title', maxlength => 250 },
- { name => 'original', required => 0, maxlength => 250, default => '' },
- { name => 'alias', required => 0, maxlength => 500, default => '' },
- { name => 'desc', required => 0, default => '', maxlength => 10240 },
- { name => 'length', required => 0, default => 0, enum => $self->{vn_lengths} },
- { name => 'l_wp', required => 0, default => '', maxlength => 150 },
- { name => 'l_encubed', required => 0, default => '', maxlength => 100 },
- { name => 'l_renai', required => 0, default => '', maxlength => 100 },
- { name => 'l_vnn', required => 0, default => $b4{l_vnn}||0, template => 'int' },
- { name => 'anime', required => 0, default => '' },
- { name => 'previmage', required => 0, default => 0, template => 'int' },
- { name => 'img_nsfw', required => 0, default => 0 },
- { name => 'vnrelations', required => 0, default => '', maxlength => 5000 },
- { name => 'screenshots', required => 0, default => '', maxlength => 1000 },
- { name => 'editsum', required => 0, maxlength => 5000 },
- { name => 'ihid', required => 0 },
- { name => 'ilock', required => 0 },
+ { post => 'title', maxlength => 250 },
+ { post => 'original', required => 0, maxlength => 250, default => '' },
+ { post => 'alias', required => 0, maxlength => 500, default => '' },
+ { post => 'desc', required => 0, default => '', maxlength => 10240 },
+ { post => 'length', required => 0, default => 0, enum => $self->{vn_lengths} },
+ { post => 'l_wp', required => 0, default => '', maxlength => 150 },
+ { post => 'l_encubed', required => 0, default => '', maxlength => 100 },
+ { post => 'l_renai', required => 0, default => '', maxlength => 100 },
+ { post => 'l_vnn', required => 0, default => $b4{l_vnn}||0, template => 'int' },
+ { post => 'anime', required => 0, default => '' },
+ { post => 'previmage', required => 0, default => 0, template => 'int' },
+ { post => 'img_nsfw', required => 0, default => 0 },
+ { post => 'vnrelations', required => 0, default => '', maxlength => 5000 },
+ { post => 'screenshots', required => 0, default => '', maxlength => 1000 },
+ { post => 'editsum', required => 0, maxlength => 5000 },
+ { post => 'ihid', required => 0 },
+ { post => 'ilock', required => 0 },
);
push @{$frm->{_err}}, 'badeditsum' if !$frm->{editsum} || lc($frm->{editsum}) eq lc($frm->{desc});
@@ -86,7 +86,7 @@ sub edit {
# nothing changed? just redirect
return $self->resRedirect("/v$vid", 'post')
- if $vid && !$self->reqUploadFileName('img') && $image == $v->{image}
+ if $vid && !$self->reqPost('img') && $image == $v->{image}
&& !grep $frm->{$_} ne $b4{$_}, keys %b4;
# perform the edit/add
@@ -123,31 +123,19 @@ sub edit {
sub _uploadimage {
my($self, $v, $frm) = @_;
- return $v ? $frm->{previmage} : 0 if $frm->{_err} || !$self->reqUploadFileName('img');
+ return $v ? $frm->{previmage} : 0 if $frm->{_err} || !$self->reqPost('img');
- # save to temporary location
- my $tmp = sprintf '%s/static/cv/00/tmp.%d.jpg', $VNDB::ROOT, $$*int(rand(1000)+1);
- $self->reqSaveUpload('img', $tmp);
+ # perform some elementary checks
+ my $imgdata = $self->reqUploadRaw('img');
+ $frm->{_err} = [ 'noimage' ] if $imgdata !~ /^(\xff\xd8|\x89\x50)/; # JPG or PNG headers
+ $frm->{_err} = [ 'toolarge' ] if length($imgdata) > 512*1024;
+ return undef if $frm->{_err};
- # perform some checks
- my $l;
- open(my $T, '<:raw:bytes', $tmp) || die $1;
- read $T, $l, 2;
- close($T);
-
- $frm->{_err} = [ 'noimage' ] if $l ne pack('H*', 'ffd8') && $l ne pack('H*', '8950');
- $frm->{_err} = [ 'toolarge' ] if -s $tmp > 512*1024;
-
- if($frm->{_err}) {
- unlink $tmp;
- return undef;
- }
-
- # get image ID and move it to the correct location
+ # get image ID and save it, to be processed by Multi
my $imgid = $self->dbVNImageId;
- my $new = sprintf '%s/static/cv/%02d/%d.jpg', $VNDB::ROOT, $imgid%100, $imgid;
- rename $tmp, $new or die $!;
- chmod 0666, $new;
+ my $fn = sprintf '%s/static/cv/%02d/%d.jpg', $VNDB::ROOT, $imgid%100, $imgid;
+ $self->reqSaveUpload('img', $fn);
+ chmod 0666, $fn;
return -1*$imgid;
}
@@ -187,14 +175,15 @@ sub _form {
h2 mt '_vnedit_image_upload';
input type => 'file', class => 'text', name => 'img', id => 'img';
- p mt('_vnedit_image_upload_msg')."\n\n\n";
+ p mt('_vnedit_image_upload_msg');
+ br; br; br;
h2 mt '_vnedit_image_nsfw';
input type => 'checkbox', class => 'checkbox', id => 'img_nsfw', name => 'img_nsfw',
$frm->{img_nsfw} ? (checked => 'checked') : ();
label class => 'checkbox', for => 'img_nsfw', mt '_vnedit_image_nsfw_check';
p mt '_vnedit_image_nsfw_msg';
- end;
+ end 'div';
}],
],
@@ -229,7 +218,7 @@ sub _form {
a href => '#', mt '_vnedit_rel_addbut';
end;
end;
- end;
+ end 'table';
}],
],
@@ -292,8 +281,8 @@ sub _updreverse {
sub vnxml {
my $self = shift;
- my $q = $self->formValidate({ name => 'q', maxlength => 500 });
- return 404 if $q->{_err};
+ my $q = $self->formValidate({ get => 'q', maxlength => 500 });
+ return $self->resNotFound if $q->{_err};
$q = $q->{q};
my($list, $np) = $self->dbVNGet(
@@ -321,9 +310,9 @@ sub scrxml {
# fetch information about screenshots
if($self->reqMethod ne 'POST') {
my $ids = $self->formValidate(
- { name => 'id', required => 1, template => 'int', multi => 1 }
+ { get => 'id', required => 1, template => 'int', multi => 1 }
);
- return 404 if $ids->{_err};
+ return $self->resNotFound if $ids->{_err};
my $r = $self->dbScreenshotGet($ids->{id});
xml;
@@ -334,28 +323,22 @@ sub scrxml {
}
# upload new screenshot
- my $num = $self->formValidate({name => 'upload', template => 'int'});
- return 404 if $num->{_err};
- my $tmp = sprintf '%s/static/sf/00/tmp.%d.jpg', $VNDB::ROOT, $$*int(rand(1000)+1);
- $self->reqSaveUpload("scr_upl_file_$num->{upload}", $tmp);
+ my $num = $self->formValidate({get => 'upload', template => 'int'});
+ return $self->resNotFound if $num->{_err};
+ my $param = "scr_upl_file_$num->{upload}";
+ # check for simple errors
my $id = 0;
- $id = -2 if !-s $tmp;
- if(!$id) {
- my $l;
- open(my $T, '<:raw:bytes', $tmp) || die $1;
- read $T, $l, 2;
- close($T);
- $id = -1 if $l ne pack('H*', 'ffd8') && $l ne pack('H*', '8950');
- }
+ my $imgdata = $self->reqUploadRaw($param);
+ $id = -2 if !$imgdata;
+ $id = -1 if !$id && $imgdata !~ /^(\xff\xd8|\x89\x50)/; # JPG or PNG headers
- if($id) {
- unlink $tmp;
- } else {
+ # no error? save and let Multi process it
+ if(!$id) {
$id = $self->dbScreenshotAdd;
- my $new = sprintf '%s/static/sf/%02d/%d.jpg', $VNDB::ROOT, $id%100, $id;
- rename $tmp, $new or die $!;
- chmod 0666, $new;
+ my $fn = sprintf '%s/static/sf/%02d/%d.jpg', $VNDB::ROOT, $id%100, $id;
+ $self->reqSaveUpload($param, $fn);
+ chmod 0666, $fn;
}
xml;
diff --git a/lib/VNDB/Handler/VNPage.pm b/lib/VNDB/Handler/VNPage.pm
index 5e024424..ee121c9b 100644
--- a/lib/VNDB/Handler/VNPage.pm
+++ b/lib/VNDB/Handler/VNPage.pm
@@ -3,11 +3,11 @@ package VNDB::Handler::VNPage;
use strict;
use warnings;
-use YAWF ':html', 'xml_escape';
+use TUWF ':html', 'xml_escape';
use VNDB::Func;
-YAWF::register(
+TUWF::register(
qr{v/rand} => \&rand,
qr{v([1-9]\d*)/rg} => \&rg,
qr{v([1-9]\d*)(?:\.([1-9]\d*))?} => \&page,
@@ -24,7 +24,7 @@ sub rg {
my($self, $vid) = @_;
my $v = $self->dbVNGet(id => $vid, what => 'relgraph')->[0];
- return 404 if !$v->{id} || !$v->{rgraph};
+ return $self->resNotFound if !$v->{id} || !$v->{rgraph};
my $title = mt '_vnrg_title', $v->{title};
return if $self->htmlRGHeader($title, 'v', $v);
@@ -50,7 +50,7 @@ sub page {
what => 'extended anime relations screenshots rating ranking'.($rev ? ' changes' : ''),
$rev ? (rev => $rev) : (),
)->[0];
- return 404 if !$v->{id};
+ return $self->resNotFound if !$v->{id};
my $r = $self->dbReleaseGet(vid => $vid, what => 'producers platforms');
@@ -80,13 +80,15 @@ sub page {
end;
if($v->{img_nsfw}) {
p id => 'nsfw_show', $self->authPref('show_nsfw') ? (style => 'display: none') : ();
- txt mt('_vnpage_imgnsfw_msg')."\n\n";
+ txt mt('_vnpage_imgnsfw_msg');
+ br; br;
a href => '#', mt '_vnpage_imgnsfw_show';
- txt "\n\n".mt '_vnpage_imgnsfw_note';
+ br; br;
+ txt mt '_vnpage_imgnsfw_note';
end;
}
}
- end;
+ end 'div'; # /vnimg
# general info
table;
@@ -145,8 +147,8 @@ sub page {
end;
end;
- end;
- end;
+ end 'table';
+ end 'div';
clearfloat;
# tags
@@ -170,7 +172,7 @@ sub page {
}
end;
}
- end;
+ end 'div'; # /mainbox
_releases($self, $v, $r);
_stats($self, $v);
@@ -268,10 +270,10 @@ sub _producers {
a href => "/p$_->{id}", title => $_->{original}||$_->{name}, shorten $_->{name}, 30;
txt ' & ' if $_ != $p[$#p];
}
- txt "\n";
+ br;
}
end;
- end;
+ end 'tr';
}
}
@@ -300,7 +302,7 @@ sub _relations {
}
end;
end;
- end;
+ end 'tr';
}
@@ -331,11 +333,11 @@ sub _anime {
end;
acronym title => $_->{title_kanji}||$_->{title_romaji}, shorten $_->{title_romaji}, 50;
b ' ('.(defined $_->{type} ? mt("_animetype_$_->{type}").', ' : '').$_->{year}.')';
- txt "\n";
+ br;
}
}
end;
- end;
+ end 'tr';
}
@@ -379,7 +381,7 @@ sub _useroptions {
end;
}
end;
- end;
+ end 'tr';
}
@@ -446,11 +448,11 @@ sub _releases {
txt ' ';
}
end;
- end;
+ end 'tr';
}
}
- end;
- end;
+ end 'table';
+ end 'div';
}
@@ -489,7 +491,7 @@ sub _screenshots {
}
end;
}
- end;
+ end 'div';
}
diff --git a/lib/VNDB/L10N.pm b/lib/VNDB/L10N.pm
index b857852d..ee9db838 100644
--- a/lib/VNDB/L10N.pm
+++ b/lib/VNDB/L10N.pm
@@ -49,7 +49,7 @@ use warnings;
package VNDB::L10N::en;
use base 'VNDB::L10N';
use POSIX 'strftime';
- use YAWF 'xml_escape';
+ use TUWF::XML 'xml_escape';
our %Lexicon;
sub quant {
diff --git a/lib/VNDB/Plugin/TransAdmin.pm b/lib/VNDB/Plugin/TransAdmin.pm
index fa8e98ef..19ce336e 100644
--- a/lib/VNDB/Plugin/TransAdmin.pm
+++ b/lib/VNDB/Plugin/TransAdmin.pm
@@ -1,9 +1,9 @@
# This plugin provides a quick and dirty user interface to editing lang.txt,
# to use it, add the following to your data/config.pl:
#
-# if($INC{"YAWF.pm"}) {
-# require VNDB::Plugin::TransAdmin;
-# $VNDB::S{transadmin} = {
+# if($TUWF::OBJ) {
+# TUWF::load('VNDB::Plugin::TransAdmin');
+# $TUWF::OBJ->{transadmin} = {
# <userid> => 'all' || <language> || <arrayref with languages>
# };
# }
@@ -16,7 +16,7 @@ package VNDB::Plugin::TransAdmin;
use strict;
use warnings;
-use YAWF ':html';
+use TUWF ':html', 'uri_escape';
use LangFile;
use VNDB::Func;
@@ -24,7 +24,7 @@ use VNDB::Func;
my $langfile = "$VNDB::ROOT/data/lang.txt";
-YAWF::register(
+TUWF::register(
qr{tladmin(?:/([a-z]+))?} => \&tladmin
);
@@ -41,9 +41,9 @@ sub tladmin {
$lang ||= '';
my $intro = $lang =~ s/intro//;
- return 404 if $lang && ($lang eq 'en' || !grep $_ eq $lang, $self->{l10n}->languages);
- my $sect = $self->reqParam('sect')||'';
- my $doc = $self->reqParam('doc')||'';
+ return $self->resNotFound if $lang && ($lang eq 'en' || !grep $_ eq $lang, $self->{l10n}->languages);
+ my $sect = $self->reqGet('sect')||'';
+ my $doc = $self->reqGet('doc')||'';
my $uid = $self->authInfo->{id};
return $self->htmlDenied if !$uid || !$self->{transadmin}{$uid};
@@ -93,14 +93,14 @@ sub _savelang {
push @read, $_ while (local $_ = $f->read);
$f->close;
- my @keys = $self->reqParam;
+ my @keys = $self->reqPost;
$f = LangFile->new(write => $langfile);
my $key;
for my $l (@read) {
$key = $l->[1] if $l->[0] eq 'key';
if($l->[0] eq 'tl' && $l->[1] eq $lang && grep $key eq $_, @keys) {
- $l->[2] = !$self->reqParam("check$key");
- $l->[3] = $self->reqParam($key);
+ $l->[2] = !$self->reqPost("check$key");
+ $l->[3] = $self->reqPost($key);
$l->[3] =~ s/\r?\n/\n/g;
$l->[3] =~ s/\s+$//g;
}
@@ -224,12 +224,7 @@ sub _section {
end;
div style => 'float: left';
if($multi) {
- $tl =~ s/&/&amp;/g;
- $tl =~ s/</&lt;/g;
- $tl =~ s/>/&gt;/g;
- textarea name => $key, id => $key, rows => $multi+2, style => 'width: 700px; height: auto; white-space: nowrap; border: none', wrap => 'off';
- lit $tl;
- end;
+ textarea name => $key, id => $key, rows => $multi+2, style => 'width: 700px; height: auto; white-space: nowrap; border: none', wrap => 'off', $tl;
} else {
input type => 'text', class => 'text', name => $key, id => $key, value => $tl, style => 'width: 700px; border: none';
}
@@ -256,7 +251,7 @@ sub _savedoc {
my $en = join '', <$f>;
close $f;
- my $tl = $self->reqParam('tl');
+ my $tl = $self->reqPost('tl');
$tl =~ s/\r?\n/\n/g;
return -e $file && unlink $file if $tl eq $en;
@@ -298,10 +293,6 @@ sub _doc {
$tl = join '', <$f>;
close $f;
}
- $tl =~ s/&/&amp;/g;
- $tl =~ s/</&lt;/g;
- $tl =~ s/>/&gt;/g;
-
form action => "/tladmin/$lang?doc=$doc", method => 'POST', 'accept-charset' => 'utf-8';
div class => 'mainbox';
@@ -320,9 +311,7 @@ sub _doc {
pre style => 'font: 12px Tahoma; border: none; background: none; margin: 0', $en;
end;
textarea name => 'tl', id => 'tl', rows => ($en =~ y/\n//),
- style => 'border: none; float: left; width: 49%; white-space: nowrap', wrap => 'off';
- lit $tl;
- end;
+ style => 'border: none; float: left; width: 49%; white-space: nowrap', wrap => 'off', $tl;
clearfloat;
if(_allowed($self, $lang)) {
br;
diff --git a/lib/VNDB/Util/Auth.pm b/lib/VNDB/Util/Auth.pm
index 9ad76894..88e68edc 100644
--- a/lib/VNDB/Util/Auth.pm
+++ b/lib/VNDB/Util/Auth.pm
@@ -10,7 +10,7 @@ use Digest::SHA qw|sha1_hex sha256_hex|;
use Time::HiRes;
use Encode 'encode_utf8';
use POSIX 'strftime';
-use YAWF ':html';
+use TUWF ':html';
use VNDB::Func;
@@ -22,15 +22,15 @@ sub authInit {
my $self = shift;
$self->{_auth} = undef;
- my $cookie = $self->reqCookie($self->{cookie_prefix}.'auth');
+ my $cookie = $self->reqCookie('auth');
return 0 if !$cookie;
- return _rmcookie($self) if length($cookie) < 41;
+ return $self->resCookie(auth => undef) if length($cookie) < 41;
my $token = substr($cookie, 0, 40);
my $uid = substr($cookie, 40);
$self->{_auth} = $uid =~ /^\d+$/ && $self->dbUserGet(uid => $uid, session => $token, what => 'extended notifycount prefs')->[0];
# update the sessions.lastused column if lastused < now()'6 hours'
$self->dbSessionUpdateLastUsed($uid, $token) if $self->{_auth} && $self->{_auth}{session_lastused} < time()-6*3600;
- return _rmcookie($self) if !$self->{_auth};
+ return $self->resCookie(auth => undef) if !$self->{_auth};
}
@@ -47,9 +47,8 @@ sub authLogin {
my $cookie = $token . $self->{_auth}{id};
$self->dbSessionAdd($self->{_auth}{id}, $token);
- my $expstr = strftime("%a, %d %b %Y %H:%M:%S GMT", gmtime(time + 31536000)); # keep the cookie for 1 year
$self->resRedirect($to, 'post');
- $self->resHeader('Set-Cookie', "$self->{cookie_prefix}auth=$cookie; expires=$expstr; path=/; domain=$self->{cookie_domain}");
+ $self->resCookie(auth => $cookie, expires => time + 31536000); # keep the cookie for 1 year
return 1;
}
@@ -61,7 +60,7 @@ sub authLogin {
sub authLogout {
my $self = shift;
- my $cookie = $self->reqCookie($self->{cookie_prefix}.'auth');
+ my $cookie = $self->reqCookie('auth');
if ($cookie && length($cookie) >= 41) {
my $token = substr($cookie, 0, 40);
my $uid = substr($cookie, 40);
@@ -69,11 +68,11 @@ sub authLogout {
}
$self->resRedirect('/', 'temp');
- _rmcookie($self);
+ $self->resCookie(auth => undef);
# set l10n cookie if the user has a preferred language set
my $l10n = $self->authPref('l10n');
- $self->resHeader('Set-Cookie', "l10n=$l10n; expires=Sat, 01-Jan-2030 00:00:00 GMT; path=/; domain=$self->{cookie_domain}") if $l10n;
+ $self->resCookie(l10n => $l10n, expires => time()+31536000) if $l10n; # keep 1 year
}
@@ -141,13 +140,6 @@ sub authPreparePass{
}
-# removes the vndb_auth cookie
-sub _rmcookie {
- $_[0]->resHeader('Set-Cookie',
- "$_[0]->{cookie_prefix}auth= ; expires=Sat, 01-Jan-2000 00:00:00 GMT; path=/; domain=$_[0]->{cookie_domain}");
-}
-
-
# Generate a code to be used later on to validate that the form was indeed
# submitted from our site and by the same user/visitor. Not limited to
# logged-in users.
diff --git a/lib/VNDB/Util/BrowseHTML.pm b/lib/VNDB/Util/BrowseHTML.pm
index 62e01fd1..6d6cdeda 100644
--- a/lib/VNDB/Util/BrowseHTML.pm
+++ b/lib/VNDB/Util/BrowseHTML.pm
@@ -3,7 +3,7 @@ package VNDB::Util::BrowseHTML;
use strict;
use warnings;
-use YAWF ':html', 'xml_escape';
+use TUWF ':html', 'xml_escape';
use Exporter 'import';
use VNDB::Func;
use POSIX 'ceil';
@@ -62,7 +62,7 @@ sub htmlBrowse {
}
}
end;
- end;
+ end 'thead';
# footer
if($opt{footer}) {
@@ -75,8 +75,8 @@ sub htmlBrowse {
$opt{row}->($self, $_+1, $opt{items}[$_])
for 0..$#{$opt{items}};
- end;
- end;
+ end 'table';
+ end 'div';
# bottom navigation
$self->htmlBrowseNavigate($opt{pageurl}, $opt{options}{p}, $opt{nextpage}, 'b');
@@ -117,7 +117,7 @@ sub htmlBrowseNavigate {
$l > $nc+1 and $ell->(0);
$l > $_ and $tab->(0, $p+$_, $p+$_) for (reverse 2..($nc>$l-2?$l-2:$nc-1));
$l > 1 and $tab->(0, $p+1, mt('_browse_next').' &rsaquo;');
- end;
+ end 'ul';
}
@@ -154,7 +154,7 @@ sub htmlBrowseHist {
a href => $revurl, title => $i->{ioriginal}, shorten $i->{ititle}, 80;
b class => 'grayedout'; lit bb2html $i->{comments}, 150; end;
end;
- end;
+ end 'tr';
},
);
}
@@ -205,7 +205,7 @@ sub htmlBrowseVN {
txt sprintf '%.2f', $l->{c_rating}||0;
b class => 'grayedout', sprintf ' (%d)', $l->{c_votecount};
end;
- end;
+ end 'tr';
},
);
}
diff --git a/lib/VNDB/Util/CommonHTML.pm b/lib/VNDB/Util/CommonHTML.pm
index a412949a..1872c083 100644
--- a/lib/VNDB/Util/CommonHTML.pm
+++ b/lib/VNDB/Util/CommonHTML.pm
@@ -3,7 +3,7 @@ package VNDB::Util::CommonHTML;
use strict;
use warnings;
-use YAWF ':html', 'xml_escape';
+use TUWF ':html', 'xml_escape', 'html_escape';
use Exporter 'import';
use Algorithm::Diff::Fast 'compact_diff';
use VNDB::Func;
@@ -95,7 +95,7 @@ sub htmlMainTabs {
li !$sel ? (class => 'tabselected') : ();
a href => "/$id", $id;
end;
- end;
+ end 'ul';
}
@@ -114,7 +114,7 @@ sub htmlDenied {
p mt '_denied_noaccess_msg';
}
end;
- end;
+ end 'div';
$self->htmlFooter;
}
@@ -140,7 +140,7 @@ sub htmlHiddenMessage {
lit bb2html $editsum;
end;
end;
- end;
+ end 'div';
return $self->htmlFooter() || 1 if !$self->authCan('del');
return 0;
}
@@ -205,9 +205,9 @@ sub htmlRevision {
[ ilock => serialize => sub { mt $_[0] ? '_revision_yes' : '_revision_no' } ],
@fields
);
- end;
+ end 'table';
}
- end;
+ end 'div';
}
sub revheader { # type, obj
@@ -233,8 +233,8 @@ sub revdiff {
if($o{diff} && $ser1 && $ser2) {
my $sep = ref $o{diff} ? qr/($o{diff})/ : qr//;
- my @ser1 = $o{split} ? $o{split}->($ser1) : map xml_escape($_), split $sep, $ser1;
- my @ser2 = $o{split} ? $o{split}->($ser2) : map xml_escape($_), split $sep, $ser2;
+ my @ser1 = $o{split} ? $o{split}->($ser1) : map html_escape($_), split $sep, $ser1;
+ my @ser2 = $o{split} ? $o{split}->($ser2) : map html_escape($_), split $sep, $ser2;
return if $o{split} && $#ser1 == $#ser2 && !grep $ser1[$_] ne $ser2[$_], 0..$#ser1;
$ser1 = $ser2 = '';
@@ -247,8 +247,8 @@ sub revdiff {
$ser2 .= ($ser2?$o{join}:'').($i % 2 ? qq|<b class="diff_add">$b</b>| : $b) if $b ne '';
}
} elsif(!$o{htmlize}) {
- $ser1 = xml_escape $ser1;
- $ser2 = xml_escape $ser2;
+ $ser1 = html_escape $ser1;
+ $ser2 = html_escape $ser2;
}
$ser1 = mt '_revision_empty' if !$ser1 && $ser1 ne '0';
@@ -297,7 +297,7 @@ sub htmlEditMessage {
p mt '_editmsg_revert_msg', $num;
end;
}
- end;
+ end 'div';
}
@@ -347,7 +347,7 @@ sub htmlVoteStats {
end;
end;
}
- end;
+ end 'table';
my $recent = $self->dbVoteGet(
$type.'id' => $obj->{id},
@@ -381,7 +381,7 @@ sub htmlVoteStats {
td $self->{l10n}->date($recent->[$_]{date});
end;
}
- end;
+ end 'table';
}
clearfloat;
@@ -392,7 +392,7 @@ sub htmlVoteStats {
p mt '_votestats_rank_rat', $obj->{r_ranking}, sprintf '%.2f', $obj->{c_rating};
end;
}
- end;
+ end 'div';
}
@@ -409,7 +409,7 @@ sub htmlSearchBox {
end;
input type => 'text', name => 'q', id => 'q', class => 'text', value => $v;
input type => 'submit', class => 'submit', value => mt '_searchbox_submit';
- end;
+ end 'fieldset';
}
@@ -430,21 +430,7 @@ sub htmlRGHeader {
return 1;
}
$self->resHeader('Content-Type' => 'application/xhtml+xml; charset=UTF-8');
-
- # This is a REALLY ugly hack, need find a proper solution in YAWF
- no warnings 'redefine';
- my $sub = \&YAWF::XML::html;
- *YAWF::XML::html = sub () {
- lit q|<!DOCTYPE html PUBLIC
- "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
- "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">|;
- tag 'html',
- xmlns => "http://www.w3.org/1999/xhtml",
- 'xmlns:svg' => 'http://www.w3.org/2000/svg',
- 'xmlns:xlink' => 'http://www.w3.org/1999/xlink';
- };
- $self->htmlHeader(title => $title);
- *YAWF::XML::html = $sub;
+ $self->htmlHeader(title => $title, svg => 1);
$self->htmlMainTabs($type, $obj, 'rg');
return 0;
}
diff --git a/lib/VNDB/Util/FormHTML.pm b/lib/VNDB/Util/FormHTML.pm
index 41ee0ccc..68b6a101 100644
--- a/lib/VNDB/Util/FormHTML.pm
+++ b/lib/VNDB/Util/FormHTML.pm
@@ -3,7 +3,7 @@ package VNDB::Util::FormHTML;
use strict;
use warnings;
-use YAWF ':html';
+use TUWF ':html';
use Exporter 'import';
use POSIX 'strftime';
use VNDB::Func;
@@ -41,7 +41,7 @@ sub htmlFormError {
li mt "_formerr_tpl_$rule", $field if $type eq 'template';
}
end;
- end;
+ end 'div';
end if $mainbox;
}
@@ -152,15 +152,10 @@ sub htmlFormPart {
input type => 'hidden', id => $o{short}, name => $o{short}, value => $frm->{$o{short}}||'', class => 'dateinput';
}
if(/text/) {
- (my $txt = $frm->{$o{short}}||'') =~ s/&/&amp;/;
- $txt =~ s/</&lt;/;
- $txt =~ s/>/&gt;/;
- textarea name => $o{short}, id => $o{short}, rows => $o{rows}||5, cols => $o{cols}||60;
- lit $txt;
- end;
+ textarea name => $o{short}, id => $o{short}, rows => $o{rows}||5, cols => $o{cols}||60, $frm->{$o{short}}||'';
}
end;
- end;
+ end 'tr';
}
@@ -195,7 +190,7 @@ sub htmlForm {
li class => 'left';
a href => '#all', id => 'jt_sel_all', mt '_form_tab_all';
end;
- end;
+ end 'ul';
}
# form subs
@@ -210,7 +205,7 @@ sub htmlForm {
$self->htmlFormPart($options->{frm}, $_) for @$parts;
end;
end;
- end;
+ end 'div';
}
# db mod / edit summary / submit button
@@ -227,27 +222,24 @@ sub htmlForm {
input type => 'checkbox', name => 'ilock', id => 'ilock', value => 1, $options->{frm}{ilock} ? (checked => 'checked') : ();
label for => 'ilock', mt '_form_ilock';
}
- txt "\n".mt('_form_hidlock_note')."\n" if $self->authCan('lock') || $self->authCan('del');
+ if($self->authCan('lock') || $self->authCan('del')) {
+ br; txt mt('_form_hidlock_note'); br;
+ }
# edit summary
- (my $txt = $options->{frm}{editsum}||'') =~ s/&/&amp;/;
- $txt =~ s/</&lt;/;
- $txt =~ s/>/&gt;/;
h2;
txt mt '_form_editsum';
b class => 'standout', ' ('.mt('_inenglish').')';
end;
- textarea name => 'editsum', id => 'editsum', rows => 4, cols => 50;
- lit $txt;
- end;
+ textarea name => 'editsum', id => 'editsum', rows => 4, cols => 50, $options->{frm}{editsum}||'';
br;
}
input type => 'submit', value => mt('_form_submit'), class => 'submit';
end;
- end;
+ end 'div';
}
- end;
+ end 'form';
}
diff --git a/lib/VNDB/Util/LayoutHTML.pm b/lib/VNDB/Util/LayoutHTML.pm
index cc34b874..7c03b6a3 100644
--- a/lib/VNDB/Util/LayoutHTML.pm
+++ b/lib/VNDB/Util/LayoutHTML.pm
@@ -3,20 +3,24 @@ package VNDB::Util::LayoutHTML;
use strict;
use warnings;
-use YAWF ':html';
+use TUWF ':html';
use Exporter 'import';
use VNDB::Func;
our @EXPORT = qw|htmlHeader htmlFooter|;
-sub htmlHeader { # %options->{ title, noindex, search, feeds }
+sub htmlHeader { # %options->{ title, noindex, search, feeds, svg }
my($self, %o) = @_;
- my $skin = $self->reqParam('skin') || $self->authPref('skin') || $self->{skin_default};
+ my $skin = $self->reqGet('skin') || $self->authPref('skin') || $self->{skin_default};
$skin = $self->{skin_default} if !$self->{skins}{$skin} || !-d "$VNDB::ROOT/static/s/$skin";
# heading
- html;
+ html lang => $self->{l10n}->language_tag(), $o{svg} ? (
+ doctype => 'xhtml-math-svg',
+ 'xmlns:svg' => 'http://www.w3.org/2000/svg',
+ 'xmlns:xlink' => 'http://www.w3.org/1999/xlink'
+ ) : ();
head;
title $o{title};
Link rel => 'shortcut icon', href => '/favicon.ico', type => 'image/x-icon';
@@ -75,7 +79,7 @@ sub _menu {
input type => 'submit', class => 'submit', value => 'Search';
end;
end;
- end;
+ end 'div'; # /menubox
div class => 'menubox';
if($self->authInfo->{id}) {
@@ -117,7 +121,7 @@ sub _menu {
end;
end;
}
- end;
+ end 'div'; # /menubox
div class => 'menubox';
h2 mt '_menu_dbstats';
@@ -131,7 +135,7 @@ sub _menu {
clearfloat;
end;
end;
- end;
+ end 'div'; # /menulist
}
@@ -143,7 +147,8 @@ sub htmlFooter { # %options => { prefs => [pref1,..] }
if($q && $q->{vid}) {
lit '"';
a href => "/v$q->{vid}", style => 'text-decoration: none', $q->{quote};
- txt qq|"\n|;
+ txt '"';
+ br;
}
txt "vndb $self->{version} | ";
@@ -155,7 +160,7 @@ sub htmlFooter { # %options => { prefs => [pref1,..] }
txt ' | ';
a href => $self->{source_url}, mt '_footer_source';
end;
- end; # /div maincontent
+ end 'div'; # /maincontent
# insert users' preference data when required by JS
if($o{prefs}) {
@@ -168,13 +173,13 @@ sub htmlFooter { # %options => { prefs => [pref1,..] }
end;
}
script type => 'text/javascript', src => $self->{url_static}.'/f/js/'.$self->{l10n}->language_tag().'.js?'.$self->{version}, '';
- end; # /body
- end; # /html
+ end 'body';
+ end 'html';
# write the SQL queries as a HTML comment when debugging is enabled
if($self->debug) {
lit "\n<!--\n SQL Queries:\n";
- for (@{$self->{_YAWF}{DB}{queries}}) {
+ for (@{$self->{_TUWF}{DB}{queries}}) {
my $q = !ref $_->[0] ? $_->[0] :
$_->[0][0].(exists $_->[0][1] ? ' | "'.join('", "', map defined()?$_:'NULL', @{$_->[0]}[1..$#{$_->[0]}]).'"' : '');
$q =~ s/^\s//g;
diff --git a/lib/VNDB/Util/Misc.pm b/lib/VNDB/Util/Misc.pm
index 71aca7a8..9f281ee7 100644
--- a/lib/VNDB/Util/Misc.pm
+++ b/lib/VNDB/Util/Misc.pm
@@ -4,14 +4,15 @@ package VNDB::Util::Misc;
use strict;
use warnings;
use Exporter 'import';
+use TUWF ':html';
use VNDB::Func;
-our @EXPORT = qw|filFetchDB|;
+our @EXPORT = qw|filFetchDB ieCheck|;
my %filfields = (
vn => [qw|length hasani tag_inc tag_exc taginc tagexc tagspoil lang olang plat|],
- release => [qw|type patch freeware doujin date_before date_after minage lang olang resolution plat med voiced ani_story ani_ero|],
+ release => [qw|type patch freeware doujin date_before date_after released minage lang olang resolution plat med voiced ani_story ani_ero|],
);
@@ -57,7 +58,7 @@ sub filFetchDB {
# throwing 500's even for non-browse pages. We have to do some low-level
# PostgreSQL stuff with savepoints to ensure that an error won't affect our
# existing transaction.
- my $dbh = $self->{_YAWF}{DB}{sql};
+ my $dbh = $self->dbh;
$dbh->pg_savepoint('filter');
my($r, $np);
my $OK = eval {
@@ -98,3 +99,51 @@ sub _fil_vn_compat {
return 0;
}
+
+sub ieCheck {
+ my $self = shift;
+
+ return 1 if !$self->reqHeader('User-Agent') ||
+ $self->reqHeader('User-Agent') !~ /MSIE [67]/ || $self->reqCookie('ie_sucks');
+
+ if($self->reqGet('i-still-want-access')) {
+ (my $ref = $self->reqHeader('Referer') || '/') =~ s/^\Q$self->{url}//;
+ $self->resRedirect($ref, 'temp');
+ $self->resCookie('ie_sucks' => 1);
+ return;
+ }
+
+ html;
+ head;
+ title 'Your browser sucks';
+ style type => 'text/css',
+ q|body { background: black }|
+ .q|div { position: absolute; left: 50%; top: 50%; width: 500px; margin-left: -250px; height: 180px; margin-top: -90px; background-color: #012; border: 1px solid #258; text-align: center; }|
+ .q|p { color: #ddd; margin: 10px; font: 9pt "Tahoma"; }|
+ .q|h1 { color: #258; font-size: 14pt; font-family: "Futura", "Century New Gothic", "Arial", Serif; font-weight: normal; margin: 10px 0 0 0; } |
+ .q|a { color: #fff }|;
+ end 'head';
+ body;
+ div;
+ h1 'Oops, we were too lazy to support your browser!';
+ p;
+ lit qq|We decided to stop supporting Internet Explorer 6 and 7, as it's a royal pain in |
+ .qq|the ass to make our site look good in a browser that doesn't want to cooperate with us.<br />|
+ .qq|You can try one of the following free alternatives: |
+ .qq|<a href="http://www.mozilla.com/firefox/">Firefox</a>, |
+ .qq|<a href="http://www.opera.com/">Opera</a>, |
+ .qq|<a href="http://www.apple.com/safari/">Safari</a>, or |
+ .qq|<a href="http://www.google.com/chrome">Chrome</a>.<br /><br />|
+ .qq|If you're really stubborn about using Internet Explorer, upgrading to version 8 will also work.<br /><br />|
+ .qq|...and if you're mad, you can also choose to ignore this warning and |
+ .qq|<a href="/?i-still-want-access=1">open the site anyway</a>.|;
+ end;
+ end;
+ end 'body';
+ end 'html';
+ return 0;
+}
+
+
+1;
+
diff --git a/lib/VNDBUtil.pm b/lib/VNDBUtil.pm
index f5650d6d..6285e77a 100644
--- a/lib/VNDBUtil.pm
+++ b/lib/VNDBUtil.pm
@@ -8,7 +8,7 @@ use Exporter 'import';
use Encode 'encode_utf8';
use Unicode::Normalize 'NFKD';
-our @EXPORT = qw|shorten bb2html gtintype normalize normalize_titles normalize_query imgsize uri_escape|;
+our @EXPORT = qw|shorten bb2html gtintype normalize normalize_titles normalize_query imgsize|;
sub shorten {
@@ -242,14 +242,5 @@ sub imgsize {
}
-# Same as URI::Escape::uri_escape_utf8(), only simpler and doesn't add extra
-# dependencies
-sub uri_escape {
- local $_ = encode_utf8 shift;
- s/([^A-Za-z0-9._~-])/sprintf '%%%02X', ord $1/eg;
- return $_;
-}
-
-
1;
diff --git a/util/jsgen.pl b/util/jsgen.pl
index 58b0ac9a..75a77504 100755
--- a/util/jsgen.pl
+++ b/util/jsgen.pl
@@ -13,7 +13,6 @@ BEGIN { ($ROOT = abs_path $0) =~ s{/util/jsgen\.pl$}{}; }
require $ROOT.'/data/global.pl';
use lib "$ROOT/lib";
-use lib "$ROOT/yawf/lib";
use LangFile;
# The VNDB::L10N module is not really suited to be used outside the VNDB::*
diff --git a/util/sql/func.sql b/util/sql/func.sql
index 0248c69a..2f87bdb9 100644
--- a/util/sql/func.sql
+++ b/util/sql/func.sql
@@ -103,6 +103,7 @@ BEGIN
WITH RECURSIVE tags_vn_all(lvl, tag, vid, uid, vote, spoiler, meta) AS (
SELECT 15, tag, vid, uid, vote, spoiler, false
FROM tags_vn
+ WHERE NOT ignore
UNION ALL
SELECT lvl-1, tp.parent, ta.vid, ta.uid, ta.vote, ta.spoiler, t.meta
FROM tags_vn_all ta
diff --git a/util/sql/schema.sql b/util/sql/schema.sql
index 676d6400..2a3a394a 100644
--- a/util/sql/schema.sql
+++ b/util/sql/schema.sql
@@ -217,6 +217,7 @@ CREATE TABLE tags_vn (
vote smallint NOT NULL DEFAULT 3 CHECK (vote >= -3 AND vote <= 3 AND vote <> 0),
spoiler smallint CHECK(spoiler >= 0 AND spoiler <= 2),
date timestamptz NOT NULL DEFAULT NOW(),
+ ignore boolean NOT NULL DEFAULT false,
PRIMARY KEY(tag, vid, uid)
);
diff --git a/util/updates/update_2.17.sql b/util/updates/update_2.17.sql
new file mode 100644
index 00000000..54487d0a
--- /dev/null
+++ b/util/updates/update_2.17.sql
@@ -0,0 +1,8 @@
+
+-- tag overrule feature
+ALTER TABLE tags_vn ADD COLUMN ignore boolean NOT NULL DEFAULT false;
+
+
+-- load new function(s)
+\i util/sql/func.sql
+
diff --git a/util/vndb.pl b/util/vndb.pl
index 0fd6e08d..b6056dd4 100755
--- a/util/vndb.pl
+++ b/util/vndb.pl
@@ -12,11 +12,10 @@ our $ROOT;
BEGIN { ($ROOT = abs_path $0) =~ s{/util/vndb\.pl$}{}; }
-use lib $ROOT.'/yawf/lib';
use lib $ROOT.'/lib';
-use YAWF ':html';
+use TUWF ':html';
use VNDB::L10N;
use SkinFile;
@@ -42,13 +41,23 @@ require $ROOT.'/data/global.pl';
system "make -sC $ROOT" if $S{regen_static};
-YAWF::init(
+$TUWF::OBJ->{$_} = $S{$_} for (keys %S);
+TUWF::set(
%O,
- namespace => 'VNDB',
- object_data => \%S,
pre_request_handler => \&reqinit,
error_404_handler => \&handle404,
+ log_format => \&logformat,
+ # for compatibility with YAWF
+ validate_templates => {
+ mail => { regex => qr/^[^@<>]+@[^@.<>]+(?:\.[^@.<>]+)+$/ },
+ url => { regex => qr/^(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?$/ },
+ asciiprint => { regex => qr/^[\x20-\x7E]*$/ },
+ int => { regex => qr/^-?\d+$/ },
+ pname => { regex => qr/^[a-z0-9-]*$/ },
+ },
);
+TUWF::load_recursive('VNDB::Util', 'VNDB::DB', 'VNDB::Handler');
+TUWF::run();
sub reqinit {
@@ -85,20 +94,16 @@ sub reqinit {
$rmcookie = 1 if $cookie && $cookie eq $browser;
$handle = VNDB::L10N->get_handle($cookie) if $cookie && $browser ne $cookie;
}
- $self->resHeader('Set-Cookie', "l10n= ; expires=Sat, 01-Jan-2000 00:00:00 GMT; path=/; domain=$self->{cookie_domain}")
- if $rmcookie;
+ $self->resCookie(l10n => undef) if $rmcookie;
$self->{l10n} = $handle;
# check for IE
- if($self->reqHeader('User-Agent') && $self->reqHeader('User-Agent') =~ /MSIE [67]/
- && !$self->reqCookie('ie-sucks') && $self->reqPath ne 'we-dont-like-ie') {
- # act as if we're opening /we-dont-like-ie6 (ugly hack, until YAWF supports preventing URL handlers from firing)
- $ENV{HTTP_REFERER} = $ENV{REQUEST_URI};
- $ENV{REQUEST_URI} = '/we-dont-like-ie';
- }
+ return 0 if !$self->ieCheck;
# load some stats (used for about all pageviews, anyway)
$self->{stats} = $self->dbStats;
+
+ return 1;
}
@@ -110,10 +115,22 @@ sub handle404 {
h1 'Page not found';
div class => 'warning';
h2 'Oops!';
- p "It seems the page you were looking for does not exist,\n".
- "you may want to try using the menu on your left to find what you are looking for.";
+ p;
+ txt 'It seems the page you were looking for does not exist,';
+ br;
+ txt 'you may want to try using the menu on your left to find what you are looking for.';
+ end;
end;
end;
$self->htmlFooter;
}
+
+# log user IDs (necessary for determining performance issues, user preferences
+# have a lot of influence in this)
+sub logformat {
+ my($self, $uri, $msg) = @_;
+ sprintf "[%s] %s %s: %s\n", scalar localtime(), $uri,
+ $self->authInfo->{id} ? 'u'.$self->authInfo->{id} : '-', $msg;
+}
+
diff --git a/yawf b/yawf
deleted file mode 160000
-Subproject d7f850931451bf11538fea70b0dac212be346fc