Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
81.25% covered (warning)
81.25%
13 / 16
CRAP
91.23% covered (success)
91.23%
52 / 57
environment
0.00% covered (danger)
0.00%
0 / 1
81.25% covered (warning)
81.25%
13 / 16
29.57
91.23% covered (success)
91.23%
52 / 57
 __construct
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
13 / 13
 get_phpbb_extensions
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
1 / 1
 get_phpbb_config
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 get_phpbb_root_path
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 get_filesystem
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 get_web_root_path
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 1
 get_path_helper
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 get_assets_bag
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 getNamespaceLookUpOrder
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 setNamespaceLookUpOrder
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 render
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 display
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 display_with_assets
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
12 / 12
 inject_assets
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 loadTemplate
0.00% covered (danger)
0.00%
0 / 1
5.05
87.50% covered (warning)
87.50%
7 / 8
 findTemplate
0.00% covered (danger)
0.00%
0 / 1
6.32
62.50% covered (warning)
62.50%
5 / 8
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\template\twig;
use phpbb\template\assets_bag;
class environment extends \Twig\Environment
{
    /** @var \phpbb\config\config */
    protected $phpbb_config;
    /** @var \phpbb\filesystem\filesystem */
    protected $filesystem;
    /** @var \phpbb\path_helper */
    protected $phpbb_path_helper;
    /** @var \Symfony\Component\DependencyInjection\ContainerInterface */
    protected $container;
    /** @var \phpbb\extension\manager */
    protected $extension_manager;
    /** @var \phpbb\event\dispatcher_interface */
    protected $phpbb_dispatcher;
    /** @var string */
    protected $phpbb_root_path;
    /** @var string */
    protected $web_root_path;
    /** @var array **/
    protected $namespace_look_up_order = array('__main__');
    /** @var assets_bag */
    protected $assets_bag;
    /**
    * Constructor
    *
    * @param \phpbb\config\config $phpbb_config The phpBB configuration
    * @param \phpbb\filesystem\filesystem $filesystem
    * @param \phpbb\path_helper $path_helper phpBB path helper
    * @param string $cache_path The path to the cache directory
    * @param \phpbb\extension\manager $extension_manager phpBB extension manager
    * @param \Twig\Loader\LoaderInterface $loader Twig loader interface
    * @param \phpbb\event\dispatcher_interface    $phpbb_dispatcher    Event dispatcher object
    * @param array $options Array of options to pass to Twig
    */
    public function __construct(\phpbb\config\config $phpbb_config, \phpbb\filesystem\filesystem $filesystem, \phpbb\path_helper $path_helper, $cache_path, \phpbb\extension\manager $extension_manager = null, \Twig\Loader\LoaderInterface $loader = null, \phpbb\event\dispatcher_interface $phpbb_dispatcher = null, $options = array())
    {
        $this->phpbb_config = $phpbb_config;
        $this->filesystem = $filesystem;
        $this->phpbb_path_helper = $path_helper;
        $this->extension_manager = $extension_manager;
        $this->phpbb_dispatcher = $phpbb_dispatcher;
        $this->phpbb_root_path = $this->phpbb_path_helper->get_phpbb_root_path();
        $this->assets_bag = new assets_bag();
        $options = array_merge(array(
            'cache'            => (defined('IN_INSTALL')) ? false : $cache_path,
            'debug'            => false,
            'auto_reload'    => (bool) $this->phpbb_config['load_tplcompile'],
            'autoescape'    => false,
        ), $options);
        parent::__construct($loader, $options);
    }
    /**
    * Get the list of enabled phpBB extensions
    *
    * Used in EVENT node
    *
    * @return array
    */
    public function get_phpbb_extensions()
    {
        return ($this->extension_manager) ? $this->extension_manager->all_enabled() : array();
    }
    /**
    * Get phpBB config
    *
    * @return \phpbb\config\config
    */
    public function get_phpbb_config()
    {
        return $this->phpbb_config;
    }
    /**
     * Get the phpBB root path
     *
     * @return string
     */
    public function get_phpbb_root_path()
    {
        return $this->phpbb_root_path;
    }
    /**
    * Get the filesystem object
    *
    * @return \phpbb\filesystem\filesystem
    */
    public function get_filesystem()
    {
        return $this->filesystem;
    }
    /**
    * Get the web root path
    *
    * @return string
    */
    public function get_web_root_path()
    {
        return $this->web_root_path ?? $this->web_root_path = $this->phpbb_path_helper->get_web_root_path();
    }
    /**
    * Get the phpbb path helper object
    *
    * @return \phpbb\path_helper
    */
    public function get_path_helper()
    {
        return $this->phpbb_path_helper;
    }
    /**
     * Gets the assets bag
     *
     * @return assets_bag
     */
    public function get_assets_bag()
    {
        return $this->assets_bag;
    }
    /**
    * Get the namespace look up order
    *
    * @return array
    */
    public function getNamespaceLookUpOrder()
    {
        return $this->namespace_look_up_order;
    }
    /**
    * Set the namespace look up order to load templates from
    *
    * @param array $namespace
    * @return \Twig\Environment
    */
    public function setNamespaceLookUpOrder($namespace)
    {
        $this->namespace_look_up_order = $namespace;
        return $this;
    }
    /**
     * {@inheritdoc}
     */
    public function render($name, array $context = [])
    {
        return $this->display_with_assets($name, $context);
    }
    /**
     * {@inheritdoc}
     */
    public function display($name, array $context = [])
    {
        echo $this->display_with_assets($name, $context);
    }
    /**
     * {@inheritdoc}
     */
    private function display_with_assets($name, array $context = [])
    {
        $placeholder_salt = unique_id();
        if (array_key_exists('definition', $context))
        {
            $context['definition']->set('SCRIPTS', '__SCRIPTS_' . $placeholder_salt . '__');
            $context['definition']->set('STYLESHEETS', '__STYLESHEETS_' . $placeholder_salt . '__');
        }
        /**
        * Allow changing the template output stream before rendering
        *
        * @event core.twig_environment_render_template_before
        * @var    array    context        Array with template variables
        * @var    string  name        The template name
        * @since 3.2.1-RC1
        */
        if ($this->phpbb_dispatcher)
        {
            $vars = array('context', 'name');
            extract($this->phpbb_dispatcher->trigger_event('core.twig_environment_render_template_before', compact($vars)));
        }
        $output = parent::render($name, $context);
        /**
        * Allow changing the template output stream after rendering
        *
        * @event core.twig_environment_render_template_after
        * @var    array    context        Array with template variables
        * @var    string  name        The template name
        * @var    string    output        Rendered template output stream
        * @since 3.2.1-RC1
        */
        if ($this->phpbb_dispatcher)
        {
            $vars = array('context', 'name', 'output');
            extract($this->phpbb_dispatcher->trigger_event('core.twig_environment_render_template_after', compact($vars)));
        }
        return $this->inject_assets($output, $placeholder_salt);
    }
    /**
     * Injects the assets (from INCLUDECSS/JS) in the output.
     *
     * @param string $output
     *
     * @return string
     */
    private function inject_assets($output, $placeholder_salt)
    {
        $output = str_replace('__STYLESHEETS_' . $placeholder_salt . '__', $this->assets_bag->get_stylesheets_content(), $output);
        $output = str_replace('__SCRIPTS_' . $placeholder_salt . '__', $this->assets_bag->get_scripts_content(), $output);
        return $output;
    }
    /**
    * Loads a template by name.
    *
    * @param string  $name  The template name
    * @param integer $index The index if it is an embedded template
    * @return \Twig\Template A template instance representing the given template name
    * @throws \Twig\Error\LoaderError
    */
    public function loadTemplate($name, $index = null)
    {
        if (strpos($name, '@') === false)
        {
            foreach ($this->getNamespaceLookUpOrder() as $namespace)
            {
                try
                {
                    if ($namespace === '__main__')
                    {
                        return parent::loadTemplate($name, $index);
                    }
                    return parent::loadTemplate('@' . $namespace . '/' . $name, $index);
                }
                catch (\Twig\Error\LoaderError $e)
                {
                }
            }
            // We were unable to load any templates
            throw $e;
        }
        else
        {
            return parent::loadTemplate($name, $index);
        }
    }
    /**
    * Finds a template by name.
    *
    * @param string  $name  The template name
    * @return string
    * @throws \Twig\Error\LoaderError
    */
    public function findTemplate($name)
    {
        if (strpos($name, '@') === false)
        {
            foreach ($this->getNamespaceLookUpOrder() as $namespace)
            {
                try
                {
                    if ($namespace === '__main__')
                    {
                        return parent::getLoader()->getCacheKey($name);
                    }
                    return parent::getLoader()->getCacheKey('@' . $namespace . '/' . $name);
                }
                catch (\Twig\Error\LoaderError $e)
                {
                }
            }
            // We were unable to load any templates
            throw $e;
        }
        else
        {
            return parent::getLoader()->getCacheKey($name);
        }
    }
}