Esempio n. 1
0
 public function testTagAssign()
 {
     $config = array();
     $v = new FakeTags\VariableTag($config);
     $expectedMap = array(Consts::TAG_MAP_SUBS => array('${' => array(Consts::TAG_MAP_SUBS => array(Consts::TAG_WILDCARD => array(Consts::TAG_MAP_SUBS => array('}' => array(Consts::TAG_MAP_SUBS => array(), Consts::TAG_MAP_TAGLENGTHS => array(), Consts::TAG_MAP_HANDLER => $v, Consts::TAG_MAP_CHECKS => array())), Consts::TAG_MAP_TAGLENGTHS => array(1 => 1), Consts::TAG_MAP_HANDLER => null, Consts::TAG_MAP_CHECKS => array('}' => true))), Consts::TAG_MAP_TAGLENGTHS => array(), Consts::TAG_MAP_HANDLER => null, Consts::TAG_MAP_CHECKS => array())), Consts::TAG_MAP_TAGLENGTHS => array(2 => 2), Consts::TAG_MAP_HANDLER => null, Consts::TAG_MAP_CHECKS => array('$' => true));
     $tag = new Tags();
     $tag->register($v);
     $this->assertSame($expectedMap, $tag->getMap());
 }
Esempio n. 2
0
 public function testAnalyze()
 {
     $config = array('MaxTags' => 300, 'MaxNestingLevel' => 2, 'TolerateInvalid' => false);
     $expects = array(array(array(array(Consts::CONTEXT_ID => '', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_WILDCARD, Consts::CONTEXT_START => 13, Consts::CONTEXT_END => 18, Consts::CONTEXT_CONTEXT => null))), array(array(array(Consts::CONTEXT_ID => '', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_WILDCARD, Consts::CONTEXT_START => 7, Consts::CONTEXT_END => 11, Consts::CONTEXT_CONTEXT => null))), array(array(array(Consts::CONTEXT_ID => '', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_WILDCARD, Consts::CONTEXT_START => 41, Consts::CONTEXT_END => 44, Consts::CONTEXT_CONTEXT => null))), array(array(array(Consts::CONTEXT_ID => '', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_WILDCARD, Consts::CONTEXT_START => 57, Consts::CONTEXT_END => 60, Consts::CONTEXT_CONTEXT => null))), array(array(array(Consts::CONTEXT_ID => '', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_WILDCARD, Consts::CONTEXT_START => 50, Consts::CONTEXT_END => 53, Consts::CONTEXT_CONTEXT => null))), array(array(array(Consts::CONTEXT_ID => '0/0/3/0/0', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_CHILD, Consts::CONTEXT_START => 48, Consts::CONTEXT_END => 54, Consts::CONTEXT_CONTEXT => 'Facula\\Unit\\Formated\\Base\\Analyzer\\Context'), array(Consts::CONTEXT_ID => '', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_WILDCARD, Consts::CONTEXT_START => 54, Consts::CONTEXT_END => 55, Consts::CONTEXT_CONTEXT => null), array(Consts::CONTEXT_ID => '0/0/3/0/1', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_CHILD, Consts::CONTEXT_START => 55, Consts::CONTEXT_END => 61, Consts::CONTEXT_CONTEXT => 'Facula\\Unit\\Formated\\Base\\Analyzer\\Context'))), array(array(array(Consts::CONTEXT_ID => '', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_WILDCARD, Consts::CONTEXT_START => 34, Consts::CONTEXT_END => 37, Consts::CONTEXT_CONTEXT => null)), array(array(Consts::CONTEXT_ID => '0/0/2/1/0', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_CHILD, Consts::CONTEXT_START => 39, Consts::CONTEXT_END => 45, Consts::CONTEXT_CONTEXT => 'Facula\\Unit\\Formated\\Base\\Analyzer\\Context'))), array(array(array(Consts::CONTEXT_ID => '', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_WILDCARD, Consts::CONTEXT_START => 23, Consts::CONTEXT_END => 26, Consts::CONTEXT_CONTEXT => null)), array(array(Consts::CONTEXT_ID => '', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_WILDCARD, Consts::CONTEXT_START => 28, Consts::CONTEXT_END => 31, Consts::CONTEXT_CONTEXT => null))), array(array(array(Consts::CONTEXT_ID => '0/0/0/0/0', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_CHILD, Consts::CONTEXT_START => 6, Consts::CONTEXT_END => 12, Consts::CONTEXT_CONTEXT => 'Facula\\Unit\\Formated\\Base\\Analyzer\\Context'), array(Consts::CONTEXT_ID => '0/0/0/0/1', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_CHILD, Consts::CONTEXT_START => 12, Consts::CONTEXT_END => 19, Consts::CONTEXT_CONTEXT => 'Facula\\Unit\\Formated\\Base\\Analyzer\\Context'))), array(array(array(Consts::CONTEXT_ID => '', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_WILDCARD, Consts::CONTEXT_START => 0, Consts::CONTEXT_END => 4, Consts::CONTEXT_CONTEXT => null), array(Consts::CONTEXT_ID => '0/0/0', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_CHILD, Consts::CONTEXT_START => 4, Consts::CONTEXT_END => 21, Consts::CONTEXT_CONTEXT => 'Facula\\Unit\\Formated\\Base\\Analyzer\\Context'), array(Consts::CONTEXT_ID => '0/0/1', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_CHILD, Consts::CONTEXT_START => 21, Consts::CONTEXT_END => 32, Consts::CONTEXT_CONTEXT => 'Facula\\Unit\\Formated\\Base\\Analyzer\\Context'), array(Consts::CONTEXT_ID => '0/0/2', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_CHILD, Consts::CONTEXT_START => 32, Consts::CONTEXT_END => 46, Consts::CONTEXT_CONTEXT => 'Facula\\Unit\\Formated\\Base\\Analyzer\\Context'), array(Consts::CONTEXT_ID => '0/0/3', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_CHILD, Consts::CONTEXT_START => 46, Consts::CONTEXT_END => 62, Consts::CONTEXT_CONTEXT => 'Facula\\Unit\\Formated\\Base\\Analyzer\\Context'), array(Consts::CONTEXT_ID => '', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_WILDCARD, Consts::CONTEXT_START => 62, Consts::CONTEXT_END => 63, Consts::CONTEXT_CONTEXT => null))));
     $t = new Tags();
     $t->register(new FakeTags\BoldTag($config));
     $t->register(new FakeTags\ItalicTag($config));
     $t->register(new FakeTags\VariableShortTag($config));
     $t->register(new FakeTags\VariableTag($config));
     $t->register(new FakeTags\PercentTag($config));
     $a = new Analyzer($t, $config);
     $string = 'Some***Bold**Bold2***${AAA}(BBB)${CCC}(${DDD})%{${EEE}F${GGG}}.';
     $contexts = $a->analyze($string);
     foreach ($contexts as $contextKey => $context) {
         foreach ($context->steps() as $wildcardKey => $wildcardData) {
             foreach ($wildcardData as $stepsKey => $steps) {
                 /*
                                     printf("[%03d, %03d, %03d] => ID: %10s, Type: %03d, Start: %03d, End: %03d => |%s| \r\n",
                                         $contextKey,
                                         $wildcardKey,
                                         $stepsKey,
                                         $steps[Consts::CONTEXT_ID],
                                         $steps[Consts::CONTEXT_TYPE],
                                         $steps[Consts::CONTEXT_START],
                                         $steps[Consts::CONTEXT_END],
                                         substr(
                                             $string,
                                             $steps[Consts::CONTEXT_START],
                                             $steps[Consts::CONTEXT_END] - $steps[Consts::CONTEXT_START]
                                         )
                                     );*/
                 // Consts::CONTEXT_ID
                 $this->assertSame($expects[$contextKey][$wildcardKey][$stepsKey][Consts::CONTEXT_ID], $steps[Consts::CONTEXT_ID]);
                 // Consts::CONTEXT_TYPE
                 $this->assertSame($expects[$contextKey][$wildcardKey][$stepsKey][Consts::CONTEXT_TYPE], $steps[Consts::CONTEXT_TYPE]);
                 // Consts::CONTEXT_START
                 $this->assertSame($expects[$contextKey][$wildcardKey][$stepsKey][Consts::CONTEXT_START], $steps[Consts::CONTEXT_START]);
                 // Consts::CONTEXT_END
                 $this->assertSame($expects[$contextKey][$wildcardKey][$stepsKey][Consts::CONTEXT_END], $steps[Consts::CONTEXT_END]);
                 // Consts::CONTEXT_CONTEXT
                 if ($expects[$contextKey][$wildcardKey][$stepsKey][Consts::CONTEXT_ID] === '') {
                     $this->assertSame(true, is_null($steps[Consts::CONTEXT_CONTEXT]));
                 } else {
                     $this->assertSame($expects[$contextKey][$wildcardKey][$stepsKey][Consts::CONTEXT_CONTEXT], get_class($steps[Consts::CONTEXT_CONTEXT]));
                 }
             }
         }
     }
 }
Esempio n. 3
0
 public function testPreviousNextParent()
 {
     $tagHandlerA = new FakeTags\VariableTag(static::getDummyConfig());
     $tagHandlerB = new FakeTags\VariableShortTag(static::getDummyConfig());
     $tagHandlerC = new FakeTags\PercentTag(static::getDummyConfig());
     $tag = new Tags();
     $tag->register($tagHandlerA);
     $tag->register($tagHandlerB);
     $tag->register($tagHandlerC);
     $config = array('MaxTags' => 9999, 'MaxNestingLevel' => 2, 'TolerateInvalid' => false);
     $targetString = 'There is ${TAG1} ${TAG2}(%{TAG4} and ${TAG5}).';
     $tree = Tree::analyze($tag, $targetString, $config)->wildcard(0);
     $this->assertSame($tree->child(0)->next(), $tree->child(1)->previous()->next());
     $this->assertSame($tagHandlerA, $tree->child(0)->next()->handler());
     $this->assertSame($tagHandlerB, $tree->child(0)->next()->previous()->handler());
     $this->assertSame($tagHandlerB, $tree->child(1)->wildcard(1)->child(0)->next()->handler());
     $this->assertSame($tagHandlerC, $tree->child(1)->wildcard(1)->child(0)->next()->previous()->handler());
     $this->assertSame($tagHandlerA, $tree->child(1)->wildcard(1)->child(0)->parent()->parent()->handler());
 }
Esempio n. 4
0
 public function testAnalyzeTrimed()
 {
     $tagHandlerA = new FakeTags\VariableTag(static::getDummyConfig());
     $tagHandlerB = new FakeTags\VariableShortTag(static::getDummyConfig());
     $tagHandlerC = new FakeTags\PercentTag(static::getDummyConfig());
     $tag = new Tags();
     $tag->register($tagHandlerA);
     $tag->register($tagHandlerB);
     $tag->register($tagHandlerC);
     $config = array('MaxTags' => 9999, 'MaxNestingLevel' => 3, 'TolerateInvalid' => false);
     $string = '${TAG}(AA)';
     $contexts = Context::analyze(Tree::analyze($tag, $string, $config), $config);
     $expects = array(array(array(array(Consts::CONTEXT_ID => '', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_WILDCARD, Consts::CONTEXT_START => 2, Consts::CONTEXT_END => 5, Consts::CONTEXT_CONTEXT => null)), array(array(Consts::CONTEXT_ID => '', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_WILDCARD, Consts::CONTEXT_START => 7, Consts::CONTEXT_END => 9, Consts::CONTEXT_CONTEXT => null))), array(array(array(Consts::CONTEXT_ID => '0/0/0', Consts::CONTEXT_TYPE => Consts::CONTEXT_TYPE_CHILD, Consts::CONTEXT_START => 0, Consts::CONTEXT_END => 10, Consts::CONTEXT_CONTEXT => 'Facula\\Unit\\Formated\\Base\\Analyzer\\Context'))));
     foreach ($contexts as $contextKey => $context) {
         foreach ($context->steps() as $wildcardKey => $wildcardData) {
             foreach ($wildcardData as $stepsKey => $steps) {
                 // Consts::CONTEXT_ID
                 $this->assertSame($expects[$contextKey][$wildcardKey][$stepsKey][Consts::CONTEXT_ID], $steps[Consts::CONTEXT_ID]);
                 // Consts::CONTEXT_TYPE
                 $this->assertSame($expects[$contextKey][$wildcardKey][$stepsKey][Consts::CONTEXT_TYPE], $steps[Consts::CONTEXT_TYPE]);
                 // Consts::CONTEXT_START
                 $this->assertSame($expects[$contextKey][$wildcardKey][$stepsKey][Consts::CONTEXT_START], $steps[Consts::CONTEXT_START]);
                 // Consts::CONTEXT_END
                 $this->assertSame($expects[$contextKey][$wildcardKey][$stepsKey][Consts::CONTEXT_END], $steps[Consts::CONTEXT_END]);
                 // Consts::CONTEXT_CONTEXT
                 if ($expects[$contextKey][$wildcardKey][$stepsKey][Consts::CONTEXT_ID] === '') {
                     $this->assertSame(true, is_null($steps[Consts::CONTEXT_CONTEXT]));
                 } else {
                     $this->assertSame($expects[$contextKey][$wildcardKey][$stepsKey][Consts::CONTEXT_CONTEXT], get_class($steps[Consts::CONTEXT_CONTEXT]));
                 }
             }
         }
     }
 }
Esempio n. 5
0
 /**
  * Analyze tree according to specified Tags and content
  *
  * @param Tags $t Tags object
  * @param string $content Refer to the content string
  * @param array $config Configuration for tree analyze
  *
  * @throws Exception\TooManyTags
  * @throws Exception\NestTooDeep
  *
  * @return static Return the root tree object
  */
 public static function analyze(Tags $t, &$content, array &$config)
 {
     $totalTags = 0;
     $tagMap = $t->getMap();
     $contentLength = strlen($content);
     $stepInfo = array(static::NEXTSTEP_INDEX => 0, static::NEXTSTEP_NODE => null);
     $root = new static($tagMap, $tagMap, $totalTags);
     $stepInfo[static::NEXTSTEP_NODE] = $root->startover($root->wildcards);
     while ($contentLength > $stepInfo[static::NEXTSTEP_INDEX]) {
         $stepInfo = $stepInfo[static::NEXTSTEP_NODE]->enter($stepInfo[static::NEXTSTEP_INDEX], $content);
         if ($stepInfo[static::NEXTSTEP_NODE]->level > $config['MaxNestingLevel']) {
             throw new Exception\NestTooDeep($stepInfo[static::NEXTSTEP_NODE]->startPos, $stepInfo[static::NEXTSTEP_NODE]->level, $config['MaxNestingLevel']);
         }
         if ($totalTags > $config['MaxTags']) {
             throw new Exception\TooManyTags($stepInfo[static::NEXTSTEP_NODE]->startPos, $config['MaxTags']);
         }
     }
     // Refresh the position information of the last picking
     // branch
     while ($stepInfo[static::NEXTSTEP_NODE]->parent !== null) {
         $stepInfo[static::NEXTSTEP_NODE]->endPos = $stepInfo[static::NEXTSTEP_INDEX];
         $stepInfo[static::NEXTSTEP_NODE] = $stepInfo[static::NEXTSTEP_NODE]->parent;
     }
     return $root;
 }