/lib/mustache/src/Mustache/Loader/InlineLoader.php
PHP | 123 lines | 39 code | 9 blank | 75 comment | 6 complexity | 65f449d1f43febb087fdc90214c7efb4 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-2.1, BSD-3-Clause, MIT, GPL-3.0
- <?php
- /*
- * This file is part of Mustache.php.
- *
- * (c) 2010-2017 Justin Hileman
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * A Mustache Template loader for inline templates.
- *
- * With the InlineLoader, templates can be defined at the end of any PHP source
- * file:
- *
- * $loader = new Mustache_Loader_InlineLoader(__FILE__, __COMPILER_HALT_OFFSET__);
- * $hello = $loader->load('hello');
- * $goodbye = $loader->load('goodbye');
- *
- * __halt_compiler();
- *
- * @@ hello
- * Hello, {{ planet }}!
- *
- * @@ goodbye
- * Goodbye, cruel {{ planet }}
- *
- * Templates are deliniated by lines containing only `@@ name`.
- *
- * The InlineLoader is well-suited to micro-frameworks such as Silex:
- *
- * $app->register(new MustacheServiceProvider, array(
- * 'mustache.loader' => new Mustache_Loader_InlineLoader(__FILE__, __COMPILER_HALT_OFFSET__)
- * ));
- *
- * $app->get('/{name}', function ($name) use ($app) {
- * return $app['mustache']->render('hello', compact('name'));
- * })
- * ->value('name', 'world');
- *
- * // ...
- *
- * __halt_compiler();
- *
- * @@ hello
- * Hello, {{ name }}!
- */
- class Mustache_Loader_InlineLoader implements Mustache_Loader
- {
- protected $fileName;
- protected $offset;
- protected $templates;
- /**
- * The InlineLoader requires a filename and offset to process templates.
- *
- * The magic constants `__FILE__` and `__COMPILER_HALT_OFFSET__` are usually
- * perfectly suited to the job:
- *
- * $loader = new Mustache_Loader_InlineLoader(__FILE__, __COMPILER_HALT_OFFSET__);
- *
- * Note that this only works if the loader is instantiated inside the same
- * file as the inline templates. If the templates are located in another
- * file, it would be necessary to manually specify the filename and offset.
- *
- * @param string $fileName The file to parse for inline templates
- * @param int $offset A string offset for the start of the templates.
- * This usually coincides with the `__halt_compiler`
- * call, and the `__COMPILER_HALT_OFFSET__`
- */
- public function __construct($fileName, $offset)
- {
- if (!is_file($fileName)) {
- throw new Mustache_Exception_InvalidArgumentException('InlineLoader expects a valid filename.');
- }
- if (!is_int($offset) || $offset < 0) {
- throw new Mustache_Exception_InvalidArgumentException('InlineLoader expects a valid file offset.');
- }
- $this->fileName = $fileName;
- $this->offset = $offset;
- }
- /**
- * Load a Template by name.
- *
- * @throws Mustache_Exception_UnknownTemplateException If a template file is not found
- *
- * @param string $name
- *
- * @return string Mustache Template source
- */
- public function load($name)
- {
- $this->loadTemplates();
- if (!array_key_exists($name, $this->templates)) {
- throw new Mustache_Exception_UnknownTemplateException($name);
- }
- return $this->templates[$name];
- }
- /**
- * Parse and load templates from the end of a source file.
- */
- protected function loadTemplates()
- {
- if ($this->templates === null) {
- $this->templates = array();
- $data = file_get_contents($this->fileName, false, null, $this->offset);
- foreach (preg_split("/^@@(?= [\w\d\.]+$)/m", $data, -1) as $chunk) {
- if (trim($chunk)) {
- list($name, $content) = explode("\n", $chunk, 2);
- $this->templates[trim($name)] = trim($content);
- }
- }
- }
- }
- }