Парсер условных выражений
сайтостроение, верстка и html, 27.10.2011 Четверг, 19:44
Я позволил себе достаточно долго не писать в блог по той причине, что всё мое внимание было переключено на разработку остальных моих проектов, в числе коих statusno.net — сборник статусов для социальных сетей, da.am — многострадальный сборник анекдотов и oboi.ws — процветающий каталог обоев для рабочего стола.
И если первые два сайта застряли в эмбриональной стадии, то коллекция обоев уже пересекала рубеж посещаемости в восемь тысяч человек в день и рубеж доходов в 60 тысяч рублей в месяц (К моему большому сожалению в данный момент доходы не превышают 20 тысяч, но это долгая история и я надеюсь что такое положение дел будет длиться не бесконечно).
Напротив, коллекция обоев в моих глазах имеет такой потенциал, что я начал разработку под неё специализированной cms с довольно интересной архитектурой. Провожу время обложившись учебниками по php и всё такое прочее.
Этот пост я пишу по той причине, что хочу поделиться с вами одной из моих наработок - парсером условных выражений аля ucoz. Система разбора условий, сделанная в ucoz, показалась мне удобной и я решил её перенять (это не значит что вся cms будет ucoz-подобной, это далеко не так). Моя реализация парсера представляет из себя класс на php, который позволяет разбирать несколько видов условий, а так же реализует хранение и замену условных кодов в текстах шаблонов.
Для того чтобы использовать мой парсер на своих сайтах сначала создайте файл класса codes.class.php, затем подключите его в код вашей системы. Класс не требует создания своих экземпляров, так как все его методы статичны. Далее я опишу основные функции взаимодействия с парсером.
Подготовка к работе:
Первое что нам необходимо сделать, это загрузить в память парсера все условные коды, которые должны быть доступны на обрабатываемой странице. Для добавления кодов в парсер используется триплет функций:
codes::set('имя_кода','значение кода/переменная');
Имя кода должно быть задано латинскими буквами или цифрами без пробелов. Знаки доллара необязательны хотя и допустимы. Любое заданное значение будет сохранено в верхнем регистре и обрамлено знаками доллара. К примеру 'User_ID' будет сохранено и соотвтетственно доступно в шаблоне как $USER_ID$.
codes::get('имя_кода');
Служит для получения значения кода из памяти парсера. Значение кода обрабатывается так же, как описано выше.
codes::remove('имя_кода');
Удаление информаии о коде из памяти. Обратите внимание что все коды, загруженные в память парсера сохраняются между вызовами обработки шаблонов. Если вы хотите чтобы один код был доступен в одном шаблоне и недоступен в другом - не забудьте его удалить.
Получение информации
Если у вас появиась необходимость выгрузить информацию о добавленных кодах из парсера, например для вывода списка доступных кодов на странице сайта, как это сделано в моей системе - воспользуйтесь функциями ниже:
codes::get_codes();
Эта функция пришлет массив НАЗВАНИЙ кодов без значений. Полезна для вывода в шаблоне информации о доступных кодах.
codes::get_all();
Вернет одномерный массив кодов вида $ИМЯ_КОДА$=>ЗНАЧЕНИЕ. Бывает полезно и может использоваться для различных мелких причин.
Написание условий, подготовка шаблона
Мой парсер имеет существенное отличие от парсера ucoz - он не имеет защиты от дурака и призван лишь упростить работу с шаблонами. По этой причине в каждом условии доступна передача php кода в парсер, где он и будет исполнен. Не допускайте прямого использования условных выражений пользователями!
Парсер умеет распознавать условия любого уровня вложенности, умеет выполнять только те условия, которые попадают в выполняемую область видимости, это помогает значительно экономить ресурсы сервера. Парсер выдаст ошибку специальную ошибку в том случае, если условный код в шаблоне не будет закрыт должным образом. Так же парсер умеет перехватывать ошибки парсинга в условиях на php, что поможет избежать падения сайта.
Ниже приведены примеры условий, которые парсер умеет обрабатывать:
<if{ условие }> текст <endif>
Самое простое выражение. Если условие положительно и приводится к булевному true то будет показан текст. В качестве условия может быть передан условный код, например вот так:
<if{ $CODE$==3 }> текст <endif>
В скобках условия пишется php код в котором условные коды выступают в качестве переменных.
<if{ условие }> текст <else> текст2 <endif>
Ещё одно простое условие но уже с использованием модификатора ИЛИ. Если условие выполняется - выводится первый текст, иначе второй.
<if{ условие }> текст <else> текст2 <else> текст3 <else> текст4 <else> текст5 <endif>
Возможны сложные последовательности, например такая как выше. В этом случае будут выведены нечетные тексты.
<if{ условие }> текст <elseif{ условие2 }> текст2 <endif>
В условии выше используется переход elseif который позволяет вывести второй текст только если первое условие отрицательно а второе положительно. Подобные условия можно так же перемежать многократными else.
Итак, шаблон мы подготовили, теперь пора его обработать парсером.
Финальная обработка и вывод
Перед тем как вывести нашу страницу в браузер, мы должны обработать её шаблон (в котором уже расставлены условия и прописаны коды) функцией обработки нашего парсера.
codes::tpl(' html код шаблона страницы ');
Эта функция вернет переданный ей код но уже польностью обработанный и с замененными условными кодами и выражениями.
Надеюсь парсер вам пригодится. Он неоднократно протестирован и не содержит ошибок в формировании обработанного шаблона. Так же неплохо прокомментирован.
И если первые два сайта застряли в эмбриональной стадии, то коллекция обоев уже пересекала рубеж посещаемости в восемь тысяч человек в день и рубеж доходов в 60 тысяч рублей в месяц (К моему большому сожалению в данный момент доходы не превышают 20 тысяч, но это долгая история и я надеюсь что такое положение дел будет длиться не бесконечно).
Напротив, коллекция обоев в моих глазах имеет такой потенциал, что я начал разработку под неё специализированной cms с довольно интересной архитектурой. Провожу время обложившись учебниками по php и всё такое прочее.
Этот пост я пишу по той причине, что хочу поделиться с вами одной из моих наработок - парсером условных выражений аля ucoz. Система разбора условий, сделанная в ucoz, показалась мне удобной и я решил её перенять (это не значит что вся cms будет ucoz-подобной, это далеко не так). Моя реализация парсера представляет из себя класс на php, который позволяет разбирать несколько видов условий, а так же реализует хранение и замену условных кодов в текстах шаблонов.
Для того чтобы использовать мой парсер на своих сайтах сначала создайте файл класса codes.class.php, затем подключите его в код вашей системы. Класс не требует создания своих экземпляров, так как все его методы статичны. Далее я опишу основные функции взаимодействия с парсером.
Подготовка к работе:
Первое что нам необходимо сделать, это загрузить в память парсера все условные коды, которые должны быть доступны на обрабатываемой странице. Для добавления кодов в парсер используется триплет функций:
codes::set('имя_кода','значение кода/переменная');
Имя кода должно быть задано латинскими буквами или цифрами без пробелов. Знаки доллара необязательны хотя и допустимы. Любое заданное значение будет сохранено в верхнем регистре и обрамлено знаками доллара. К примеру 'User_ID' будет сохранено и соотвтетственно доступно в шаблоне как $USER_ID$.
codes::get('имя_кода');
Служит для получения значения кода из памяти парсера. Значение кода обрабатывается так же, как описано выше.
codes::remove('имя_кода');
Удаление информаии о коде из памяти. Обратите внимание что все коды, загруженные в память парсера сохраняются между вызовами обработки шаблонов. Если вы хотите чтобы один код был доступен в одном шаблоне и недоступен в другом - не забудьте его удалить.
Получение информации
Если у вас появиась необходимость выгрузить информацию о добавленных кодах из парсера, например для вывода списка доступных кодов на странице сайта, как это сделано в моей системе - воспользуйтесь функциями ниже:
codes::get_codes();
Эта функция пришлет массив НАЗВАНИЙ кодов без значений. Полезна для вывода в шаблоне информации о доступных кодах.
codes::get_all();
Вернет одномерный массив кодов вида $ИМЯ_КОДА$=>ЗНАЧЕНИЕ. Бывает полезно и может использоваться для различных мелких причин.
Написание условий, подготовка шаблона
Мой парсер имеет существенное отличие от парсера ucoz - он не имеет защиты от дурака и призван лишь упростить работу с шаблонами. По этой причине в каждом условии доступна передача php кода в парсер, где он и будет исполнен. Не допускайте прямого использования условных выражений пользователями!
Парсер умеет распознавать условия любого уровня вложенности, умеет выполнять только те условия, которые попадают в выполняемую область видимости, это помогает значительно экономить ресурсы сервера. Парсер выдаст ошибку специальную ошибку в том случае, если условный код в шаблоне не будет закрыт должным образом. Так же парсер умеет перехватывать ошибки парсинга в условиях на php, что поможет избежать падения сайта.
Ниже приведены примеры условий, которые парсер умеет обрабатывать:
<if{ условие }> текст <endif>
Самое простое выражение. Если условие положительно и приводится к булевному true то будет показан текст. В качестве условия может быть передан условный код, например вот так:
<if{ $CODE$==3 }> текст <endif>
В скобках условия пишется php код в котором условные коды выступают в качестве переменных.
<if{ условие }> текст <else> текст2 <endif>
Ещё одно простое условие но уже с использованием модификатора ИЛИ. Если условие выполняется - выводится первый текст, иначе второй.
<if{ условие }> текст <else> текст2 <else> текст3 <else> текст4 <else> текст5 <endif>
Возможны сложные последовательности, например такая как выше. В этом случае будут выведены нечетные тексты.
<if{ условие }> текст <elseif{ условие2 }> текст2 <endif>
В условии выше используется переход elseif который позволяет вывести второй текст только если первое условие отрицательно а второе положительно. Подобные условия можно так же перемежать многократными else.
Итак, шаблон мы подготовили, теперь пора его обработать парсером.
Финальная обработка и вывод
Перед тем как вывести нашу страницу в браузер, мы должны обработать её шаблон (в котором уже расставлены условия и прописаны коды) функцией обработки нашего парсера.
codes::tpl(' html код шаблона страницы ');
Эта функция вернет переданный ей код но уже польностью обработанный и с замененными условными кодами и выражениями.
Надеюсь парсер вам пригодится. Он неоднократно протестирован и не содержит ошибок в формировании обработанного шаблона. Так же неплохо прокомментирован.
10, 2, 2736