Web Forms и серверная валидация

Оказывается, в девятой Опере ввели экспериментальную поддержку Web Forms.

Узнал я об этом во время тестирования нового XSLT-шаблона для форм. Атрибут required каким-то образом просочился в HTML, и Опера напрочь отказывалась отправлять форму, требуя заполнить обязательное поле. Никаких перезарузок страницы, никаких скриптов — радость для веб-мастера!

Всё это хорошо, но в других браузерах поддержкой Web Forms и не пахнет (да и сама спецификация находится в состоянии Working Draft). Кроме того, серверную валидацию никто не отменял.

С другой стороны, Web Forms изначально разрабатывались с учётом обратной совместимости, что позволяет уже сейчас использовать расширенный набор элементов и атрибутов как в HTML-, так и в XML-коде для серверной валидации. Collapse )

.masterhost обновился

Только я задумался над тем, как хранить в MySQL 4.0 данные на разных языках, как .masterhost обновил программное обеспечение, в частности, поднялся до пятой версии мускуля. Гип-гип-ура! Да здравствует юникод!

Правда, у меня select version() до сих пор показывает 4.0.26. Может быть, обновление ПО ещё не успело коснуться выделенных серверов? Будем ждать…

Автозаполнение мета-тегов keywords и description

@getMetaKeywords[sText][tKeyword;hKeyword;tKey]
$sText[^sText.lower[]]
# удаляем тэги
$sText[^sText.match[<.*?>|&.*?^;][g]{ }]
# выбираем все слова длиннее 3-х букв
$tKeyword[^sText.match[([\w\-]{4,})][g]]
# сортируем по длине
^tKeyword.sort(^tKeyword.1.length[])
# собираем уникальные корни слов
$hKeyword[^tKeyword.hash{^tKeyword.1.left(5)}[$.distinct[tables]]]
$tKey[^hKeyword._keys[]]
# сортируем слова по частоте
^tKey.sort($hKeyword.[$tKey.key])[desc]
# отбираем 20 слов из середины списка
$tKey[^table::create[$tKey;$.offset(($tKey-20)\2)$.limit(20)]]
# перечисляем через пробел
$result[^tKey.menu{$hKeyword.[$tKey.key].1}[ ]]

@getMetaDescription[sText][tMatch]
# удаляем тэги
$sText[^sText.match[<.*?>|&.*?^;][g]{ }]
# берём кусок не длиннее 200 знаков
$tMatch[^sText.match[^^(.{1,200}[\.\?!])]]
$result[$tMatch.1]