vendor/symfony/src/Symfony/Bridge/Twig/Node/TransNode.php
changeset 0 7f95f8617b0b
equal deleted inserted replaced
-1:000000000000 0:7f95f8617b0b
       
     1 <?php
       
     2 
       
     3 /*
       
     4  * This file is part of the Symfony package.
       
     5  *
       
     6  * (c) Fabien Potencier <fabien@symfony.com>
       
     7  *
       
     8  * For the full copyright and license information, please view the LICENSE
       
     9  * file that was distributed with this source code.
       
    10  */
       
    11 
       
    12 namespace Symfony\Bridge\Twig\Node;
       
    13 
       
    14 /**
       
    15  *
       
    16  *
       
    17  * @author Fabien Potencier <fabien@symfony.com>
       
    18  */
       
    19 class TransNode extends \Twig_Node
       
    20 {
       
    21     public function __construct(\Twig_NodeInterface $body, \Twig_NodeInterface $domain, \Twig_Node_Expression $count = null, \Twig_Node_Expression $vars = null, \Twig_Node_Expression $locale = null, $lineno = 0, $tag = null)
       
    22     {
       
    23         parent::__construct(array('count' => $count, 'body' => $body, 'domain' => $domain, 'vars' => $vars, 'locale' => $locale), array(), $lineno, $tag);
       
    24     }
       
    25 
       
    26     /**
       
    27      * Compiles the node to PHP.
       
    28      *
       
    29      * @param \Twig_Compiler $compiler A Twig_Compiler instance
       
    30      */
       
    31     public function compile(\Twig_Compiler $compiler)
       
    32     {
       
    33         $compiler->addDebugInfo($this);
       
    34 
       
    35         $vars = $this->getNode('vars');
       
    36         $defaults = new \Twig_Node_Expression_Array(array(), -1);
       
    37         if ($vars instanceof \Twig_Node_Expression_Array) {
       
    38             $defaults = $this->getNode('vars');
       
    39             $vars = null;
       
    40         }
       
    41         list($msg, $defaults) = $this->compileString($this->getNode('body'), $defaults);
       
    42 
       
    43         $method = null === $this->getNode('count') ? 'trans' : 'transChoice';
       
    44 
       
    45         $compiler
       
    46             ->write('echo $this->env->getExtension(\'translator\')->getTranslator()->'.$method.'(')
       
    47             ->subcompile($msg)
       
    48         ;
       
    49 
       
    50         $compiler->raw(', ');
       
    51 
       
    52         if (null !== $this->getNode('count')) {
       
    53             $compiler
       
    54                 ->subcompile($this->getNode('count'))
       
    55                 ->raw(', ')
       
    56             ;
       
    57         }
       
    58 
       
    59         if (null !== $vars) {
       
    60             $compiler->raw('array_merge(');
       
    61             $this->compileDefaults($compiler, $defaults);
       
    62             $compiler
       
    63                 ->raw(', ')
       
    64                 ->subcompile($this->getNode('vars'))
       
    65                 ->raw(')')
       
    66             ;
       
    67         } else {
       
    68             $this->compileDefaults($compiler, $defaults);
       
    69         }
       
    70 
       
    71         $compiler
       
    72             ->raw(', ')
       
    73             ->subcompile($this->getNode('domain'))
       
    74         ;
       
    75         if (null !== $this->getNode('locale')) {
       
    76             $compiler
       
    77                 ->raw(', ')
       
    78                 ->subcompile($this->getNode('locale'))
       
    79             ;
       
    80         }
       
    81         $compiler->raw(");\n");
       
    82     }
       
    83 
       
    84     protected function compileDefaults(\Twig_Compiler $compiler, \Twig_Node_Expression_Array $defaults)
       
    85     {
       
    86         $compiler->raw('array(');
       
    87         foreach ($defaults as $name => $default) {
       
    88             $compiler
       
    89                 ->repr($name)
       
    90                 ->raw(' => ')
       
    91                 ->subcompile($default)
       
    92                 ->raw(', ')
       
    93             ;
       
    94         }
       
    95         $compiler->raw(')');
       
    96     }
       
    97 
       
    98     protected function compileString(\Twig_NodeInterface $body, \Twig_Node_Expression_Array $vars)
       
    99     {
       
   100         if ($body instanceof \Twig_Node_Expression_Constant) {
       
   101             $msg = $body->getAttribute('value');
       
   102         } elseif ($body instanceof \Twig_Node_Text) {
       
   103             $msg = $body->getAttribute('data');
       
   104         } else {
       
   105             return array($body, $vars);
       
   106         }
       
   107 
       
   108         $current = array();
       
   109         foreach ($vars as $name => $var) {
       
   110             $current[$name] = true;
       
   111         }
       
   112 
       
   113         preg_match_all('/(?<!%)%([^%]+)%/', $msg, $matches);
       
   114         foreach ($matches[1] as $var) {
       
   115             if (!isset($current['%'.$var.'%'])) {
       
   116                 $vars->setNode('%'.$var.'%', new \Twig_Node_Expression_Name($var, $body->getLine()));
       
   117             }
       
   118         }
       
   119 
       
   120         return array(new \Twig_Node_Expression_Constant(str_replace('%%', '%', trim($msg)), $body->getLine()), $vars);
       
   121     }
       
   122 }