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

22.04.2010

Уже около года на 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
Похожие записи

Комментарии

Добавить комментарий