vendor/twig/lib/Twig/Environment.php
author cavaliet
Mon, 07 Jul 2014 17:23:47 +0200
changeset 122 d672f7dd74dc
parent 0 7f95f8617b0b
permissions -rwxr-xr-x
Added tag V00.17 for changeset ada5f3d8b5b4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * This file is part of Twig.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * (c) 2009 Fabien Potencier
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * For the full copyright and license information, please view the LICENSE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * file that was distributed with this source code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
 * Stores the Twig configuration.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 * @package twig
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 * @author  Fabien Potencier <fabien@symfony.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
class Twig_Environment
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    const VERSION = '1.1.2';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    protected $charset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    protected $loader;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    protected $debug;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    protected $autoReload;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    protected $cache;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    protected $lexer;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    protected $parser;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    protected $compiler;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    protected $baseTemplateClass;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    protected $extensions;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    protected $parsers;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    protected $visitors;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    protected $filters;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    protected $tests;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    protected $functions;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    protected $globals;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    protected $runtimeInitialized;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    protected $loadedTemplates;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    protected $strictVariables;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    protected $unaryOperators;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
    protected $binaryOperators;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
    protected $templateClassPrefix = '__TwigTemplate_';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    protected $functionCallbacks;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
    protected $filterCallbacks;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
     * Constructor.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
     * Available options:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
     *  * debug: When set to `true`, the generated templates have a __toString()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
     *           method that you can use to display the generated nodes (default to
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
     *           false).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
     *  * charset: The charset used by the templates (default to utf-8).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
     *  * base_template_class: The base template class to use for generated
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
     *                         templates (default to Twig_Template).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
     *  * cache: An absolute path where to store the compiled templates, or
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
     *           false to disable compilation cache (default)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
     *  * auto_reload: Whether to reload the template is the original source changed.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
     *                 If you don't provide the auto_reload option, it will be
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
     *                 determined automatically base on the debug value.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
     *  * strict_variables: Whether to ignore invalid variables in templates
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
     *                      (default to false).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
     *  * autoescape: Whether to enable auto-escaping (default to true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
     *  * optimizations: A flag that indicates which optimizations to apply
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
     *                   (default to -1 which means that all optimizations are enabled;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
     *                   set it to 0 to disable)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
     * @param Twig_LoaderInterface   $loader  A Twig_LoaderInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
     * @param array                  $options An array of options
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    public function __construct(Twig_LoaderInterface $loader = null, $options = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
        if (null !== $loader) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
            $this->setLoader($loader);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
        $options = array_merge(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
            'debug'               => false,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
            'charset'             => 'UTF-8',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
            'base_template_class' => 'Twig_Template',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
            'strict_variables'    => false,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
            'autoescape'          => true,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
            'cache'               => false,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
            'auto_reload'         => null,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
            'optimizations'       => -1,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
        ), $options);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
        $this->debug              = (bool) $options['debug'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
        $this->charset            = $options['charset'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
        $this->baseTemplateClass  = $options['base_template_class'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
        $this->autoReload         = null === $options['auto_reload'] ? $this->debug : (bool) $options['auto_reload'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
        $this->extensions         = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
            'core'      => new Twig_Extension_Core(),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
            'escaper'   => new Twig_Extension_Escaper((bool) $options['autoescape']),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
            'optimizer' => new Twig_Extension_Optimizer($options['optimizations']),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
        );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
        $this->strictVariables    = (bool) $options['strict_variables'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
        $this->runtimeInitialized = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
        $this->setCache($options['cache']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
        $this->functionCallbacks = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
        $this->filterCallbacks = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
     * Gets the base template class for compiled templates.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
     * @return string The base template class name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
    public function getBaseTemplateClass()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        return $this->baseTemplateClass;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
     * Sets the base template class for compiled templates.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
     * @param string $class The base template class name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
    public function setBaseTemplateClass($class)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
        $this->baseTemplateClass = $class;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
     * Enables debugging mode.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
    public function enableDebug()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
        $this->debug = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
     * Disables debugging mode.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
    public function disableDebug()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
        $this->debug = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
     * Checks if debug mode is enabled.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
     * @return Boolean true if debug mode is enabled, false otherwise
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
    public function isDebug()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
        return $this->debug;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
     * Enables the auto_reload option.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
    public function enableAutoReload()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
        $this->autoReload = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
     * Disables the auto_reload option.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
    public function disableAutoReload()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
        $this->autoReload = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
     * Checks if the auto_reload option is enabled.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
     * @return Boolean true if auto_reload is enabled, false otherwise
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
    public function isAutoReload()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
        return $this->autoReload;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
     * Enables the strict_variables option.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
    public function enableStrictVariables()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
        $this->strictVariables = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
     * Disables the strict_variables option.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
    public function disableStrictVariables()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
        $this->strictVariables = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
     * Checks if the strict_variables option is enabled.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
     * @return Boolean true if strict_variables is enabled, false otherwise
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
    public function isStrictVariables()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
        return $this->strictVariables;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
     * Gets the cache directory or false if cache is disabled.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
     * @return string|false
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
    public function getCache()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
        return $this->cache;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
     /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
      * Sets the cache directory or false if cache is disabled.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
      *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
      * @param string|false $cache The absolute path to the compiled templates,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
      *                            or false to disable cache
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
      */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
    public function setCache($cache)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
        $this->cache = $cache ? $cache : false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
     * Gets the cache filename for a given template.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
     * @param string $name The template name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
     * @return string The cache file name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
    public function getCacheFilename($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
        if (false === $this->cache) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
            return false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
        $class = substr($this->getTemplateClass($name), strlen($this->templateClassPrefix));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
        return $this->getCache().'/'.substr($class, 0, 2).'/'.substr($class, 2, 2).'/'.substr($class, 4).'.php';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
     * Gets the template class associated with the given string.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
     * @param string $name The name for which to calculate the template class name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
     * @return string The template class name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
    public function getTemplateClass($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
        return $this->templateClassPrefix.md5($this->loader->getCacheKey($name));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
     * Gets the template class prefix.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
     * @return string The template class prefix
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
    public function getTemplateClassPrefix()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
        return $this->templateClassPrefix;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
     * Renders a template.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
     * @param string $name    The template name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
     * @param array  $context An array of parameters to pass to the template
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
     * @return string The rendered template
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
    public function render($name, array $context = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
        return $this->loadTemplate($name)->render($context);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
     * Loads a template by name.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
     * @param  string  $name  The template name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
     * @return Twig_TemplateInterface A template instance representing the given template name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
    public function loadTemplate($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
        $cls = $this->getTemplateClass($name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
        if (isset($this->loadedTemplates[$cls])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
            return $this->loadedTemplates[$cls];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
        if (!class_exists($cls, false)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
            if (false === $cache = $this->getCacheFilename($name)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
                eval('?>'.$this->compileSource($this->loader->getSource($name), $name));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
                if (!file_exists($cache) || ($this->isAutoReload() && !$this->loader->isFresh($name, filemtime($cache)))) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
                    $this->writeCacheFile($cache, $this->compileSource($this->loader->getSource($name), $name));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
                require_once $cache;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
        if (!$this->runtimeInitialized) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
            $this->initRuntime();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
        return $this->loadedTemplates[$cls] = new $cls($this);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
     * Clears the internal template cache.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
    public function clearTemplateCache()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
        $this->loadedTemplates = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
     * Clears the template cache files on the filesystem.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
    public function clearCacheFiles()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
        if (false === $this->cache) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
            return;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
        foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->cache), RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
            if ($file->isFile()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
                @unlink($file->getPathname());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
     * Gets the Lexer instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
     * @return Twig_LexerInterface A Twig_LexerInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
    public function getLexer()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
        if (null === $this->lexer) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
            $this->lexer = new Twig_Lexer($this);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
        return $this->lexer;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
     * Sets the Lexer instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
     * @param Twig_LexerInterface A Twig_LexerInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
    public function setLexer(Twig_LexerInterface $lexer)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
        $this->lexer = $lexer;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
     * Tokenizes a source code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
     * @param string $source The template source code
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
     * @param string $name   The template name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
     * @return Twig_TokenStream A Twig_TokenStream instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
    public function tokenize($source, $name = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
        return $this->getLexer()->tokenize($source, $name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
     * Gets the Parser instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
     * @return Twig_ParserInterface A Twig_ParserInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
    public function getParser()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
        if (null === $this->parser) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
            $this->parser = new Twig_Parser($this);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
        return $this->parser;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
     * Sets the Parser instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
     * @param Twig_ParserInterface A Twig_ParserInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
    public function setParser(Twig_ParserInterface $parser)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
        $this->parser = $parser;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
     * Parses a token stream.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
     * @param Twig_TokenStream $tokens A Twig_TokenStream instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
     * @return Twig_Node_Module A Node tree
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
    public function parse(Twig_TokenStream $tokens)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
        return $this->getParser()->parse($tokens);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
     * Gets the Compiler instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
     * @return Twig_CompilerInterface A Twig_CompilerInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
    public function getCompiler()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
        if (null === $this->compiler) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
            $this->compiler = new Twig_Compiler($this);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
        return $this->compiler;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
     * Sets the Compiler instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
     * @param Twig_CompilerInterface $compiler A Twig_CompilerInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
    public function setCompiler(Twig_CompilerInterface $compiler)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
        $this->compiler = $compiler;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
     * Compiles a Node.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
     * @param Twig_NodeInterface $node A Twig_NodeInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
     * @return string The compiled PHP source code
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
    public function compile(Twig_NodeInterface $node)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
        return $this->getCompiler()->compile($node)->getSource();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
     * Compiles a template source code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
     * @param string $source The template source code
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
     * @param string $name   The template name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
     * @return string The compiled PHP source code
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
    public function compileSource($source, $name = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
        try {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
            return $this->compile($this->parse($this->tokenize($source, $name)));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
        } catch (Twig_Error $e) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
            $e->setTemplateFile($name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
            throw $e;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
        } catch (Exception $e) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
            throw new Twig_Error_Runtime(sprintf('An exception has been thrown during the compilation of a template ("%s").', $e->getMessage()), -1, $name, $e);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
     * Sets the Loader instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
     * @param Twig_LoaderInterface $loader A Twig_LoaderInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
    public function setLoader(Twig_LoaderInterface $loader)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
        $this->loader = $loader;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
     * Gets the Loader instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
     * @return Twig_LoaderInterface A Twig_LoaderInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
    public function getLoader()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
        return $this->loader;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
     * Sets the default template charset.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
     * @param string $charset The default charset
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
    public function setCharset($charset)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
        $this->charset = $charset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
     * Gets the default template charset.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
     * @return string The default charset
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
    public function getCharset()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
        return $this->charset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
     * Initializes the runtime environment.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
    public function initRuntime()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
        $this->runtimeInitialized = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
        foreach ($this->getExtensions() as $extension) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
            $extension->initRuntime($this);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
     * Returns true if the given extension is registered.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
     * @param string $name The extension name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
     * @return Boolean Whether the extension is registered or not
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
    public function hasExtension($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
        return isset($this->extensions[$name]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
     * Gets an extension by name.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
     * @param string $name The extension name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
     * @return Twig_ExtensionInterface A Twig_ExtensionInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
    public function getExtension($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
        if (!isset($this->extensions[$name])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
            throw new Twig_Error_Runtime(sprintf('The "%s" extension is not enabled.', $name));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
        return $this->extensions[$name];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
     * Registers an extension.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
     * @param Twig_ExtensionInterface $extension A Twig_ExtensionInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
    public function addExtension(Twig_ExtensionInterface $extension)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
        $this->extensions[$extension->getName()] = $extension;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
     * Removes an extension by name.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
     * @param string $name The extension name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
    public function removeExtension($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
        unset($this->extensions[$name]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
     * Registers an array of extensions.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
     * @param array $extensions An array of extensions
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
    public function setExtensions(array $extensions)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
        foreach ($extensions as $extension) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
            $this->addExtension($extension);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
     * Returns all registered extensions.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
     * @return array An array of extensions
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
    public function getExtensions()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
        return $this->extensions;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
     * Registers a Token Parser.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
     * @param Twig_TokenParserInterface $parser A Twig_TokenParserInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
    public function addTokenParser(Twig_TokenParserInterface $parser)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
        if (null === $this->parsers) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
            $this->getTokenParsers();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
        $this->parsers->addTokenParser($parser);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
     * Gets the registered Token Parsers.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
     * @return Twig_TokenParserInterface[] An array of Twig_TokenParserInterface instances
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
    public function getTokenParsers()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
        if (null === $this->parsers) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
            $this->parsers = new Twig_TokenParserBroker;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
            foreach ($this->getExtensions() as $extension) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
                $parsers = $extension->getTokenParsers();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
                foreach($parsers as $parser) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
                    if ($parser instanceof Twig_TokenParserInterface) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
                        $this->parsers->addTokenParser($parser);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
                    } else if ($parser instanceof Twig_TokenParserBrokerInterface) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
                        $this->parsers->addTokenParserBroker($parser);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
                    } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
                        throw new Twig_Error_Runtime('getTokenParsers() must return an array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
        return $this->parsers;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
     * Registers a Node Visitor.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
     * @param Twig_NodeVisitorInterface $visitor A Twig_NodeVisitorInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
    public function addNodeVisitor(Twig_NodeVisitorInterface $visitor)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
        if (null === $this->visitors) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
            $this->getNodeVisitors();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
        $this->visitors[] = $visitor;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
     * Gets the registered Node Visitors.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
     * @return Twig_NodeVisitorInterface[] An array of Twig_NodeVisitorInterface instances
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
    public function getNodeVisitors()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
        if (null === $this->visitors) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
            $this->visitors = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
            foreach ($this->getExtensions() as $extension) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
                $this->visitors = array_merge($this->visitors, $extension->getNodeVisitors());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
        return $this->visitors;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
     * Registers a Filter.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
     * @param string               $name    The filter name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
     * @param Twig_FilterInterface $visitor A Twig_FilterInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
    public function addFilter($name, Twig_FilterInterface $filter)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
        if (null === $this->filters) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
            $this->loadFilters();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
        $this->filters[$name] = $filter;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
     * Get a filter by name.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
     * Subclasses may override this method and load filters differently;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
     * so no list of filters is available.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
     * @param string $name The filter name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
     * @return Twig_Filter|false A Twig_Filter instance or false if the filter does not exists
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
    public function getFilter($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
        if (null === $this->filters) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   693
            $this->loadFilters();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
        if (isset($this->filters[$name])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
            return $this->filters[$name];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
        foreach ($this->filterCallbacks as $callback) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
            if (false !== $filter = call_user_func($callback, $name)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
                return $filter;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
        return false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
    public function registerUndefinedFilterCallback($callable)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
        $this->filterCallbacks[] = $callable;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
     * Gets the registered Filters.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
     * @return Twig_FilterInterface[] An array of Twig_FilterInterface instances
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
    protected function loadFilters()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
        $this->filters = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
        foreach ($this->getExtensions() as $extension) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
            $this->filters = array_merge($this->filters, $extension->getFilters());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
     * Registers a Test.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
     * @param string             $name    The test name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
     * @param Twig_TestInterface $visitor A Twig_TestInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
    public function addTest($name, Twig_TestInterface $test)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
        if (null === $this->tests) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
            $this->getTests();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
        $this->tests[$name] = $test;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
     * Gets the registered Tests.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
     * @return Twig_TestInterface[] An array of Twig_TestInterface instances
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
    public function getTests()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
        if (null === $this->tests) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
            $this->tests = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
            foreach ($this->getExtensions() as $extension) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
                $this->tests = array_merge($this->tests, $extension->getTests());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
        return $this->tests;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
     * Registers a Function.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
     * @param string                 $name     The function name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
     * @param Twig_FunctionInterface $function A Twig_FunctionInterface instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
    public function addFunction($name, Twig_FunctionInterface $function)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
        if (null === $this->functions) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
            $this->loadFunctions();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
        $this->functions[$name] = $function;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
     * Get a function by name.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
     * Subclasses may override this method and load functions differently;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
     * so no list of functions is available.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
     * @param string $name function name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
     * @return Twig_Function|false A Twig_Function instance or false if the function does not exists
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
    public function getFunction($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
        if (null === $this->functions) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
            $this->loadFunctions();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
        if (isset($this->functions[$name])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
            return $this->functions[$name];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
        foreach ($this->functionCallbacks as $callback) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
            if (false !== $function = call_user_func($callback, $name)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
                return $function;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
        return false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
    public function registerUndefinedFunctionCallback($callable)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
        $this->functionCallbacks[] = $callable;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
    protected function loadFunctions()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
        $this->functions = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
        foreach ($this->getExtensions() as $extension) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
            $this->functions = array_merge($this->functions, $extension->getFunctions());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
     * Registers a Global.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
     * @param string $name  The global name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
     * @param mixed  $value The global value
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
    public function addGlobal($name, $value)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
        if (null === $this->globals) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
            $this->getGlobals();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
        $this->globals[$name] = $value;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
     * Gets the registered Globals.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
     * @return array An array of globals
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
    public function getGlobals()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   838
        if (null === $this->globals) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
            $this->globals = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
            foreach ($this->getExtensions() as $extension) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
                $this->globals = array_merge($this->globals, $extension->getGlobals());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   845
        return $this->globals;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
     * Gets the registered unary Operators.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
     * @return array An array of unary operators
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
    public function getUnaryOperators()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
        if (null === $this->unaryOperators) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
            $this->initOperators();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
        return $this->unaryOperators;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
     * Gets the registered binary Operators.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
     * @return array An array of binary operators
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
    public function getBinaryOperators()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
        if (null === $this->binaryOperators) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
            $this->initOperators();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
        return $this->binaryOperators;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
    protected function initOperators()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
        $this->unaryOperators = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
        $this->binaryOperators = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
        foreach ($this->getExtensions() as $extension) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
            $operators = $extension->getOperators();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
            if (!$operators) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
                continue;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
            if (2 !== count($operators)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
                throw new InvalidArgumentException(sprintf('"%s::getOperators()" does not return a valid operators array.', get_class($extension)));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
            $this->unaryOperators = array_merge($this->unaryOperators, $operators[0]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   892
            $this->binaryOperators = array_merge($this->binaryOperators, $operators[1]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   893
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   894
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   896
    protected function writeCacheFile($file, $content)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   897
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
        if (!is_dir(dirname($file))) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
            mkdir(dirname($file), 0777, true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   902
        $tmpFile = tempnam(dirname($file), basename($file));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   903
        if (false !== @file_put_contents($tmpFile, $content)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   904
            // rename does not work on Win32 before 5.2.6
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   905
            if (@rename($tmpFile, $file) || (@copy($tmpFile, $file) && unlink($tmpFile))) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   906
                chmod($file, 0644);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   907
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   908
                return;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   909
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   910
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   911
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   912
        throw new Twig_Error_Runtime(sprintf('Failed to write cache file "%s".', $file));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   913
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   914
}