Парсер условных выражений

сайтостроение, верстка и 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 код шаблона страницы   ');

     Эта функция вернет переданный ей код но уже польностью обработанный и с замененными условными кодами и выражениями.
     Надеюсь парсер вам пригодится. Он неоднократно протестирован и не содержит ошибок в формировании обработанного шаблона. Так же неплохо прокомментирован.

Жми на пятую!
10, 2, 2736
    © Блог StudioAD.ru 2024 год нашей эры. Не все права защищены... Копирование любой информации и материалов с обратной ссылкой приветствуется! Хостинг от uCoz.

    Если вам пришлись по душе материалы моего блога - подпишитесь на RSS дабы получать обновления незамедлительно! Я рад что вы читаете и комментируете мои экзерсисы, приятного времяпрепровождения.