4f5a31d2 |
<?php declare(strict_types=1);
/**
* Part of Windwalker project.
*
* @copyright Copyright (C) 2019 LYRASOFT.
* @license LGPL-2.0-or-later
*/
namespace Windwalker\Renderer;
use Windwalker\Renderer\Twig\GlobalContainer;
use Windwalker\Renderer\Twig\TwigFilesystemLoader;
use Windwalker\Structure\Structure;
/**
* Class PhpRenderer
*
* @since 2.0
*/
class TwigRenderer extends AbstractEngineRenderer
{
/**
* Property twig.
*
* @var \Twig_Environment
*/
protected $engine = null;
/**
* Property loader.
*
* @var \Twig_LoaderInterface
*/
protected $loader = null;
/**
* Property extensions.
*
* @var \Twig_ExtensionInterface[]
*/
protected $extensions = [];
/**
* Property config.
*
* @var Structure|array
*/
protected $config = [];
/**
* Property debugExtension.
*
* @var \Twig_Extension_Debug
*/
protected $debugExtension = null;
/**
* render
*
* @param string $file
* @param array|object $data
*
* @throws \UnexpectedValueException
* @return string
*/
public function render($file, $data = [])
{
$file = pathinfo($file, PATHINFO_EXTENSION) === 'twig' ? $file : $file . '.twig';
$this->extensions = array_merge($this->extensions, (array) $this->config->get('extensions', []));
return $this->getEngine()->render($file, $data);
}
/**
* getLoader
*
* @return \Twig_LoaderInterface
*/
public function getLoader()
{
if (!$this->loader) {
if ($this->config->get('path_separator')) {
$this->loader = new TwigFilesystemLoader(
iterator_to_array(clone $this->getPaths()),
$this->config->get('path_separator')
);
} else {
$this->loader = new \Twig_Loader_Filesystem(iterator_to_array(clone $this->getPaths()));
}
}
return $this->loader;
}
/**
* setLoader
*
* @param \Twig_LoaderInterface $loader
*
* @return TwigRenderer Return self to support chaining.
*/
public function setLoader(\Twig_LoaderInterface $loader)
{
$this->loader = $loader;
return $this;
}
/**
* addExtension
*
* @param \Twig_ExtensionInterface $extension
*
* @return static
*/
public function addExtension(\Twig_ExtensionInterface $extension)
{
$this->extensions[] = $extension;
return $this;
}
/**
* getTwig
*
* @param bool $new
*
* @return \Twig_Environment
*/
public function getEngine($new = false)
{
if (!($this->engine instanceof \Twig_Environment) || $new) {
$this->engine = new \Twig_Environment($this->getLoader(), $this->config->toArray());
foreach (GlobalContainer::getExtensions() as $extension) {
$this->engine->addExtension(clone $extension);
}
foreach ($this->extensions as $extension) {
$this->engine->addExtension($extension);
}
foreach (GlobalContainer::getGlobals() as $name => $value) {
$this->engine->addGlobal($name, $value);
}
if ($this->config->get('debug')) {
$this->engine->addExtension($this->getDebugExtension());
}
}
return $this->engine;
}
/**
* setTwig
*
* @param \Twig_Environment $twig
*
* @return TwigRenderer Return self to support chaining.
*/
public function setEngine($twig)
{
if (!($twig instanceof \Twig_Environment)) {
throw new \InvalidArgumentException('Engine object should be Twig_environment');
}
$this->engine = $twig;
return $this;
}
/**
* Method to get property DebugExtension
*
* @return \Twig_Extension_Debug
*/
public function getDebugExtension()
{
if (!$this->debugExtension) {
$this->debugExtension = new \Twig_Extension_Debug();
}
return $this->debugExtension;
}
/**
* Method to set property debugExtension
*
* @param \Twig_ExtensionInterface $debugExtension
*
* @return static Return self to support chaining.
*/
public function setDebugExtension(\Twig_ExtensionInterface $debugExtension)
{
$this->debugExtension = $debugExtension;
return $this;
}
/**
* Method to get property Extensions
*
* @return \Twig_ExtensionInterface[]
*/
public function getExtensions()
{
return $this->extensions;
}
/**
* Method to set property extensions
*
* @param \Twig_ExtensionInterface[] $extensions Twig extenions
*
* @return static Return self to support chaining.
*/
public function setExtensions($extensions)
{
$this->extensions = $extensions;
return $this;
}
}
|