diff --git a/src/output_xhtml.cpp b/src/output_xhtml.cpp index dee3060e59..005aa42a04 100644 --- a/src/output_xhtml.cpp +++ b/src/output_xhtml.cpp @@ -198,7 +198,7 @@ XHTMLStream::XHTMLStream(odocstream & os) {} -void XHTMLStream::writeError(std::string const & s) +void XHTMLStream::writeError(std::string const & s) const { LYXERR0(s); os_ << from_utf8(""); @@ -213,8 +213,15 @@ namespace { bool XHTMLStream::closeFontTags() { + if (isTagPending(parsep_tag)) + // we haven't had any content + return true; + + // this may be a useless check, since we ought at least to have + // the parsep_tag. but it can't hurt too much to be careful. if (tag_stack_.empty()) return true; + // first, we close any open font tags we can close html::StartTag curtag = tag_stack_.back(); while (html::isFontTag(curtag.tag_)) { @@ -256,37 +263,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()) { @@ -398,7 +395,7 @@ XHTMLStream & XHTMLStream::operator<<(html::CR const &) } -bool XHTMLStream::isTagOpen(string const & stag) +bool XHTMLStream::isTagOpen(string const & stag) const { TagStack::const_iterator sit = tag_stack_.begin(); TagStack::const_iterator const sen = tag_stack_.end(); @@ -409,6 +406,17 @@ bool XHTMLStream::isTagOpen(string const & stag) } +bool XHTMLStream::isTagPending(string const & stag) const +{ + TagStack::const_iterator sit = pending_tags_.begin(); + TagStack::const_iterator const sen = pending_tags_.end(); + for (; sit != sen; ++sit) + if (sit->tag_ == stag) + return true; + return false; +} + + // this is complicated, because we want to make sure that // everything is properly nested. the code ought to make // sure of that, but we won't assert (yet) if we run into diff --git a/src/output_xhtml.h b/src/output_xhtml.h index 416e0daf49..cb8501ee10 100644 --- a/src/output_xhtml.h +++ b/src/output_xhtml.h @@ -138,9 +138,11 @@ private: /// void clearTagDeque(); /// - bool isTagOpen(std::string const &); + bool isTagOpen(std::string const &) const; /// - void writeError(std::string const &); + bool isTagPending(std::string const &) const; + /// + void writeError(std::string const &) const; /// odocstream & os_; /// diff --git a/status.20x b/status.20x index 80965da64b..081d44e28c 100644 --- a/status.20x +++ b/status.20x @@ -80,6 +80,8 @@ What's new - Index entries in XHTML output no longer sorted case sensitively. +- Fixed some probelms XHTML output had with empty paragraphs. + * USER INTERFACE