10 KiB
How it work
Устарело
Терминология
- Исходный шаблон - изначальный вид шаблона в специальном синтаксисе
- Код шаблона - резальтат компиляции шаблона, PHP код.
- Провайдер - объект, источник исходных шаблонов.
Классы
-
Fenom
- является хранилищем- шаблонов
- модификаторов
- фильтров
- тегов
- провайдеров
- настройки - маска из опций
- список разрешенных функций
а также обладает соответсвующими setter-ами и getter-ами для настройки.
-
Fenom\Tokenizer
- разбирает, при помощи tokens_get_all, строку на токены, которые хранит массивом. Обладает методами для обработки токенов, работающими как с конкретными токенами так и с их группами. -
Fenom\Render
- простейший шаблон. ХранитClosure
с PHP кодом шаблона- настройки
- зависимости
-
Fenom\Template
- шаблон с функцией компиляции, расширен отFenom\Render
. Содержит различные методы для разбора выражений при помощиFenom\Tokenizer
. -
Fenom\Compiler
- набор правил разбора различных тегов. -
Fenom\Modifier
- набор модификаторов. -
Fenom\Scope
- абстрактный уровень блочного тега. -
Fenom\ProviderInterface
- интерфейс провадеров шаблонов -
Fenom\Provider
- примитивный провайдер шаблонов с файловой системы.
Процесс работы
При вызове метода Fenom::display($template, $vars)
шаблонизатор ищет в своем хранилище уже загруженный шаблон.
Если шаблона нет - либо загружает код шаблона с файловой системыб либо инициирует его компиляцию.
Компиляция шаблонов
- Создается "пустой"
Fenom\Template
- В него загружется исходный шаблон из провайдера
- Исходный шаблон проходит pre-фильтры.
- Начинается разбор исходного шаблона.
- Ищется первый открывающий тег символ -
{
- Смотрятся следующий за
{
символ.- Если
}
или пробельный символ - ищется следующий символ{
- Если
*
- ищется*}
, текст до которого, в последствии, вырезается. - Ищется символ
}
. Полученный фрагмент шаблона считается тегом. - Если был тег
{ignore}
название тега проверяется на закрытие этого тега. - Для тега создается токенайзер и отдается в диспетчер тегов
- Диспетчер тега вызывает различные парсеры выражений, компилятор тега и возвращает PHP код (см ниже).
- Полученный фрагмент PHP кода обрабатывается и прикрепляется к коду шаблона.
- Ищется следующий
{
символ... - ...
- В конце проверяется токенайзер на наличие не используемых токенов, если таковые есть - выбрасывается ошибка.
- Если
- Проверяется стек на наличие не закрытых блоковых тегов
- Ищется первый открывающий тег символ -
- PHP код проходит post-фильтры
- Код шаблона сохраняеться на файлувую систему
- Код шаблона выполняется для использования
Как работает токенайзер
Объек токенайзера принимает на вход любую строчку и разбирает ее при помощи функции token_get_all(). Полученные токен складываются в массив. Каждый токен прдсатвляет из себя числовой массив из 4-х элементов:
- Код токена. Это либо число либо один символ.
- Тело токена. Содержимое токена.
- Номер строки в исходной строке
- Пробельные символы, идущие за токеном
Токенайзер обладает внутренним указателем на "текущий" токен, передвигая указатель можно получить доступ к токенам через специальные функции-проверки. Почти все функции-проверки проверяют текущее значение на соответствие кода токену. Вместо кода может быть отдан код группы токенов.
Как работает диспетчер тегов
- Проверяет, не является выражение в токенайзере тегом ignore.
- Проверяет, не является выражение в токенайзере закрывающим тегом.
- Проверяет, не является выражение в токенайзере скалярным значением.
- По имени тега из списка тегов выбирается массив и запускается соответсвующий парсер.
- Парсер возвращает PHP код
Как работают парсеры
Парсер всегда получает объект токенайзера. Курсор токенайзера установлен на токен с которого начинается выражение, которое должен разобрать парсер.
Таким образом, по завершению разбора выражения, парсер должен установить курсор токенайзера на первый незнакомый ему символ.
Для примера рассмортим парсер переменной Fenom\Template::parseVar()
.
В шаблоне имеется тег {$list.one.c|modifier:1.2}. В парсер будет отдан объект токенайзера new Tokenizer('$list.one.c|modifier:1.2')
с токенами $list
.
one
.
c
|
modifier
:
1.2
.
Указатель курсора установлен на токен $list
. После разбора токенов, курсор будет установлен на |
так как это не знакомый парсеру переменных токен. Следующий парсер может быть вызван Fenom\Template::parseModifier()
, который распарсит модификатор.