#include "Lexer.h"
#include "output_latex.h"
#include "output_xhtml.h"
-#include "sgml.h"
+#include "xml.h"
#include "texstream.h"
#include "TextClass.h"
#include "TocBackend.h"
InsetIndex::InsetIndex(Buffer * buf, InsetIndexParams const & params)
- : InsetCollapsible(buf), params_(params)
+ : InsetCollapsible(buf), params_(params)
{}
-void InsetIndex::latex(otexstream & os, OutputParams const & runparams_in) const
+void InsetIndex::latex(otexstream & ios, OutputParams const & runparams_in) const
{
OutputParams runparams(runparams_in);
runparams.inIndexEntry = true;
+ otexstringstream os;
+
if (buffer().masterBuffer()->params().use_indices && !params_.index.empty()
- && params_.index != "idx") {
+ && params_.index != "idx") {
os << "\\sindex[";
os << escape(params_.index);
os << "]{";
os << '{';
}
- // get contents of InsetText as LaTeX and plaintext
odocstringstream ourlatex;
- // FIXME: do Tex/Row correspondence (I don't currently understand what is
- // being generated from latexstr below)
otexstream ots(ourlatex);
InsetText::latex(ots, runparams);
+ if (runparams.for_search) {
+ // No need for special handling, if we are only searching for some patterns
+ os << ourlatex.str() << "}";
+ return;
+ }
+ // get contents of InsetText as LaTeX and plaintext
odocstringstream ourplain;
InsetText::plaintext(ourplain, runparams);
+ // FIXME: do Tex/Row correspondence (I don't currently understand what is
+ // being generated from latexstr below)
docstring latexstr = ourlatex.str();
docstring plainstr = ourplain.str();
LYXERR0("The `|' separator was not found in the plaintext version!");
}
- // Separate the entires and subentries, i.e., split on "!"
+ // Separate the entries and subentries, i.e., split on "!"
// FIXME This would do the wrong thing with escaped ! characters
std::vector<docstring> const levels =
- getVectorFromString(latexstr, from_ascii("!"), true);
+ getVectorFromString(latexstr, from_ascii("!"), true);
std::vector<docstring> const levels_plain =
- getVectorFromString(plainstr, from_ascii("!"), true);
+ getVectorFromString(plainstr, from_ascii("!"), true);
vector<docstring>::const_iterator it = levels.begin();
vector<docstring>::const_iterator end = levels.end();
if (contains(*it, '\\') && !contains(*it, '@')) {
// Plaintext might return nothing (e.g. for ERTs)
docstring const spart =
- (it2 < levels_plain.end() && !(*it2).empty())
- ? *it2 : *it;
+ (it2 < levels_plain.end() && !(*it2).empty())
+ ? *it2 : *it;
// Now we need to validate that all characters in
// the sorting part are representable in the current
// encoding. If not try the LaTeX macro which might
// or might not be a good choice, and issue a warning.
pair<docstring, docstring> spart_latexed =
- runparams.encoding->latexString(spart, runparams.dryrun);
+ runparams.encoding->latexString(spart, runparams.dryrun);
if (!spart_latexed.second.empty())
- LYXERR0("Uncodable character in index entry. Sorting might be wrong!");
+ LYXERR0("Uncodable character in index entry. Sorting might be wrong!");
if (spart != spart_latexed.first && !runparams.dryrun) {
// FIXME: warning should be passed to the error dialog
frontend::Alert::warning(_("Index sorting failed"),
- bformat(_("LyX's automatic index sorting algorithm faced\n"
- "problems with the entry '%1$s'.\n"
- "Please specify the sorting of this entry manually, as\n"
- "explained in the User Guide."), spart));
+ bformat(_("LyX's automatic index sorting algorithm faced\n"
+ "problems with the entry '%1$s'.\n"
+ "Please specify the sorting of this entry manually, as\n"
+ "explained in the User Guide."), spart));
}
// remove remaining \'s for the sorting part
docstring const ppart =
- subst(spart_latexed.first, from_ascii("\\"), docstring());
+ subst(spart_latexed.first, from_ascii("\\"), docstring());
os << ppart;
os << '@';
}
os << "|" << cmd;
}
os << '}';
+
+ // In macros with moving arguments, such as \section,
+ // we store the index and output it after the macro (#2154)
+ if (runparams_in.postpone_fragile_stuff)
+ runparams_in.post_macro += os.str();
+ else
+ ios << os.release();
}
}
-docstring InsetIndex::xhtml(XHTMLStream & xs, OutputParams const &) const
+docstring InsetIndex::xhtml(XMLStream & xs, OutputParams const &) const
{
// we just print an anchor, taking the paragraph ID from
// our own interior paragraph, which doesn't get printed
std::string const magic = paragraphs().front().magicLabel();
std::string const attr = "id='" + magic + "'";
- xs << html::CompTag("a", attr);
+ xs << xml::CompTag("a", attr);
return docstring();
}
}
-void InsetPrintIndex::updateBuffer(ParIterator const &, UpdateType)
+void InsetPrintIndex::updateBuffer(ParIterator const &, UpdateType, bool const /*deleted*/)
{
Index const * index =
buffer().masterParams().indiceslist().findShortcut(getParam("type"));
} // namespace
-docstring InsetPrintIndex::xhtml(XHTMLStream &, OutputParams const & op) const
+docstring InsetPrintIndex::xhtml(XMLStream &, OutputParams const & op) const
{
BufferParams const & bp = buffer().masterBuffer()->params();
// that's how we deal with the fact that we're probably inside a standard
// paragraph, and we don't want to be.
odocstringstream ods;
- XHTMLStream xs(ods);
+ XMLStream xs(ods);
- xs << html::StartTag("div", tocattr);
- xs << html::StartTag(lay.htmltag(), lay.htmlattr())
+ xs << xml::StartTag("div", tocattr);
+ xs << xml::StartTag(lay.htmltag(), lay.htmlattr())
<< translateIfPossible(from_ascii("Index"),
op.local_font->language()->lang())
- << html::EndTag(lay.htmltag());
- xs << html::StartTag("ul", "class='main'");
+ << xml::EndTag(lay.htmltag());
+ xs << xml::StartTag("ul", "class='main'");
Font const dummy;
vector<IndexEntry>::const_iterator eit = entries.begin();
// close last entry or entries, depending.
if (level == 3) {
// close this sub-sub-entry
- xs << html::EndTag("li") << html::CR();
+ xs << xml::EndTag("li") << xml::CR();
// is this another sub-sub-entry within the same sub-entry?
if (!eit->same_sub(last)) {
// close this level
- xs << html::EndTag("ul") << html::CR();
+ xs << xml::EndTag("ul") << xml::CR();
level = 2;
}
}
// sub-entry. In that case, we do not want to close anything.
if (level == 2 && !eit->same_sub(last)) {
// close sub-entry
- xs << html::EndTag("li") << html::CR();
+ xs << xml::EndTag("li") << xml::CR();
// is this another sub-entry with the same main entry?
if (!eit->same_main(last)) {
// close this level
- xs << html::EndTag("ul") << html::CR();
+ xs << xml::EndTag("ul") << xml::CR();
level = 1;
}
}
// close the entry.
if (level == 1 && !eit->same_main(last)) {
// close entry
- xs << html::EndTag("li") << html::CR();
+ xs << xml::EndTag("li") << xml::CR();
}
}
// We need to use our own stream, since we will have to
// modify what we get back.
odocstringstream ent;
- XHTMLStream entstream(ent);
+ XMLStream entstream(ent);
OutputParams ours = op;
ours.for_toc = true;
par.simpleLyXHTMLOnePar(buffer(), entstream, ours, dummy);
if (level == 3) {
// another subsubentry
- xs << html::StartTag("li", "class='subsubentry'")
- << XHTMLStream::ESCAPE_NONE << subsub;
+ xs << xml::StartTag("li", "class='subsubentry'")
+ << XMLStream::ESCAPE_NONE << subsub;
} else if (level == 2) {
// there are two ways we can be here:
// (i) we can actually be inside a sub-entry already and be about
// note that in this case, too, though, the sub-entry might already
// have a sub-sub-entry.
if (eit->sub != last.sub)
- xs << html::StartTag("li", "class='subentry'")
- << XHTMLStream::ESCAPE_NONE << sub;
+ xs << xml::StartTag("li", "class='subentry'")
+ << XMLStream::ESCAPE_NONE << sub;
if (!subsub.empty()) {
// it's actually a subsubentry, so we need to start that list
- xs << html::CR()
- << html::StartTag("ul", "class='subsubentry'")
- << html::StartTag("li", "class='subsubentry'")
- << XHTMLStream::ESCAPE_NONE << subsub;
+ xs << xml::CR()
+ << xml::StartTag("ul", "class='subsubentry'")
+ << xml::StartTag("li", "class='subsubentry'")
+ << XMLStream::ESCAPE_NONE << subsub;
level = 3;
}
} else {
// note that in this case, too, though, the main entry might already
// have a sub-entry, or even a sub-sub-entry.
if (eit->main != last.main)
- xs << html::StartTag("li", "class='main'") << main;
+ xs << xml::StartTag("li", "class='main'") << main;
if (!sub.empty()) {
// there's a sub-entry, too
- xs << html::CR()
- << html::StartTag("ul", "class='subentry'")
- << html::StartTag("li", "class='subentry'")
- << XHTMLStream::ESCAPE_NONE << sub;
+ xs << xml::CR()
+ << xml::StartTag("ul", "class='subentry'")
+ << xml::StartTag("li", "class='subentry'")
+ << XMLStream::ESCAPE_NONE << sub;
level = 2;
if (!subsub.empty()) {
// and a sub-sub-entry
- xs << html::CR()
- << html::StartTag("ul", "class='subsubentry'")
- << html::StartTag("li", "class='subsubentry'")
- << XHTMLStream::ESCAPE_NONE << subsub;
+ xs << xml::CR()
+ << xml::StartTag("ul", "class='subsubentry'")
+ << xml::StartTag("li", "class='subsubentry'")
+ << XMLStream::ESCAPE_NONE << subsub;
level = 3;
}
}
// finally, then, we can output the index link itself
string const parattr = "href='#" + par.magicLabel() + "'";
xs << (entry_number == 0 ? ":" : ",");
- xs << " " << html::StartTag("a", parattr)
- << ++entry_number << html::EndTag("a");
+ xs << " " << xml::StartTag("a", parattr)
+ << ++entry_number << xml::EndTag("a");
last = *eit;
}
// now we have to close all the open levels
while (level > 0) {
- xs << html::EndTag("li") << html::EndTag("ul") << html::CR();
+ xs << xml::EndTag("li") << xml::EndTag("ul") << xml::CR();
--level;
}
- xs << html::EndTag("div") << html::CR();
+ xs << xml::EndTag("div") << xml::CR();
return ods.str();
}