Clean up Tokenizer constants.

Remove a bunch of hardcoded strings from everywhere.
This commit is contained in:
Justin Hileman
2012-03-05 14:25:32 -08:00
parent 36e7247b1e
commit a196ac8dab
6 changed files with 101 additions and 96 deletions
+9 -9
View File
@@ -47,8 +47,8 @@ class Compiler {
$code = ''; $code = '';
$level++; $level++;
foreach ($tree as $node) { foreach ($tree as $node) {
switch (is_string($node) ? 'text' : $node[Tokenizer::TAG]) { switch (is_string($node) ? 'text' : $node[Tokenizer::TYPE]) {
case '#': case Tokenizer::T_SECTION:
$code .= $this->section( $code .= $this->section(
$node[Tokenizer::NODES], $node[Tokenizer::NODES],
$node[Tokenizer::NAME], $node[Tokenizer::NAME],
@@ -60,7 +60,7 @@ class Compiler {
); );
break; break;
case '^': case Tokenizer::T_INVERTED:
$code .= $this->invertedSection( $code .= $this->invertedSection(
$node[Tokenizer::NODES], $node[Tokenizer::NODES],
$node[Tokenizer::NAME], $node[Tokenizer::NAME],
@@ -68,8 +68,8 @@ class Compiler {
); );
break; break;
case '<': case Tokenizer::T_PARTIAL:
case '>': case Tokenizer::T_PARTIAL_2:
$code .= $this->partial( $code .= $this->partial(
$node[Tokenizer::NAME], $node[Tokenizer::NAME],
isset($node[Tokenizer::INDENT]) ? $node[Tokenizer::INDENT] : '', isset($node[Tokenizer::INDENT]) ? $node[Tokenizer::INDENT] : '',
@@ -77,15 +77,15 @@ class Compiler {
); );
break; break;
case '{': case Tokenizer::T_UNESCAPED:
case '&': case Tokenizer::T_UNESCAPED_2:
$code .= $this->variable($node[Tokenizer::NAME], false, $level); $code .= $this->variable($node[Tokenizer::NAME], false, $level);
break; break;
case '!': case Tokenizer::T_COMMENT:
break; break;
case '_v': case Tokenizer::T_ESCAPED:
$code .= $this->variable($node[Tokenizer::NAME], true, $level); $code .= $this->variable($node[Tokenizer::NAME], true, $level);
break; break;
+4 -4
View File
@@ -49,13 +49,13 @@ class Parser {
if ($token === null) { if ($token === null) {
continue; continue;
} elseif (is_array($token)) { } elseif (is_array($token)) {
switch ($token[Tokenizer::TAG]) { switch ($token[Tokenizer::TYPE]) {
case '#': case Tokenizer::T_SECTION:
case '^': case Tokenizer::T_INVERTED:
$nodes[] = $this->buildTree($tokens, $token); $nodes[] = $this->buildTree($tokens, $token);
break; break;
case '/': case Tokenizer::T_END_SECTION:
if (!isset($parent)) { if (!isset($parent)) {
throw new \LogicException('Unexpected closing tag: /'. $token[Tokenizer::NAME]); throw new \LogicException('Unexpected closing tag: /'. $token[Tokenizer::NAME]);
} }
+52 -45
View File
@@ -24,40 +24,47 @@ class Tokenizer {
const IN_TAG = 2; const IN_TAG = 2;
// Token types // Token types
const T_SECTION = 1; const T_SECTION = '#';
const T_INVERTED = 2; const T_INVERTED = '^';
const T_END_SECTION = 3; const T_END_SECTION = '/';
const T_COMMENT = 4; const T_COMMENT = '!';
const T_PARTIAL = 5; const T_PARTIAL = '>';
const T_PARTIAL_2 = 6; const T_PARTIAL_2 = '<';
const T_DELIM_CHANGE = 7; const T_DELIM_CHANGE = '=';
const T_ESCAPED = 8; const T_ESCAPED = '_v';
const T_UNESCAPED = 9; const T_UNESCAPED = '{';
const T_UNESCAPED_2 = 10; const T_UNESCAPED_2 = '&';
// Token types map // Valid token types
private static $tagTypes = array( private static $tagTypes = array(
'#' => self::T_SECTION, self::T_SECTION => true,
'^' => self::T_INVERTED, self::T_INVERTED => true,
'/' => self::T_END_SECTION, self::T_END_SECTION => true,
'!' => self::T_COMMENT, self::T_COMMENT => true,
'>' => self::T_PARTIAL, self::T_PARTIAL => true,
'<' => self::T_PARTIAL_2, self::T_PARTIAL_2 => true,
'=' => self::T_DELIM_CHANGE, self::T_DELIM_CHANGE => true,
'_v' => self::T_ESCAPED, self::T_ESCAPED => true,
'{' => self::T_UNESCAPED, self::T_UNESCAPED => true,
'&' => self::T_UNESCAPED_2, self::T_UNESCAPED_2 => true,
);
// Interpolated tags
private static $interpolatedTags = array(
self::T_ESCAPED => true,
self::T_UNESCAPED => true,
self::T_UNESCAPED_2 => true,
); );
// Token properties // Token properties
const NODES = 'nodes'; const TYPE = 'type';
const TAG = 'tag';
const NAME = 'name'; const NAME = 'name';
const OTAG = 'otag'; const OTAG = 'otag';
const CTAG = 'ctag'; const CTAG = 'ctag';
const INDEX = 'index'; const INDEX = 'index';
const END = 'end'; const END = 'end';
const INDENT = 'indent'; const INDENT = 'indent';
const NODES = 'nodes';
private $state; private $state;
private $tagType; private $tagType;
@@ -104,14 +111,21 @@ class Tokenizer {
break; break;
case self::IN_TAG_TYPE: case self::IN_TAG_TYPE:
$i += strlen($this->otag) - 1; $i += strlen($this->otag) - 1;
$tag = isset(self::$tagTypes[$text[$i + 1]]) ? self::$tagTypes[$text[$i + 1]] : null; if (isset(self::$tagTypes[$text[$i + 1]])) {
$this->tagType = $tag ? $text[$i + 1] : '_v'; $tag = $text[$i + 1];
if ($this->tagType === '=') { $this->tagType = $tag;
} else {
$tag = null;
$this->tagType = self::T_ESCAPED;
}
if ($this->tagType === self::T_DELIM_CHANGE) {
$i = $this->changeDelimiters($text, $i); $i = $this->changeDelimiters($text, $i);
$this->state = self::IN_TEXT; $this->state = self::IN_TEXT;
} else { } else {
if ($tag) { if ($tag !== null) {
$i++; $i++;
} }
$this->state = self::IN_TAG; $this->state = self::IN_TAG;
@@ -122,21 +136,25 @@ class Tokenizer {
default: default:
if ($this->tagChange($this->ctag, $text, $i)) { if ($this->tagChange($this->ctag, $text, $i)) {
$this->tokens[] = array( $this->tokens[] = array(
self::TAG => $this->tagType, self::TYPE => $this->tagType,
self::NAME => trim($this->buffer), self::NAME => trim($this->buffer),
self::OTAG => $this->otag, self::OTAG => $this->otag,
self::CTAG => $this->ctag, self::CTAG => $this->ctag,
self::INDEX => ($this->tagType == '/') ? $this->seenTag - strlen($this->otag) : $i + strlen($this->ctag) self::INDEX => ($this->tagType == self::T_END_SECTION) ? $this->seenTag - strlen($this->otag) : $i + strlen($this->ctag)
); );
$this->buffer = ''; $this->buffer = '';
$i += strlen($this->ctag) - 1; $i += strlen($this->ctag) - 1;
$this->state = self::IN_TEXT; $this->state = self::IN_TEXT;
if ($this->tagType == '{') { if ($this->tagType == self::T_UNESCAPED) {
if ($this->ctag == '}}') { if ($this->ctag == '}}') {
$i++; $i++;
} else { } else {
$this->cleanTripleStache($this->tokens[count($this->tokens) - 1]); // Clean up `{{{ tripleStache }}}` style tokens.
$lastName = $this->tokens[count($this->tokens) - 1][self::NAME];
if (substr($lastName, -1) === '}') {
$this->tokens[count($this->tokens) - 1][self::NAME] = trim(substr($lastName, 0, -1));
}
} }
} }
} else { } else {
@@ -185,8 +203,8 @@ class Tokenizer {
$tokensCount = count($this->tokens); $tokensCount = count($this->tokens);
for ($j = $this->lineStart; $j < $tokensCount; $j++) { for ($j = $this->lineStart; $j < $tokensCount; $j++) {
$token = $this->tokens[$j]; $token = $this->tokens[$j];
if (is_array($token) && isset(self::$tagTypes[$token[self::TAG]])) { if (is_array($token) && isset(self::$tagTypes[$token[self::TYPE]])) {
if (self::$tagTypes[$token[self::TAG]] >= self::T_ESCAPED) { if (isset(self::$interpolatedTags[$token[self::TYPE]])) {
return false; return false;
} }
} elseif (is_string($token)) { } elseif (is_string($token)) {
@@ -210,7 +228,7 @@ class Tokenizer {
$tokensCount = count($this->tokens); $tokensCount = count($this->tokens);
for ($j = $this->lineStart; $j < $tokensCount; $j++) { for ($j = $this->lineStart; $j < $tokensCount; $j++) {
if (!is_array($this->tokens[$j])) { if (!is_array($this->tokens[$j])) {
if (isset($this->tokens[$j+1]) && is_array($this->tokens[$j+1]) && $this->tokens[$j+1][self::TAG] == '>') { if (isset($this->tokens[$j+1]) && is_array($this->tokens[$j+1]) && $this->tokens[$j+1][self::TYPE] == self::T_PARTIAL) {
$this->tokens[$j+1][self::INDENT] = (string) $this->tokens[$j]; $this->tokens[$j+1][self::INDENT] = (string) $this->tokens[$j];
} }
@@ -245,17 +263,6 @@ class Tokenizer {
return $closeIndex + strlen($close) - 1; return $closeIndex + strlen($close) - 1;
} }
/**
* Clean up `{{{ tripleStache }}}` style tokens.
*
* @param array &$token
*/
private function cleanTripleStache(&$token) {
if (substr($token[self::NAME], -1) === '}') {
$token[self::NAME] = trim(substr($token[self::NAME], 0, -1));
}
}
/** /**
* Test whether it's time to change tags. * Test whether it's time to change tags.
* *
+3 -3
View File
@@ -50,11 +50,11 @@ class CompilerTest extends \PHPUnit_Framework_TestCase {
'foo', 'foo',
"\n", "\n",
array( array(
Tokenizer::TAG => '_v', Tokenizer::TYPE => Tokenizer::T_ESCAPED,
Tokenizer::NAME => 'name', Tokenizer::NAME => 'name',
), ),
array( array(
Tokenizer::TAG => '_v', Tokenizer::TYPE => Tokenizer::T_ESCAPED,
Tokenizer::NAME => '.', Tokenizer::NAME => '.',
), ),
"'bar'", "'bar'",
@@ -79,6 +79,6 @@ class CompilerTest extends \PHPUnit_Framework_TestCase {
*/ */
public function testCompilerThrowsUnknownNodeTypeException() { public function testCompilerThrowsUnknownNodeTypeException() {
$compiler = new Compiler; $compiler = new Compiler;
$compiler->compile('', array(array(Tokenizer::TAG => 'invalid')), 'SomeClass'); $compiler->compile('', array(array(Tokenizer::TYPE => 'invalid')), 'SomeClass');
} }
} }
+21 -21
View File
@@ -43,11 +43,11 @@ class ParserTest extends \PHPUnit_Framework_TestCase {
array( array(
array(array( array(array(
Tokenizer::TAG => '_v', Tokenizer::TYPE => Tokenizer::T_ESCAPED,
Tokenizer::NAME => 'name' Tokenizer::NAME => 'name'
)), )),
array(array( array(array(
Tokenizer::TAG => '_v', Tokenizer::TYPE => Tokenizer::T_ESCAPED,
Tokenizer::NAME => 'name' Tokenizer::NAME => 'name'
)), )),
), ),
@@ -56,16 +56,16 @@ class ParserTest extends \PHPUnit_Framework_TestCase {
array( array(
'foo', 'foo',
array( array(
Tokenizer::TAG => '^', Tokenizer::TYPE => Tokenizer::T_INVERTED,
Tokenizer::INDEX => 123, Tokenizer::INDEX => 123,
Tokenizer::NAME => 'parent' Tokenizer::NAME => 'parent'
), ),
array( array(
Tokenizer::TAG => '_v', Tokenizer::TYPE => Tokenizer::T_ESCAPED,
Tokenizer::NAME => 'name' Tokenizer::NAME => 'name'
), ),
array( array(
Tokenizer::TAG => '/', Tokenizer::TYPE => Tokenizer::T_END_SECTION,
Tokenizer::INDEX => 456, Tokenizer::INDEX => 456,
Tokenizer::NAME => 'parent' Tokenizer::NAME => 'parent'
), ),
@@ -74,13 +74,13 @@ class ParserTest extends \PHPUnit_Framework_TestCase {
array( array(
'foo', 'foo',
array( array(
Tokenizer::TAG => '^', Tokenizer::TYPE => Tokenizer::T_INVERTED,
Tokenizer::NAME => 'parent', Tokenizer::NAME => 'parent',
Tokenizer::INDEX => 123, Tokenizer::INDEX => 123,
Tokenizer::END => 456, Tokenizer::END => 456,
Tokenizer::NODES => array( Tokenizer::NODES => array(
array( array(
Tokenizer::TAG => '_v', Tokenizer::TYPE => Tokenizer::T_ESCAPED,
Tokenizer::NAME => 'name' Tokenizer::NAME => 'name'
), ),
), ),
@@ -107,9 +107,9 @@ class ParserTest extends \PHPUnit_Framework_TestCase {
array( array(
array( array(
array( array(
Tokenizer::TAG => '#', Tokenizer::TYPE => Tokenizer::T_SECTION,
Tokenizer::NAME => 'parent',
Tokenizer::INDEX => 123, Tokenizer::INDEX => 123,
Tokenizer::NAME => 'parent'
), ),
), ),
), ),
@@ -118,9 +118,9 @@ class ParserTest extends \PHPUnit_Framework_TestCase {
array( array(
array( array(
array( array(
Tokenizer::TAG => '^', Tokenizer::TYPE => Tokenizer::T_INVERTED,
Tokenizer::NAME => 'parent',
Tokenizer::INDEX => 123, Tokenizer::INDEX => 123,
Tokenizer::NAME => 'parent'
), ),
), ),
), ),
@@ -129,9 +129,9 @@ class ParserTest extends \PHPUnit_Framework_TestCase {
array( array(
array( array(
array( array(
Tokenizer::TAG => '/', Tokenizer::TYPE => Tokenizer::T_END_SECTION,
Tokenizer::NAME => 'parent',
Tokenizer::INDEX => 123, Tokenizer::INDEX => 123,
Tokenizer::NAME => 'parent'
), ),
), ),
), ),
@@ -140,24 +140,24 @@ class ParserTest extends \PHPUnit_Framework_TestCase {
array( array(
array( array(
array( array(
Tokenizer::TAG => '#', Tokenizer::TYPE => Tokenizer::T_SECTION,
Tokenizer::NAME => 'parent',
Tokenizer::INDEX => 123, Tokenizer::INDEX => 123,
Tokenizer::NAME => 'parent'
), ),
array( array(
Tokenizer::TAG => '#', Tokenizer::TYPE => Tokenizer::T_SECTION,
Tokenizer::NAME => 'child',
Tokenizer::INDEX => 123, Tokenizer::INDEX => 123,
Tokenizer::NAME => 'child'
), ),
array( array(
Tokenizer::TAG => '/', Tokenizer::TYPE => Tokenizer::T_END_SECTION,
Tokenizer::NAME => 'parent',
Tokenizer::INDEX => 123, Tokenizer::INDEX => 123,
Tokenizer::NAME => 'parent'
), ),
array( array(
Tokenizer::TAG => '/', Tokenizer::TYPE => Tokenizer::T_END_SECTION,
Tokenizer::NAME => 'child',
Tokenizer::INDEX => 123, Tokenizer::INDEX => 123,
Tokenizer::NAME => 'child'
), ),
), ),
), ),
+7 -9
View File
@@ -45,7 +45,7 @@ class TokenizerTest extends \PHPUnit_Framework_TestCase {
null, null,
array( array(
array( array(
Tokenizer::TAG => '_v', Tokenizer::TYPE => Tokenizer::T_ESCAPED,
Tokenizer::NAME => 'name', Tokenizer::NAME => 'name',
Tokenizer::OTAG => '{{', Tokenizer::OTAG => '{{',
Tokenizer::CTAG => '}}', Tokenizer::CTAG => '}}',
@@ -65,7 +65,7 @@ class TokenizerTest extends \PHPUnit_Framework_TestCase {
'<<< >>>', '<<< >>>',
array( array(
array( array(
Tokenizer::TAG => '_v', Tokenizer::TYPE => Tokenizer::T_ESCAPED,
Tokenizer::NAME => 'name', Tokenizer::NAME => 'name',
Tokenizer::OTAG => '<<<', Tokenizer::OTAG => '<<<',
Tokenizer::CTAG => '>>>', Tokenizer::CTAG => '>>>',
@@ -79,7 +79,7 @@ class TokenizerTest extends \PHPUnit_Framework_TestCase {
null, null,
array( array(
array( array(
Tokenizer::TAG => '{', Tokenizer::TYPE => Tokenizer::T_UNESCAPED,
Tokenizer::NAME => 'a', Tokenizer::NAME => 'a',
Tokenizer::OTAG => '{{', Tokenizer::OTAG => '{{',
Tokenizer::CTAG => '}}', Tokenizer::CTAG => '}}',
@@ -87,7 +87,7 @@ class TokenizerTest extends \PHPUnit_Framework_TestCase {
), ),
"\n", "\n",
array( array(
Tokenizer::TAG => '#', Tokenizer::TYPE => Tokenizer::T_SECTION,
Tokenizer::NAME => 'b', Tokenizer::NAME => 'b',
Tokenizer::OTAG => '{{', Tokenizer::OTAG => '{{',
Tokenizer::CTAG => '}}', Tokenizer::CTAG => '}}',
@@ -95,14 +95,14 @@ class TokenizerTest extends \PHPUnit_Framework_TestCase {
), ),
null, null,
array( array(
Tokenizer::TAG => '_v', Tokenizer::TYPE => Tokenizer::T_ESCAPED,
Tokenizer::NAME => 'c', Tokenizer::NAME => 'c',
Tokenizer::OTAG => '|', Tokenizer::OTAG => '|',
Tokenizer::CTAG => '|', Tokenizer::CTAG => '|',
Tokenizer::INDEX => 37, Tokenizer::INDEX => 37,
), ),
array( array(
Tokenizer::TAG => '/', Tokenizer::TYPE => Tokenizer::T_END_SECTION,
Tokenizer::NAME => 'b', Tokenizer::NAME => 'b',
Tokenizer::OTAG => '|', Tokenizer::OTAG => '|',
Tokenizer::CTAG => '|', Tokenizer::CTAG => '|',
@@ -110,7 +110,7 @@ class TokenizerTest extends \PHPUnit_Framework_TestCase {
), ),
"\n", "\n",
array( array(
Tokenizer::TAG => '{', Tokenizer::TYPE => Tokenizer::T_UNESCAPED,
Tokenizer::NAME => 'd', Tokenizer::NAME => 'd',
Tokenizer::OTAG => '|', Tokenizer::OTAG => '|',
Tokenizer::CTAG => '|', Tokenizer::CTAG => '|',
@@ -119,8 +119,6 @@ class TokenizerTest extends \PHPUnit_Framework_TestCase {
) )
), ),
); );
} }
} }