Index: src/mgr/stringmgr.cpp =================================================================== --- src/mgr/stringmgr.cpp (revision 3718) +++ src/mgr/stringmgr.cpp (revision 3721) @@ -20,6 +20,7 @@ * */ +#include #include #include #include Index: src/modules/filters/osisxhtml.cpp =================================================================== --- src/modules/filters/osisxhtml.cpp (revision 3718) +++ src/modules/filters/osisxhtml.cpp (revision 3721) @@ -849,7 +849,11 @@ else if (tag.isEndTag()) { outText("", buf, u); } - else if (!(type == "colophon")) outText(tag, buf, u); + else if (!(type == "colophon")) { + if (tag.getAttribute("sID")) tag.setEmpty(false); + if (tag.getAttribute("eID")) tag.setEndTag(true); + outText(tag, buf, u); + } } else if (!strcmp(tag.getName(), "span")) { Index: src/utilfuns/utilxml.cpp =================================================================== --- src/utilfuns/utilxml.cpp (revision 3718) +++ src/utilfuns/utilxml.cpp (revision 3721) @@ -291,13 +291,16 @@ tag.append('/'); tag.append(getName()); - for (StringPairMap::iterator it = attributes.begin(); it != attributes.end(); it++) { - //tag.appendFormatted(" %s=\"%s\"", it->first.c_str(), it->second.c_str()); - tag.append(' '); - tag.append(it->first.c_str()); - tag.append((strchr(it->second.c_str(), '\"')) ? "=\'" : "=\""); - tag.append(it->second.c_str()); - tag.append((strchr(it->second.c_str(), '\"'))? '\'' : '\"'); + + if (!isEndTag()) { + for (StringPairMap::iterator it = attributes.begin(); it != attributes.end(); it++) { + //tag.appendFormatted(" %s=\"%s\"", it->first.c_str(), it->second.c_str()); + tag.append(' '); + tag.append(it->first.c_str()); + tag.append((strchr(it->second.c_str(), '\"')) ? "=\'" : "=\""); + tag.append(it->second.c_str()); + tag.append((strchr(it->second.c_str(), '\"'))? '\'' : '\"'); + } } if (isEmpty()) Index: include/utilxml.h =================================================================== --- include/utilxml.h (revision 3718) +++ include/utilxml.h (revision 3721) @@ -75,6 +75,13 @@ * otherwise, we return if we're a simple XML end . */ bool isEndTag(const char *eID = 0) const; + inline void setEndTag(bool value) { + if (!parsed) + parse(); + endTag = value; + if (value) + empty = false; + } const StringList getAttributeNames() const; int getAttributePartCount(const char *attribName, char partSplit = '|') const;