/** * Parse next code token. * * @return CodeNode */ protected function parseCode() { $token = $this->expectTokenType('code'); $node = new CodeNode($token->value, $token->buffer, $this->lexer->getCurrentLine()); // Skip newlines while ($this->lexer->predictToken()->type === 'newline') { $this->lexer->getAdvancedToken(); } if ($this->lexer->predictToken()->type === 'indent') { $node->setBlock($this->parseBlock()); } return $node; }
/** * Dump code node. * * @param CodeNode $node code node * @param integer $level indentation level * * @return string */ protected function dumpCode(CodeNode $node, $level = 0) { $html = str_repeat(' ', $level); if ($node->getBlock()) { if ($node->isBuffered()) { $begin = '<?php echo ' . preg_replace('/^ +/', '', $node->getCode()) . " { ?>\n"; } else { $begin = '<?php ' . preg_replace('/^ +/', '', $node->getCode()) . " { ?>\n"; } $end = "\n" . str_repeat(' ', $level) . '<?php } ?>'; foreach ($this->codes as $regex => $ending) { if (preg_match($regex, $node->getCode())) { $begin = '<?php ' . preg_replace('/^ +| +$/', '', $node->getCode()) . " ?>\n"; $end = "\n" . str_repeat(' ', $level) . '<?php ' . $ending . '; ?>'; if ($ending === 'endif' && isset($this->nextIsIf[$level]) && $this->nextIsIf[$level]) { $end = ''; } break; } } $html .= $begin; $html .= $this->dumpNode($node->getBlock(), $level + 1); $html .= $end; } else { if ($node->isBuffered()) { $html .= '<?php echo ' . preg_replace('/^ +/', '', $node->getCode()) . ' ?>'; } else { $html .= '<?php ' . preg_replace('/^ +/', '', $node->getCode()) . ' ?>'; } } return $html; }