Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
87.50% covered (warning)
87.50%
7 / 8
CRAP
98.00% covered (success)
98.00%
49 / 50
extension
0.00% covered (danger)
0.00%
0 / 1
87.50% covered (warning)
87.50%
7 / 8
14
98.00% covered (success)
98.00%
49 / 50
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 getName
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 getTokenParsers
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
8 / 8
 getFilters
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 getFunctions
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getOperators
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
19 / 19
 loop_subset
100.00% covered (success)
100.00%
1 / 1
5
100.00% covered (success)
100.00%
7 / 7
 lang
0.00% covered (danger)
0.00%
0 / 1
3.03
85.71% covered (warning)
85.71%
6 / 7
<?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;
class extension extends \Twig_Extension
{
    /** @var \phpbb\template\context */
    protected $context;
    /** @var \phpbb\language\language */
    protected $language;
    /**
    * Constructor
    *
    * @param \phpbb\template\context $context
    * @param \phpbb\language\language $language
    * @return \phpbb\template\twig\extension
    */
    public function __construct(\phpbb\template\context $context, $language)
    {
        $this->context = $context;
        $this->language = $language;
    }
    /**
    * Get the name of this extension
    *
    * @return string
    */
    public function getName()
    {
        return 'phpbb';
    }
    /**
    * Returns the token parser instance to add to the existing list.
    *
    * @return array An array of Twig_TokenParser instances
    */
    public function getTokenParsers()
    {
        return array(
            new \phpbb\template\twig\tokenparser\defineparser,
            new \phpbb\template\twig\tokenparser\includeparser,
            new \phpbb\template\twig\tokenparser\includejs,
            new \phpbb\template\twig\tokenparser\includecss,
            new \phpbb\template\twig\tokenparser\event,
            new \phpbb\template\twig\tokenparser\includephp,
            new \phpbb\template\twig\tokenparser\php,
        );
    }
    /**
    * Returns a list of filters to add to the existing list.
    *
    * @return array An array of filters
    */
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('subset', array($this, 'loop_subset'), array('needs_environment' => true)),
            // @deprecated 3.2.0 Uses twig's JS escape method instead of addslashes
            new \Twig_SimpleFilter('addslashes', 'addslashes'),
        );
    }
    /**
    * Returns a list of global functions to add to the existing list.
    *
    * @return array An array of global functions
    */
    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('lang', array($this, 'lang')),
        );
    }
    /**
    * Returns a list of operators to add to the existing list.
    *
    * @return array An array of operators
    */
    public function getOperators()
    {
        return array(
            array(
                '!' => array('precedence' => 50, 'class' => 'Twig_Node_Expression_Unary_Not'),
            ),
            array(
                // precedence settings are copied from similar operators in Twig core extension
                '||' => array('precedence' => 10, 'class' => 'Twig_Node_Expression_Binary_Or', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
                '&&' => array('precedence' => 15, 'class' => 'Twig_Node_Expression_Binary_And', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
                'eq' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Equal', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
                'ne' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_NotEqual', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
                'neq' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_NotEqual', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
                '<>' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_NotEqual', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
                '===' => array('precedence' => 20, 'class' => '\phpbb\template\twig\node\expression\binary\equalequal', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
                '!==' => array('precedence' => 20, 'class' => '\phpbb\template\twig\node\expression\binary\notequalequal', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
                'gt' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Greater', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
                'gte' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_GreaterEqual', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
                'ge' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_GreaterEqual', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
                'lt' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Less', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
                'lte' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_LessEqual', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
                'le' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_LessEqual', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
                'mod' => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_Mod', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
            ),
        );
    }
    /**
    * Grabs a subset of a loop
    *
    * @param \Twig_Environment $env          A Twig_Environment instance
    * @param mixed            $item         A variable
    * @param integer          $start        Start of the subset
    * @param integer          $end            End of the subset
    * @param Boolean          $preserveKeys Whether to preserve key or not (when the input is an array)
    *
    * @return mixed The sliced variable
    */
    function loop_subset(\Twig_Environment $env, $item, $start, $end = null, $preserveKeys = false)
    {
        // We do almost the same thing as Twig's slice (array_slice), except when $end is positive
        if ($end >= 1)
        {
            // When end is > 1, subset will end on the last item in an array with the specified $end
            // This is different from slice in that it is the number we end on rather than the number
            //  of items to grab (length)
            // Start must always be the actual starting number for this calculation (not negative)
            $start = ($start < 0) ? count($item) + $start : $start;
            $end = $end - $start;
        }
        // We always include the last element (this was the past design)
        $end = ($end == -1 || $end === null) ? null : $end + 1;
        return twig_slice($env, $item, $start, $end, $preserveKeys);
    }
    /**
    * Get output for a language variable (L_FOO, LA_FOO)
    *
    * This function checks to see if the language var was outputted to $context
    * (e.g. in the ACP, L_TITLE)
    * If not, we return the result of $user->lang()
    *
    * @return string
    */
    function lang()
    {
        $args = func_get_args();
        $key = $args[0];
        $context_vars = $this->context->get_root_ref();
        if (is_string($key) && isset($context_vars['L_' . $key]))
        {
            return $context_vars['L_' . $key];
        }
        // LA_ is transformed into lang(\'$1\')|escape('js'), so we should not
        // need to check for it
        return call_user_func_array(array($this->language, 'lang'), $args);
    }
}