Программирование > Теория, алгоритмы и стандарты

Работа с шаблонами

<< < (2/4) > >>

Макс:
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.б., то определить алгоритм что-то не получается...
--- Конец цитаты ---

Да без проблем! Можно например использовать рекурсию - ишешь один блок, обрабатываешь его и снова запускаешь функцию только уже для поиска блока внутри блока, ишешь дальше...

Навигация

[0] Главная страница сообщений

[#] Следующая страница

[*] Предыдущая страница

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 
Перейти к полной версии