1*04fd306cSNickeau<?php 2*04fd306cSNickeau/** 3*04fd306cSNickeau * 4*04fd306cSNickeau * @category Xamin 5*04fd306cSNickeau * @package Handlebars 6*04fd306cSNickeau * @author fzerorubigd <fzerorubigd@gmail.com> 7*04fd306cSNickeau * @author Behrooz Shabani <everplays@gmail.com> 8*04fd306cSNickeau * @author Craig Bass <craig@clearbooks.co.uk> 9*04fd306cSNickeau * @author ^^ <craig@devls.co.uk> 10*04fd306cSNickeau * @copyright 2012 (c) ParsPooyesh Co 11*04fd306cSNickeau * @copyright 2013 (c) Behrooz Shabani 12*04fd306cSNickeau * @license MIT 13*04fd306cSNickeau * @link http://voodoophp.org/docs/handlebars 14*04fd306cSNickeau */ 15*04fd306cSNickeau 16*04fd306cSNickeaunamespace Handlebars\Loader; 17*04fd306cSNickeauuse Handlebars\Loader; 18*04fd306cSNickeauuse Handlebars\HandlebarsString; 19*04fd306cSNickeau 20*04fd306cSNickeau 21*04fd306cSNickeauclass FilesystemLoader implements Loader 22*04fd306cSNickeau{ 23*04fd306cSNickeau private $_baseDir; 24*04fd306cSNickeau private $_extension = '.handlebars'; 25*04fd306cSNickeau private $_prefix = ''; 26*04fd306cSNickeau private $_templates = array(); 27*04fd306cSNickeau 28*04fd306cSNickeau /** 29*04fd306cSNickeau * Handlebars filesystem Loader constructor. 30*04fd306cSNickeau * 31*04fd306cSNickeau * $options array allows overriding certain Loader options during instantiation: 32*04fd306cSNickeau * 33*04fd306cSNickeau * $options = array( 34*04fd306cSNickeau * // extension used for Handlebars templates. Defaults to '.handlebars' 35*04fd306cSNickeau * 'extension' => '.other', 36*04fd306cSNickeau * ); 37*04fd306cSNickeau * 38*04fd306cSNickeau * @param string|array $baseDirs A path contain template files or array of paths 39*04fd306cSNickeau * @param array $options Array of Loader options (default: array()) 40*04fd306cSNickeau * 41*04fd306cSNickeau * @throws \RuntimeException if $baseDir does not exist. 42*04fd306cSNickeau */ 43*04fd306cSNickeau public function __construct($baseDirs, Array $options = []) 44*04fd306cSNickeau { 45*04fd306cSNickeau if (is_string($baseDirs)) { 46*04fd306cSNickeau $baseDirs = array(rtrim(realpath($baseDirs), '/')); 47*04fd306cSNickeau } else { 48*04fd306cSNickeau foreach ($baseDirs as &$dir) { 49*04fd306cSNickeau $dir = rtrim(realpath($dir), '/'); 50*04fd306cSNickeau } unset( $dir ); 51*04fd306cSNickeau } 52*04fd306cSNickeau 53*04fd306cSNickeau $this->_baseDir = $baseDirs; 54*04fd306cSNickeau 55*04fd306cSNickeau foreach ($this->_baseDir as $dir) { 56*04fd306cSNickeau if (!is_dir($dir)) { 57*04fd306cSNickeau throw new \RuntimeException( 58*04fd306cSNickeau 'FilesystemLoader baseDir must be a directory: ' . $dir 59*04fd306cSNickeau ); 60*04fd306cSNickeau } 61*04fd306cSNickeau } 62*04fd306cSNickeau 63*04fd306cSNickeau if (isset($options['extension'])) { 64*04fd306cSNickeau $this->_extension = '.' . ltrim($options['extension'], '.'); 65*04fd306cSNickeau } 66*04fd306cSNickeau 67*04fd306cSNickeau if (isset($options['prefix'])) { 68*04fd306cSNickeau $this->_prefix = $options['prefix']; 69*04fd306cSNickeau } 70*04fd306cSNickeau } 71*04fd306cSNickeau 72*04fd306cSNickeau /** 73*04fd306cSNickeau * Load a Template by name. 74*04fd306cSNickeau * 75*04fd306cSNickeau * $loader = new FilesystemLoader(dirname(__FILE__).'/views'); 76*04fd306cSNickeau * // loads "./views/admin/dashboard.handlebars"; 77*04fd306cSNickeau * $loader->load('admin/dashboard'); 78*04fd306cSNickeau * 79*04fd306cSNickeau * @param string $name template name 80*04fd306cSNickeau * 81*04fd306cSNickeau * @return HandlebarsString Handlebars Template source 82*04fd306cSNickeau */ 83*04fd306cSNickeau public function load($name) 84*04fd306cSNickeau { 85*04fd306cSNickeau if (!isset($this->_templates[$name])) { 86*04fd306cSNickeau $this->_templates[$name] = $this->loadFile($name); 87*04fd306cSNickeau } 88*04fd306cSNickeau 89*04fd306cSNickeau return new HandlebarsString($this->_templates[$name]); 90*04fd306cSNickeau } 91*04fd306cSNickeau 92*04fd306cSNickeau /** 93*04fd306cSNickeau * Helper function for loading a Handlebars file by name. 94*04fd306cSNickeau * 95*04fd306cSNickeau * @param string $name template name 96*04fd306cSNickeau * 97*04fd306cSNickeau * @throws \InvalidArgumentException if a template file is not found. 98*04fd306cSNickeau * @return string Handlebars Template source 99*04fd306cSNickeau */ 100*04fd306cSNickeau protected function loadFile($name) 101*04fd306cSNickeau { 102*04fd306cSNickeau $fileName = $this->getFileName($name); 103*04fd306cSNickeau 104*04fd306cSNickeau if ($fileName === false) { 105*04fd306cSNickeau throw new \InvalidArgumentException('Template ' . $name . ' not found.'); 106*04fd306cSNickeau } 107*04fd306cSNickeau 108*04fd306cSNickeau return file_get_contents($fileName); 109*04fd306cSNickeau } 110*04fd306cSNickeau 111*04fd306cSNickeau /** 112*04fd306cSNickeau * Helper function for getting a Handlebars template file name. 113*04fd306cSNickeau * 114*04fd306cSNickeau * @param string $name template name 115*04fd306cSNickeau * 116*04fd306cSNickeau * @return string Template file name 117*04fd306cSNickeau */ 118*04fd306cSNickeau protected function getFileName($name) 119*04fd306cSNickeau { 120*04fd306cSNickeau foreach ($this->_baseDir as $baseDir) { 121*04fd306cSNickeau $fileName = $baseDir . '/'; 122*04fd306cSNickeau $fileParts = explode('/', $name); 123*04fd306cSNickeau $file = array_pop($fileParts); 124*04fd306cSNickeau 125*04fd306cSNickeau if (substr($file, strlen($this->_prefix)) !== $this->_prefix) { 126*04fd306cSNickeau $file = $this->_prefix . $file; 127*04fd306cSNickeau } 128*04fd306cSNickeau 129*04fd306cSNickeau $fileParts[] = $file; 130*04fd306cSNickeau $fileName .= implode('/', $fileParts); 131*04fd306cSNickeau $lastCharacters = substr($fileName, 0 - strlen($this->_extension)); 132*04fd306cSNickeau 133*04fd306cSNickeau if ($lastCharacters !== $this->_extension) { 134*04fd306cSNickeau $fileName .= $this->_extension; 135*04fd306cSNickeau } 136*04fd306cSNickeau if (file_exists($fileName)) { 137*04fd306cSNickeau return $fileName; 138*04fd306cSNickeau } 139*04fd306cSNickeau } 140*04fd306cSNickeau 141*04fd306cSNickeau return false; 142*04fd306cSNickeau } 143*04fd306cSNickeau 144*04fd306cSNickeau} 145