xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Дружим GeSHi filter и validator.w3.org

Опубликовано в

Уже около года на drupal.org весит предложение к разработчикам GeSHi, подружить их фильтр с валидатором. Но воз и ныне там :(

Проблема в том, что блок с кодом, с помощью дефолтных фильтров, оборачивается тегом p. Но по стандартам, параграфы не могут содержать блочных элементов. На такой код валидатор ругается error-ом:

No p element in scope but a p end tag seen.

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! =)

Написанное актуально для Drupal 6.x, GeSHi filter 1.3
Похожие записи

Комментарии RSS

Спасибо за решение!

Уже нет.

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании