private $tokens;
private $seenTag;
private $line;
+
private $otag;
- private $ctag;
+ private $otagChar;
private $otagLen;
+
+ private $ctag;
+ private $ctagChar;
private $ctagLen;
/**
* Scan and tokenize template source.
*
* @throws Mustache_Exception_SyntaxException when mismatched section tags are encountered
+ * @throws Mustache_Exception_InvalidArgumentException when $delimiters string is invalid
*
* @param string $text Mustache template source to tokenize
* @param string $delimiters Optionally, pass initial opening and closing delimiters (default: null)
for ($i = 0; $i < $len; $i++) {
switch ($this->state) {
case self::IN_TEXT:
- if ($this->tagChange($this->otag, $this->otagLen, $text, $i)) {
+ $char = $text[$i];
+ // Test whether it's time to change tags.
+ if ($char === $this->otagChar && substr($text, $i, $this->otagLen) === $this->otag) {
$i--;
$this->flushBuffer();
$this->state = self::IN_TAG_TYPE;
} else {
- $char = $text[$i];
$this->buffer .= $char;
if ($char === "\n") {
$this->flushBuffer();
break;
default:
- if ($this->tagChange($this->ctag, $this->ctagLen, $text, $i)) {
+ $char = $text[$i];
+ // Test whether it's time to change tags.
+ if ($char === $this->ctagChar && substr($text, $i, $this->ctagLen) === $this->ctag) {
$token = array(
self::TYPE => $this->tagType,
self::NAME => trim($this->buffer),
$this->state = self::IN_TEXT;
$this->tokens[] = $token;
} else {
- $this->buffer .= $text[$i];
+ $this->buffer .= $char;
}
break;
}
*/
private function reset()
{
- $this->state = self::IN_TEXT;
- $this->tagType = null;
- $this->buffer = '';
- $this->tokens = array();
- $this->seenTag = false;
- $this->line = 0;
- $this->otag = '{{';
- $this->ctag = '}}';
- $this->otagLen = 2;
- $this->ctagLen = 2;
+ $this->state = self::IN_TEXT;
+ $this->tagType = null;
+ $this->buffer = '';
+ $this->tokens = array();
+ $this->seenTag = false;
+ $this->line = 0;
+
+ $this->otag = '{{';
+ $this->otagChar = '{';
+ $this->otagLen = 2;
+
+ $this->ctag = '}}';
+ $this->ctagChar = '}';
+ $this->ctagLen = 2;
}
/**
/**
* Change the current Mustache delimiters. Set new `otag` and `ctag` values.
*
+ * @throws Mustache_Exception_SyntaxException when delimiter string is invalid
+ *
* @param string $text Mustache template source
* @param int $index Current tokenizer index
*
$close = '=' . $this->ctag;
$closeIndex = strpos($text, $close, $index);
- $this->setDelimiters(trim(substr($text, $startIndex, $closeIndex - $startIndex)));
-
- $this->tokens[] = array(
+ $token = array(
self::TYPE => self::T_DELIM_CHANGE,
self::LINE => $this->line,
);
+ try {
+ $this->setDelimiters(trim(substr($text, $startIndex, $closeIndex - $startIndex)));
+ } catch (Mustache_Exception_InvalidArgumentException $e) {
+ throw new Mustache_Exception_SyntaxException($e->getMessage(), $token);
+ }
+
+ $this->tokens[] = $token;
+
return $closeIndex + strlen($close) - 1;
}
/**
* Set the current Mustache `otag` and `ctag` delimiters.
*
+ * @throws Mustache_Exception_InvalidArgumentException when delimiter string is invalid
+ *
* @param string $delimiters
*/
private function setDelimiters($delimiters)
{
- list($otag, $ctag) = explode(' ', $delimiters);
- $this->otag = $otag;
- $this->ctag = $ctag;
- $this->otagLen = strlen($otag);
- $this->ctagLen = strlen($ctag);
+ if (!preg_match('/^\s*(\S+)\s+(\S+)\s*$/', $delimiters, $matches)) {
+ throw new Mustache_Exception_InvalidArgumentException(sprintf('Invalid delimiters: %s', $delimiters));
+ }
+
+ list($_, $otag, $ctag) = $matches;
+
+ $this->otag = $otag;
+ $this->otagChar = $otag[0];
+ $this->otagLen = strlen($otag);
+
+ $this->ctag = $ctag;
+ $this->ctagChar = $ctag[0];
+ $this->ctagLen = strlen($ctag);
}
/**
return $end + $this->ctagLen - 1;
}
-
- /**
- * Test whether it's time to change tags.
- *
- * @param string $tag Current tag name
- * @param int $tagLen Current tag name length
- * @param string $text Mustache template source
- * @param int $index Current tokenizer index
- *
- * @return bool True if this is a closing section tag
- */
- private function tagChange($tag, $tagLen, $text, $index)
- {
- return substr($text, $index, $tagLen) === $tag;
- }
}