@@ -18,61 +18,61 @@  | 
                                                    ||
| 18 | 18 | class ViewTemplateSelector  | 
                                                        
| 19 | 19 |  { | 
                                                        
| 20 | 20 | |
| 21 | - /**  | 
                                                        |
| 22 | - * @param ViewModel $view  | 
                                                        |
| 23 | - *  | 
                                                        |
| 24 | - * @return string  | 
                                                        |
| 25 | - */  | 
                                                        |
| 26 | - public function getTemplateName(ViewModel $view)  | 
                                                        |
| 27 | -    { | 
                                                        |
| 28 | -        if ($view instanceof TemplateSpecifyingViewModel) { | 
                                                        |
| 29 | - return $this->validateSpecifiedTemplateName($view);  | 
                                                        |
| 30 | -        } else { | 
                                                        |
| 31 | - return $this->calculateTemplateFromClassName($view);  | 
                                                        |
| 32 | - }  | 
                                                        |
| 33 | - }  | 
                                                        |
| 21 | + /**  | 
                                                        |
| 22 | + * @param ViewModel $view  | 
                                                        |
| 23 | + *  | 
                                                        |
| 24 | + * @return string  | 
                                                        |
| 25 | + */  | 
                                                        |
| 26 | + public function getTemplateName(ViewModel $view)  | 
                                                        |
| 27 | +	{ | 
                                                        |
| 28 | +		if ($view instanceof TemplateSpecifyingViewModel) { | 
                                                        |
| 29 | + return $this->validateSpecifiedTemplateName($view);  | 
                                                        |
| 30 | +		} else { | 
                                                        |
| 31 | + return $this->calculateTemplateFromClassName($view);  | 
                                                        |
| 32 | + }  | 
                                                        |
| 33 | + }  | 
                                                        |
| 34 | 34 | |
| 35 | - /**  | 
                                                        |
| 36 | - * @param TemplateSpecifyingViewModel $view  | 
                                                        |
| 37 | - *  | 
                                                        |
| 38 | - * @return mixed  | 
                                                        |
| 39 | - * @throws \UnexpectedValueException if no template is provided  | 
                                                        |
| 40 | - */  | 
                                                        |
| 41 | - protected function validateSpecifiedTemplateName(TemplateSpecifyingViewModel $view)  | 
                                                        |
| 42 | -    { | 
                                                        |
| 43 | - $template = $view->getTemplateName();  | 
                                                        |
| 44 | - $view_class = get_class($view);  | 
                                                        |
| 45 | -        if ( ! $template) { | 
                                                        |
| 46 | - throw new \UnexpectedValueException(  | 
                                                        |
| 47 | - "$view_class::getTemplateName() must return a template name, empty value returned"  | 
                                                        |
| 48 | - );  | 
                                                        |
| 49 | - }  | 
                                                        |
| 35 | + /**  | 
                                                        |
| 36 | + * @param TemplateSpecifyingViewModel $view  | 
                                                        |
| 37 | + *  | 
                                                        |
| 38 | + * @return mixed  | 
                                                        |
| 39 | + * @throws \UnexpectedValueException if no template is provided  | 
                                                        |
| 40 | + */  | 
                                                        |
| 41 | + protected function validateSpecifiedTemplateName(TemplateSpecifyingViewModel $view)  | 
                                                        |
| 42 | +	{ | 
                                                        |
| 43 | + $template = $view->getTemplateName();  | 
                                                        |
| 44 | + $view_class = get_class($view);  | 
                                                        |
| 45 | +		if ( ! $template) { | 
                                                        |
| 46 | + throw new \UnexpectedValueException(  | 
                                                        |
| 47 | + "$view_class::getTemplateName() must return a template name, empty value returned"  | 
                                                        |
| 48 | + );  | 
                                                        |
| 49 | + }  | 
                                                        |
| 50 | 50 | |
| 51 | -        if ( ! is_string($template)) { | 
                                                        |
| 52 | - $type = is_object($template) ? get_class($template) : gettype($template);  | 
                                                        |
| 53 | - throw new \UnexpectedValueException(  | 
                                                        |
| 54 | - "$view_class::getTemplateName() must return a string template name, $type value returned"  | 
                                                        |
| 55 | - );  | 
                                                        |
| 56 | - }  | 
                                                        |
| 51 | +		if ( ! is_string($template)) { | 
                                                        |
| 52 | + $type = is_object($template) ? get_class($template) : gettype($template);  | 
                                                        |
| 53 | + throw new \UnexpectedValueException(  | 
                                                        |
| 54 | + "$view_class::getTemplateName() must return a string template name, $type value returned"  | 
                                                        |
| 55 | + );  | 
                                                        |
| 56 | + }  | 
                                                        |
| 57 | 57 | |
| 58 | - return $template;  | 
                                                        |
| 59 | - }  | 
                                                        |
| 58 | + return $template;  | 
                                                        |
| 59 | + }  | 
                                                        |
| 60 | 60 | |
| 61 | - /**  | 
                                                        |
| 62 | - * @param ViewModel $view  | 
                                                        |
| 63 | - *  | 
                                                        |
| 64 | - * @return string  | 
                                                        |
| 65 | - */  | 
                                                        |
| 66 | - protected function calculateTemplateFromClassName(ViewModel $view)  | 
                                                        |
| 67 | -    { | 
                                                        |
| 68 | -        $template = preg_replace('/\\\\|_/', '/', get_class($view)); | 
                                                        |
| 69 | -        $template = preg_replace('/([a-z])([A-Z])/', '\1_\2', $template); | 
                                                        |
| 70 | - $template = strtolower($template);  | 
                                                        |
| 71 | -        if (substr($template, 0, 5) === 'view/') { | 
                                                        |
| 72 | - $template = substr($template, 5);  | 
                                                        |
| 73 | - }  | 
                                                        |
| 61 | + /**  | 
                                                        |
| 62 | + * @param ViewModel $view  | 
                                                        |
| 63 | + *  | 
                                                        |
| 64 | + * @return string  | 
                                                        |
| 65 | + */  | 
                                                        |
| 66 | + protected function calculateTemplateFromClassName(ViewModel $view)  | 
                                                        |
| 67 | +	{ | 
                                                        |
| 68 | +		$template = preg_replace('/\\\\|_/', '/', get_class($view)); | 
                                                        |
| 69 | +		$template = preg_replace('/([a-z])([A-Z])/', '\1_\2', $template); | 
                                                        |
| 70 | + $template = strtolower($template);  | 
                                                        |
| 71 | +		if (substr($template, 0, 5) === 'view/') { | 
                                                        |
| 72 | + $template = substr($template, 5);  | 
                                                        |
| 73 | + }  | 
                                                        |
| 74 | 74 | |
| 75 | - return $template;  | 
                                                        |
| 76 | - }  | 
                                                        |
| 75 | + return $template;  | 
                                                        |
| 76 | + }  | 
                                                        |
| 77 | 77 | |
| 78 | 78 | }  | 
                                                        
@@ -1,9 +1,9 @@ discard block  | 
                                                    ||
| 1 | 1 | <?php  | 
                                                        
| 2 | 2 | /**  | 
                                                        
| 3 | - * @author Andrew Coulton <[email protected]>  | 
                                                        |
| 4 | - * @copyright 2015 inGenerator Ltd  | 
                                                        |
| 5 | - * @license http://kohanaframework.org/license  | 
                                                        |
| 6 | - */  | 
                                                        |
| 3 | + * @author Andrew Coulton <[email protected]>  | 
                                                        |
| 4 | + * @copyright 2015 inGenerator Ltd  | 
                                                        |
| 5 | + * @license http://kohanaframework.org/license  | 
                                                        |
| 6 | + */  | 
                                                        |
| 7 | 7 | |
| 8 | 8 | namespace Ingenerator\KohanaView;  | 
                                                        
| 9 | 9 | |
@@ -17,10 +17,10 @@ discard block  | 
                                                    ||
| 17 | 17 | interface ViewModel  | 
                                                        
| 18 | 18 |  { | 
                                                        
| 19 | 19 | |
| 20 | - /**  | 
                                                        |
| 21 | - * @param array $variables  | 
                                                        |
| 22 | - * @return void  | 
                                                        |
| 23 | - */  | 
                                                        |
| 24 | - public function display(array $variables);  | 
                                                        |
| 20 | + /**  | 
                                                        |
| 21 | + * @param array $variables  | 
                                                        |
| 22 | + * @return void  | 
                                                        |
| 23 | + */  | 
                                                        |
| 24 | + public function display(array $variables);  | 
                                                        |
| 25 | 25 | |
| 26 | 26 | }  | 
                                                        
@@ -37,81 +37,81 @@  | 
                                                    ||
| 37 | 37 | */  | 
                                                        
| 38 | 38 | abstract class AbstractViewModel implements ViewModel  | 
                                                        
| 39 | 39 |  { | 
                                                        
| 40 | - /**  | 
                                                        |
| 41 | - * @var array The actual view data  | 
                                                        |
| 42 | - */  | 
                                                        |
| 43 | - protected $variables = [];  | 
                                                        |
| 40 | + /**  | 
                                                        |
| 41 | + * @var array The actual view data  | 
                                                        |
| 42 | + */  | 
                                                        |
| 43 | + protected $variables = [];  | 
                                                        |
| 44 | 44 | |
| 45 | - /**  | 
                                                        |
| 46 | - * @var string[] The names of the valid set of fields that must be passed to the display() method  | 
                                                        |
| 47 | - */  | 
                                                        |
| 48 | - protected $expect_var_names = [];  | 
                                                        |
| 45 | + /**  | 
                                                        |
| 46 | + * @var string[] The names of the valid set of fields that must be passed to the display() method  | 
                                                        |
| 47 | + */  | 
                                                        |
| 48 | + protected $expect_var_names = [];  | 
                                                        |
| 49 | 49 | |
| 50 | - public function __construct()  | 
                                                        |
| 51 | -    { | 
                                                        |
| 52 | - // Assign the expect_var_names to ensure that we don't accidentally start requiring compiled fields  | 
                                                        |
| 53 | - $this->expect_var_names = array_keys($this->variables);  | 
                                                        |
| 54 | - }  | 
                                                        |
| 50 | + public function __construct()  | 
                                                        |
| 51 | +	{ | 
                                                        |
| 52 | + // Assign the expect_var_names to ensure that we don't accidentally start requiring compiled fields  | 
                                                        |
| 53 | + $this->expect_var_names = array_keys($this->variables);  | 
                                                        |
| 54 | + }  | 
                                                        |
| 55 | 55 | |
| 56 | - /**  | 
                                                        |
| 57 | - * Get field values  | 
                                                        |
| 58 | - *  | 
                                                        |
| 59 | - * @param string $name  | 
                                                        |
| 60 | - *  | 
                                                        |
| 61 | - * @return mixed  | 
                                                        |
| 62 | - */  | 
                                                        |
| 63 | - public function __get($name)  | 
                                                        |
| 64 | -    { | 
                                                        |
| 65 | -        if (array_key_exists($name, $this->variables)) { | 
                                                        |
| 66 | - return $this->variables[$name];  | 
                                                        |
| 67 | -        } elseif (method_exists($this, 'var_'.$name)) { | 
                                                        |
| 68 | - $method = 'var_'.$name;  | 
                                                        |
| 56 | + /**  | 
                                                        |
| 57 | + * Get field values  | 
                                                        |
| 58 | + *  | 
                                                        |
| 59 | + * @param string $name  | 
                                                        |
| 60 | + *  | 
                                                        |
| 61 | + * @return mixed  | 
                                                        |
| 62 | + */  | 
                                                        |
| 63 | + public function __get($name)  | 
                                                        |
| 64 | +	{ | 
                                                        |
| 65 | +		if (array_key_exists($name, $this->variables)) { | 
                                                        |
| 66 | + return $this->variables[$name];  | 
                                                        |
| 67 | +		} elseif (method_exists($this, 'var_'.$name)) { | 
                                                        |
| 68 | + $method = 'var_'.$name;  | 
                                                        |
| 69 | 69 | |
| 70 | - return $this->$method();  | 
                                                        |
| 71 | -        } else { | 
                                                        |
| 72 | - throw new \BadMethodCallException(static::class." does not define a '$name' field");  | 
                                                        |
| 73 | - }  | 
                                                        |
| 74 | - }  | 
                                                        |
| 70 | + return $this->$method();  | 
                                                        |
| 71 | +		} else { | 
                                                        |
| 72 | + throw new \BadMethodCallException(static::class." does not define a '$name' field");  | 
                                                        |
| 73 | + }  | 
                                                        |
| 74 | + }  | 
                                                        |
| 75 | 75 | |
| 76 | - /**  | 
                                                        |
| 77 | - * @param string $name  | 
                                                        |
| 78 | - * @param mixed $value  | 
                                                        |
| 79 | - *  | 
                                                        |
| 80 | - * @throws \BadMethodCallException values cannot be assigned except with the display method  | 
                                                        |
| 81 | - */  | 
                                                        |
| 82 | - public function __set($name, $value)  | 
                                                        |
| 83 | -    { | 
                                                        |
| 84 | - throw new \BadMethodCallException(static::class.' variables are read-only, cannot assign '.$name);  | 
                                                        |
| 85 | - }  | 
                                                        |
| 76 | + /**  | 
                                                        |
| 77 | + * @param string $name  | 
                                                        |
| 78 | + * @param mixed $value  | 
                                                        |
| 79 | + *  | 
                                                        |
| 80 | + * @throws \BadMethodCallException values cannot be assigned except with the display method  | 
                                                        |
| 81 | + */  | 
                                                        |
| 82 | + public function __set($name, $value)  | 
                                                        |
| 83 | +	{ | 
                                                        |
| 84 | + throw new \BadMethodCallException(static::class.' variables are read-only, cannot assign '.$name);  | 
                                                        |
| 85 | + }  | 
                                                        |
| 86 | 86 | |
| 87 | - /**  | 
                                                        |
| 88 | - * Set the data to be rendered in the view - note this does not actually render the view.  | 
                                                        |
| 89 | - *  | 
                                                        |
| 90 | - * @param array $variables  | 
                                                        |
| 91 | - */  | 
                                                        |
| 92 | - public function display(array $variables)  | 
                                                        |
| 93 | -    { | 
                                                        |
| 94 | - $errors = [];  | 
                                                        |
| 95 | - $provided_variables = array_keys($variables);  | 
                                                        |
| 96 | -        foreach (array_diff($provided_variables, $this->expect_var_names) as $unexpected_var) { | 
                                                        |
| 97 | -            if (method_exists($this, 'var_'.$unexpected_var)) { | 
                                                        |
| 98 | - $errors[] = "'$unexpected_var' conflicts with ::var_$unexpected_var()";  | 
                                                        |
| 99 | -            } else { | 
                                                        |
| 100 | - $errors[] = "'$unexpected_var' is not expected";  | 
                                                        |
| 101 | - }  | 
                                                        |
| 102 | - }  | 
                                                        |
| 103 | -        foreach (array_diff($this->expect_var_names, $provided_variables) as $missing_var) { | 
                                                        |
| 104 | - $errors[] = "'$missing_var' is missing";  | 
                                                        |
| 105 | - }  | 
                                                        |
| 87 | + /**  | 
                                                        |
| 88 | + * Set the data to be rendered in the view - note this does not actually render the view.  | 
                                                        |
| 89 | + *  | 
                                                        |
| 90 | + * @param array $variables  | 
                                                        |
| 91 | + */  | 
                                                        |
| 92 | + public function display(array $variables)  | 
                                                        |
| 93 | +	{ | 
                                                        |
| 94 | + $errors = [];  | 
                                                        |
| 95 | + $provided_variables = array_keys($variables);  | 
                                                        |
| 96 | +		foreach (array_diff($provided_variables, $this->expect_var_names) as $unexpected_var) { | 
                                                        |
| 97 | +			if (method_exists($this, 'var_'.$unexpected_var)) { | 
                                                        |
| 98 | + $errors[] = "'$unexpected_var' conflicts with ::var_$unexpected_var()";  | 
                                                        |
| 99 | +			} else { | 
                                                        |
| 100 | + $errors[] = "'$unexpected_var' is not expected";  | 
                                                        |
| 101 | + }  | 
                                                        |
| 102 | + }  | 
                                                        |
| 103 | +		foreach (array_diff($this->expect_var_names, $provided_variables) as $missing_var) { | 
                                                        |
| 104 | + $errors[] = "'$missing_var' is missing";  | 
                                                        |
| 105 | + }  | 
                                                        |
| 106 | 106 | |
| 107 | -        if ( ! empty($errors)) { | 
                                                        |
| 108 | - throw new \InvalidArgumentException(  | 
                                                        |
| 109 | - "Invalid variables provided to ".static::class."::display()"  | 
                                                        |
| 110 | -                ."\n - ".implode("\n - ", $errors) | 
                                                        |
| 111 | - );  | 
                                                        |
| 112 | - }  | 
                                                        |
| 107 | +		if ( ! empty($errors)) { | 
                                                        |
| 108 | + throw new \InvalidArgumentException(  | 
                                                        |
| 109 | + "Invalid variables provided to ".static::class."::display()"  | 
                                                        |
| 110 | +				."\n - ".implode("\n - ", $errors) | 
                                                        |
| 111 | + );  | 
                                                        |
| 112 | + }  | 
                                                        |
| 113 | 113 | |
| 114 | - $this->variables = $variables;  | 
                                                        |
| 115 | - }  | 
                                                        |
| 114 | + $this->variables = $variables;  | 
                                                        |
| 115 | + }  | 
                                                        |
| 116 | 116 | |
| 117 | 117 | }  | 
                                                        
@@ -31,86 +31,86 @@  | 
                                                    ||
| 31 | 31 | class TemplateCompiler  | 
                                                        
| 32 | 32 |  { | 
                                                        
| 33 | 33 | |
| 34 | - /**  | 
                                                        |
| 35 | - * @var array  | 
                                                        |
| 36 | - */  | 
                                                        |
| 37 | - protected $options = [  | 
                                                        |
| 38 | - 'raw_output_prefix' => '!',  | 
                                                        |
| 39 | - 'escape_method' => 'HTML::chars',  | 
                                                        |
| 40 | - ];  | 
                                                        |
| 34 | + /**  | 
                                                        |
| 35 | + * @var array  | 
                                                        |
| 36 | + */  | 
                                                        |
| 37 | + protected $options = [  | 
                                                        |
| 38 | + 'raw_output_prefix' => '!',  | 
                                                        |
| 39 | + 'escape_method' => 'HTML::chars',  | 
                                                        |
| 40 | + ];  | 
                                                        |
| 41 | 41 | |
| 42 | - /**  | 
                                                        |
| 43 | - * @param array $options  | 
                                                        |
| 44 | - */  | 
                                                        |
| 45 | - public function __construct(array $options = [])  | 
                                                        |
| 46 | -    { | 
                                                        |
| 47 | - $this->options = array_merge($this->options, $options);  | 
                                                        |
| 48 | - }  | 
                                                        |
| 42 | + /**  | 
                                                        |
| 43 | + * @param array $options  | 
                                                        |
| 44 | + */  | 
                                                        |
| 45 | + public function __construct(array $options = [])  | 
                                                        |
| 46 | +	{ | 
                                                        |
| 47 | + $this->options = array_merge($this->options, $options);  | 
                                                        |
| 48 | + }  | 
                                                        |
| 49 | 49 | |
| 50 | - /**  | 
                                                        |
| 51 | - * Compile a string containing a PHP template, automatically escaping variables that are echoed in PHP short tags,  | 
                                                        |
| 52 | - * and return the compiled PHP string.  | 
                                                        |
| 53 | - *  | 
                                                        |
| 54 | - * @param string $source  | 
                                                        |
| 55 | - *  | 
                                                        |
| 56 | - * @return string  | 
                                                        |
| 57 | - * @throws \InvalidArgumentException if the template is empty or invalid  | 
                                                        |
| 58 | - */  | 
                                                        |
| 59 | - public function compile($source)  | 
                                                        |
| 60 | -    { | 
                                                        |
| 61 | -        if ( ! $source) { | 
                                                        |
| 62 | -            throw new \InvalidArgumentException('Cannot compile empty template'); | 
                                                        |
| 63 | - }  | 
                                                        |
| 50 | + /**  | 
                                                        |
| 51 | + * Compile a string containing a PHP template, automatically escaping variables that are echoed in PHP short tags,  | 
                                                        |
| 52 | + * and return the compiled PHP string.  | 
                                                        |
| 53 | + *  | 
                                                        |
| 54 | + * @param string $source  | 
                                                        |
| 55 | + *  | 
                                                        |
| 56 | + * @return string  | 
                                                        |
| 57 | + * @throws \InvalidArgumentException if the template is empty or invalid  | 
                                                        |
| 58 | + */  | 
                                                        |
| 59 | + public function compile($source)  | 
                                                        |
| 60 | +	{ | 
                                                        |
| 61 | +		if ( ! $source) { | 
                                                        |
| 62 | +			throw new \InvalidArgumentException('Cannot compile empty template'); | 
                                                        |
| 63 | + }  | 
                                                        |
| 64 | 64 | |
| 65 | -        return preg_replace_callback('/<\?=(.+?)(;|\?>)/s', [$this, 'compilePhpShortTag'], $source); | 
                                                        |
| 66 | - }  | 
                                                        |
| 65 | +		return preg_replace_callback('/<\?=(.+?)(;|\?>)/s', [$this, 'compilePhpShortTag'], $source); | 
                                                        |
| 66 | + }  | 
                                                        |
| 67 | 67 | |
| 68 | - /**  | 
                                                        |
| 69 | - * @param string[] $matches  | 
                                                        |
| 70 | - *  | 
                                                        |
| 71 | - * @return string  | 
                                                        |
| 72 | - */  | 
                                                        |
| 73 | - protected function compilePhpShortTag($matches)  | 
                                                        |
| 74 | -    { | 
                                                        |
| 75 | - $var = trim($matches[1]);  | 
                                                        |
| 76 | - $terminator = $matches[2];  | 
                                                        |
| 77 | - $escape_method = $this->options['escape_method'];  | 
                                                        |
| 78 | - $raw_output_prefix = $this->options['raw_output_prefix'];  | 
                                                        |
| 68 | + /**  | 
                                                        |
| 69 | + * @param string[] $matches  | 
                                                        |
| 70 | + *  | 
                                                        |
| 71 | + * @return string  | 
                                                        |
| 72 | + */  | 
                                                        |
| 73 | + protected function compilePhpShortTag($matches)  | 
                                                        |
| 74 | +	{ | 
                                                        |
| 75 | + $var = trim($matches[1]);  | 
                                                        |
| 76 | + $terminator = $matches[2];  | 
                                                        |
| 77 | + $escape_method = $this->options['escape_method'];  | 
                                                        |
| 78 | + $raw_output_prefix = $this->options['raw_output_prefix'];  | 
                                                        |
| 79 | 79 | |
| 80 | -        if ($this->startsWith($var, $raw_output_prefix)) { | 
                                                        |
| 81 | - // Remove prefix and echo unescaped  | 
                                                        |
| 82 | - $compiled = '<?='.trim(substr($var, strlen($raw_output_prefix))).';';  | 
                                                        |
| 83 | -        } elseif ($this->startsWith($var, '//')) { | 
                                                        |
| 84 | - // Echo an empty string to prevent the comment causing a parse error  | 
                                                        |
| 85 | - $compiled = "<?='';$var;";  | 
                                                        |
| 80 | +		if ($this->startsWith($var, $raw_output_prefix)) { | 
                                                        |
| 81 | + // Remove prefix and echo unescaped  | 
                                                        |
| 82 | + $compiled = '<?='.trim(substr($var, strlen($raw_output_prefix))).';';  | 
                                                        |
| 83 | +		} elseif ($this->startsWith($var, '//')) { | 
                                                        |
| 84 | + // Echo an empty string to prevent the comment causing a parse error  | 
                                                        |
| 85 | + $compiled = "<?='';$var;";  | 
                                                        |
| 86 | 86 | |
| 87 | -        } elseif ($this->startsWith($var, $escape_method)) { | 
                                                        |
| 88 | - // Try to help user to avoid accidental double-escaping  | 
                                                        |
| 89 | - throw new \InvalidArgumentException(  | 
                                                        |
| 90 | -                "Invalid implicit double-escape in template - remove $escape_method from {$matches[0]} or mark as raw" | 
                                                        |
| 91 | - );  | 
                                                        |
| 87 | +		} elseif ($this->startsWith($var, $escape_method)) { | 
                                                        |
| 88 | + // Try to help user to avoid accidental double-escaping  | 
                                                        |
| 89 | + throw new \InvalidArgumentException(  | 
                                                        |
| 90 | +				"Invalid implicit double-escape in template - remove $escape_method from {$matches[0]} or mark as raw" | 
                                                        |
| 91 | + );  | 
                                                        |
| 92 | 92 | |
| 93 | -        } else { | 
                                                        |
| 94 | - // Escape the value before echoing  | 
                                                        |
| 95 | -            $compiled = "<?={$escape_method}($var);"; | 
                                                        |
| 96 | - }  | 
                                                        |
| 93 | +		} else { | 
                                                        |
| 94 | + // Escape the value before echoing  | 
                                                        |
| 95 | +			$compiled = "<?={$escape_method}($var);"; | 
                                                        |
| 96 | + }  | 
                                                        |
| 97 | 97 | |
| 98 | -        if ($terminator === '?>') { | 
                                                        |
| 99 | - $compiled .= '?>';  | 
                                                        |
| 100 | - }  | 
                                                        |
| 98 | +		if ($terminator === '?>') { | 
                                                        |
| 99 | + $compiled .= '?>';  | 
                                                        |
| 100 | + }  | 
                                                        |
| 101 | 101 | |
| 102 | - return $compiled;  | 
                                                        |
| 103 | - }  | 
                                                        |
| 102 | + return $compiled;  | 
                                                        |
| 103 | + }  | 
                                                        |
| 104 | 104 | |
| 105 | - /**  | 
                                                        |
| 106 | - * @param string $string  | 
                                                        |
| 107 | - * @param string $prefix  | 
                                                        |
| 108 | - *  | 
                                                        |
| 109 | - * @return bool  | 
                                                        |
| 110 | - */  | 
                                                        |
| 111 | - protected function startsWith($string, $prefix)  | 
                                                        |
| 112 | -    { | 
                                                        |
| 113 | - return (strncmp($string, $prefix, strlen($prefix)) === 0);  | 
                                                        |
| 114 | - }  | 
                                                        |
| 105 | + /**  | 
                                                        |
| 106 | + * @param string $string  | 
                                                        |
| 107 | + * @param string $prefix  | 
                                                        |
| 108 | + *  | 
                                                        |
| 109 | + * @return bool  | 
                                                        |
| 110 | + */  | 
                                                        |
| 111 | + protected function startsWith($string, $prefix)  | 
                                                        |
| 112 | +	{ | 
                                                        |
| 113 | + return (strncmp($string, $prefix, strlen($prefix)) === 0);  | 
                                                        |
| 114 | + }  | 
                                                        |
| 115 | 115 | |
| 116 | 116 | }  | 
                                                        
@@ -17,11 +17,11 @@  | 
                                                    ||
| 17 | 17 | interface TemplateManager  | 
                                                        
| 18 | 18 |  { | 
                                                        
| 19 | 19 | |
| 20 | - /**  | 
                                                        |
| 21 | - * @param string $template_name Name of the template to use (can include path separators)  | 
                                                        |
| 22 | - *  | 
                                                        |
| 23 | - * @return string Path to the compiled template file  | 
                                                        |
| 24 | - */  | 
                                                        |
| 25 | - public function getPath($template_name);  | 
                                                        |
| 20 | + /**  | 
                                                        |
| 21 | + * @param string $template_name Name of the template to use (can include path separators)  | 
                                                        |
| 22 | + *  | 
                                                        |
| 23 | + * @return string Path to the compiled template file  | 
                                                        |
| 24 | + */  | 
                                                        |
| 25 | + public function getPath($template_name);  | 
                                                        |
| 26 | 26 | |
| 27 | 27 | }  | 
                                                        
@@ -22,117 +22,117 @@  | 
                                                    ||
| 22 | 22 | */  | 
                                                        
| 23 | 23 | class CFSTemplateManager implements TemplateManager  | 
                                                        
| 24 | 24 |  { | 
                                                        
| 25 | - /**  | 
                                                        |
| 26 | - * @var string  | 
                                                        |
| 27 | - */  | 
                                                        |
| 28 | - protected $cache_dir;  | 
                                                        |
| 29 | -  | 
                                                        |
| 30 | - /**  | 
                                                        |
| 31 | - * @var CFSWrapper  | 
                                                        |
| 32 | - */  | 
                                                        |
| 33 | - protected $cascading_files;  | 
                                                        |
| 34 | -  | 
                                                        |
| 35 | - /**  | 
                                                        |
| 36 | - * @var array  | 
                                                        |
| 37 | - */  | 
                                                        |
| 38 | - protected $compiled_paths = [];  | 
                                                        |
| 39 | -  | 
                                                        |
| 40 | - /**  | 
                                                        |
| 41 | - * @var TemplateCompiler  | 
                                                        |
| 42 | - */  | 
                                                        |
| 43 | - protected $compiler;  | 
                                                        |
| 44 | -  | 
                                                        |
| 45 | - /**  | 
                                                        |
| 46 | - * @var boolean  | 
                                                        |
| 47 | - */  | 
                                                        |
| 48 | - protected $recompile_always;  | 
                                                        |
| 49 | -  | 
                                                        |
| 50 | - /**  | 
                                                        |
| 51 | - * Valid options:  | 
                                                        |
| 52 | - * * cache_dir => the path where compiled templates will be cached  | 
                                                        |
| 53 | - * * recompile_always => whether to recompile each template on every execution,  | 
                                                        |
| 54 | - *  | 
                                                        |
| 55 | - * @param CFSWrapper $cascading_files  | 
                                                        |
| 56 | - * @param TemplateCompiler $compiler  | 
                                                        |
| 57 | - * @param array $options  | 
                                                        |
| 58 | - */  | 
                                                        |
| 59 | - public function __construct(CFSWrapper $cascading_files, TemplateCompiler $compiler, array $options)  | 
                                                        |
| 60 | -    { | 
                                                        |
| 61 | - $this->cascading_files = $cascading_files;  | 
                                                        |
| 62 | - $this->compiler = $compiler;  | 
                                                        |
| 63 | - $this->cache_dir = trim($options['cache_dir'], '/');  | 
                                                        |
| 64 | - $this->recompile_always = \Arr::get($options, 'recompile_always', FALSE);  | 
                                                        |
| 65 | - }  | 
                                                        |
| 66 | -  | 
                                                        |
| 67 | - /**  | 
                                                        |
| 68 | -     * {@inheritdoc} | 
                                                        |
| 69 | - */  | 
                                                        |
| 70 | - public function getPath($template_name)  | 
                                                        |
| 71 | -    { | 
                                                        |
| 72 | - $compiled_path = $this->cache_dir.'/'.$template_name.'.php';  | 
                                                        |
| 73 | -  | 
                                                        |
| 74 | -        if ($this->isCompileRequired($compiled_path)) { | 
                                                        |
| 75 | - $source = $this->requireSourceFileContent($template_name);  | 
                                                        |
| 76 | - $compiled = $this->compiler->compile($source);  | 
                                                        |
| 77 | - $this->writeFile($compiled_path, $compiled);  | 
                                                        |
| 78 | - $this->compiled_paths[$compiled_path] = TRUE;  | 
                                                        |
| 79 | - }  | 
                                                        |
| 80 | -  | 
                                                        |
| 81 | - return $compiled_path;  | 
                                                        |
| 82 | - }  | 
                                                        |
| 83 | -  | 
                                                        |
| 84 | - /**  | 
                                                        |
| 85 | - * @param string $compiled_path  | 
                                                        |
| 86 | - *  | 
                                                        |
| 87 | - * @return bool  | 
                                                        |
| 88 | - */  | 
                                                        |
| 89 | - protected function isCompileRequired($compiled_path)  | 
                                                        |
| 90 | -    { | 
                                                        |
| 91 | -        if ($this->recompile_always AND ! isset($this->compiled_paths[$compiled_path])) { | 
                                                        |
| 92 | - return TRUE;  | 
                                                        |
| 93 | - }  | 
                                                        |
| 94 | -  | 
                                                        |
| 95 | - return ! file_exists($compiled_path);  | 
                                                        |
| 96 | - }  | 
                                                        |
| 97 | -  | 
                                                        |
| 98 | - /**  | 
                                                        |
| 99 | - * @param string $template_name  | 
                                                        |
| 100 | - *  | 
                                                        |
| 101 | - * @return string  | 
                                                        |
| 102 | - */  | 
                                                        |
| 103 | - protected function requireSourceFileContent($template_name)  | 
                                                        |
| 104 | -    { | 
                                                        |
| 105 | -        if ( ! $source_file = $this->cascading_files->find_file('views', $template_name)) { | 
                                                        |
| 106 | -            throw new \InvalidArgumentException("Cannot find template source file 'views/$template_name'"); | 
                                                        |
| 107 | - }  | 
                                                        |
| 108 | -  | 
                                                        |
| 109 | - return file_get_contents($source_file);  | 
                                                        |
| 110 | - }  | 
                                                        |
| 111 | -  | 
                                                        |
| 112 | - /**  | 
                                                        |
| 113 | - * @param string $compiled_path  | 
                                                        |
| 114 | - * @param string $compiled  | 
                                                        |
| 115 | - */  | 
                                                        |
| 116 | - protected function writeFile($compiled_path, $compiled)  | 
                                                        |
| 117 | -    { | 
                                                        |
| 118 | - $this->ensureWriteableDirectory(dirname($compiled_path));  | 
                                                        |
| 119 | - file_put_contents($compiled_path, $compiled);  | 
                                                        |
| 120 | - }  | 
                                                        |
| 121 | -  | 
                                                        |
| 122 | - /**  | 
                                                        |
| 123 | - * @param string $path  | 
                                                        |
| 124 | - */  | 
                                                        |
| 125 | - protected function ensureWriteableDirectory($path)  | 
                                                        |
| 126 | -    { | 
                                                        |
| 127 | -        if (is_dir($path)) { | 
                                                        |
| 128 | -            if ( ! is_writeable($path)) { | 
                                                        |
| 129 | -                throw new \RuntimeException("Cannot write to compiled template path '$path'"); | 
                                                        |
| 130 | - }  | 
                                                        |
| 131 | -        } else { | 
                                                        |
| 132 | -            if ( ! mkdir($path, 0777, TRUE)) { | 
                                                        |
| 133 | -                throw new \RuntimeException("Cannot create template cache directory in '$path'"); | 
                                                        |
| 134 | - }  | 
                                                        |
| 135 | - }  | 
                                                        |
| 136 | - }  | 
                                                        |
| 25 | + /**  | 
                                                        |
| 26 | + * @var string  | 
                                                        |
| 27 | + */  | 
                                                        |
| 28 | + protected $cache_dir;  | 
                                                        |
| 29 | +  | 
                                                        |
| 30 | + /**  | 
                                                        |
| 31 | + * @var CFSWrapper  | 
                                                        |
| 32 | + */  | 
                                                        |
| 33 | + protected $cascading_files;  | 
                                                        |
| 34 | +  | 
                                                        |
| 35 | + /**  | 
                                                        |
| 36 | + * @var array  | 
                                                        |
| 37 | + */  | 
                                                        |
| 38 | + protected $compiled_paths = [];  | 
                                                        |
| 39 | +  | 
                                                        |
| 40 | + /**  | 
                                                        |
| 41 | + * @var TemplateCompiler  | 
                                                        |
| 42 | + */  | 
                                                        |
| 43 | + protected $compiler;  | 
                                                        |
| 44 | +  | 
                                                        |
| 45 | + /**  | 
                                                        |
| 46 | + * @var boolean  | 
                                                        |
| 47 | + */  | 
                                                        |
| 48 | + protected $recompile_always;  | 
                                                        |
| 49 | +  | 
                                                        |
| 50 | + /**  | 
                                                        |
| 51 | + * Valid options:  | 
                                                        |
| 52 | + * * cache_dir => the path where compiled templates will be cached  | 
                                                        |
| 53 | + * * recompile_always => whether to recompile each template on every execution,  | 
                                                        |
| 54 | + *  | 
                                                        |
| 55 | + * @param CFSWrapper $cascading_files  | 
                                                        |
| 56 | + * @param TemplateCompiler $compiler  | 
                                                        |
| 57 | + * @param array $options  | 
                                                        |
| 58 | + */  | 
                                                        |
| 59 | + public function __construct(CFSWrapper $cascading_files, TemplateCompiler $compiler, array $options)  | 
                                                        |
| 60 | +	{ | 
                                                        |
| 61 | + $this->cascading_files = $cascading_files;  | 
                                                        |
| 62 | + $this->compiler = $compiler;  | 
                                                        |
| 63 | + $this->cache_dir = trim($options['cache_dir'], '/');  | 
                                                        |
| 64 | + $this->recompile_always = \Arr::get($options, 'recompile_always', FALSE);  | 
                                                        |
| 65 | + }  | 
                                                        |
| 66 | +  | 
                                                        |
| 67 | + /**  | 
                                                        |
| 68 | +	 * {@inheritdoc} | 
                                                        |
| 69 | + */  | 
                                                        |
| 70 | + public function getPath($template_name)  | 
                                                        |
| 71 | +	{ | 
                                                        |
| 72 | + $compiled_path = $this->cache_dir.'/'.$template_name.'.php';  | 
                                                        |
| 73 | +  | 
                                                        |
| 74 | +		if ($this->isCompileRequired($compiled_path)) { | 
                                                        |
| 75 | + $source = $this->requireSourceFileContent($template_name);  | 
                                                        |
| 76 | + $compiled = $this->compiler->compile($source);  | 
                                                        |
| 77 | + $this->writeFile($compiled_path, $compiled);  | 
                                                        |
| 78 | + $this->compiled_paths[$compiled_path] = TRUE;  | 
                                                        |
| 79 | + }  | 
                                                        |
| 80 | +  | 
                                                        |
| 81 | + return $compiled_path;  | 
                                                        |
| 82 | + }  | 
                                                        |
| 83 | +  | 
                                                        |
| 84 | + /**  | 
                                                        |
| 85 | + * @param string $compiled_path  | 
                                                        |
| 86 | + *  | 
                                                        |
| 87 | + * @return bool  | 
                                                        |
| 88 | + */  | 
                                                        |
| 89 | + protected function isCompileRequired($compiled_path)  | 
                                                        |
| 90 | +	{ | 
                                                        |
| 91 | +		if ($this->recompile_always AND ! isset($this->compiled_paths[$compiled_path])) { | 
                                                        |
| 92 | + return TRUE;  | 
                                                        |
| 93 | + }  | 
                                                        |
| 94 | +  | 
                                                        |
| 95 | + return ! file_exists($compiled_path);  | 
                                                        |
| 96 | + }  | 
                                                        |
| 97 | +  | 
                                                        |
| 98 | + /**  | 
                                                        |
| 99 | + * @param string $template_name  | 
                                                        |
| 100 | + *  | 
                                                        |
| 101 | + * @return string  | 
                                                        |
| 102 | + */  | 
                                                        |
| 103 | + protected function requireSourceFileContent($template_name)  | 
                                                        |
| 104 | +	{ | 
                                                        |
| 105 | +		if ( ! $source_file = $this->cascading_files->find_file('views', $template_name)) { | 
                                                        |
| 106 | +			throw new \InvalidArgumentException("Cannot find template source file 'views/$template_name'"); | 
                                                        |
| 107 | + }  | 
                                                        |
| 108 | +  | 
                                                        |
| 109 | + return file_get_contents($source_file);  | 
                                                        |
| 110 | + }  | 
                                                        |
| 111 | +  | 
                                                        |
| 112 | + /**  | 
                                                        |
| 113 | + * @param string $compiled_path  | 
                                                        |
| 114 | + * @param string $compiled  | 
                                                        |
| 115 | + */  | 
                                                        |
| 116 | + protected function writeFile($compiled_path, $compiled)  | 
                                                        |
| 117 | +	{ | 
                                                        |
| 118 | + $this->ensureWriteableDirectory(dirname($compiled_path));  | 
                                                        |
| 119 | + file_put_contents($compiled_path, $compiled);  | 
                                                        |
| 120 | + }  | 
                                                        |
| 121 | +  | 
                                                        |
| 122 | + /**  | 
                                                        |
| 123 | + * @param string $path  | 
                                                        |
| 124 | + */  | 
                                                        |
| 125 | + protected function ensureWriteableDirectory($path)  | 
                                                        |
| 126 | +	{ | 
                                                        |
| 127 | +		if (is_dir($path)) { | 
                                                        |
| 128 | +			if ( ! is_writeable($path)) { | 
                                                        |
| 129 | +				throw new \RuntimeException("Cannot write to compiled template path '$path'"); | 
                                                        |
| 130 | + }  | 
                                                        |
| 131 | +		} else { | 
                                                        |
| 132 | +			if ( ! mkdir($path, 0777, TRUE)) { | 
                                                        |
| 133 | +				throw new \RuntimeException("Cannot create template cache directory in '$path'"); | 
                                                        |
| 134 | + }  | 
                                                        |
| 135 | + }  | 
                                                        |
| 136 | + }  | 
                                                        |
| 137 | 137 | |
| 138 | 138 | }  | 
                                                        
@@ -15,11 +15,11 @@  | 
                                                    ||
| 15 | 15 | class CFSWrapper  | 
                                                        
| 16 | 16 |  { | 
                                                        
| 17 | 17 | |
| 18 | - /**  | 
                                                        |
| 19 | - * @see \Kohana::find_file  | 
                                                        |
| 20 | - */  | 
                                                        |
| 21 | - public function find_file($dir, $file)  | 
                                                        |
| 22 | -    { | 
                                                        |
| 23 | - return \Kohana::find_file($dir, $file, NULL, FALSE);  | 
                                                        |
| 24 | - }  | 
                                                        |
| 18 | + /**  | 
                                                        |
| 19 | + * @see \Kohana::find_file  | 
                                                        |
| 20 | + */  | 
                                                        |
| 21 | + public function find_file($dir, $file)  | 
                                                        |
| 22 | +	{ | 
                                                        |
| 23 | + return \Kohana::find_file($dir, $file, NULL, FALSE);  | 
                                                        |
| 24 | + }  | 
                                                        |
| 25 | 25 | }  | 
                                                        
@@ -1,9 +1,9 @@ discard block  | 
                                                    ||
| 1 | 1 | <?php  | 
                                                        
| 2 | 2 | /**  | 
                                                        
| 3 | - * @author Andrew Coulton <[email protected]>  | 
                                                        |
| 4 | - * @copyright 2015 inGenerator Ltd  | 
                                                        |
| 5 | - * @license http://kohanaframework.org/license  | 
                                                        |
| 6 | - */  | 
                                                        |
| 3 | + * @author Andrew Coulton <[email protected]>  | 
                                                        |
| 4 | + * @copyright 2015 inGenerator Ltd  | 
                                                        |
| 5 | + * @license http://kohanaframework.org/license  | 
                                                        |
| 6 | + */  | 
                                                        |
| 7 | 7 | |
| 8 | 8 | namespace Ingenerator\KohanaView;  | 
                                                        
| 9 | 9 | |
@@ -16,8 +16,8 @@ discard block  | 
                                                    ||
| 16 | 16 | interface TemplateSpecifyingViewModel  | 
                                                        
| 17 | 17 |  { | 
                                                        
| 18 | 18 | |
| 19 | - /**  | 
                                                        |
| 20 | - * @return string  | 
                                                        |
| 21 | - */  | 
                                                        |
| 22 | - public function getTemplateName();  | 
                                                        |
| 19 | + /**  | 
                                                        |
| 20 | + * @return string  | 
                                                        |
| 21 | + */  | 
                                                        |
| 22 | + public function getTemplateName();  | 
                                                        |
| 23 | 23 | }  | 
                                                        
@@ -17,11 +17,11 @@  | 
                                                    ||
| 17 | 17 | interface Renderer  | 
                                                        
| 18 | 18 |  { | 
                                                        
| 19 | 19 | |
| 20 | - /**  | 
                                                        |
| 21 | - * @param ViewModel $view  | 
                                                        |
| 22 | - *  | 
                                                        |
| 23 | - * @return string  | 
                                                        |
| 24 | - */  | 
                                                        |
| 25 | - public function render(ViewModel $view);  | 
                                                        |
| 20 | + /**  | 
                                                        |
| 21 | + * @param ViewModel $view  | 
                                                        |
| 22 | + *  | 
                                                        |
| 23 | + * @return string  | 
                                                        |
| 24 | + */  | 
                                                        |
| 25 | + public function render(ViewModel $view);  | 
                                                        |
| 26 | 26 | |
| 27 | 27 | }  |