Парсер шаблонизатор

MasterSID

Новичок
Парсер шаблонизатор

Решил написать свой незамысловатый шаблонизатор и столкнулся с небольшой проблемкой.
Принцип работы шаблонизатора:
1. Определяем главный файл шаблона
2. Собираем в отдельном массиве-члене класса шаблонизатора пары [переменная_шаблона]=>парсируемый текст
3. Парсим в файл шаблона все эти переменные
4. Делаем вывод.

Парсится все последовательно: шерстим массив с собранными парами переменная=>содержимое и заменяем перменную на содержимое.

Так вот проблема в том, чтобы парсить только те конструкции типа {TITLE}, {BODY} и т.д., которые содержатся именно в файлах шаблонанов, но не парсить эти конструкции, содержащиеся в парсируемом тексте.

То есть, допустим такой вариант:
Файл шаблона:
-------------------------------
{TITLE}<br>{BODY}
-------------------------------


Алгоритм скрипта:
-------------------------------
Читаем файл шаблона
Регистрируем пару "{TITLE}"=>"Новый Заголовок {BODY}"
Регистрируем пару "{BODY}"=>"Тело документа"
Парсим по описанному выше алгоритму и выводим в браузер.
-------------------------------

т.к. все идет последовательно, то в шаблон сначала парсится {TITLE} и мы получаем такое содержимое буфера:
Новый Заголовок {BODY}<br>{BODY}

Далее в массиве идет переменная {BODY} и, поскольку она в буфере встречается уже дважды, то и парсится 2 раза. Как с этим бороться? Причем нужно дать возможность использовать конструкции типа {ПЕРЕМЕННАЯ} в парсируемом тексте без ограничений.
 

crocodile2u

http://vbolshov.org.ru
Скажи-ка, друже, какие такие фичи будут в твоем шаблонизаторе, которых нет у других? И если таковых не имеется, то на кой тебе сдался собственный шаблонизатор? Время убить? Задача, которую ты ставишь перед шаблонизатором в этом посте, великолепно решена в любом из существующих готовых решений.
 

Nutty

Новичок
тебе надо что-то вроде {literal} в смарти или какого-нибудь экранирующего тэга,что б парсер не лез в нутрь этой конструкции
 

MasterSID

Новичок
Убедительная просьба не задавать мне таких вопросов, т.к. это оффтопик. Я бы хотел получить помощь в решении конкретной задачи, а не доказывать зачем мне это надо.

Вообще это вопрос из разряда: зачем ты пишешь свою CMS? какие такие фичи в ней будут, которых нет в других CMS? Почти все задачи, которые ты ставишь перед своей системой великолепно решены в других, уже существующих. Достаточно только добавить свои модули...

Отвечу так:
Во-первых данное решение может понадобиться не только в шаблонизаторе, но и вряде других ситуаций.
Во-вторых кроме меня, оно может заинтересовать кого-то еще.
В-третьих я не люблю использовать чужие скрипты в своих разработках
В-четвертых, мне интересно самому - т.к. чем большы скриптов я напишу и больше сфер затрону - тем больше о языке и подходах к решению разных проблем узнаю.
И в-пятых большинство существующих шаблонизаторов серъезно наворочены, соответсвенно их производительность снижена, по-сравнению с более мобильными вариантами, которые подстраиваются под нужды той системы, где они используются. Зачем тратить ценное процессорное время, если можно найти более простое решение?

То же самое и с CMS - их действительно много, но все они наворочены кучей фич, которые могут быть совершенно бесполезными, тем неменее эти фичи будут инклюдиться вместе со всем необходимым кодом и, тем самым, снижать его производительность. Более того, иногда может понадобиться куча дополнительного времени, для того, чтобы вникнуть в структуру и особенности чужого кода (в том случае, если понадобится внести свои изменения и дополнения). Практически таже история и с шаблонизаторами.

В общем это тема для отдельного топика и здесь я продолжать ее обсуждение не буду. Сэкономим наше время, ок?

-~{}~ 25.08.05 10:45:

Автор оригинала: Nutty
тебе надо что-то вроде {literal} в смарти или какого-нибудь экранирующего тэга,что б парсер не лез в нутрь этой конструкции
Прошу прощения, можно немного подробнее?
 

StUV

Rotaredom
напр.: вместо {...} используй {[:$#(...)#$:]}
вообще введи использование динамических "скобок" - т.е. чтобы их можно было задавать при инициализации шаблонизатора (+использование дефолтных значений) или для каждого шаблона свой вариант (в зависимости от контекста)
 

MasterSID

Новичок
По поводу: {[:$#(...)#$:]}
А если использовать шаблонизатор для чата или форума, то любой человек, узнавший этот набор символов сможет накосячить изрядно.
 

StUV

Rotaredom
MasterSID
ты уже прочитал все треды из поиска по ссылке, которую получил в другом топике ???
 

MasterSID

Новичок
Судя по названиям этих топиков - не такая уж это изъезженная проблема. Я пока ничего похожего не нашел
 

Фанат

oncle terrible
Команда форума
Я, кстати, впорос, наконец, понял.
Решение пока в голову не приходит
 

StUV

Rotaredom
1. самый простой вариант - запрещение этого набора символов
2. можно при парсинге шаблонов при_вставке в шаблон текста заменять эту конструкцию неким другим набором, а перед выводом в браузер (когда все переменные шаблона пропарсились) - возвращать их вид обратно
 

MasterSID

Новичок
а если этой некий другой набор присутсвует в тексте шаблона или тексе, введенным пользователем?
 

MasterSID

Новичок
А запрещение этого набора символов тоже плохое решение, т..к. ни один пользователь такого форума или чата не сможет написать {TITLE} в окне чата/форума
 

StUV

Rotaredom
=)))
каждый раз генерируй новый уникальный эквивалент и пиши всю последовательность в базу - в конце парсинга последовательно откатывай =)
 

mani13

Новичок
MasterSID
например, заменять & на &amp;
а [ (или что-нить т.п.) на &#91;
ну а потом обратно
 

Romantik

TeaM PHPClub
Я чет не пойму: причем тут поле ввода в том же чате к шаблону?
 

MasterSID

Новичок
ОООО, ОНК, сенк тебе - то, что надо!!!

-~{}~ 25.08.05 12:27:

теперь все парсится как надо

-~{}~ 25.08.05 12:30:

Только вопрос - а правильно ли это с точки зрения безопасности. Возможно ли несанкционированное использование дескрипторов при такой конструкции?

$template='{TITLE}<br>{BODY}';
$tags["{TITLE}"]="Заголовок {BODY}{TITLE}";
$tags["{BODY}"]="Тело странички{BODY}{TITLE}";
echo strtr($template, $tags);

-~{}~ 25.08.05 12:30:

Только вопрос - а правильно ли это с точки зрения безопасности. Возможно ли несанкционированное использование дескрипторов при такой конструкции?

$template='{TITLE}<br>{BODY}';
$tags["{TITLE}"]="Заголовок {BODY}{TITLE}";
$tags["{BODY}"]="Тело странички{BODY}{TITLE}";
echo strtr($template, $tags);
 

Лисю

Guest
MasterSID

может это офф., но твой "шаблонизатор" липовый тебе в скором времени надоест и ты его выкинишь на помойку. Причины:

1. Это не шаблонизатор, а фигня.
2. Он не даст тебе в полной степени отделить логику приложения от логики представления.
3. Он не гибок.

Читаем: http://spectator.ru/technology/php/easy_templates
Название статьи пусть тебя не пугает. Если правильно использовать основную идею, можно многово добиться. Я раньше как и ты делал шаблны на подобных вставках. Эта "технология" приемлема лишь для очень простых сайтов ( в плане верстки). теперь использую исключительно этот шаблонизатор.

-~{}~ 25.08.05 15:27:

автор, зайди сюда - http://phpclub.ru/talk/showthread.php?s=&threadid=72052&rand=16 и ответь, есть ли у тебя необходимость писать шаблонизатор, а то crocodile2u очень переживает.
 
Сверху