mirror of
https://github.com/Mibew/handlebars.php.git
synced 2025-05-03 10:33:08 +03:00
Fix escaping of tags with multiple slashes
This commit is contained in:
parent
04f963a21f
commit
824ae885c6
@ -149,7 +149,15 @@ class Tokenizer
|
|||||||
|
|
||||||
switch ($this->state) {
|
switch ($this->state) {
|
||||||
case self::IN_TEXT:
|
case self::IN_TEXT:
|
||||||
if ($this->tagChange($this->otag. self::T_TRIM, $text, $i) and !$this->escaped) {
|
// Handlebars.js does not think that openning curly brace in
|
||||||
|
// "\\\{{data}}" template is escaped. Instead it removes one
|
||||||
|
// slash and leaves others "as is". To emulate similar behavior
|
||||||
|
// we have to check the last character in the buffer. If it's a
|
||||||
|
// slash we actually does not need to escape openning curly
|
||||||
|
// brace.
|
||||||
|
$prev_slash = substr($this->buffer, -1) == '\\';
|
||||||
|
|
||||||
|
if ($this->tagChange($this->otag. self::T_TRIM, $text, $i) and (!$this->escaped || $prev_slash)) {
|
||||||
$this->flushBuffer();
|
$this->flushBuffer();
|
||||||
$this->state = self::IN_TAG_TYPE;
|
$this->state = self::IN_TAG_TYPE;
|
||||||
$this->trimLeft = true;
|
$this->trimLeft = true;
|
||||||
@ -157,7 +165,7 @@ class Tokenizer
|
|||||||
$this->buffer .= "{{{";
|
$this->buffer .= "{{{";
|
||||||
$i += 2;
|
$i += 2;
|
||||||
continue;
|
continue;
|
||||||
} elseif ($this->tagChange($this->otag, $text, $i) and !$this->escaped) {
|
} elseif ($this->tagChange($this->otag, $text, $i) and (!$this->escaped || $prev_slash)) {
|
||||||
$i--;
|
$i--;
|
||||||
$this->flushBuffer();
|
$this->flushBuffer();
|
||||||
$this->state = self::IN_TAG_TYPE;
|
$this->state = self::IN_TAG_TYPE;
|
||||||
|
@ -127,6 +127,16 @@ class HandlebarsTest extends \PHPUnit_Framework_TestCase
|
|||||||
array('data' => 'foo'),
|
array('data' => 'foo'),
|
||||||
'\\foo' // is equals to \foo in output
|
'\\foo' // is equals to \foo in output
|
||||||
),
|
),
|
||||||
|
array(
|
||||||
|
'\\\\\\{{data}}', // is equal to \\\{{data}} in template file
|
||||||
|
array('data' => 'foo'),
|
||||||
|
'\\\\foo' // is equals to \\foo in output
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'\\\\\\\\{{data}}', // is equal to \\\\{{data}} in template file
|
||||||
|
array('data' => 'foo'),
|
||||||
|
'\\\\\\foo' // is equals to \\\foo in output
|
||||||
|
),
|
||||||
array(
|
array(
|
||||||
'\{{{data}}}', // is equal to \{{{data}}} in template file
|
'\{{{data}}}', // is equal to \{{{data}}} in template file
|
||||||
array('data' => 'foo'),
|
array('data' => 'foo'),
|
||||||
|
Loading…
Reference in New Issue
Block a user