mirror of
				https://github.com/fenom-template/fenom.git
				synced 2023-08-10 21:13:07 +03:00 
			
		
		
		
	Add 'how it work'
This commit is contained in:
		
							
								
								
									
										56
									
								
								docs/dev/internal.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								docs/dev/internal.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
				
			|||||||
 | 
					How it work
 | 
				
			||||||
 | 
					===========
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Терминология
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Исходный шаблон - изначальный вид шаблона в специальном синтаксисе
 | 
				
			||||||
 | 
					* Код шаблона - резальтат компиляции шаблона, PHP код.
 | 
				
			||||||
 | 
					* Провайдер - объект, источник исходных шаблонов.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Классы
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `Fenom` - является хранилищем
 | 
				
			||||||
 | 
					    * [шаблонов](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L88)
 | 
				
			||||||
 | 
					    * [модификаторов](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L112)
 | 
				
			||||||
 | 
					    * [фильтров](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L73)
 | 
				
			||||||
 | 
					    * [тегов](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L140)
 | 
				
			||||||
 | 
					    * [провайдеров](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L107)
 | 
				
			||||||
 | 
					    * [настройки](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L98) - маска из [опций](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L29)
 | 
				
			||||||
 | 
					    * [список](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom.php#L131) разрешенных функций
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    а также обладает соответсвующими setter-ами и getter-ами для настройки.
 | 
				
			||||||
 | 
					* `Fenom\Tokenizer` -  разбирает, при помощи [tokens_get_all](http://docs.php.net/manual/en/function.token-get-all.php), строку на токены, которые хранит [массивом](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Tokenizer.php#L84).
 | 
				
			||||||
 | 
					Обладает методами для обработки токенов, работающими как с [конкретными токенами](http://docs.php.net/manual/en/tokens.php) так и с их [группами](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Tokenizer.php#L94).
 | 
				
			||||||
 | 
					* `Fenom\Render` - простейший шаблон. Хранит
 | 
				
			||||||
 | 
					    * `Closure` с [PHP кодом](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Render.php#L30) шаблона
 | 
				
			||||||
 | 
					    * [настройки](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Render.php#L19)
 | 
				
			||||||
 | 
					    * [зависимости](https://github.com/bzick/fenom/blob/1.2.2/src/Fenom/Render.php#L59)
 | 
				
			||||||
 | 
					* `Fenom\Template` - шаблон с функцией компиляции, расширен от `Fenom\Render`. Содержит различные методы для разбора выражений при помощи `Fenom\Tokenizer`.
 | 
				
			||||||
 | 
					* `Fenom\Compiler` - набор правил разбора различных тегов.
 | 
				
			||||||
 | 
					* `Fenom\Modifier` - набор модификаторов.
 | 
				
			||||||
 | 
					* `Fenom\Scope` - абстрактный уровень блочного тега.
 | 
				
			||||||
 | 
					* `Fenom\ProviderInterface` - интерфейс провадеров шаблонов
 | 
				
			||||||
 | 
					* `Fenom\Provider` - примитивный провайдер шаблонов с файловой системы.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Процесс работы
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* При вызове метода `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-фильтры
 | 
				
			||||||
 | 
					    * Код шаблона сохраняеться на файлувую систему
 | 
				
			||||||
 | 
					    * Код шаблона выполняется для будущего использования
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Reference in New Issue
	
	Block a user