diff --git a/CHANGELOG.md b/CHANGELOG.md
index d187a8c..96f162c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,24 @@
Changelog
=========
+## 2.3.0 (2014-08-08)
+
+- Add tags {set} and {add}
+- Fix bug #97
+- ++Docs
+- --Bugs
+- ++Tests
+
+### 2.2.1 (2014-07-29)
+
+- ++Docs
+- --Bugs
+
+## 2.2.0 (2014-07-11)
+- Add new modifiers: match, ematch, replace, ereplace, split, esplit, join
+- ++Docs
+- ++Tests
+
### 2.1.2 (2014-07-03)
- Add test for bug #86
diff --git a/README.md b/README.md
index 8031ed8..1177347 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@ Fenom - Template Engine for PHP
[](https://packagist.org/packages/fenom/fenom)
[](https://travis-ci.org/bzick/fenom)
-[](https://coveralls.io/r/bzick/fenom?branch=master)
+[](https://coveralls.io/r/bzick/fenom?branch=master)
[](https://packagist.org/packages/fenom/fenom)
## [Quick start](./docs/en/start.md) :: [Documentation](./docs/readme.md) [[en](./docs/en/readme.md)|[ru](./docs/ru/readme.md)] :: [Benchmark](./docs/en/benchmark.md)
@@ -14,7 +14,7 @@ Fenom - Template Engine for PHP
### What is it
-**Fenom** *(from "fenomenal")* — lightweight template engine for PHP.
+**Fenóm** — lightweight template engine for PHP.
It means:
diff --git a/docs/en/dev/git.md b/docs/en/dev/git.md
deleted file mode 100644
index c9e656b..0000000
--- a/docs/en/dev/git.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Git conversation
-================
-
-Ветка `master` содержит стабильную последнюю версию проекта. В ветку `master` может сливаться новая версия проекта из `develop` или исправления.
-Ветка `develop`, для разработки, содержит не стабильную версию проекта. Принимает все новшевства, изменения и исправления.
diff --git a/docs/en/dev/readme.md b/docs/en/dev/readme.md
index 4e96964..ef019b2 100644
--- a/docs/en/dev/readme.md
+++ b/docs/en/dev/readme.md
@@ -1,12 +1,15 @@
Develop
=======
-If you want to discuss the enhancement of the Fenom, create an issue on Github or submit a pull request.
+If you want to contribute to Fenom please feel free to create an issue or submit a pull request on Github.
-There tho branches — master and develop.
-The branch master for stable releases and hotfixes; the branch develop for development of features. Each tag names by rule `major.minor.fix` (1.4.9, 1.1.2 etc) and creates from master. Version changes by the rule of [semantic versioning](http://semver.org/).
+There are two branches:
+
+* `master` branch is for stable releases and hotfixes
+* `develop` branch is for development of features
+
+Each tag names by rule `major.minor.fix` (1.4.9, 1.1.2, etc.) and creates from master. Version changes by the rule of [semantic versioning](http://semver.org/).
For questions: a.cobest@gmail.com (English, Russian languages)
-
-* the [scheme of work](schema.md)
+* the [scheme of work](schema.md)
\ No newline at end of file
diff --git a/docs/ru/dev/internal.md b/docs/ru/dev/internal.md
index 2439003..93a3bbd 100644
--- a/docs/ru/dev/internal.md
+++ b/docs/ru/dev/internal.md
@@ -37,7 +37,7 @@ How it work
## Процесс работы
При вызове метода `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#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).
### Компиляция шаблонов
@@ -64,7 +64,7 @@ How it work
### Как работает токенайзер
-Объек токенайзера принимает на вход любую строчку и разбирает ее при помощи функции token_get_all(). Полученные токен складываются в массив. Каждый токен прдсатвляет из себя числовой массив из 4-х элементов:
+Объект токенайзера принимает на вход любую строчку и разбирает ее при помощи функции token_get_all(). Полученные токен складываются в массив. Каждый токен прдсатвляет из себя числовой массив из 4-х элементов:
* Код токена. Это либо число либо один символ.
* Тело токена. Содержимое токена.
diff --git a/docs/ru/ext/extend.md b/docs/ru/ext/extend.md
index c8851d5..2f9071b 100644
--- a/docs/ru/ext/extend.md
+++ b/docs/ru/ext/extend.md
@@ -4,7 +4,6 @@
# Добавление тегов
В шаблонизаторе принято различать два типа тегов: _компиляторы_ и _функции_.
-Compilers invokes during compilation template to PHP source and have to
Компиляторы вызываются во время преобразования кода шаблона в PHP код и возвращяю PHP код который будет вставлен вместо тега.
А функции вызываются непременно в момент выполнения шаблона и возвращают непосредственно данные которые будут отображены.
Среди тегов как и в HTML есть строчные и блоковые теги.
@@ -17,7 +16,7 @@ Compilers invokes during compilation template to PHP source and have to
$fenom->addFunction(string $function_name, callable $callback[, callable $parser]);
```
-В данном случае запускается стандартный парсер, который автоматически разберет аргументы тега, которые должны быть в формате HTML аттрибутов и отдаст их в функцию ассоциативным массивом:
+В данном случае запускается стандартный парсер, который автоматически разберет аргументы тега, которые должны быть в формате HTML атрибутов и отдаст их в функцию ассоциативным массивом:
```php
$fenom->addFunction("some_function", function (array $params) { /* ... */ });
```
@@ -39,10 +38,10 @@ public static function calc($x, $y = 5) { /* ... */}
// ...
$fenom->addFunctionSmart('calc', 'XYCalcs::calc');
```
-then
+пример выше позволяет объявить тег `{calc}` и спользовать его:
```smarty
-{calc x=$top y=50} or {calc y=50 x=$top} is XYCalcs::calc($top, 50)
-{calc x=$top} or {calc $top} is XYCalcs::calc($top)
+{calc x=$top y=50} или {calc y=50 x=$top} вызовет XYCalcs::calc($top, 50)
+{calc x=$top} или {calc $top} вызовет XYCalcs::calc($top)
```
Таким образом вы успешно можете добавлять Ваши функции или методы.
@@ -56,7 +55,7 @@ $fenom->addBlockFunction(string $function_name, callable $callback[, callable $p
Сам коллбек принимает первым аргументом контент между открывающим и закрывающим тегом, а вторым аргументом - ассоциативный массив из аргуметов тега:
```php
-$fenom->addBlockFunction('some_block_function', function ($content, array $params) { /* ... */});
+$fenom->addBlockFunction('some_block_function', function (array $params, $content) { /* ... */});
```
## Линейный компилятор
@@ -100,7 +99,7 @@ $fenom->addModifier(string $modifier, callable $callback);
* `$modifier` - название модификатора, которое будет использоваться в шаблоне
* `$callback` - коллбек, который будет вызван для изменения данных
-For example:
+Например:
```smarty
{$variable|my_modifier:$param1:$param2}
@@ -145,8 +144,8 @@ $fenom->addAccessor('project', function (Fenom\Tokenizer $tokens) { /* code */ }
который считывает шаблоны из указанной директории.
Источник шаблонов должен реализовать интерфейс `Fenom\ProviderInterface`.
-Используйте метод `$fenom->setProvider(...)` что бы добавить источник в шаблонизатор, указав навание источника и, если есть необходимость,
-задать директорию кеша для шаблонов из этого источника. Рассмотрим на примере, реализуем источик шаблонов из базы данных.
+Используйте метод `$fenom->setProvider(...)` что бы добавить источник в шаблонизатор, указав название источника и, если есть необходимость,
+задать директорию кеша для шаблонов из этого источника. Рассмотрим на примере, реализуем источник шаблонов из базы данных.
Создадим источник:
@@ -178,11 +177,11 @@ $fenom->display("db:index.tpl", $vars);
# Расширение кеша (эксперементальное)
-Изначально Fenom не расчитывался на то что кеш скомпиленых шаблонов может располагаться не на файловой системе.
+Изначально Fenom не рассчитывался на то что кеш скомпиленых шаблонов может располагаться не на файловой системе.
Однако, в теории, есть возможность реализовать свое кеширование для скомпиленых шаблонов без переопределения шаблонизатора.
Речь идет о своем протоколе, отличным от `file://`, который [можно определить](http://php.net/manual/en/class.streamwrapper.php) в PHP.
-Ваш протол должени иметь класс реализации протокола как указан в документации [Stream Wrapper](http://www.php.net/manual/en/class.streamwrapper.php).
+Ваш протокол должен иметь класс реализации как указано в документации [Stream Wrapper](http://www.php.net/manual/en/class.streamwrapper.php).
Класс протокола может иметь не все указанные в документации методы. Вот список методов, необходимых шаблонизатору:
* [CacheStreamWrapper::stream_open](http://www.php.net/manual/en/streamwrapper.stream-open.php)
@@ -190,14 +189,14 @@ $fenom->display("db:index.tpl", $vars);
* [CacheStreamWrapper::stream_close](http://www.php.net/manual/en/streamwrapper.stream-close.php)
* [CacheStreamWrapper::rename](http://www.php.net/manual/en/streamwrapper.rename.php)
-For `include`:
+Для работы через `include`:
* [CacheStreamWrapper::stream_stat](http://www.php.net/manual/en/streamwrapper.stream-stat.php)
* [CacheStreamWrapper::stream_read](http://www.php.net/manual/en/streamwrapper.stream-read.php)
* [CacheStreamWrapper::stream_eof](http://www.php.net/manual/en/streamwrapper.stream-eof.php)
**Note**
-(On 2014-05-13) Zend OpCacher кроме `file://` и `phar://` не поддеривает другие протоколы.
+(On 2014-05-13) Zend OpCacher кроме `file://` и `phar://` не поддерживает другие протоколы.
Пример работы кеша
diff --git a/docs/ru/inheritance.md b/docs/ru/inheritance.md
index 67677a2..8f73315 100644
--- a/docs/ru/inheritance.md
+++ b/docs/ru/inheritance.md
@@ -1,4 +1,4 @@
Наследование шаблонов
=====================
-Документации пока нет, почитайте на хабре пока
\ No newline at end of file
+Документации пока нет, [почитайте на хабре](http://habrahabr.ru/post/169525/) пока
diff --git a/docs/ru/operators.md b/docs/ru/operators.md
index e1b2c60..fc859a4 100644
--- a/docs/ru/operators.md
+++ b/docs/ru/operators.md
@@ -7,7 +7,7 @@
* `-$a` - отрицание знака, смена знака `$a`.
* `$a + $b` - сложение, сумма `$a` и `$b`.
-* `$a - $b` - вычитаение, разность `$a` и `$b`.
+* `$a - $b` - вычитание, разность `$a` и `$b`.
* `$a * $b` - умножение, произведение `$a` и `$b`.
* `$a / $b` - деление, частное от деления `$a` на `$b`.
* `$a % $b` - деление по модулю, целочисленный остаток от деления `$a` на `$b`.
@@ -64,13 +64,13 @@
| Тип операнда 1 | Тип операнда 2 | Результат |
|-------------------|-------------------|-----------|
-| null или string | string | NULL преобразуется в "", числовое или лексическое сравнение |
-| bool или null | что угодно | Преобразуется в bool, FALSE < TRUE |
-| object | object | Встроенные классы могут определять свои собственные правила сравнения, объекты разных классов не сравниваются, объекты одного класса - сравниваются свойства тем же способом, что и в массивах |
-| string или number | string или number | Строки переводятся в числа, обычная математика |
-| array | array | Массивы с меньшим числом элементов считаются меньше, если ключ из первого операнда не найден во втором операнде - массивы не могут сравниваться, иначе идет сравнение соответствующих значений |
-| object | что угодно | object всегда больше |
-| array | что угодно | array всегда больше |
+| null или строка | строка | NULL преобразуется в "", числовое или лексическое сравнение |
+| булев или null | что угодно | Преобразуется в bool, FALSE < TRUE |
+| объект | объект | Встроенные классы могут определять свои собственные правила сравнения, объекты разных классов не сравниваются, объекты одного класса - сравниваются свойства тем же способом, что и в массивах |
+| строка или число | строка или число | Строки переводятся в числа, обычная математика |
+| массив | массив | Массивы с меньшим числом элементов считаются меньше, если ключ из первого операнда не найден во втором операнде - массивы не могут сравниваться, иначе идет сравнение соответствующих значений |
+| объект | что угодно | object всегда больше |
+| массим | что угодно | array всегда больше |
### Побитовые операторы
@@ -129,7 +129,7 @@ Fenom поддерживает префиксные и постфиксные о
### Строковые операторы
-Оператор конкатенации `~` возвращает строку, представляющую собой соединение левого и правого аргумента.
+Оператор объединения `~` возвращает строку, представляющую собой соединение левого и правого аргумента.
* `$a ~ $b` - возвращает результат объединения сток `$a` и `$b`
* `$a ~~ $b` - возвращает результат объединения сток `$a` и `$b` через пробел
@@ -177,7 +177,7 @@ Fenom поддерживает префиксные и постфиксные о
{$request.action !: 'default'}
```
-Как видно, оператор `:?` более расширенный чем `:!` и включает в себя функциональность опертора `!:`.
+Как видно, оператор `:?` более расширенный чем `:!` и включает в себя функциональность оператора `!:`.
Для упрощения понимания можно подвести итог:
@@ -196,7 +196,7 @@ Fenom поддерживает префиксные и постфиксные о
### Операторы проверки
Оператор проверки это упрощенный тернарный оператор от которого осталась только часть проверки без возвращаемых вариантов.
-Суть операторов — быстро произвести проверку на не пустое занчение и существование пременной.
+Суть операторов — быстро произвести проверку на не пустое значение и существование пременной.
* `$a?` - вернет `TRUE` если `$a` не пустое
* `$a!` - вернет `TRUE` если `$a` существует
@@ -208,7 +208,7 @@ Fenom поддерживает префиксные и постфиксные о
### Оператор тестирования
-Оператор `is` производит тесты над перменными или выражением. Левый операнд считается тестируемым, а правый операнд — название теста:
+Оператор `is` производит тесты над переменными или выражением. Левый операнд считается тестируемым, а правый операнд — название теста:
```smarty
{* проверка переменной на не четность *}
@@ -219,7 +219,7 @@ Fenom поддерживает префиксные и постфиксные о
Результат тестирования может быть инвертирован с помощью `is not` оператора:
```smarty
-{* проверяем переменную что ее значение не явдяется числом *}
+{* проверяем переменную что ее значение не является числом *}
{$a is not integer}
```
@@ -236,7 +236,7 @@ Fenom поддерживает префиксные и постфиксные о
* `string` — строка
* `callback`, `callable` — функция
* `number`, `numeric` — число, в общем понимании
-* `$a is iterable` - тестирует переменную на возможность итеративного обхода.
+* `$a is iterable` - тестирует переменную на возможность итеративного обхода (для `foreach`).
* `$a is template` - переменная `$a` содержит название существующего шаблона.
* `$a is empty` - переменная пустая.
* `$a is set` - переменная существует.
@@ -247,7 +247,7 @@ Fenom поддерживает префиксные и постфиксные о
### Оператор присутствия
-Оператор `in` проверяет присутвие скалярного значения слева в массиве или строке справа.
+Оператор `in` проверяет присутствие скалярного значения слева в массиве или строке справа.
Результат тестирования может быть инвертирован с помощью `not ni` оператора.
* `$a in list $b` - значение `$a` содержится в массиве значений `$b`
@@ -255,10 +255,10 @@ Fenom поддерживает префиксные и постфиксные о
* `$a in string $b` - значение `$a` содержится в `$b` как подстрока.
* `$a in $b` - значение `$a` содержится в `$b`, где `$b` может быть строкой, обычным или ассоциативным массивом.
Этот вариант долгий так как требуется проверить типы переменной `$b`.
-Однако если вместо $b явно задан массив иили строка то оператор сам адаптируется для быстрого поиска.
+Однако если вместо $b явно задан массив или строка то оператор сам адаптируется для быстрого поиска.
```smarty
{'df' in 'abcdefg'}
{5 in [1, 5, 25, 125]}
{99 in keys [1, 5, 25, 99 => 125]}
-```
\ No newline at end of file
+```
diff --git a/docs/ru/readme.md b/docs/ru/readme.md
index d725665..6c509ed 100644
--- a/docs/ru/readme.md
+++ b/docs/ru/readme.md
@@ -1,6 +1,10 @@
Документация
=============
+
+
+**Внимание! Документация в режиме беты, тексты могут содержать опечатки**
+
### Fenom
* [Быстрый старт](./start.md)
diff --git a/docs/ru/start.md b/docs/ru/start.md
index b75282d..8b63a99 100644
--- a/docs/ru/start.md
+++ b/docs/ru/start.md
@@ -5,7 +5,7 @@
### Composer
-Fenom зарегестирован на [packagist.org](https://packagist.org/) как пакет [fenom/fenom](https://packagist.org/packages/fenom/fenom).
+Fenom зарегистрирован на [packagist.org](https://packagist.org/) как пакет [fenom/fenom](https://packagist.org/packages/fenom/fenom).
Что бы установить Fenom через composer пропишите в `composer.json` списке пакетов:
```json
{
@@ -16,15 +16,15 @@ Fenom зарегестирован на [packagist.org](https://packagist.org/)
```
и обновите зависимости: `composer update`.
-### Custom loader
+### Произвольная подгрузка
-Склонируйте Fenom в любую директорию Вашего проекта: `git clone https://github.com/bzick/fenom.git`. Рекомендуется использовать последнюю версию.
+Клонируйте Fenom в любую директорию Вашего проекта: `git clone https://github.com/bzick/fenom.git`. Рекомендуется использовать последнюю версию.
Для загрузки классов Fenom использует [psr-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md#autoloading-standard) стандарт.
Таким образом вы можете:
-* использовать Ваш загрузчик, который понимает `psr-0` формат для загрузки классов Fenom из директории `src/` с пространством имен `Fenom`.
-* или использовать строенный загрузчик Fenom: `Fenom::registerAutoload();` для загрузки самого себя.
+* использовать Ваш автозагрузчик, который понимает `psr-0` формат для загрузки классов Fenom из директории `src/` с пространством имен `Fenom`.
+* или использовать встроенный автозагрузчик Fenom: `Fenom::registerAutoload();` для загрузки самого себя.
-Так же вы можете использовать встроенный в Fenom загрузчик для загрузки других классов в `psr-0` формате наименования класса и файла:
+Так же вы можете использовать встроенный в Fenom автозагрузчик для загрузки других классов в `psr-0` формате:
```php
Fenom::registerAutoload(PROJECT_DIR."/classes");
```
@@ -66,7 +66,7 @@ $fenom->display("template/name.tpl", $vars);
$result = $fenom->fetch("template/name.tpl", $vars);
```
-Для отрисовки большого количества данных можно использовать поток
+Для вывода большого количества данных можно использовать поток
```php
// $fenom->pipe(string $template, array $variables, callable $callback, int $chunk_size) : void
@@ -82,3 +82,29 @@ $fenom->pipe(
Поток позволяет обрабатывать большой результат по кускам, размер куска указывается в байтах аргументом `$chunk_size`.
Каждый кусок передается в `$callback` для обработки или вывода.
+
diff --git a/docs/ru/tags/set.md b/docs/ru/tags/set.md
index c498092..a92b8b8 100644
--- a/docs/ru/tags/set.md
+++ b/docs/ru/tags/set.md
@@ -49,20 +49,20 @@
```smarty
{set $v}
Some long {$text|trim}
-{/var}
+{/set}
```
-Такой вариант создания позволяет применить модификаторы к данным переде тем как они будут сохранены в переменную:
+Такой вариант создания позволяет применить модификаторы к данным перед тем как они будут сохранены в переменную:
```smarty
{set $v|escape} {* применение можификатора к значению *}
Some long {$text|trim}
-{/var}
+{/set}
```
### {add}
-Тег {add} делает тоже самое что и тег {set} за исключением того что сначало проверяет наличие переменной и если переменной нет — задет новое значение.
+Тег {add} делает тоже самое что и тег {set} за исключением того что сначала проверяет наличие переменной и если переменной нет — задет новое значение.
```smarty
{add $var = 'value'}
@@ -78,4 +78,3 @@
Тег {var} старое название тега {set}, сейчас это одно и тоже.
-
diff --git a/sandbox/templates/concat-bug.tpl b/sandbox/templates/concat-bug.tpl
deleted file mode 100644
index 4f9fa48..0000000
--- a/sandbox/templates/concat-bug.tpl
+++ /dev/null
@@ -1,2 +0,0 @@
-Some eval:
-{$dop_content = ": some texta"}
\ No newline at end of file
diff --git a/sandbox/templates/extends/75-child.tpl b/sandbox/templates/extends/75-child.tpl
deleted file mode 100644
index e99ff4b..0000000
--- a/sandbox/templates/extends/75-child.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-{extends 'extends/75-parent.tpl'}
-{block 'child'}
- {macro child_test(v, i)}
- child test - {$v}, i = {$i};
- {var $i = $i -1}
- {if $i > 0}
- {macro.child_test v=$v i=$i}
- {/if}
- {/macro}
-
- child call:
- {macro.child_test v = 'ok' i = 5}
-{/block}
\ No newline at end of file
diff --git a/sandbox/templates/extends/75-parent.tpl b/sandbox/templates/extends/75-parent.tpl
deleted file mode 100644
index 3f360b0..0000000
--- a/sandbox/templates/extends/75-parent.tpl
+++ /dev/null
@@ -1,12 +0,0 @@
-{macro parent_test(v, i)}
- parent test - {$v}, i = {$i};
-{var $i = $i -1}
-{if $i > 0}
- {macro.parent_test v=$v i=$i}
-{/if}
-{/macro}
-
-{block 'child'}{/block}
-
-parent call:
-{macro.parent_test v = 'ok' i = 5}
\ No newline at end of file
diff --git a/sandbox/templates/extends/parent.tpl b/sandbox/templates/extends/parent.tpl
deleted file mode 100644
index e69de29..0000000
diff --git a/sandbox/templates/footer.tpl b/sandbox/templates/footer.tpl
new file mode 100644
index 0000000..67233e6
--- /dev/null
+++ b/sandbox/templates/footer.tpl
@@ -0,0 +1,8 @@
+
+