Merge branch 'origin/master'

Conflicts:
	CHANGELOG.md
This commit is contained in:
Ivan Shalganov 2014-01-08 01:10:18 +04:00
commit 19e0898da6
6 changed files with 59 additions and 19 deletions

View File

@ -12,6 +12,11 @@ Changelog
- Move benchmark to another project
- Rename `\Fenom\Compiler` to `\Fenom\Tags`
### 1.4.8 (2013-12-01)
- Fix #52
- Tests++
### 1.4.7 (2013-09-21)
- Bug fixes

View File

@ -20,16 +20,17 @@ $fenom->setOptions($options);
Параметры могут быть массивом `'option_name' => true` (если ключ не указан автоматически задаётся false) или битовой маской.
* **disable_methods**, `Fenom::DENY_METHODS`, disable calling methods in templates. Any method call in the template will throw `Fenom\SecurityException`.
* **disable_native_funcs**, `Fenom::DENY_INLINE_FUNCS`, запретить использование PHP функций, кроме разрешенных.
* **auto_reload**, `Fenom::AUTO_RELOAD`, пересобирать шаблон если его оригинал был изменён (замедляет работу шаблонизатора).
* **force_compile**, `Fenom::FORCE_COMPILE`, пересобирать шаблон при каждом вызове (сильно замедляет работу шаблонизатора).
* **disable_cache**, `Fenom::DISABLE_CACHE`, не сохранять собранный шаблон на диск (сильно замедляет работу шаблонизатора).
* **force_include**, `Fenom::FORCE_INCLUDE`, оптимизировать вставку шаблона в шаблон. Это увеличит производительность и размер собранного шаблона.
Опция активируется если имя шаблона задано явно и скалярно.
* **auto_escape**, `Fenom::AUTO_ESCAPE`, все выводящие переменные и результаты функций будут экранироваться
* **auto_trim**, `Fenom::AUTO_TRIM`, при компиляции, все пробельные символы между тегами будут удлаены.
* **force_verify**, `Fenom::FORCE_VERIFY`, проверять обращение каждой переменной и возвращать NULL если переменной не существует.
| Code | Constant | Description | Affect |
| -------------------- | ------------------------- | ------------ | ------- |
| disable_methods | `Fenom::DENY_METHODS` | disable calling methods of objects in templates. | |
| disable_native_funcs | `Fenom::DENY_INLINE_FUNCS`| disable calling native function in templates, except allowed. | |
| auto_reload | `Fenom::AUTO_RELOAD` | reload template if source will be changed | decreases the performance |
| force_compile | `Fenom::FORCE_COMPILE` | recompile template every time when the template renders | greatly decreases performance |
| disable_cache | `Fenom::DISABLE_CACHE` | disable compile cache | greatly decreases performance |
| force_include | `Fenom::FORCE_INCLUDE` | paste template body instead of include-tag | increases performance, increases cache size |
| auto_escape | `Fenom::AUTO_ESCAPE` | html-escape each variables outputs | decreases performance |
| force_verify | `Fenom::FORCE_VERIFY` | check existence every used variable | decreases performance |
| auto_trim | `Fenom::AUTO_TRIM` | remove space-characters before and after tags | |
```php
$fenom->setOptions(array(
@ -40,10 +41,7 @@ $fenom->setOptions(array(
$fenom->setOptions(Fenom::AUTO_RELOAD | Fenom::FORCE_INCLUDE);
```
По умолчанию, все опции отключены.
**By default all options disabled**
### Tag options
## :raw
## :trim, :ltrim, :rtrim

View File

@ -25,7 +25,7 @@ class Modifier
*/
public static function dateFormat($date, $format = "%b %e, %Y")
{
if (is_string($date) && !is_numeric($date)) {
if (!is_numeric($date)) {
$date = strtotime($date);
if (!$date) $date = time();
}
@ -39,7 +39,7 @@ class Modifier
*/
public static function date($date, $format = "Y m d")
{
if (is_string($date) && !is_numeric($date)) {
if (!is_numeric($date)) {
$date = strtotime($date);
if (!$date) $date = time();
}
@ -100,7 +100,7 @@ class Modifier
if (preg_match('#^(.{' . $length . '}).*?(.{' . $length . '})?$#usS', $string, $match)) {
if (count($match) == 3) {
if ($by_words) {
return preg_replace('#\s.*$#usS', "", $match[1]) . $etc . preg_replace('#^.*\s#usS', "", $match[2]);
return preg_replace('#\s.*$#usS', "", $match[1]) . $etc . preg_replace('#.*\s#usS', "", $match[2]);
} else {
return $match[1] . $etc . $match[2];
}

View File

@ -732,7 +732,14 @@ class Template extends Render
if ($this->_options & Fenom::DENY_METHODS) {
throw new \LogicException("Forbidden to call methods");
}
$code .= $this->parseArgs($tokens);
do { // parse call-chunks: $var->func()->func()->prop->func()->...
if($tokens->is('(')) {
$code .= $this->parseArgs($tokens);
}
if($tokens->is(T_OBJECT_OPERATOR) && $tokens->isNext(T_STRING)) {
$code .= '->'.$tokens->next()->getAndNext();
}
} while($tokens->is('(', T_OBJECT_OPERATOR));
} elseif ($tokens->is(Tokenizer::MACRO_INCDEC)) {
$code .= $tokens->getAndNext();
} else {

View File

@ -274,3 +274,21 @@ class TestCase extends \PHPUnit_Framework_TestCase
);
}
}
class Helper {
public $word = 'helper';
public function __construct($word) {
$this->word = $word;
$this->self = $this;
}
public function chunk() {
return $this;
}
public function __toString() {
return $this->word;
}
}

View File

@ -34,7 +34,18 @@ class TemplateTest extends TestCase
$obj->name = "Object";
$obj->list = $a;
$obj->c = "c";
$b = array("b" => array("c" => "Username", "c_char" => "c", "mcp" => "Master", 'm{$c}p' => "Unknown", 'obj' => $obj), "c" => "c");
// $world = new
$b = array(
"b" => array(
"c" => "Username",
"c_char" => "c",
"mcp" => "Master",
'm{$c}p' => "Unknown",
'obj' => $obj
),
"c" => "c",
"world" => new Helper('world')
);
$c = array_replace_recursive($b, array("b" => array(3 => $b["b"], 4 => "Mister")));
return array(
array('hello, {$a}!', $a, 'hello, World!'),
@ -83,6 +94,7 @@ class TemplateTest extends TestCase
$b, 'hello, Username!'),
array('hello, {"World"}!', $a, 'hello, World!'),
array('hello, {"W{$a}d"}!', $a, 'hello, WWorldd!'),
array('hello, {$world->chunk(1)->self->chunk("new")}!', $b, 'hello, world!'),
);
}