Модуль Text.Process
Модуль Text.Process создан для обработки текста перед сохранением в базе данных или перед выводом на экран - транслит, подсветка синтаксиса, выделение каких-либо терминов и тд. В библиотеке есть несколько реализованных обработчиков текста. Также, можно создать любой свой обработчик.
Как применять
Для этого необходимо вызвать обработчик.
Text_Process::process($text, 'html'); // удалит почти все html-теги Text_Process::process($text, 'translit'); // транслитерирует текст Text_Process::process($text, 'html', 'translit'); // сначала удалит почти все html-теги, а затем транслитерирует что осталось
Следует помнить, что соблюдение правил обеспечивается необратимыми изменениями в html-коде. И если требуется сохранить html-код в первозданном виде, обрабатывать текст перед сохранением в БД не стоит. В то же время обработка текста непосредственно перед выводом на экран несколько замедлит загрузку страницы.
Настройка обработчика
В некоторых случаях необходимо настроить обработчик. Например, для фильтра HTML задать разрешенные теги, которые не нужно удалять. В этом случае вызываем обработку с настройками:
Text_Process::process($text, array('html' => array('tags' => array('b', 'i', 's')))); // удалит все теги кроме <b>, <i>, <s>
Реализованные обработчики
- Text.Parser.Translit (translit) - производит транслитерацию текста.
- Text.Parser.BB (bb) - переводит bb-код в html.
- Text.Parser.Parms (parms) - переводит текстовые параметры в массив.
- Text.Highlight.PHP (php) - подсветка синтаксиса PHP.
- Text.Parser.Wiki (wiki) - переводит wiki-код в html.
- Text.Filter.PlainText (plaintext) - преобразует специальные символы в HTML-сущности.
- Text.Filter.HTML (html) - удаляет все теги, кроме разрешенных, из текста.
- Text.Filter.HTMLPurifier (htmlpurifier) - пытается исправить ошибки html-верстки, удаляет пустые теги.
- Text.Processor.Typographer (typographer) - улучшает отображение текста на сайте путем исправления "типографических ошибок" и правильным расположением текста.
- Text.Processor.Nl2br (nl2br) - вставляет HTML код разрыва строки (br) перед каждым переводом строки.
Реализация своего обработчика
Для примера создадим простейший обработчик текста, который выделяет жирным шрифтом слово или часть слова, переданные через $config. Например, для подсветки запроса в результатах поиска по сайту.
Для создания своего обработчика нужно:
1. Реализовать класс, который поддерживает интерфейс Text_Process_ProcessInterface. Он содержит всего два публичных метода: process() и configure(), предназначение каждого понятно по его названию. Наш класс в упрощенном варианте будет выглядеть примерно так:
Core::load('Text.Process'); class App_TextProcessorBolder implements Core_ModuleInterface, Text_Process_ProcessInterface { protected $words = array(); // конфигурирование public function configure($config) { if (isset($config['words'])) { $this->words = is_array($config['words']) ? $config['words'] : array($config['words']); } } // непосредственная обработка текста public function process($text) { if($this->words) { $text = preg_replace('/('.implode('|', $this->words).')/ui', '<b>$1</b>', $text); return $text; } }
2. Зарегистрировать свой обработчик.
Text_Process::add_process('bolder', 'App.TextProcessorBolder');
где первый аргумент - мнемокод обработчика, по которому он будет вызываться в дальнейшем.
3. Подключить модуль
Core::load('App.TextProcessorBolder');
4. Вызов осуществляется следующим образом:
$config = array('words' => 'масл'); echo Text_Process::process('Масленное масло', array('bolder' => $config)); // Результат: <b>Масл</b>енное <b>масл</b>о
Для филдов textarea и contest в настройках можно указать мнемокод своего обработчика в параметре value_processors.
public function fields() { return array( ... 'announce' => array( 'type' => 'textarea', 'value_processors' => 'bolder', ... ), }
Text.Processor.Typographer
Данный обработчик изменяет html-код таким образом, чтобы он отображался в браузерах по всем законам web-типографики. Перечислю основные поддерживаемые правила:
- Замена кавычек на html-коды «ёлочек»;
- Замена минусов на html-коды тире и короткого тире;
- Переносы предлогов, местоимений на новую строку (отсутствие "висячих" предлогов и местоимений);
- Неразрываемые даты, ФИО и тд.
Также можно добавить висячую пунктуацию (с определенными ограничениями).
Используем так:
Text_Process::process($text, 'typographer');