protected function parse()
{
$this->output = '';
// drop tags
$this->parser->html = preg_replace('#<(' . implode('|', $this->drop) . ')[^>]*>.*</\\1>#sU', '', $this->parser->html);
while ($this->parser->nextNode()) {
switch ($this->parser->nodeType) {
case 'doctype':
break;
case 'pi':
case 'comment':
if ($this->keepHTML) {
$this->flushLinebreaks();
$this->out($this->parser->node);
$this->setLineBreaks(2);
}
// else drop
break;
case 'text':
$this->handleText();
break;
case 'tag':
if (in_array($this->parser->tagName, $this->ignore)) {
break;
}
// If the previous tag was not a block element, we simulate a paragraph tag
if ($this->parser->isBlockElement && $this->parser->isNextToInlineContext && !in_array($this->parent(), $this->allowMixedChildren)) {
$this->setLineBreaks(2);
}
if ($this->parser->isStartTag) {
$this->flushLinebreaks();
}
if ($this->skipConversion) {
$this->isMarkdownable();
// update notConverted
$this->handleTagToText();
continue;
}
// block elements
if (!$this->parser->keepWhitespace && $this->parser->isBlockElement) {
$this->fixBlockElementSpacing();
}
// inline elements
if (!$this->parser->keepWhitespace && $this->parser->isInlineContext) {
$this->fixInlineElementSpacing();
}
if ($this->isMarkdownable()) {
if ($this->parser->isBlockElement && $this->parser->isStartTag && !$this->lastWasBlockTag && !empty($this->output)) {
if (!empty($this->buffer)) {
$str =& $this->buffer[count($this->buffer) - 1];
} else {
$str =& $this->output;
}
if (substr($str, -strlen($this->indent) - 1) != "\n" . $this->indent) {
$str .= "\n" . $this->indent;
}
}
$func = 'handleTag_' . $this->parser->tagName;
$this->{$func}();
if ($this->linkPosition == self::LINK_AFTER_PARAGRAPH && $this->parser->isBlockElement && !$this->parser->isStartTag && empty($this->parser->openTags)) {
$this->flushFootnotes();
}
if (!$this->parser->isStartTag) {
$this->lastClosedTag = $this->parser->tagName;
}
} else {
$this->handleTagToText();
$this->lastClosedTag = '';
}
break;
default:
trigger_error('invalid node type', E_USER_ERROR);
break;
}
$this->lastWasBlockTag = $this->parser->nodeType == 'tag' && $this->parser->isStartTag && $this->parser->isBlockElement;
}
if (!empty($this->buffer)) {
// trigger_error('buffer was not flushed, this is a bug. please report!', E_USER_WARNING);
while (!empty($this->buffer)) {
$this->out($this->unbuffer());
}
}
// cleanup
$this->output = rtrim(str_replace('&', '&', str_replace('<', '<', str_replace('>', '>', $this->output))));
// end parsing, flush stacked tags
$this->flushFootnotes();
$this->stack = array();
}