vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Templating/TemplateNameParser.php
changeset 0 7f95f8617b0b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Templating/TemplateNameParser.php	Sat Sep 24 15:40:41 2011 +0200
@@ -0,0 +1,105 @@
+<?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\Bundle\FrameworkBundle\Templating;
+
+use Symfony\Component\Templating\TemplateNameParser as BaseTemplateNameParser;
+use Symfony\Component\Templating\TemplateReferenceInterface;
+use Symfony\Component\HttpKernel\KernelInterface;
+
+/**
+ * TemplateNameParser converts template names from the short notation
+ * "bundle:section:template.format.engine" to TemplateReferenceInterface
+ * instances.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class TemplateNameParser extends BaseTemplateNameParser
+{
+    protected $kernel;
+    protected $cache;
+
+    /**
+     * Constructor.
+     *
+     * @param KernelInterface $kernel A KernelInterface instance
+     */
+    public function __construct(KernelInterface $kernel)
+    {
+        $this->kernel = $kernel;
+        $this->cache = array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function parse($name)
+    {
+        if ($name instanceof TemplateReferenceInterface) {
+            return $name;
+        } else if (isset($this->cache[$name])) {
+            return $this->cache[$name];
+        }
+
+        // normalize name
+        $name = str_replace(':/', ':', preg_replace('#/{2,}#', '/', strtr($name, '\\', '/')));
+
+        if (false !== strpos($name, '..')) {
+            throw new \RuntimeException(sprintf('Template name "%s" contains invalid characters.', $name));
+        }
+
+        $parts = explode(':', $name);
+        if (3 !== count($parts)) {
+            throw new \InvalidArgumentException(sprintf('Template name "%s" is not valid (format is "bundle:section:template.format.engine").', $name));
+        }
+
+        $elements = explode('.', $parts[2]);
+        if (3 > count($elements)) {
+            throw new \InvalidArgumentException(sprintf('Template name "%s" is not valid (format is "bundle:section:template.format.engine").', $name));
+        }
+        $engine = array_pop($elements);
+        $format = array_pop($elements);
+
+        $template = new TemplateReference($parts[0], $parts[1], implode('.', $elements), $format, $engine);
+
+        if ($template->get('bundle')) {
+            try {
+                $this->kernel->getBundle($template->get('bundle'));
+            } catch (\Exception $e) {
+                throw new \InvalidArgumentException(sprintf('Template name "%s" is not valid.', $name), 0, $e);
+            }
+        }
+
+        return $this->cache[$name] = $template;
+    }
+
+    /**
+     * Convert a filename to a template.
+     *
+     * @param string $file The filename
+     *
+     * @return TemplateReferenceInterface A template
+     */
+    public function parseFromFilename($file)
+    {
+        $parts = explode('/', strtr($file, '\\', '/'));
+
+        $elements = explode('.', array_pop($parts));
+        if (3 > count($elements)) {
+            return false;
+        }
+        $engine = array_pop($elements);
+        $format = array_pop($elements);
+
+        return new TemplateReference('', implode('/', $parts), implode('.', $elements), $format, $engine);
+    }
+
+}