fenom/docs/dev/internal.md
2013-08-22 10:33:03 +04:00

8.8 KiB
Raw Blame History

How it work

Терминология

  • Исходный шаблон - изначальный вид шаблона в специальном синтаксисе
  • Код шаблона - резальтат компиляции шаблона, PHP код.
  • Провайдер - объект, источник исходных шаблонов.

Классы

  • Fenom - является хранилищем

    а также обладает соответсвующими setter-ами и getter-ами для настройки.

  • Fenom\Tokenizer - разбирает, при помощи tokens_get_all, строку на токены, которые хранит массивом. Обладает методами для обработки токенов, работающими как с конкретными токенами так и с их группами.

  • Fenom\Render - простейший шаблон. Хранит

  • 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-фильтры
  • Код шаблона сохраняеться на файлувую систему
  • Код шаблона выполняется для использования

Как работает диспетчер тегов:

Как работают парсеры:

Парсер всегда получает объект токенайзера. Курсор токенайзера установлен на токен с которого начинается выражение, которое должен разобрать парсер. Таким образом, по завершению разбора выражения, парсер должен установить курсор токенайзера на первый незнакомый ему символ. Для примера рассмортим парсер переменной 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(), который распарсит можификатор.