vendor/twig-extensions/lib/Twig/Extensions/Node/Trans.php
changeset 0 7f95f8617b0b
equal deleted inserted replaced
-1:000000000000 0:7f95f8617b0b
       
     1 <?php
       
     2 
       
     3 /*
       
     4  * This file is part of Twig.
       
     5  *
       
     6  * (c) 2010 Fabien Potencier
       
     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 /**
       
    13  * Represents a trans node.
       
    14  *
       
    15  * @package    twig
       
    16  * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
       
    17  */
       
    18 class Twig_Extensions_Node_Trans extends Twig_Node
       
    19 {
       
    20     public function __construct(Twig_NodeInterface $body, Twig_NodeInterface $plural = null, Twig_Node_Expression $count = null, $lineno, $tag = null)
       
    21     {
       
    22         parent::__construct(array('count' => $count, 'body' => $body, 'plural' => $plural), array(), $lineno, $tag);
       
    23     }
       
    24 
       
    25     /**
       
    26      * Compiles the node to PHP.
       
    27      *
       
    28      * @param Twig_Compiler A Twig_Compiler instance
       
    29      */
       
    30     public function compile(Twig_Compiler $compiler)
       
    31     {
       
    32         $compiler->addDebugInfo($this);
       
    33 
       
    34         list($msg, $vars) = $this->compileString($this->getNode('body'));
       
    35 
       
    36         if (null !== $this->getNode('plural')) {
       
    37             list($msg1, $vars1) = $this->compileString($this->getNode('plural'));
       
    38 
       
    39             $vars = array_merge($vars, $vars1);
       
    40         }
       
    41 
       
    42         $function = null === $this->getNode('plural') ? 'gettext' : 'ngettext';
       
    43 
       
    44         if ($vars) {
       
    45             $compiler
       
    46                 ->write('echo strtr('.$function.'(')
       
    47                 ->subcompile($msg)
       
    48             ;
       
    49 
       
    50             if (null !== $this->getNode('plural')) {
       
    51                 $compiler
       
    52                     ->raw(', ')
       
    53                     ->subcompile($msg1)
       
    54                     ->raw(', abs(')
       
    55                     ->subcompile($this->getNode('count'))
       
    56                     ->raw(')')
       
    57                 ;
       
    58             }
       
    59 
       
    60             $compiler->raw('), array(');
       
    61 
       
    62             foreach ($vars as $var) {
       
    63                 if ('count' === $var->getAttribute('name')) {
       
    64                     $compiler
       
    65                         ->string('%count%')
       
    66                         ->raw(' => abs(')
       
    67                         ->subcompile($this->getNode('count'))
       
    68                         ->raw('), ')
       
    69                     ;
       
    70                 } else {
       
    71                     $compiler
       
    72                         ->string('%'.$var->getAttribute('name').'%')
       
    73                         ->raw(' => ')
       
    74                         ->subcompile($var)
       
    75                         ->raw(', ')
       
    76                     ;
       
    77                 }
       
    78             }
       
    79 
       
    80             $compiler->raw("));\n");
       
    81         } else {
       
    82             $compiler
       
    83                 ->write('echo '.$function.'(')
       
    84                 ->subcompile($msg)
       
    85             ;
       
    86 
       
    87             if (null !== $this->getNode('plural')) {
       
    88                 $compiler
       
    89                     ->raw(', ')
       
    90                     ->subcompile($msg1)
       
    91                     ->raw(', abs(')
       
    92                     ->subcompile($this->getNode('count'))
       
    93                     ->raw(')')
       
    94                 ;
       
    95             }
       
    96 
       
    97             $compiler->raw(');');
       
    98         }
       
    99     }
       
   100 
       
   101     protected function compileString(Twig_NodeInterface $body)
       
   102     {
       
   103         if ($body instanceof Twig_Node_Expression_Name || $body instanceof Twig_Node_Expression_Constant) {
       
   104             return array($body, array());
       
   105         }
       
   106 
       
   107         $vars = array();
       
   108 
       
   109         if (count($body)) {
       
   110             $msg = '';
       
   111 
       
   112             foreach ($body as $node) {
       
   113                 if ($node instanceof Twig_Node_Print) {
       
   114                     $n = $node->getNode('expr');
       
   115                     while ($n instanceof Twig_Node_Expression_Filter) {
       
   116                         $n = $n->getNode('node');
       
   117                     }
       
   118                     $msg .= sprintf('%%%s%%', $n->getAttribute('name'));
       
   119                     $vars[] = new Twig_Node_Expression_Name($n->getAttribute('name'), $n->getLine());
       
   120                 } else {
       
   121                     $msg .= $node->getAttribute('data');
       
   122                 }
       
   123             }
       
   124         } else {
       
   125             $msg = $body->getAttribute('data');
       
   126         }
       
   127 
       
   128         return array(new Twig_Node(array(new Twig_Node_Expression_Constant(trim($msg), $body->getLine()))), $vars);
       
   129     }
       
   130 }