From cad8d27ffebaf58bf91797ba5613b505b5233fb4 Mon Sep 17 00:00:00 2001 From: bzick Date: Thu, 22 Aug 2013 10:33:03 +0400 Subject: [PATCH] Add 'how it work' --- docs/dev/git.md | 5 ++++ docs/dev/internal.md | 54 ++++++++++++++++++++++++++++++-------------- 2 files changed, 42 insertions(+), 17 deletions(-) create mode 100644 docs/dev/git.md diff --git a/docs/dev/git.md b/docs/dev/git.md new file mode 100644 index 0000000..c9e656b --- /dev/null +++ b/docs/dev/git.md @@ -0,0 +1,5 @@ +Git conversation +================ + +Ветка `master` содержит стабильную последнюю версию проекта. В ветку `master` может сливаться новая версия проекта из `develop` или исправления. +Ветка `develop`, для разработки, содержит не стабильную версию проекта. Принимает все новшевства, изменения и исправления. diff --git a/docs/dev/internal.md b/docs/dev/internal.md index 7608440..55d6575 100644 --- a/docs/dev/internal.md +++ b/docs/dev/internal.md @@ -34,23 +34,43 @@ How it work ## Процесс работы -* При вызове метода `Fenom::display($template, $vars)` шаблонизатор [ищет](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L712) в своем хранилище уже загруженный шаблон. +При вызове метода `Fenom::display($template, $vars)` шаблонизатор [ищет](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L712) в своем хранилище уже загруженный шаблон. Если шаблона [нет](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L727) - либо [загружает](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L762) код шаблона с файловой системыб либо [инициирует](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L759) его [компиляцию](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L788). Последовательность компиляции шаблона следующая: - * [Создается](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L660) "пустой" `Fenom\Template` - * В него [загружется](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L157) исходный шаблон [из провайдера](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L167) - * Исходный шаблон проходит pre-фильтры. - * Начинается [разбор](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L196) исходного шаблона. - * [Ищется](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L204) первый открывающий тег символ - `{` - * [Смотрятся](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L205) следующий за `{` символ. - * Если `}` или пробельный символ - ищется следующий символ `{` - * Если `*` - ищется `*}`, текст до которого, в последствии, вырезается. - * Ищется символ `}`. Полученный фрагмент шаблона считается тегом. - * Если [был тег](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L238) `{ignore}` название тега проверяется на закрытие этого тега. - * Для тега [создается](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L245) токенайзер и отдается в [диспетчер](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L488) тегов - * Диспетчер тега вызывает различные парсеры выражений, компилятор тега и возвращает PHP код. - * Проверяется стек на наличие не закрытых блоков тегов - * PHP код проходит post-фильтры - * Код шаблона сохраняеться на файлувую систему - * Код шаблона выполняется для будущего использования +* [Создается](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L660) "пустой" `Fenom\Template` +* В него [загружется](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L157) исходный шаблон [из провайдера](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L167) +* Исходный шаблон проходит [pre-фильтры](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L200). +* Начинается [разбор](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L196) исходного шаблона. + * [Ищется](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L204) первый открывающий тег символ - `{` + * [Смотрятся](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L205) следующий за `{` символ. + * Если `}` или пробельный символ - ищется следующий символ `{` + * Если `*` - ищется `*}`, текст до которого, в последствии, вырезается. + * Ищется символ `}`. Полученный фрагмент шаблона считается тегом. + * Если [был тег](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L238) `{ignore}` название тега проверяется на закрытие этого тега. + * Для тега [создается](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L245) токенайзер и отдается в [диспетчер](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L488) тегов + * Диспетчер тега вызывает различные парсеры выражений, компилятор тега и возвращает PHP код (см ниже). + * Полученный фрагмент PHP кода [обрабатывается и прикрепляется](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L362) к коду шаблона. + * Ищется следующий `{` символ... + * ... + * В конце проверяется токенайзер на наличие не используемых токенов, если таковые есть - выбрасывается ошибка. + * [Проверяется](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L264) стек на наличие не закрытых блоковых тегов +* PHP код проходит [post-фильтры](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L282) +* Код шаблона [сохраняеться](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L799) на файлувую систему +* Код шаблона выполняется для использования + +Как работает диспетчер тегов: + +* Проверяет, не является выражение в токенайзере [тегом ignore](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L492). +* Проверяет, не является выражение в токенайзере [закрывающим тегом](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L499). +* Проверяет, не является выражение в токенайзере [скалярным значением](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L566). +* По имени тега из [списка тегов](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L140) выбирается массив и запускается [соответсвующий](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Template.php#L582) парсер. +* Парсер возвращает 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()`, который распарсит можификатор.