From: Richard Heck Date: Tue, 5 Aug 2008 14:25:32 +0000 (+0000) Subject: Fix bug 5113. X-Git-Tag: 1.6.10~3734 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=4d506d21b6e9dfa56931259da2ae01b46096d8da;p=features.git Fix bug 5113. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@26065 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/insets/InsetIndex.cpp b/src/insets/InsetIndex.cpp index 11c3a26fd0..00da6df8be 100644 --- a/src/insets/InsetIndex.cpp +++ b/src/insets/InsetIndex.cpp @@ -20,6 +20,7 @@ #include "sgml.h" #include "TocBackend.h" +#include "support/debug.h" #include "support/docstream.h" #include "support/gettext.h" #include "support/lstrings.h" @@ -49,22 +50,54 @@ int InsetIndex::latex(odocstream & os, os << "\\index"; os << '{'; int i = 7; - odocstringstream ods; - InsetText::latex(ods, runparams); - odocstringstream ods2; - InsetText::plaintext(ods2, runparams); + + // get contents of InsetText as LaTeX and plaintext + odocstringstream ourlatex; + InsetText::latex(ourlatex, runparams); + odocstringstream ourplain; + InsetText::plaintext(ourplain, runparams); + docstring latexstr = ourlatex.str(); + docstring plainstr = ourplain.str(); + + // this will get what follows | if anything does + docstring cmd; + + // check for the | separator + // FIXME This would go wrong on an escaped "|", but + // how far do we want to go here? + size_t pos = latexstr.find(from_ascii("|")); + if (pos != docstring::npos) { + // put the bit after "|" into cmd... + cmd = latexstr.substr(pos + 1); + // ...and erase that stuff from latexstr + latexstr = latexstr.erase(pos); + // ...and similarly from plainstr + size_t ppos = plainstr.find(from_ascii("|")); + if (ppos < plainstr.size()) + plainstr.erase(ppos); + else + LYXERR0("The `|' separator was not found in the plaintext version!"); + } + + // Separate the entires and subentries, i.e., split on "!" + // FIXME This would do the wrong thing with escaped ! characters std::vector const levels = - getVectorFromString(ods.str(), from_ascii("!"), true); + getVectorFromString(latexstr, from_ascii("!"), true); std::vector const levels_plain = - getVectorFromString(ods2.str(), from_ascii("!"), true); + getVectorFromString(plainstr, from_ascii("!"), true); + vector::const_iterator it = levels.begin(); vector::const_iterator end = levels.end(); vector::const_iterator it2 = levels_plain.begin(); + bool first = true; for (; it != end; ++it) { - if (it > levels.begin()) { + // write the separator except the first time + if (!first) { os << '!'; i += 1; - } + } else + first = false; + // correctly sort macros and formatted strings // if we do find a command, prepend a plain text // version of the content to get sorting right, @@ -72,9 +105,8 @@ int InsetIndex::latex(odocstream & os, // Don't do that if the user entered '@' himself, though. if (contains(*it, '\\') && !contains(*it, '@')) { // Plaintext might return nothing (e.g. for ERTs) - docstring spart = - (it2 < levels_plain.end() - && !(*it2).empty()) ? *it2 : *it; + docstring const spart = + (it2 < levels_plain.end() && !(*it2).empty()) ? *it2 : *it; // remove remaining \'s for the sorting part docstring const ppart = subst(spart, from_ascii("\\"), docstring()); @@ -88,6 +120,11 @@ int InsetIndex::latex(odocstream & os, if (it2 < levels_plain.end()) ++it2; } + // write the bit that followed "|" + if (!cmd.empty()) { + os << "|" << cmd; + i += cmd.size() + 1; + } os << '}'; i += 1; return i;