mirror of
https://github.com/Mibew/handlebars.php.git
synced 2025-05-03 10:33:08 +03:00
Merge branch 'master' of https://github.com/mai7star/handlebars.php
This commit is contained in:
commit
ccaa5b1d21
100
src/Handlebars/Loader/InlineLoader.php
Normal file
100
src/Handlebars/Loader/InlineLoader.php
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Handlebars Inline Template string Loader implementation.
|
||||||
|
*
|
||||||
|
* With the InlineLoader, templates can be defined at the end of any PHP source
|
||||||
|
* file:
|
||||||
|
*
|
||||||
|
* $loader = new \Handlebars\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`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Handlebars\Loader;
|
||||||
|
|
||||||
|
use Handlebars\Loader;
|
||||||
|
use Handlebars\String;
|
||||||
|
|
||||||
|
class InlineLoader implements 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 \Handlebars\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 \InvalidArgumentException('InlineLoader expects a valid filename.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_int($offset) || $offset < 0) {
|
||||||
|
throw new \InvalidArgumentException('InlineLoader expects a valid file offset.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->_fileName = $fileName;
|
||||||
|
$this->_offset = $offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a Template by name.
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
*
|
||||||
|
* @return string Mustache Template source
|
||||||
|
*/
|
||||||
|
public function load($name)
|
||||||
|
{
|
||||||
|
$this->loadTemplates();
|
||||||
|
|
||||||
|
if (!array_key_exists($name, $this->_templates)) {
|
||||||
|
throw new \InvalidArgumentException("Template {$name} not found.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->_templates[$name];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse and load templates from the end of a source file.
|
||||||
|
*/
|
||||||
|
protected function loadTemplates()
|
||||||
|
{
|
||||||
|
if (!is_null($this->_templates)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -619,6 +619,23 @@ class HandlebarsTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertEquals('test', $engine->render('loader', array()));
|
$this->assertEquals('test', $engine->render('loader', array()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test inline loader
|
||||||
|
*/
|
||||||
|
public function testInlineLoader()
|
||||||
|
{
|
||||||
|
$loader = new \Handlebars\Loader\InlineLoader(__FILE__, __COMPILER_HALT_OFFSET__);
|
||||||
|
$this->assertEquals('This is a inline template.', $loader->load('template1'));
|
||||||
|
|
||||||
|
$expected = <<<EOM
|
||||||
|
a
|
||||||
|
b
|
||||||
|
c
|
||||||
|
d
|
||||||
|
EOM;
|
||||||
|
$this->assertEquals($expected, $loader->load('template2'));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test file system loader
|
* Test file system loader
|
||||||
*/
|
*/
|
||||||
@ -1206,3 +1223,17 @@ class HandlebarsTest extends \PHPUnit_Framework_TestCase
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Testcase for testInlineLoader
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
__halt_compiler();
|
||||||
|
@@ template1
|
||||||
|
This is a inline template.
|
||||||
|
|
||||||
|
@@ template2
|
||||||
|
a
|
||||||
|
b
|
||||||
|
c
|
||||||
|
d
|
Loading…
Reference in New Issue
Block a user