/** * @dataProvider sourcesProvider */ public function testCompiles($source, $expectedOutput, $locals) { // // parse // $parseContext = new ParserContext(); $parseContext->setString($source)->setBaseDirectory(__DIR__); $template = $parseContext->parse(); $this->assertInstanceOf('Skrz\\Templating\\Engine\\AST\\TemplateNode', $template); // // compile // $compilerContext = new CompilerContext(); $compilerContext->setNamespace('Skrz\\Templating\\Engine')->setClassName("Template_" . sha1(uniqid('', true)))->setTemplate($template)->setParserContext($parseContext)->addModifier("strip_tags", function (Compiler $compiler, ModifierNode $modifier, $text) { return new ModifierCompilerResult("strip_tags({$text})"); })->addFunction("inferno", function (Compiler $compiler, FunctionNode $function) { /** @var StatementAndExpressionVO $hell */ $hell = $compiler->walk($function->getArgument("hell")); $ret = ""; $ret .= "echo '666 ';"; $ret .= $hell->getStatement(); $ret .= "echo " . $hell->getExpression() . ";"; $ret .= "echo ' 666';"; return new FunctionCompilerResult($ret); }); $compiled = $compilerContext->compile(); // // debug // // echo "\n\n"; // echo "$source\n"; // echo "--------\n"; // echo $compiled; // echo "\n"; // // run // $this->assertNull(eval("?>{$compiled}")); $fullyQualifiedClassName = $compilerContext->getFullyQualifiedClassName(); $templateInstance = new $fullyQualifiedClassName(); ob_start(); $templateInstance($locals); $actualOutput = ob_get_contents(); ob_end_clean(); $this->assertEquals($expectedOutput, $actualOutput); }
public function getFullyQualifiedClassName($templateFile = null) { if ($templateFile === null) { $templateFile = !is_null($this->template) ? $this->template->getContext()->getFile() : $this->parserContext->getFile(); if ($this->className !== null) { return "\\" . trim(trim($this->namespace, "\\") . "\\" . trim($this->className, "\\"), "\\"); } } return "\\" . trim(trim($this->namespace, "\\") . "\\" . trim($this->formatClassName($templateFile), "\\"), "\\"); }
public function fetch($templateFile) { if (strncmp($templateFile, "string:", strlen("string:")) === 0) { $this->parserContext->setString(substr($templateFile, strlen("string:"))); $this->compilerContext->setClassName("Template_" . md5($this->parserContext->getString())); } else { if (!is_null($this->parserContext->getBaseDirectory()) && strncmp($templateFile, $this->parserContext->getBaseDirectory(), strlen($this->parserContext->getBaseDirectory())) === 0) { $templateFile = substr($templateFile, strlen($this->parserContext->getBaseDirectory()) + 1); } // must be set before CompilerContext::getFullyQualifiedClassName() is called // FIXME: uncouple this $this->parserContext->setFile($templateFile); } $className = $this->compilerContext->getFullyQualifiedClassName(); if (!class_exists($className)) { $saveFileName = $this->classDirectory . "/" . str_replace("\\", "/", trim($className, "\\") . ".php"); if (file_exists($saveFileName)) { require_once $saveFileName; } else { $oldUmask = umask(0); $compiledTemplate = $this->compilerContext->setTemplate($this->parserContext->parse())->compile(); if (!is_dir(dirname($saveFileName))) { @mkdir(dirname($saveFileName), $this->dirPerms, true); } file_put_contents($saveFileName, $compiledTemplate); @chmod($saveFileName, $this->dirPerms); umask($oldUmask); require_once $saveFileName; } } $templateInstance = new $className(); ob_start(); $templateInstance($this->locals); $output = ob_get_clean(); foreach ($this->outputFilters as $filter) { $output = $filter($output); } return $output; }