Сен 13 2008

Фильтрация разметки страниц с использованием Tidy

Раздел: Веб-разработкаМета @ 11:05

Вольный перевод статьи Tidy Output Filtering с официального сайта CakePHP (http://bakery.cakephp.org/articles/view/tidy-output-filtering).

В CakePHP можно довольно просто отфильтровать весь выводимый контент через Tidy, для того чтобы удостовериться в его валидности (соответствию стандартам) и доступности посковикам. Использование Tidy позволяет не заботиться о тщательной разметке шаблонов и контента, что особенно актуально когда контент создается самими пользователями сайта или неопытными сотрудниками заказчика. Конечно, дополнительный фильтр влияет на производительность, но чаще всего это очень удобное и полезное решение.

В первую очередь, вам надо установить расширение php tidy. Для Windows его можно взять с сайта pecl4win (http://pecl4win.php.net/list.php), для всех остальных операционных систем — или из штатных репозитариев, или из исходных кодов с сайта pecl (pecl.php.net). Информацию по установке и настройке расширения можно почитать тут - http://ru.php.net/tidy.

Затем, создаем хелпер /app/views/helpers/tidy_filter.php:

<?php
class TidyHelper extends AppHelper {

function __construct() {
if (class_exists(’Tidy’)) { // Выполняемся только если расширение tidy установлено
ob_start(); // Кешируем весь вывод в буфер
}
}

function __destruct() {
if (class_exists(’Tidy’)) { // Выполняемся только если расширение tidy установлено
$output = ob_get_clean(); // Получаем содержимое буфера
$Tidy = new Tidy(); // Создаем объект Tidy
$tidyConfig = array( // А в этом массиве — настройки фильтра
‘doctype’ => ’strict’, // Устанавливаем строгое соответствие стандарту
‘drop-empty-paras’ => true, // Убираем пустые теги p
‘drop-font-tags’ => true, // Убираем теги font
‘drop-proprietary-attributes’ => true, // Убираем все специфические микрософтовские атрибуты (например, от Ворда)
‘enclose-block-text’ => true, // Все блоки текста заключаем в p
‘enclose-text’ => true, // Весь свободный текст (который просто в body, без других тегов) тоже заключаем в p
‘hide-comments’ => false, // Комментарии в коде не трогаем
‘hide-endtags’ => true, // Убираем необязательные закрывающие теги
‘indent’ => true, // Форматируем html, аккуратно расставляя отступы
‘logical-emphasis’ => true, // Заменяем теги i и b на em и strong соответственно
‘lower-literals’ => true, // Все html-атрибуты приводим к нижнему регистру
‘markup’ => true, // Исправляем ошибки разметки
‘output-xhtml’ => true, // Выдача в xhtml
‘quote-ampersand’ => true, // Заменяем символы & на &amp;
‘quote-marks’ => true, // Заменяем символы кавычек в тексте на соответствующие html-коды
‘quote-nbsp’ => true, // Неразрывные пробелы выводим спецтегом &nbsp; вместо кода символа
’show-warnings’ => true, // Выводить сообщения о проблемах обработки
‘wrap’ => 150 // Стараемся чтобы строки были не длиннее 150 символов
);
$Tidy->parseString($output, $tidyConfig, ‘utf8′); // Загружаем обрабатываемый контент из буфера по конфигу, с кодировкой utf8. Важно тут установить кодировку, используемую в вашем приложении!
$Tidy->diagnose(); // Получаем более подробную информацию об ошибках в документе
$Tidy->cleanRepair(); // Запускаем обработку
$output = tidy_get_output($Tidy); // Получаем результаты обработки
if ($Tidy->errorBuffer && Configure::read(’debug’) > 0) {
$output = str_replace(’</body>’, ‘<pre id=”tidy”>’ . htmlspecialchars($Tidy->errorBuffer) . “</pre>\n</body>”, $output); // Если при обработке возникли ошибки — присоединяем их к концу документа
}
ob_start();
echo $output; // Выводим результат
}
}
}
?>

Подключаем хелпер к контроллеру:

<?php
class AppController extends Controller {
var $helpers = array(’TidyFilter’, ‘…остальные хелперы…);
}
?>

Вот и все. Фильтрация уже работает. Смотрите, тестируйте.

Теги: , ,

2 Responses to “Фильтрация разметки страниц с использованием Tidy”

  1. Антон says:

    Tidy - мощная библиотека. Только трудно найти русское описание ее опций. Полного русского описания я так и не нашел. Мож кинете ссылку, если такое есть на примете?

  2. Мета says:

    К сожалению, даже не знаю - есть где-нибудь перевод мануала или нет. Сам пользуюсь английским.

Напиши комментарий!