Программирование > Теория, алгоритмы и стандарты
Работа с шаблонами
Макс:
Phoinix
ИМХО ты не совсем правильно делаешь обработку блоков.
Предположим сделал я такой шаблон :
--- Код: ---
%col1%
%col2%
--- Конец кода ---
Как нужно такой блок обрабатывать ? Вырезаешь ВЕСЬ блок (все что между комметариями BEGIN rows_block и END rows_block)
Парсишь этот блок и полученный HTML вставляешь на его место.
Примерно так:
--- Код: ---
# это шаблон с блоком
$a = \'Begin template
I am %name% %surname%
end template\';
$_ = $a;
# получаем текст блока
$_ =~ /(.+?)/s;
# в этой переменной будет текст блока
$block_code = $1;
# а сюда будем записывать результирующий ХТМЛ
$block_html = \'\';
# парсинг блока
$_ = $block_code;
$_ =~ s/%name%/Maxim/s;
$_ =~ s/%surname%/Matyukhin/s;
$block_html .= $_;
$_ = $block_code;
$_ =~ s/%name%/Vladimir/s;
$_ =~ s/%surname%/Putin/s;
$block_html .= $_;
# заменяем блок на его результирующий HTML-код
$a =~s/(.+?)/$block_html/s;
print $a;
--- Конец кода ---
Я перл совершенно не знаю, но при правильной реализации, такой подход позволяет сделать блоки неограниченной вложенности.
Я например не вижу, как в твоем случае сделать вложенные блоки
ЗЫ
это всего лишь мое имхо
Phoinix:
Tronyx
--- Цитировать ---Код будет как раз таки меньше и сможет обрабатывать все шаблоны, а тебе приходится каждый раз заново писать новый обработчик, это не логично + частично теряется смысл использования шаблонов
--- Конец цитаты ---
Ну вообщем-то подобный обработчик не подразумевается как отдельный модуль, а как дополнение к существующим скриптам
Макс
С этим не спорю, как альтернатива можно делать и так, но IMHO для меня проще свой вариант. Тем паче, что загрузку файла в Perl\'е я произвожу в массив, каждая строка - ячейка массива, следовательно твое решение не подойдет, т.к. маркировки начала и конца блока в разных ячейках массива и одним регулярным выражением забрать весь блок не получится...
Получится примерно так:
код шаблона:
%col1%
%col2%
код скрипта:
open (TMP, $file); @template = ; close (TMP);
foreach (@template) {
if (m//gi) {$block_on = 1;}
if (m//gi) {$block_on = 0;}
if ($block_on eq 1) {$block_code .=$_; $_ = "";}
}
и т.д.
т.е. по сути тоже самое, может даже хуже...
Но можно сделать по-другому открытие файла:
open (TMP, $file);
while () {
$template .=$_;
}
close (TMP);
Тогда конечно проще делать "нарезку" регулярными выражениями как предлагает Макс.
Tronyx:
--- Цитировать ---Phoinix:
Ну вообщем-то подобный обработчик не подразумевается как отдельный модуль, а как дополнение к существующим скриптам
--- Конец цитаты ---
Если у тебя сделано не рационально это не значит, что так и подразумевается делать.
--- Цитировать ---Phoinix:
маркировки начала и конца блока в разных ячейках массива и одним регулярным выражением забрать весь блок не получится...
--- Конец цитаты ---
Ну и что? Ты же сам написал как получится???
PS так как это теория и алгоритмы не нужно останавливаться на реализации на пёрле, описывайте алгоритм словами.
Phoinix:
Tronyx
--- Цитировать ---Если у тебя сделано не рационально это не значит, что так и подразумевается делать
--- Конец цитаты ---
А как же тогда сделать это более рационально? :)
Что-то я уже начал запутываться %) надо разобраться
1. Данная обработка предполагается для конкретных задач следовательно универсальность кода ни к чему, универсальность принципа обработки IMHO присутствует;
2. По поводу выделения блоков HTML кода - все зависит от реализации загрузки файлов:
а. если файл выгружается в массив, то IMHO мой способ выделения блоков наиболее рационален;
б. если файл выгружается не в массив, то более рационален способ выделения блоков которые предложили Макс и Tronyx;
3. По поводу выделения вложенных блоков, честно говоря, если идти по способу 2.б., то определить алгоритм что-то не получается... тем более реализовать предложение Tronyx по поводу:
--- Цитировать ---А ты сделай неограниченую вложеность и не будет ни какой загвоздки.
--- Конец цитаты ---
Если только (но для массивов):
1. определять в цикле начальные метки, до тех пор пока не появится конечная (запоминая месторасположение меток в массиве);
2. делать выборку блока между последней начальной и найденой конечной;
3. определять последнюю начальную метку на предыдущую;
4. возврат в п.1.
при этом учитываем имена блоков, а потом в соответствии сними расставляем обратно...
Но IMHO все же проще адаптироваться под конкретные задачи...
Tronyx:
--- Цитировать ---Phoinix:
Данная обработка предполагается для конкретных задач следовательно универсальность кода ни к чему, универсальность принципа обработки IMHO присутствует;
--- Конец цитаты ---
Ты хошешь писать новый обработчик каждый раз когда используешь новый шаблон? Рационально было бы написать один единственный обработчик который сможет обрабатывать любые шаблоны. И это не ИМХО!
--- Цитировать ---Phoinix:
2. По поводу выделения блоков HTML кода - все зависит от реализации загрузки файлов:
--- Конец цитаты ---
Всё так зависит только у тебя. У меня в шаблонизаторе файл загружается в массив и используются "нормальные" блоки, сейчас они у меня работают по другому, но в одной из прошлых версий работали так же.
--- Цитировать ---Phoinix:
а. если файл выгружается в массив, то IMHO мой способ выделения блоков наиболее рационален;
--- Конец цитаты ---
А вот тут слово рационаленен точно не нужно. ;) Больше подходит - довольно не удобен, но максимально прост в реализации.
--- Цитировать ---Phoinix:
3. По поводу выделения вложенных блоков, честно говоря, если идти по способу 2.б., то определить алгоритм что-то не получается...
--- Конец цитаты ---
Да без проблем! Можно например использовать рекурсию - ишешь один блок, обрабатываешь его и снова запускаешь функцию только уже для поиска блока внутри блока, ишешь дальше...
Навигация
Перейти к полной версии