Парсер специальных условных выражений и функций

в 18:12, , рубрики: html, php, код, метки: , , ,

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

Установка и использование

Для того, чтобы использовать мою разработку, нужно создать файл класса и поместить в него код, который я загрузил на WebCodes (кстати, класс отлично прокомментирован).

Работа со спец. кодами

Спец. код — это выражение, которое можно вставить в HTML шаблон и, при последующей обработке, получить его значение. Для того, чтобы его задать, воспользуемся методом set().

codes::set('code_name', 'code_value')

Или для того, чтобы задать сразу несколько кодов.

codes::set(
    array('code_name_1', 'code_name_2'),
    array('code_value_1', 'code_value_2')
)

Теперь, в шаблонах можно использовать специальный код $CODE_NAME$. Имя кода обрамлено знаком доллара и сохранено в верхнем регистре. Удаление кода происходит с помощью метода remove().

codes::remove('code_name')

Для того, чтобы получить значение кода, имеется метод get().

codes::get('code_name')

Для получения всех сохраненных имен можно воспользоваться методом get_codes(). Возвращает массив.

codes::get_codes()

Можно получить полную информацию о сохраненных кодах с помощью метода get_all(). Возвращает массив вида $CODE_NAME$ => code_value.

codes::get_all()
Условные выражения

В моем скрипте пользователю предоставляется возможность создавать условные выражения. Начнем их разбор с одиночного IF.

<if{condition}>
    HTML код, который будет показан в случае, если условие (condition) будет выполнено.
<endif>

Ваше условие должно быть помещено в фигурные скобки, вместо слова condition. Условие строится по такому же принципу, как и в любых си-подобных языках. Возможно использовать более большие конструкции.

<if{condition_1}>
    HTML код, который будет показан в случае, если условие #1 (condition_1) будет выполнено.
<elseif{condition_2}>
    HTML код, который будет показан в случае, если условие #2 (condition_2) будет выполнено.
<else>
    HTML код, который будет показан в случае, если ни условие #1 (condition_1), ни условие #2 (condition_2) не будут выполнены.
<endif>

Альтернативных условий ELSEIF может быть сколько угодно. Хочу заметить, что важен порядок постановки условных конструкций: если Вы сначала используете ELSE, а после него ELSEIF, то будет выполнен блок ELSE! Повторное использование конструкции ELSE ни к чему не приведет, будет выполнено первое вхождение. В случае, если операторы не будут закрыты или будет нарушен порядок, парсер выдаст ошибку синтаксиса.

Функции

Парсер умеет работать с функциями (но, к сожалению, пока не знает рекурсии). Определение функции выполняется специальной конструкцией.

<def{$FUNCTION_NAME$ ($ARG_1$,$ARG_2$,...)}>
    HTML код, который выдает функция при вызове.
<enddef>

Разберемся с синтаксисом. Название функции должно быть записано в верхнем регистре и обрамлено знаками доллара, как в примере ($FUNCTION_NAME$). При этом не важно, сохранен или нет специальный код с таким именем, обработки спец. кодов и функций пересекаются в безопасном месте. Далее идут аргументы функции (в скобках). Желательно, чтобы аргументы были оформлены в том же стиле, что и специальные коды, но пока это не обязательно, т.е. если у вас будет аргумент, под названием a, то при вызове функции, все символы a будут заменены значением переданного параметра. Аргументы перечисляются через запятую. Функции могут быть объявлены в любом месте программы, даже после их вызова, т.к. сначала считываются все объявления, а потом все вызовы. Кстати, о вызовах.

<call{$FUNCTION_NAME$ ($PARAM_1$,$PARAM_2$,...)}>

С помощью этой конструкции осуществляется вызов объявленной функции (иначе вылезет ошибка синтаксиса). $FUNCTION_NAME$ — имя функции, которую вы вызываете, $PARAM_1$,$PARAM_2$ — параметры, которые вы передаете (в строго заявленном порядке). Вызовы функции можно помещать в условные конструкции. Хочу заметить, что все переменные, заданные снаружи функции, ничего не значат и выводятся просто как набор символов (что-то похожее на область видимости). Если вы хотите передать просто строку, а не спец. символ, то не нужно отбивать ее кавычками, т.к. по сути, место, где происходит вызов функции — уже строка.

Обработка

После того, как все ваши шаблоны созданы, настало время их обработать. Для этого есть метод template(), который принимает один строковый параметр и возвращает обработанную строку.

codes::template($html)

Вот и все, теперь шаблон готов для вывода.

Конец

На этом моя инструкция окончена. Надеюсь, она оказалась не слишком трудной и парсер вам понравится. В планах у меня создать проверку синтаксиса логических конструкций, аргументов, создать рекурсию и еще некоторые вещи.

Автор: cheremushkin

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js