/** * @param Tokenizer $tokens * @param Template $tpl * @return string */ public static function php(Tokenizer $tokens, Template $tpl) { $callable = array($tokens->skip('.')->need(Tokenizer::MACRO_STRING)->getAndNext()); while ($tokens->is('.')) { $callable[] = $tokens->next()->need(Tokenizer::MACRO_STRING)->getAndNext(); } $callable = implode('\\', $callable); if ($tokens->is(T_DOUBLE_COLON)) { $callable .= '::' . $tokens->next()->need(Tokenizer::MACRO_STRING)->getAndNext(); } $call_filter = $tpl->getStorage()->call_filters; if ($call_filter) { foreach ($call_filter as $filter) { if (!fnmatch(addslashes($filter), $callable)) { throw new \LogicException("Callback " . str_replace('\\', '.', $callable) . " is not available by settings"); } } } if (!is_callable($callable)) { throw new \RuntimeException("PHP method " . str_replace('\\', '.', $callable) . ' does not exists.'); } if ($tokens->is('(')) { $arguments = 'array' . $tpl->parseArgs($tokens) . ''; } else { $arguments = 'array()'; } return 'call_user_func_array(' . var_export($callable, true) . ', ' . $arguments . ')'; }
/** * @param Tokenizer $tokens * @param Scope $scope */ public static function autoescapeOpen(Tokenizer $tokens, Scope $scope) { $boolean = $tokens->get(T_STRING) == "true" ? true : false; $scope["escape"] = $scope->tpl->escape; $scope->tpl->escape = $boolean; $tokens->next(); }
/** * Accessor {$.block.NAME} * @param Tokenizer $tokens * @param Template $tpl * @return mixed */ public static function block(Tokenizer $tokens, Template $tpl) { if ($tokens->is('.')) { $name = $tokens->next()->get(Tokenizer::MACRO_STRING); $tokens->next(); return isset($tpl->blocks[$name]) ? 'true' : 'false'; } else { return "array(" . implode(",", array_keys($tpl->blocks)) . ")"; } }
/** * Parse parameters as $key=$value * param1=$var param2=3 ... * * @static * @param Tokenizer $tokens * @param array $defaults * @throws \Exception * @return array */ public function parseParams(Tokenizer $tokens, array $defaults = null) { $params = array(); while ($tokens->valid()) { if ($tokens->is(Tokenizer::MACRO_STRING)) { $key = $tokens->getAndNext(); if ($defaults && !isset($defaults[$key])) { throw new InvalidUsageException("Unknown parameter '{$key}'"); } if ($tokens->is("=")) { $tokens->next(); $params[$key] = $this->parseExpr($tokens); } else { throw new InvalidUsageException("Invalid value for parameter '{$key}'"); } } elseif ($tokens->is(Tokenizer::MACRO_SCALAR, '"', T_VARIABLE, "[", '(')) { $params[] = $this->parseExpr($tokens); } else { break; } } if ($defaults) { $params += $defaults; } return $params; }
public static function tagPaste(Tokenizer $tokens, Tag $tag) { $name = $tokens->get(T_CONSTANT_ENCAPSED_STRING); $tokens->next(); if (isset($tag->tpl->blocks[$name])) { return "?>" . substr($tag->tpl->blocks[$name]["block"], 1, -1) . "<?php "; } else { return ""; } }
public function testFixFloats() { $text = "1..3"; $tokens = new Tokenizer($text); $this->assertTrue($tokens->is(T_LNUMBER)); $this->assertTrue($tokens->next()->is('.')); $this->assertTrue($tokens->next()->is('.')); $this->assertTrue($tokens->next()->is(T_LNUMBER)); }
/** * @param Tokenizer $tokens * @param Tag $tag */ public static function stripOpen(Tokenizer $tokens, Tag $tag) { $expected = $tokens->get(T_STRING) == "true" ? true : false; $tokens->next(); $tag->setOption(\Fenom::AUTO_STRIP, $expected); }