From 7c5f28ad26508083bedaf3d36632960228ba6302 Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Sun, 8 Apr 2012 10:03:23 -0400 Subject: [PATCH] The logic of the endParagraph() routine is wrong. We should first check if the parsep_tag is pending. --- src/output_xhtml.cpp | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/src/output_xhtml.cpp b/src/output_xhtml.cpp index fbd9f4bc1c..11d2de2734 100644 --- a/src/output_xhtml.cpp +++ b/src/output_xhtml.cpp @@ -283,37 +283,27 @@ void XHTMLStream::startParagraph(bool keep_empty) void XHTMLStream::endParagraph() { - if (!isTagOpen(parsep_tag)) { - // is it pending? - TagStack::const_iterator dit = pending_tags_.begin(); - TagStack::const_iterator const den = pending_tags_.end(); - bool found = false; - for (; dit != den; ++dit) { - if (dit->tag_ == parsep_tag) { - found = true; - break; - } - } - - if (!found) { - writeError("No paragraph separation tag found in endParagraph()."); - return; - } - - // this case is normal. + if (isTagPending(parsep_tag)) { + // this case is normal. it just means we didn't have content, + // so the parsep_tag never got moved onto the tag stack. while (!pending_tags_.empty()) { // clear all pending tags up to and including the parsep tag. // note that we work from the back, because we want to get rid - // of everything that hasnt' been used. + // of everything that hasn't been used. html::StartTag const cur_tag = pending_tags_.back(); string const & tag = cur_tag.tag_; - tag_stack_.pop_back(); + pending_tags_.pop_back(); if (tag == parsep_tag) break; } return; } + if (!isTagOpen(parsep_tag)) { + writeError("No paragraph separation tag found in endParagraph()."); + return; + } + // this case is also normal, if the parsep tag is the last one // on the stack. otherwise, it's an error. while (!tag_stack_.empty()) {