mirror of
https://github.com/fenom-template/fenom.git
synced 2023-08-10 21:13:07 +03:00
Add custom parsers for accessors
This commit is contained in:
parent
3b56906ec8
commit
ef4458ca10
@ -53,6 +53,10 @@ class Fenom
|
|||||||
|
|
||||||
const MAX_MACRO_RECURSIVE = 32;
|
const MAX_MACRO_RECURSIVE = 32;
|
||||||
|
|
||||||
|
const ACCESSOR_CUSTOM = null;
|
||||||
|
const ACCESSOR_VAR = 'Fenom\Accessor::parserVar';
|
||||||
|
const ACCESSOR_CALL = 'Fenom\Accessor::parserCall';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var int[] of possible options, as associative array
|
* @var int[] of possible options, as associative array
|
||||||
* @see setOptions
|
* @see setOptions
|
||||||
@ -796,12 +800,16 @@ class Fenom
|
|||||||
/**
|
/**
|
||||||
* Add global accessor ($.)
|
* Add global accessor ($.)
|
||||||
* @param string $name
|
* @param string $name
|
||||||
* @param callable $parser
|
* @param callable|string $accessor
|
||||||
|
* @param string $parser
|
||||||
* @return Fenom
|
* @return Fenom
|
||||||
*/
|
*/
|
||||||
public function addAccessor($name, $parser)
|
public function addAccessor($name, $accessor, $parser = self::ACCESSOR_CUSTOM)
|
||||||
{
|
{
|
||||||
$this->_accessors[$name] = $parser;
|
$this->_accessors[$name] = array(
|
||||||
|
"accessor" => $accessor,
|
||||||
|
"parser" => $parser
|
||||||
|
);
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,10 +28,20 @@ class Accessor {
|
|||||||
'env' => '$_ENV'
|
'env' => '$_ENV'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
public static function parserVar($var, Tokenizer $tokens, Template $tpl, &$is_var) {
|
||||||
|
$is_var = true;
|
||||||
|
return $tpl->parseVariable($tokens, $var);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function parserCall($accessor, Tokenizer $tokens, Template $tpl) {
|
||||||
|
// return $tpl->parseVariable($tokens, $var);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accessor for global variables
|
* Accessor for global variables
|
||||||
* @param Tokenizer $tokens
|
* @param Tokenizer $tokens
|
||||||
* @param Template $tpl
|
* @param Template $tpl
|
||||||
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function getVar(Tokenizer $tokens, Template $tpl)
|
public static function getVar(Tokenizer $tokens, Template $tpl)
|
||||||
{
|
{
|
||||||
@ -47,6 +57,7 @@ class Accessor {
|
|||||||
/**
|
/**
|
||||||
* Accessor for template information
|
* Accessor for template information
|
||||||
* @param Tokenizer $tokens
|
* @param Tokenizer $tokens
|
||||||
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function tpl(Tokenizer $tokens)
|
public static function tpl(Tokenizer $tokens)
|
||||||
{
|
{
|
||||||
|
@ -795,8 +795,16 @@ class Template extends Render
|
|||||||
}
|
}
|
||||||
$code = $this->parseScalar($tokens, true);
|
$code = $this->parseScalar($tokens, true);
|
||||||
break;
|
break;
|
||||||
|
case '$':
|
||||||
|
$code = $this->parseAccessor($tokens, $is_var);
|
||||||
|
if(!$is_var) {
|
||||||
|
$code = $unary . $code;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case T_VARIABLE:
|
case T_VARIABLE:
|
||||||
|
if(!isset($code)) {
|
||||||
$code = $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");
|
||||||
@ -817,9 +825,6 @@ class Template extends Render
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '$':
|
|
||||||
$code = $unary . $this->parseAccessor($tokens, $is_var);
|
|
||||||
break;
|
|
||||||
case T_DEC:
|
case T_DEC:
|
||||||
case T_INC:
|
case T_INC:
|
||||||
if($this->_options & Fenom::FORCE_VERIFY) {
|
if($this->_options & Fenom::FORCE_VERIFY) {
|
||||||
|
@ -10,23 +10,25 @@ class SandboxTest extends TestCase {
|
|||||||
*/
|
*/
|
||||||
public function test()
|
public function test()
|
||||||
{
|
{
|
||||||
|
return;
|
||||||
|
$this->fenom->setOptions(\Fenom::FORCE_VERIFY);
|
||||||
|
$this->fenom->addAccessor('q', 'Navi::$q', \Fenom::ACCESSOR_VAR);
|
||||||
// $this->assertEquals([1, 2, 4, "as" => 767, "df" => ["qert"]], [1, 2, 4, "as" => 767, "df" => ["qet"]]);
|
// $this->assertEquals([1, 2, 4, "as" => 767, "df" => ["qert"]], [1, 2, 4, "as" => 767, "df" => ["qet"]]);
|
||||||
// $this->fenom->addBlockCompiler('php', 'Fenom\Compiler::nope', function ($tokens, Tag $tag) {
|
// $this->fenom->addBlockCompiler('php', 'Fenom\Compiler::nope', function ($tokens, Tag $tag) {
|
||||||
// return '<?php ' . $tag->cutContent();
|
// return '<?php ' . $tag->cutContent();
|
||||||
// });
|
// });
|
||||||
// $this->tpl('welcome.tpl', '{$a}');
|
// $this->tpl('welcome.tpl', '{$a}');
|
||||||
// var_dump($this->fenom->compileCode('{set $a=$one|min:0..$three|max:4}')->getBody());
|
// var_dump($this->fenom->compileCode('{set $a=$one|min:0..$three|max:4}')->getBody());
|
||||||
// try {
|
try {
|
||||||
// var_dump($this->fenom->compileCode('{foreach $a as $k => $v} {/foreach}')->getBody());
|
var_dump($this->fenom->compileCode('{$.q.ddqd->d() + 333}')->getBody());
|
||||||
// } catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
// print_r($e->getMessage() . "\n" . $e->getTraceAsString());
|
print_r($e->getMessage() . "\n" . $e->getTraceAsString());
|
||||||
// while ($e->getPrevious()) {
|
while ($e->getPrevious()) {
|
||||||
// $e = $e->getPrevious();
|
$e = $e->getPrevious();
|
||||||
// print_r("\n\n" . $e->getMessage() . " in {$e->getFile()}:{$e->getLine()}\n" . $e->getTraceAsString());
|
print_r("\n\n" . $e->getMessage() . " in {$e->getFile()}:{$e->getLine()}\n" . $e->getTraceAsString());
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user