This commit is contained in:
bzick 2014-11-05 16:07:50 +03:00
parent 1c439fedb7
commit 7e8598ae3b
6 changed files with 43 additions and 30 deletions

View File

@ -36,7 +36,8 @@ $fenom->setOptions($options);
| *force_include* | `Fenom::FORCE_INCLUDE` | стараться по возможности вставить код дочернего шаблона в родительский при подключении шаблона | повышает производительность, увеличивает размер файлов в кеше, уменьшает количество файлов в кеше | | *force_include* | `Fenom::FORCE_INCLUDE` | стараться по возможности вставить код дочернего шаблона в родительский при подключении шаблона | повышает производительность, увеличивает размер файлов в кеше, уменьшает количество файлов в кеше |
| *auto_escape* | `Fenom::AUTO_ESCAPE` | автоматически экранировать HTML сущности при выводе переменных в шаблон | понижает производительность | | *auto_escape* | `Fenom::AUTO_ESCAPE` | автоматически экранировать HTML сущности при выводе переменных в шаблон | понижает производительность |
| *force_verify* | `Fenom::FORCE_VERIFY` | автоматически проверять существование переменной перед использованием в шаблоне | понижает производительность | | *force_verify* | `Fenom::FORCE_VERIFY` | автоматически проверять существование переменной перед использованием в шаблоне | понижает производительность |
| *disable_statics* | `Fenom::DENY_STATICS` | отключает воззможность вызова статических методов в шаблоне | | | *disable_php_calls* | `Fenom::DENY_PHP_CALLS` | отключает возможность вызова статических методов и функций в шаблоне | |
| *disable_statics* | `Fenom::DENY_STATICS` | устаревшее название disable_php_calls | |
| *strip* | `Fenom::AUTO_STRIP` | удаляет лишиние пробелы в шаблоне | уменьшает размер кеша | | *strip* | `Fenom::AUTO_STRIP` | удаляет лишиние пробелы в шаблоне | уменьшает размер кеша |
```php ```php

View File

@ -115,15 +115,17 @@ $fenom->addModifier('my_modifier', function ($variable, $param1, $param2) {
# Расширение тестовго оператора # Расширение тестовго оператора
```php ```php
$fenom->addTest($name, $code); $fenom->addTest(string $name, string $code);
?>
``` ```
`$code` - PHP код для условия, с маркером для замены на значение или переменную.
Например, тест на целое число `is int` можно добавить как `$fenom->addTest('int', 'is_int(%s)')`.
В шаблоне тесты выглядит как `{$a is int}`, а после компиляции выглядит приблизительно так - `is_int($a)`.
# Расширение глобальной переменной или функции # Расширение глобальной переменной или функции
Fenom обладает определенным набором глобальных переменных и функций. Однако их может не хватать для удобной работы с шаблонами. Fenom обладает определенным набором глобальных переменных и функций. Однако их может не хватать для удобной работы с шаблонами.
В этом случае потребуется добавить, переопределить или удалить существующие глобальные переменные или функции. В этом случае потребуется добавить, переопределить или удалить существующие глобальные переменные или функции.
Метод `Fenom::addAccessor($name, $parser)` позволяет добавить свой обработчик на не известную глобальную переменную или функцию. Метод `Fenom::addAccessor(string $name, callable $parser)` позволяет добавить свой обработчик на не известную глобальную переменную или функцию.
```php ```php
$fenom->addAccessor('project', function (Fenom\Tokenizer $tokens) { /* code */ }); $fenom->addAccessor('project', function (Fenom\Tokenizer $tokens) { /* code */ });

View File

@ -1,19 +1,10 @@
<?php <?php
namespace Ts { require_once __DIR__.'/../src/Fenom.php';
class Math {
public static function multi($x, $y) {
return $x * $y;
}
}
}
namespace { \Fenom::registerAutoload();
require_once __DIR__.'/../src/Fenom.php';
\Fenom::registerAutoload(); $fenom = Fenom::factory(__DIR__.'/templates', __DIR__.'/compiled');
$fenom->setOptions(Fenom::AUTO_RELOAD | Fenom::AUTO_STRIP);
$fenom = Fenom::factory(__DIR__.'/templates', __DIR__.'/compiled', Fenom::FORCE_COMPILE); echo($fenom->compile("problem.tpl", false)->getBody());
// $fenom->getTemplate("problem.tpl");
var_dump($fenom->compile("concat-bug.tpl", false)->getBody());
}

View File

@ -36,8 +36,13 @@ class Fenom
const DISABLE_CACHE = 0x400; const DISABLE_CACHE = 0x400;
const FORCE_VERIFY = 0x800; const FORCE_VERIFY = 0x800;
const AUTO_TRIM = 0x1000; // reserved const AUTO_TRIM = 0x1000; // reserved
const DENY_STATICS = 0x2000; const DENY_PHP_CALLS = 0x2000;
const AUTO_STRIP = 0x4000; const AUTO_STRIP = 0x4000;
/**
* Use DENY_PHP_CALLS
* @deprecated
*/
const DENY_STATICS = 0x2000;
/* Default parsers */ /* Default parsers */
const DEFAULT_CLOSE_COMPILER = 'Fenom\Compiler::stdClose'; const DEFAULT_CLOSE_COMPILER = 'Fenom\Compiler::stdClose';
@ -63,6 +68,7 @@ class Fenom
"auto_escape" => self::AUTO_ESCAPE, "auto_escape" => self::AUTO_ESCAPE,
"force_verify" => self::FORCE_VERIFY, "force_verify" => self::FORCE_VERIFY,
"auto_trim" => self::AUTO_TRIM, "auto_trim" => self::AUTO_TRIM,
"disable_php_calls" => self::DENY_PHP_CALLS,
"disable_statics" => self::DENY_STATICS, "disable_statics" => self::DENY_STATICS,
"strip" => self::AUTO_STRIP, "strip" => self::AUTO_STRIP,
); );
@ -399,6 +405,9 @@ class Fenom
$this->_provider = $provider; $this->_provider = $provider;
} }
public function setCachePerms() {
}
/** /**
* Set compile directory * Set compile directory
* *

View File

@ -663,10 +663,6 @@ class Template extends Render
// parse term // parse term
$term = $this->parseTerm($tokens, $var); // term of the expression $term = $this->parseTerm($tokens, $var); // term of the expression
if ($term !== false) { if ($term !== false) {
if ($var && ($this->_options & Fenom::FORCE_VERIFY)) {
$term = '(isset(' . $term . ') ? ' . $term . ' : null)';
$var = false;
}
if ($tokens->is('|')) { if ($tokens->is('|')) {
$term = $this->parseModifier($tokens, $term); $term = $this->parseModifier($tokens, $term);
$var = false; $var = false;
@ -780,24 +776,37 @@ class Template extends Render
} }
return $this->parseScalar($tokens, true); return $this->parseScalar($tokens, true);
} elseif ($tokens->is(T_VARIABLE)) { } elseif ($tokens->is(T_VARIABLE)) {
$code = $unary . $this->parseVariable($tokens); $code = $this->parseVariable($tokens);
if ($tokens->is("(") && $tokens->hasBackList(T_STRING, T_OBJECT_OPERATOR)) { if ($tokens->is("(") && $tokens->hasBackList(T_STRING, T_OBJECT_OPERATOR)) {
if ($this->_options & Fenom::DENY_METHODS) { if ($this->_options & Fenom::DENY_METHODS) {
throw new \LogicException("Forbidden to call methods"); throw new \LogicException("Forbidden to call methods");
} }
$code = $this->parseChain($tokens, $code); return $this->parseChain($tokens, $code);
} elseif ($tokens->is(Tokenizer::MACRO_INCDEC)) { } elseif ($tokens->is(Tokenizer::MACRO_INCDEC)) {
$code .= $tokens->getAndNext(); if($this->_options & Fenom::FORCE_VERIFY) {
return $unary . '(isset(' . $code . ') ? ' . $code . $tokens->getAndNext() . ' : null)';
} else {
return $unary . $code . $tokens->getAndNext();
}
} else { } else {
$is_var = true; if($this->_options & Fenom::FORCE_VERIFY) {
return $unary . '(isset(' . $code . ') ? ' . $code . ' : null)';
} else {
$is_var = true;
return $unary . $code;
}
} }
return $code;
} elseif ($tokens->is('$')) { } elseif ($tokens->is('$')) {
$is_var = false; $is_var = false;
$var = $this->parseAccessor($tokens); $var = $this->parseAccessor($tokens);
return $unary . $var; return $unary . $var;
} elseif ($tokens->is(Tokenizer::MACRO_INCDEC)) { } elseif ($tokens->is(Tokenizer::MACRO_INCDEC)) {
return $unary . $tokens->getAndNext() . $this->parseVariable($tokens); if($this->_options & Fenom::FORCE_VERIFY) {
$var = $this->parseVariable($tokens);
return $unary . '(isset(' . $var . ') ? ' . $tokens->getAndNext() . $this->parseVariable($tokens).' : null)';
} else {
return $unary . $tokens->getAndNext() . $this->parseVariable($tokens);
}
} elseif ($tokens->is("(")) { } elseif ($tokens->is("(")) {
$tokens->next(); $tokens->next();
$code = $unary . "(" . $this->parseExpr($tokens) . ")"; $code = $unary . "(" . $this->parseExpr($tokens) . ")";

View File

@ -433,6 +433,7 @@ class TemplateTest extends TestCase
'if: block1 end' 'if: block1 end'
), ),
array('if: {if $unexist} block1 {else} block2 {/if} end', $a, 'if: block2 end', Fenom::FORCE_VERIFY), array('if: {if $unexist} block1 {else} block2 {/if} end', $a, 'if: block2 end', Fenom::FORCE_VERIFY),
array('if: {if !$unexist} block1 {else} block2 {/if} end', $a, 'if: block1 end', Fenom::FORCE_VERIFY),
); );
} }