Backport the following from trunk:

29cf7af6d3
		8dd436b7dc
		7c5f28ad26
This fixes issues with empty paragraphs in XHTML output.
This commit is contained in:
Richard Heck 2012-04-08 10:01:54 -04:00
parent c5c0a289f5
commit 25246819de
3 changed files with 36 additions and 24 deletions

View File

@ -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("<!-- Output Error: " + s + " -->");
@ -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

View File

@ -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_;
///

View File

@ -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