Template Toolkit(русская редакция) |
|
||
|
Template::Filters |
|
ОБЗОР |
[ Индекс ] [ Модули ] [ Наверх ] |
use Template::Filters; $filters = Template::Filters->new(\%config); ($filter, $error) = $filters->fetch($name, \@args, $context); |
ОПИСАНИЕ |
[ Индекс ] [ Модули ] [ Наверх ] |
Модуль Template::Filters реализует поставщика для создания и/или возвращения функций, реализующих стандартные фильтры. Дополнительные пользовательские фильтры можно добавить через опции FILTERS. |
МЕТОДЫ |
[ Индекс ] [ Модули ] [ Наверх ] |
new(\%params)Метод конструктора, который создает и возвращает ссылку на объект Template::Filters. В качестве параметра можно передать ссылку на хеш с опциями конфигурации. Они описаны ниже. my $filters = Template::Filters->new({ FILTERS => { ... }, }); my $template = Template->new({ LOAD_FILTERS => [ $filters ], }); Модуль по умолчанию Template::Filters создается модулем Template.pm, если не указана опция LOAD_FILTERS. Все параметры конфигурации передаются конструктору. $template = Template->new({ FILTERS => { ... }, }); fetch($name, \@args, $context)Запрашивает фильтр с указанным именем. Имя фильтра передается в качестве первого параметра. Это должно быть имя одного из стандартных фильтров или одного из фильтров, определенных в конфигурационном хеше FILTERS. Второй аргумент должен быть ссылкой на массив, содержащий параметры конфигурации фильтра. Можно передать 0 или undef, если таких параметров нет. Третий аргумент должен быть ссылкой на текущий объект Template::Context. В случае успеха метод возвращает ссылку на функцию фильтра. Он также может вернуть (undef, STATUS_DECLINE) в случае отклонения запроса, чтобы разрешить обращение к другим поставщикам фильтров, определенных в цепочке ответственности LOAD_FILTERS. В случае ошибки метод возвращает ($error, STATUS_ERROR), где $error - сообщение об ошибке или объект Template::Exception, обозначающие произошедшую ошибку. Если установлена опция TOLERANT, ошибки автоматически подавляются и ответ преобразуется в STATUS_DECLINE. |
ОПЦИИ КОНФИГУРАЦИИ |
[ Индекс ] [ Модули ] [ Наверх ] |
Следующий список детализирует опции конфигурации, которые можно передать конструктору Template::Filters new().
|
ФИЛЬТРЫ TEMPLATE TOOLKIT |
[ Индекс ] [ Модули ] [ Наверх ] |
The following standard filters are distributed with the Template Toolkit. format(format)Фильтр 'format' принимает в качестве параметра строку описания формата вывода (как в printf()) и форматирует в соответствие с ней каждую строку текста. [% FILTER format('<!-- %-40s -->') %] This is a block of text filtered through the above format. [% END %] вывод: <!-- This is a block of text filtered --> <!-- through the above format. --> upperПереводит вывод в ВЕРХНИЙ РЕГИСТР. [% "hello world" FILTER upper %] вывод: HELLO WORLD lowerПереводит вывод в нижний регистр. [% "Hello World" FILTER lower %] вывод: hello world ucfirstПереводит в ВЕРХНИЙ РЕГИСТР первый символ вывода. [% "hello" FILTER ucfirst %] вывод: Hello lcfirstПереводит в нижний регистр первый символ вывода. [% "HELLO" FILTER lcfirst %] вывод: hELLO trimОбрезает начальные и/или завершающие пробельные символы в тексте вывода. Особенно полезен в сочетании с INCLUDE, PROCESS, и т.п., оказывая такой же эффект как и опция конфигурации TRIM. [% INCLUDE myfile | trim %] collapseСокращает пробельные последовательности внутри текста вывода в единственный пробел. Начальные и/или завершающие пробельные символы (которые будут сжаты в один пробел) удаляются, как и в фильтре trim. [% FILTER collapse %] The cat sat on the mat [% END %] вывод: The cat sat on the mat htmlЗаменяет символы '<', '>' и '&' на '<', '>' и '&' соответственно, предохраняя от интерпретации их как части HTML тегов или сущностей. [% FILTER html %] Binary "<=>" returns -1, 0, or 1 depending on... [% END %] вывод: Binary "<=>" returns -1, 0, or 1 depending on... html_entityФильтр html быстрый и простой, но он не кодирует весь спектр HTML сущностей, который может содержать текст. Фильтр html_entity использует либо модуль Apache::Util (который написан на C и поэтому более быстр), либо модуль HTML::Entities (написанный на Perl, но столь же всеобъемлющий), для того чтобы выполнить перекодирование. Если на вашей системе установлен один из этих модулей, текст будет перекодирован (посредством функций escape_html() или encode_entities() соответственно) - все символы из расширенного диапазона будут переведены в соответствующие HTML сущности (например, 'é' будет заменен на 'é'). Если ни один из модулей не доступен, будет возбуждено исключение 'html_entity' с соответствующим сообщением. Более подробно о кодировании HTML сущностей смотрите http://www.w3.org/TR/REC-html40/sgml/entities.html. html_paraЭтот фильтр форматирует блок текста в параграфы HTML. Последовательность из двух и более символов новой строки используется в качестве разделителя параграфов, которые затем заворачиваются в HTML теги <p>...</p>. [% FILTER html_para %] The cat sat on the mat. Mary had a little lamb. [% END %] вывод: <p> The cat sat on the mat. </p> <p> Mary had a little lamb. </p> html_break / html_para_breakАналогичен описанному выше фильтру html_para, но для связывания параграфов использует последовательность HTML-тегов <br><br>. [% FILTER html_break %] The cat sat on the mat. Mary had a little lamb. [% END %] вывод: The cat sat on the mat. <br> <br> Mary had a little lamb. html_line_breakЭтот фильтр заменяет любой символ новой строки на HTML-тег <br>, сохраняя таким образом переносы в оригинальном тексте в выводе HTML. [% FILTER html_line_break %] The cat sat on the mat. Mary had a little lamb. [% END %] вывод: The cat sat on the mat.<br> Mary had a little lamb.<br> uri
Фильтр выполняет URI-кодирование входного текста, преобразуя все символы,
находящиеся вне диапазона разрешенных в URI (согласно RFC 2396), в их
шестнадцатеричные представления в виде [% 'my file.html' | uri %] вывод: my%20file.html
Учтите, что URI-кодирования часто недостаточно для генерации гиперссылок
в HTML документе. Например, символ <a href="[% filename | uri | html %]">click here</a> indent(pad)Создает отступ у тестового блока либо подстановкой текстовой строки, либо подстановкой фиксированного количества пробелов. Аргумент 'отступ' может быть строкой или числовым значением, задающим ширину отступа (в пробелах). Если аргумент опущен используется значение по умолчанию 4. [% FILTER indent('ME> ') %] blah blah blah cabbages, rhubard, onions [% END %] вывод: ME> blah blah blah ME> cabbages, rhubard, onions truncate(length)Усекает текстовый блок до указанной длины или до длины по умолчанию (32 символа). Усеченный текст будет завершен последовательностью '...' (причем '...' входит в обрезанный текст, а не добавляется к нему после усечения). [% FILTER truncate(21) %] I have much to say on this matter that has previously been said on more than one occasion. [% END %] вывод: I have much to say... repeat(iterations)Повторяет текстовый блок указанное число раз (по умолчанию: 1). [% FILTER repeat(3) %] We want more beer and we want more beer, [% END %] We are the more beer wanters! вывод: We want more beer and we want more beer, We want more beer and we want more beer, We want more beer and we want more beer, We are the more beer wanters! remove(string)Ищет во входном тексте вхождения указанной строки и удаляет их. В качестве строки для поиска можно использовать регулярное выражение Perl. [% "The cat sat on the mat" FILTER remove('\s+') %] вывод: Thecatsatonthemat replace(search, replace)Аналогичен описанному выше фильтру remove, но принимает в качестве второго параметра строку, используемую для замены вхождений строки поиска. [% "The cat sat on the mat" | replace('\s+', '_') %] вывод: The_cat_sat_on_the_mat redirect(file, options)Фильтр 'redirect' перенаправляет вывод блока в отдельный файл, указанный относительно пути, заданного опцией конфигурации OUTPUT_PATH. [% FOREACH user = myorg.userlist %] [% FILTER redirect("users/${user.id}.html") %] [% INCLUDE userinfo %] [% END %] [% END %] или более лаконично с использованием обратной нотации: [% INCLUDE userinfo FILTER redirect("users/${user.id}.html") FOREACH user = myorg.userlist %] Если опция OUTPUT_PATH не определена будет сгенерировано исключение 'file'. За именем файла может идти необзательный параметр 'binmode', явно определяющий вывод в файл в двоичном режиме. [% PROCESS my/png/generator FILTER redirect("images/logo.png", binmode=1) %] В целях обратной совместимости с ранними версиями для установки двоичного режима можно использовать одиночное истинное значение. [% PROCESS my/png/generator FILTER redirect("images/logo.png", 1) %] В целях будущей совместимости и ясности, если ничто не мешает, рекомендуется явно использовать именованную опцию 'binmode', как показано в первом примере. eval / evalttФильтр 'eval' вычисляет блок как текст шаблона, обрабатывая все директивы внутри него. Это позволяет переменным шаблона содержать фрагменты шаблона, а также предоставляет метод для обработки при необходимости фрагментов шаблона из внешних источников, таких как база данных. my $vars = { fragment => "The cat sat on the [% place %]", }; $template->process($file, $vars); Следующий пример: [% fragment | eval %] следовательно эквивалентен: The cat sat on the [% place %] Фильтр 'evaltt' является синонимом для 'eval'. perl / evalperlФильтр 'perl' вычисляет блок как perl-код. Опция EVAL_PERL должна быть установлена в истинное значение или будет возбуждено исключение 'perl'. [% my_perl_code | perl %] В большинстве случаев использование блока [% PERL %] ... [% END %] покрывает всю необходимость в вычислении perl-кода, учитывая то, что директивы обрабатываются до того, как блок вычисляется как код Perl. Так, предыдущий пример можно записать более подробно: [% PERL %] [% my_perl_code %] [% END %] равносильно [% FILTER perl %] [% my_perl_code %] [% END %] Фильтр 'evalperl' предоставляется как синоним 'perl' для обратной совместимости. stdout(options)Фильтр 'stdout' отправляет вывод, сгенерированный окруженным им блоком, на STDOUT. Чтобы установить STDOUT в двоичный режим (смотри perl-функцию binmode), можно указать именованный параметр 'binmode' или одиночное истинное значение. [% PROCESS something/cool FILTER stdout(binmode=1) # recommended %] [% PROCESS something/cool FILTER stdout(1) # alternate %] Фильтр 'stdout' можно использовать для принудительной установки STDOUT в двоичный режим, а также для перенаправления отдельного вывода на STDOUT внутри null или stderr блоков. Смотри пример фильтра 'null' ниже. stderrФильтр 'stderr' направляет вывод, сгенерированный окруженным им блоком, на STDERR. nullФильтр 'null' ничего не выводит. Это полезно при использовании плагинов, методы которых возвращают значения, которые не должны появиться в выводе. Вместо того, чтобы подавлять их присваиванием возвращаемых значений фиктивным переменным, можно заключить блок внутрь фильтра 'null': [% FILTER null; USE im = GD.Image(100,100); black = im.colorAllocate(0, 0, 0); red = im.colorAllocate(255,0, 0); blue = im.colorAllocate(0, 0, 255); im.arc(50,50,95,75,0,360,blue); im.fill(50,50,red); im.png | stdout(1); END; -%] Обратите внимание на использование фильтра 'stdout', обеспечивающего вывод частного выражения на stdout (в данном случае в двоичном режиме). latex(outputType)Передает текстовый блок на вход LaTeX и производит вывод в формате PDF, DVI или PostScript. Аргумент 'outputType' определяет формат вывода и должен быть установлен в одно из строковых значений: "pdf" (по умолчанию), "dvi" или "ps". Блок текста должен быть завершенным исходным файлом LaTeX. [% FILTER latex("pdf") -%] \documentclass{article} \begin{document} \title{A Sample TT2 \LaTeX\ Source File} \author{Craig Barratt} \maketitle \section{Introduction} This is some text. \end{document} [% END -%] Выводом будет файл PDF. Необходимо обратить внимание на то, чтобы вокруг блока не было посторонних символов или текста, так как этот текст будет добавлен к (двоичному) выводу фильтра 'latex'. Обратите внимание на использование в директиве END '-%]' в качестве END_TAG для удаления завершающего символа новой строки. Один из примеров обоснованного использования предваряющего текста - вывод CGI-скрипта, который должен отдавать перед выводом latex заголовок Content-Type, например: Content-Type: application/pdf [% FILTER latex("pdf") -%] \documentclass{article} \begin{document} ... \end{document} [% END -%] В других случаях следует использовать фильтр 'redirect', чтобы сохранить вывод в файл вместо отправки его на stdout. Это можно использовать в пакетных утилитах: [% output = FILTER latex("pdf") -%] \documentclass{article} \begin{document} ... \end{document} [% END; output | redirect("document.pdf", 1) -%] (Обратите внимание второй аргумент принудительно устанавливает двоичный режим.) Фильтр 'latex' запускает одну или две внешних программы, поэтому он не очень быстрый. Но для небольших документов производительность вполне приемлема, даже при использовании в интерактивных приложениях. Если latex, pdflatex или dvips сообщат об ошибке, будет возбуждено исключение типа 'latex'. |
АВТОР |
[ Индекс ] [ Модули ] [ Наверх ] |
Энди Уардли (Andy Wardley <abw@andywardley.com>) |
ВЕРСИЯ |
[ Индекс ] [ Модули ] [ Наверх ] |
2.78, поставляется в составе Template Toolkit версии 2.14, дата релиза - 4 октября 2004. |
АВТОРСКИЕ ПРАВА |
[ Индекс ] [ Модули ] [ Наверх ] |
Copyright (C) 1996-2004 Andy Wardley. All Rights Reserved. Copyright (C) 1998-2002 Canon Research Centre Europe Ltd. Этот модуль является свободно-распространяемым программным обеспечением; вы можете распространять и/или модифицировать его на тех же условиях, что и Perl. |
СМОТРИ ТАКЖЕ |
[ Индекс ] [ Модули ] [ Наверх ] |