Example #1
0
 public function testRender()
 {
     $element = new HtmlElement();
     $element->setContent('cont1');
     $html = $element->render();
     $this->assertEquals('cont1', $html);
 }
 public function testRender3()
 {
     $element1 = new BoolBlockElement();
     $element1->setContent(true);
     $element2 = new HtmlElement();
     $element2->setContent('cont2');
     $element1->addChild($element2);
     $html = $element1->render();
     $this->assertEquals('cont2', $html);
 }
Example #3
0
 public function testRenderChildren2()
 {
     $element1 = new Element();
     $element2 = new HtmlElement();
     $element3 = new HtmlElement();
     $element1->setChildren(array($element2, $element3));
     $element2->setContent('el2');
     $element3->setContent('el3');
     $this->assertEquals('el2el3', $element1->renderChildren($element1->getChildren()));
 }
Example #4
0
 private function parseElements($rawhtml = '', $parentElement = null, $level = 1)
 {
     #fwrite(STDOUT, __CLASS__.'->'.__FUNCTION__.': level='.$level.PHP_EOL);
     if ($level >= 100) {
         throw new RuntimeException(__FUNCTION__ . ': Maximum level of 100 reached.', 2);
     }
     if (!$rawhtml && $level == 1) {
         $rawhtml = $this->template;
     }
     if (!$parentElement) {
         $this->elementsId++;
         $parentElement = $this->rootElement = new Element();
         $parentElement->setId($this->elementsId);
     }
     $fuse = 0;
     while ($rawhtml) {
         $fuse++;
         if ($fuse >= 1000) {
             throw new RuntimeException(__FUNCTION__ . ': Maximum level of 1000 reached.', 3);
         }
         #fwrite(STDOUT, str_repeat(' ', 4 * ($level)).'parse: "'.$rawhtml.'"'.PHP_EOL);
         $content = '';
         $element = null;
         // Find opening bracket.
         $pos = strpos($rawhtml, '{');
         if ($pos === false) {
             #fwrite(STDOUT, str_repeat(' ', 4 * ($level)).'no { found'.PHP_EOL);
             $this->elementsId++;
             $element = new HtmlElement();
             $element->setId($this->elementsId);
             $element->setContent($rawhtml);
             $parentElement->addChild($element);
             $rawhtml = '';
         } else {
             #fwrite(STDOUT, str_repeat(' ', 4 * ($level)).'found {: '.$pos.PHP_EOL);
             if ($pos >= 1) {
                 $content = substr($rawhtml, 0, $pos);
                 #fwrite(STDOUT, str_repeat(' ', 4 * ($level + 1)).'content: "'.$content.'"'.PHP_EOL);
             }
             $this->elementsId++;
             $element = new HtmlElement();
             $element->setId($this->elementsId);
             $element->setContent($content);
             $parentElement->addChild($element);
             $rawhtml = substr($rawhtml, $pos + 1);
             // Find close bracket for the opening one.
             $pos = strpos($rawhtml, '}');
             if ($pos === false) {
                 $content .= '{';
                 #fwrite(STDOUT, str_repeat(' ', 4 * ($level + 1)).'no } found: "'.$content.'"'.PHP_EOL);
                 $element->setContent($content);
             } else {
                 $nameFull = substr($rawhtml, 0, $pos);
                 $nameFullLen = strlen($nameFull);
                 $rawhtml = substr($rawhtml, $pos + 1);
                 #fwrite(STDOUT, str_repeat(' ', 4 * ($level + 1)).'found }: '.$pos.', "'.$nameFull.'" '.$nameFullLen.PHP_EOL);
                 if (strtolower(substr($nameFull, 0, 6)) == 'block:') {
                     // Process a block element.
                     $nameFullPos = strpos($nameFull, ':');
                     $name = substr($nameFull, $nameFullPos + 1);
                     $type = strtolower(substr($nameFull, 0, $nameFullPos));
                     // Search close tag for the opened tag.
                     $offset = 0;
                     $newoffset = 0;
                     $testhtml = '';
                     $temphtml = $rawhtml;
                     do {
                         $temphtml = substr($temphtml, $offset);
                         $pos = strpos($temphtml, '{/' . $nameFull . '}');
                         if ($pos === false) {
                             throw new RuntimeException(__FUNCTION__ . ': Missing closing tag "{/' . $nameFull . '}".', 1);
                         } else {
                             $testhtml = substr($temphtml, 0, $pos);
                             $newoffset = $offset + $pos + 2 + $nameFullLen + 1;
                             $offset = $newoffset;
                         }
                     } while (strpos($testhtml, '{' . $nameFull . '}') !== false);
                     $subhtml = substr($rawhtml, 0, $offset - 2 - $nameFullLen - 1);
                     $rawhtml = substr($rawhtml, $offset);
                     $element = null;
                     if ($type == 'block') {
                         if (strtolower(substr($name, 0, 5)) == 'ifnot') {
                             $name = substr($name, 5);
                             $element = new IfNotBlockElement();
                         } elseif (strtolower(substr($name, 0, 2)) == 'if') {
                             $name = substr($name, 2);
                             $element = new IfBlockElement();
                         } elseif ($name == 'Posts') {
                             $element = new PostsBlockElement();
                         } elseif ($name == 'Text') {
                             $element = new TextBlockElement();
                         } elseif ($name == 'Link') {
                             $element = new LinkBlockElement();
                         } elseif ($name == 'Photo') {
                             $element = new PhotoBlockElement();
                         } elseif ($name == 'Photos') {
                             $element = new PhotosBlockElement();
                         } elseif ($name == 'Photoset') {
                             $element = new PhotosetBlockElement();
                         } elseif ($name == 'IndexPage') {
                             $element = new IndexPageBlockElement();
                         } elseif ($name == 'PermalinkPage') {
                             $element = new PermalinkPageBlockElement();
                         } elseif ($name == 'Title') {
                             $element = new TitleBlockElement();
                         } elseif ($name == 'PostTitle') {
                             $element = new PostTitleBlockElement();
                         } elseif ($name == 'Description') {
                             $element = new DescriptionBlockElement();
                         } elseif ($name == 'AskEnabled') {
                             $element = new AskEnabledBlockElement();
                         } elseif ($name == 'HasPages') {
                             $element = new HasPagesBlockElement();
                         } elseif ($name == 'Pages') {
                             $element = new PagesBlockElement();
                         } elseif ($name == 'Caption') {
                             $element = new CaptionBlockElement();
                         } elseif ($name == 'Quote') {
                             $element = new QuoteBlockElement();
                         } elseif ($name == 'Chat') {
                             $element = new ChatBlockElement();
                         } elseif ($name == 'Audio') {
                             $element = new AudioBlockElement();
                         } elseif ($name == 'Video') {
                             $element = new VideoBlockElement();
                         } elseif ($name == 'Answer') {
                             $element = new AnswerBlockElement();
                         } elseif ($name == 'Source') {
                             $element = new SourceBlockElement();
                         } elseif ($name == 'Lines') {
                             $element = new LinesBlockElement();
                         } elseif ($name == 'Label') {
                             $element = new LabelBlockElement();
                         } elseif ($name == 'Date') {
                             $element = new DateBlockElement();
                         } elseif ($name == 'AudioEmbed') {
                             $element = new AudioEmbedBlockElement();
                         } elseif ($name == 'NoteCount') {
                             $element = new NoteCountBlockElement();
                         } elseif ($name == 'HasTags') {
                             $element = new HasTagsBlockElement();
                         } elseif ($name == 'PostNotes') {
                             $element = new PostNotesBlockElement();
                         } elseif ($name == 'Pagination') {
                             $element = new PaginationBlockElement();
                         } elseif ($name == 'PreviousPage') {
                             $element = new PreviousPageBlockElement();
                         } elseif ($name == 'NextPage') {
                             $element = new NextPageBlockElement();
                         } elseif ($name == 'Tags') {
                             $element = new TagsBlockElement();
                         } elseif ($name == 'LinkURL') {
                             $element = new LinkUrlBlockElement();
                         } else {
                             $msg = __FUNCTION__ . ': Unknown block "' . $name . '". Path: ' . $parentElement->getPath();
                             throw new RuntimeException($msg, 3);
                         }
                     }
                     if ($element) {
                         $this->elementsId++;
                         $element->setId($this->elementsId);
                         $element->setName($name);
                         $parentElement->addChild($element);
                         $this->parseElements($subhtml, $element, $level + 1);
                     }
                     /*else{
                     			throw new RuntimeException(__FUNCTION__.': Can not create element.', 4);
                     		}*/
                 } else {
                     // Process non-block element.
                     #fwrite(STDOUT, str_repeat(' ', 4 * ($level + 1)).'else'.PHP_EOL);
                     if (in_array($nameFull, static::$variableNames)) {
                         #fwrite(STDOUT, str_repeat(' ', 4 * ($level + 1)).'ok'.PHP_EOL);
                         $this->elementsId++;
                         $element = new VariableElement();
                         $element->setId($this->elementsId);
                         $element->setName($nameFull);
                         $parentElement->addChild($element);
                     } elseif (substr($nameFull, 0, 5) == 'text:') {
                         #fwrite(STDOUT, str_repeat(' ', 4 * ($level + 1)).'ok text'.PHP_EOL);
                         $this->elementsId++;
                         $element = new TextVariableElement();
                         $element->setId($this->elementsId);
                         $element->setName($nameFull);
                         $parentElement->addChild($element);
                     } elseif (substr($nameFull, 0, 5) == 'lang:') {
                         #fwrite(STDOUT, str_repeat(' ', 4 * ($level + 1)).'ok lang'.PHP_EOL);
                         $this->elementsId++;
                         $element = new LangVariableElement();
                         $element->setId($this->elementsId);
                         $element->setName($nameFull);
                         $parentElement->addChild($element);
                     } else {
                         // Unknown block. Set the original content.
                         $content = '{' . $nameFull . '}';
                         #fwrite(STDOUT, str_repeat(' ', 4 * ($level + 1)).'content: "'.$nameFull.'", "'.$content.'"'.PHP_EOL);
                         $this->elementsId++;
                         $element = new HtmlElement();
                         $element->setId($this->elementsId);
                         $element->setName($nameFull);
                         $element->setContent($content);
                         $parentElement->addChild($element);
                     }
                     #$rawhtml = substr($rawhtml, $pos + 1);
                 }
             }
         }
         #usleep(300000);
     }
     #if($level == 1){ ve($this->rootElement); }
 }