X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fxml.cpp;h=e50e55972b042b53ca6459b64ff371d62bf78efa;hb=2b02b73f4a59bb73f9e819a960ea98c86ef8716f;hp=0daa9d84e2581c805216dc09e5a92d5fc2eb55b5;hpb=fc2c36289b5c0cd15f453c4905bb56a2b20aef25;p=lyx.git diff --git a/src/xml.cpp b/src/xml.cpp index 0daa9d84e2..e50e55972b 100644 --- a/src/xml.cpp +++ b/src/xml.cpp @@ -28,6 +28,7 @@ #include "support/lstrings.h" #include "support/textutils.h" +#include #include #include #include @@ -108,12 +109,9 @@ docstring StartTag::writeTag() const { docstring output = '<' + tag_; if (!attr_.empty()) { - docstring attributes = xml::escapeString(attr_, XMLStream::ESCAPE_NONE); - attributes.erase(attributes.begin(), std::find_if(attributes.begin(), attributes.end(), - [](int c) {return !std::isspace(c);})); - if (!attributes.empty()) { + docstring attributes = xml::trimLeft(xml::escapeString(attr_, XMLStream::ESCAPE_NONE)); + if (!attributes.empty()) output += ' ' + attributes; - } } output += ">"; return output; @@ -140,11 +138,11 @@ docstring EndTag::writeEndTag() const docstring CompTag::writeTag() const { - docstring output = '<' + from_utf8(tag_); + docstring output = '<' + tag_; if (!attr_.empty()) { // Erase the beginning of the attributes if it contains space characters: this function deals with that // automatically. - docstring attributes = escapeString(from_utf8(attr_), XMLStream::ESCAPE_NONE); + docstring attributes = escapeString(attr_, XMLStream::ESCAPE_NONE); attributes.erase(attributes.begin(), std::find_if(attributes.begin(), attributes.end(), [](int c) {return !std::isspace(c);})); if (!attributes.empty()) { @@ -208,9 +206,6 @@ bool XMLStream::closeFontTags() if (**curtag != xml::parsep_tag) os_ << (*curtag)->writeEndTag(); tag_stack_.pop_back(); - // this shouldn't happen, since then the font tags - // weren't in any other tag. - LASSERT(!tag_stack_.empty(), return true); if (tag_stack_.empty()) return true; curtag = &tag_stack_.back(); @@ -483,7 +478,8 @@ XMLStream &XMLStream::operator<<(xml::EndTag const &etag) + "' when other tags were pending. Last pending tag is `" + to_utf8(pending_tags_.back()->writeTag()) + "'. Tag discarded."); - pending_tags_.erase(dit); + if (!pending_tags_.empty()) + pending_tags_.erase(dit); return *this; } } @@ -604,6 +600,28 @@ docstring xml::uniqueID(docstring const & label) } +bool xml::isNotOnlySpace(docstring const & str) +{ + for (auto const & c: str) { + if (c != ' ' && c != '\t' && c != '\n' && c != '\v' && c != '\f' && c != '\r') + return true; + } + return false; +} + + +docstring xml::trimLeft(docstring const & str) +{ + size_t i = 0; + for (auto const & c: str) { + if (c != ' ' && c != '\t' && c != '\n' && c != '\v' && c != '\f' && c != '\r') + return str.substr(i, docstring::npos); + i++; + } + return str; +} + + docstring xml::cleanID(docstring const & orig) { // The standard xml:id only allows letters, digits, '-' and '.' in a name. @@ -651,7 +669,8 @@ docstring xml::cleanID(docstring const & orig) // as both of them would be transformed as "a.b". With this procedure, one will become "a.b" and the other "a.b-1". if (mangle && mangledNames.find(content) != mangledNames.end()) { int & mangleID = tMangleID.localData(); - content += "-" + convert(mangleID); + if (mangleID > 0) + content += "-" + convert(mangleID); mangleID += 1; }