Пример #1
0
 public function do_parse(h\string $template)
 {
     $begin = 0;
     $end = 0;
     $opening_delimiter = self::OPENING_DELIMITER;
     $closing_delimiter = self::CLOSING_DELIMITER;
     $parser_stack = h\collection();
     $parser_stack[] = new tag\begin();
     do {
         // Open tag ////////////////////////////////////////////////////////////////////
         $end = $template->search($opening_delimiter, $begin);
         if (-1 === $end) {
             $end = $template->length();
         }
         $element = new tag\raw();
         $element->content = $template->slice($begin, $end);
         $parser_stack[] = $element;
         $begin = $end;
         if ($template->length() === $begin) {
             break;
         }
         // Close tag ///////////////////////////////////////////////////////////////////
         $begin += strlen($opening_delimiter);
         $end = $template->search($closing_delimiter, $begin);
         $first = $template[$begin];
         ++$begin;
         if ($first->is_equal(h\string('#'))) {
             $element = new tag\section();
             $element->name = $template->slice($begin, $end);
             $parser_stack[] = $element;
         } elseif ($first->is_equal(h\string('^'))) {
             $element = new tag\inverted();
             $element->name = $template->slice($begin, $end);
             $parser_stack[] = $element;
         } elseif ($first->is_equal(h\string('/'))) {
             $element = new tag\close();
             $element->name = $template->slice($begin, $end);
             $parser_stack[] = $element;
         } elseif ($first->is_equal(h\string('!'))) {
             $element = new tag\comment();
             $element->content = $template->slice($begin, $end);
             $parser_stack[] = $element;
         } elseif ($first->is_equal(h\string('{'))) {
             if ('}' !== $template[++$end]) {
                 throw 'Ill-formed';
             }
             $element = new tag\unescaped();
             $element->name = $template->slice($begin, $end - 1)->trimmed();
             $parser_stack[] = $element;
         } elseif ($first->is_equal(h\string('&'))) {
             $element = new tag\unescaped();
             $element->name = $template->slice($begin, $end - 1)->trimmed();
             $parser_stack[] = $element;
         } elseif ($first->is_equal(h\string('>'))) {
             throw 'TODO';
         } elseif ($first->is_equal(h\string('='))) {
             throw 'TODO';
         } else {
             $element = new tag\variable();
             $element->name = $template->slice($begin - 1, $end)->trimmed();
             $parser_stack[] = $element;
         }
         $begin = $end = $end + strlen($closing_delimiter);
     } while (true);
     $parser_stack[] = new tag\end();
     return $parser_stack;
 }