vendor/symfony/src/Symfony/Bridge/Twig/Node/TransNode.php
changeset 0 7f95f8617b0b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/symfony/src/Symfony/Bridge/Twig/Node/TransNode.php	Sat Sep 24 15:40:41 2011 +0200
@@ -0,0 +1,122 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bridge\Twig\Node;
+
+/**
+ *
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TransNode extends \Twig_Node
+{
+    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)
+    {
+        parent::__construct(array('count' => $count, 'body' => $body, 'domain' => $domain, 'vars' => $vars, 'locale' => $locale), array(), $lineno, $tag);
+    }
+
+    /**
+     * Compiles the node to PHP.
+     *
+     * @param \Twig_Compiler $compiler A Twig_Compiler instance
+     */
+    public function compile(\Twig_Compiler $compiler)
+    {
+        $compiler->addDebugInfo($this);
+
+        $vars = $this->getNode('vars');
+        $defaults = new \Twig_Node_Expression_Array(array(), -1);
+        if ($vars instanceof \Twig_Node_Expression_Array) {
+            $defaults = $this->getNode('vars');
+            $vars = null;
+        }
+        list($msg, $defaults) = $this->compileString($this->getNode('body'), $defaults);
+
+        $method = null === $this->getNode('count') ? 'trans' : 'transChoice';
+
+        $compiler
+            ->write('echo $this->env->getExtension(\'translator\')->getTranslator()->'.$method.'(')
+            ->subcompile($msg)
+        ;
+
+        $compiler->raw(', ');
+
+        if (null !== $this->getNode('count')) {
+            $compiler
+                ->subcompile($this->getNode('count'))
+                ->raw(', ')
+            ;
+        }
+
+        if (null !== $vars) {
+            $compiler->raw('array_merge(');
+            $this->compileDefaults($compiler, $defaults);
+            $compiler
+                ->raw(', ')
+                ->subcompile($this->getNode('vars'))
+                ->raw(')')
+            ;
+        } else {
+            $this->compileDefaults($compiler, $defaults);
+        }
+
+        $compiler
+            ->raw(', ')
+            ->subcompile($this->getNode('domain'))
+        ;
+        if (null !== $this->getNode('locale')) {
+            $compiler
+                ->raw(', ')
+                ->subcompile($this->getNode('locale'))
+            ;
+        }
+        $compiler->raw(");\n");
+    }
+
+    protected function compileDefaults(\Twig_Compiler $compiler, \Twig_Node_Expression_Array $defaults)
+    {
+        $compiler->raw('array(');
+        foreach ($defaults as $name => $default) {
+            $compiler
+                ->repr($name)
+                ->raw(' => ')
+                ->subcompile($default)
+                ->raw(', ')
+            ;
+        }
+        $compiler->raw(')');
+    }
+
+    protected function compileString(\Twig_NodeInterface $body, \Twig_Node_Expression_Array $vars)
+    {
+        if ($body instanceof \Twig_Node_Expression_Constant) {
+            $msg = $body->getAttribute('value');
+        } elseif ($body instanceof \Twig_Node_Text) {
+            $msg = $body->getAttribute('data');
+        } else {
+            return array($body, $vars);
+        }
+
+        $current = array();
+        foreach ($vars as $name => $var) {
+            $current[$name] = true;
+        }
+
+        preg_match_all('/(?<!%)%([^%]+)%/', $msg, $matches);
+        foreach ($matches[1] as $var) {
+            if (!isset($current['%'.$var.'%'])) {
+                $vars->setNode('%'.$var.'%', new \Twig_Node_Expression_Name($var, $body->getLine()));
+            }
+        }
+
+        return array(new \Twig_Node_Expression_Constant(str_replace('%%', '%', trim($msg)), $body->getLine()), $vars);
+    }
+}