diff -r 000000000000 -r 7f95f8617b0b vendor/symfony/src/Symfony/Component/Templating/Loader/FilesystemLoader.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/symfony/src/Symfony/Component/Templating/Loader/FilesystemLoader.php Sat Sep 24 15:40:41 2011 +0200 @@ -0,0 +1,124 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Templating\Loader; + +use Symfony\Component\Templating\Storage\Storage; +use Symfony\Component\Templating\Storage\FileStorage; +use Symfony\Component\Templating\TemplateReferenceInterface; + +/** + * FilesystemLoader is a loader that read templates from the filesystem. + * + * @author Fabien Potencier + * + * @api + */ +class FilesystemLoader extends Loader +{ + protected $templatePathPatterns; + + /** + * Constructor. + * + * @param array $templatePathPatterns An array of path patterns to look for templates + * + * @api + */ + public function __construct($templatePathPatterns) + { + $this->templatePathPatterns = (array) $templatePathPatterns; + } + + /** + * Loads a template. + * + * @param TemplateReferenceInterface $template A template + * + * @return Storage|Boolean false if the template cannot be loaded, a Storage instance otherwise + * + * @api + */ + public function load(TemplateReferenceInterface $template) + { + $file = $template->get('name'); + + if (self::isAbsolutePath($file) && file_exists($file)) { + return new FileStorage($file); + } + + $replacements = array(); + foreach ($template->all() as $key => $value) { + $replacements['%'.$key.'%'] = $value; + } + + $logs = array(); + foreach ($this->templatePathPatterns as $templatePathPattern) { + if (is_file($file = strtr($templatePathPattern, $replacements)) && is_readable($file)) { + if (null !== $this->debugger) { + $this->debugger->log(sprintf('Loaded template file "%s"', $file)); + } + + return new FileStorage($file); + } + + if (null !== $this->debugger) { + $logs[] = sprintf('Failed loading template file "%s"', $file); + } + } + + if (null !== $this->debugger) { + foreach ($logs as $log) { + $this->debugger->log($log); + } + } + + return false; + } + + /** + * Returns true if the template is still fresh. + * + * @param TemplateReferenceInterface $template A template + * @param integer $time The last modification time of the cached template (timestamp) + * + * @api + */ + public function isFresh(TemplateReferenceInterface $template, $time) + { + if (false === $storage = $this->load($template)) { + return false; + } + + return filemtime((string) $storage) < $time; + } + + /** + * Returns true if the file is an existing absolute path. + * + * @param string $file A path + * + * @return true if the path exists and is absolute, false otherwise + */ + static protected function isAbsolutePath($file) + { + if ($file[0] == '/' || $file[0] == '\\' + || (strlen($file) > 3 && ctype_alpha($file[0]) + && $file[1] == ':' + && ($file[2] == '\\' || $file[2] == '/') + ) + ) { + return true; + } + + return false; + } +}