From f6f9d3fe6fa14e7fc9a1e08e6834d768c10b95ff Mon Sep 17 00:00:00 2001 From: Justin Hileman Date: Wed, 14 Mar 2012 20:04:55 -0700 Subject: [PATCH] Allow custom `escape` callbacks. cf. #86 --- Mustache.php | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/Mustache.php b/Mustache.php index c97cd12..5cfe409 100644 --- a/Mustache.php +++ b/Mustache.php @@ -30,6 +30,9 @@ class Mustache { MustacheException::UNKNOWN_PRAGMA => true, ); + // Override the escaper function. Defaults to `htmlspecialchars`. + protected $_escape; + // Override charset passed to htmlentities() and htmlspecialchars(). Defaults to UTF-8. protected $_charset = 'UTF-8'; @@ -84,6 +87,11 @@ class Mustache { * Passing an $options array allows overriding certain Mustache options during instantiation: * * $options = array( + * // `escape` -- custom escaper callback; must be callable. + * 'escape' => function($text) { + * return htmlspecialchars($text, ENT_COMPAT, 'UTF-8'); + * }, + * * // `charset` -- must be supported by `htmlspecialentities()`. defaults to 'UTF-8' * 'charset' => 'ISO-8859-1', * @@ -127,6 +135,13 @@ class Mustache { * @return void */ protected function _setOptions(array $options) { + if (isset($options['escape'])) { + if (!is_callable($options['escape'])) { + throw new InvalidArgumentException('Mustache constructor "escape" option must be callable'); + } + $this->_escape = $options['escape']; + } + if (isset($options['charset'])) { $this->_charset = $options['charset']; } @@ -640,7 +655,13 @@ class Mustache { * @return string */ protected function _renderEscaped($tag_name, $leading, $trailing) { - $rendered = htmlentities($this->_renderUnescaped($tag_name, '', ''), ENT_COMPAT, $this->_charset); + $value = $this->_renderUnescaped($tag_name, '', ''); + if (isset($this->_escape)) { + $rendered = call_user_func($this->_escape, $value); + } else { + $rendered = htmlentities($value, ENT_COMPAT, $this->_charset); + } + return $leading . $rendered . $trailing; }