Уже около года на drupal.org весит предложение к разработчикам GeSHi, подружить их фильтр с валидатором. Но воз и ныне там :(
Проблема в том, что блок с кодом, с помощью дефолтных фильтров, оборачивается тегом p
. Но по стандартам, параграфы не могут содержать блочных элементов. На такой код валидатор ругается error-ом:
No p element in scope but a p end tag seen.
Если гора не идёт к Магомету… =) Подправить контент до его вывода, можно с помощью создания своего фильтра. Всё очень просто:
/**
* Реализация hook_filter()
*/
function mymodule_filter($op, $delta = 0, $format = -1, $text = '', $cache_id = 0)
{
// Регистрируем в друпале свой фильтр
if ($op == 'list')
{
return array('GeSHi filter paragraph fix');
}
// Описание фильтра
if ($op == 'description')
{
return 'Удаляет теги параграфов в которые заключён блок с кодом. Необходимо для прохождения валидации на w3c.org.';
}
// Подготовка контента
if ($op == 'prepare')
{
return $text;
}
// Обработка контента
if ($op == 'process')
{
return preg_replace('#<p>(<div class="geshifilter">.+?</div>)</p>#s', '$1', $text);
}
}
После включения модуля с этим кодом, на странице настроек форматов ввода (admin/settings/filters) появится новый фильтр, который нужно включить:
При этом, в настройках GeSHi, пункт "Code container, wrapping technique" должен быть установлен в GESHI_HEADER_PRE, и блоки с кодом, нужно будет всегда отбивать пустой строкой.
Подробнее про создание своих фильтров.
Теперь мой блог наконец full HTML5 valid! =)
Комментарии
Спасибо за решение!
Уже нет.
Добавить комментарий