xref: /plugin/combo/vendor/salesforce/handlebars-php/src/Handlebars/Loader/FilesystemLoader.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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