From f67a9fac2e05babb1ccbfbd29934d3c5f4715926 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=BCrgen=20Spitzm=C3=BCller?= Date: Mon, 14 Jul 2008 08:20:24 +0000 Subject: [PATCH] * src/insets/InsetIndex.cpp (output_latex): - sanitize the handling of index levels (most of bug 5014). git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@25596 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/insets/InsetIndex.cpp | 53 ++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/src/insets/InsetIndex.cpp b/src/insets/InsetIndex.cpp index d56fa4a5b1..94d2a961bc 100644 --- a/src/insets/InsetIndex.cpp +++ b/src/insets/InsetIndex.cpp @@ -44,35 +44,48 @@ InsetIndex::InsetIndex(Buffer const & buf) int InsetIndex::latex(odocstream & os, - OutputParams const & runparams) const + OutputParams const & runparams) const { os << "\\index"; os << '{'; + int i = 7; odocstringstream ods; - int i = InsetText::latex(ods, runparams); - bool sorted = 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, - // e.g. \index{LyX@\LyX}, \index{text@\textbf{text}} - // Don't do that if the user entered '@' himself, though. - if (contains(ods.str(), '\\') && !contains(ods.str(), '@')) { - odocstringstream odss; - if (InsetText::plaintext(odss, runparams) > 0) { + InsetText::latex(ods, runparams); + odocstringstream ods2; + InsetText::plaintext(ods2, runparams); + std::vector const levels = + getVectorFromString(ods.str(), from_ascii("!")); + std::vector const levels_plain = + getVectorFromString(ods2.str(), from_ascii("!")); + vector::const_iterator it = levels.begin(); + vector::const_iterator end = levels.end(); + vector::const_iterator it2 = levels_plain.begin(); + for (; it != end; ++it) { + if (it > levels.begin()) { + os << '!'; + i += 1; + } + // correctly sort macros and formatted strings + // if we do find a command, prepend a plain text + // version of the content to get sorting right, + // e.g. \index{LyX@\LyX}, \index{text@\textbf{text}} + // Don't do that if the user entered '@' himself, though. + if (contains(*it, '\\') && !contains(*it, '@')) { // remove remaining \'s for the sorting part - os << subst(odss.str(), from_ascii("\\"), docstring()); + docstring const ppart = + subst(*it2, from_ascii("\\"), docstring()); + os << ppart; os << '@'; - sorted = true; + i += ppart.size() + 1; } + docstring const tpart = *it; + os << tpart; + i += tpart.size(); + if (it2 < levels_plain.end()) + ++it2; } - // if a hierarchy tag '!' is used, ommit this in the post-@ part. - if (sorted && contains(ods.str(), '!')) { - string dummy; - // FIXME unicode - os << from_utf8(rsplit(to_utf8(ods.str()), dummy, '!')); - } else - i = InsetText::latex(os, runparams); os << '}'; + i += 1; return i; } -- 2.39.2