X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetIndex.cpp;h=a328d27de635c885b6d978e1fccf0ec81a763e16;hb=239b9919ffe28338d789e6dc9122228f77ab77a7;hp=573ad66ce5dc332993aa4c36627a0bf68467012a;hpb=7b6b4c4598cc7f2fc3dd571937899c8a0ea6e0ce;p=lyx.git diff --git a/src/insets/InsetIndex.cpp b/src/insets/InsetIndex.cpp index 573ad66ce5..a328d27de6 100644 --- a/src/insets/InsetIndex.cpp +++ b/src/insets/InsetIndex.cpp @@ -22,11 +22,13 @@ #include "FuncRequest.h" #include "FuncStatus.h" #include "IndicesList.h" +#include "Language.h" #include "LaTeXFeatures.h" #include "Lexer.h" #include "output_latex.h" #include "output_xhtml.h" #include "sgml.h" +#include "texstream.h" #include "TextClass.h" #include "TocBackend.h" @@ -37,8 +39,8 @@ #include "frontends/alert.h" -#include #include +#include using namespace std; using namespace lyx::support; @@ -65,7 +67,7 @@ void InsetIndex::latex(otexstream & os, OutputParams const & runparams_in) const if (buffer().masterBuffer()->params().use_indices && !params_.index.empty() && params_.index != "idx") { os << "\\sindex["; - os << params_.index; + os << escape(params_.index); os << "]{"; } else { os << "\\index"; @@ -73,9 +75,10 @@ void InsetIndex::latex(otexstream & os, OutputParams const & runparams_in) const } // get contents of InsetText as LaTeX and plaintext - TexRow texrow; odocstringstream ourlatex; - otexstream ots(ourlatex, texrow); + // FIXME: do Tex/Row correspondence (I don't currently understand what is + // being generated from latexstr below) + otexstream ots(ourlatex); InsetText::latex(ots, runparams); odocstringstream ourplain; InsetText::plaintext(ourplain, runparams); @@ -134,15 +137,11 @@ void InsetIndex::latex(otexstream & os, OutputParams const & runparams_in) const // 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. - docstring spart2; - for (size_t n = 0; n < spart.size(); ++n) { - try { - spart2 += runparams.encoding->latexChar(spart[n]).first; - } catch (EncodingException & /* e */) { + pair spart_latexed = + runparams.encoding->latexString(spart, runparams.dryrun); + if (!spart_latexed.second.empty()) LYXERR0("Uncodable character in index entry. Sorting might be wrong!"); - } - } - if (spart != spart2 && !runparams.dryrun) { + 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" @@ -152,7 +151,7 @@ void InsetIndex::latex(otexstream & os, OutputParams const & runparams_in) const } // remove remaining \'s for the sorting part docstring const ppart = - subst(spart2, from_ascii("\\"), docstring()); + subst(spart_latexed.first, from_ascii("\\"), docstring()); os << ppart; os << '@'; } @@ -203,13 +202,13 @@ void InsetIndex::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_INSET_MODIFY: { if (cmd.getArg(0) == "changetype") { - cur.recordUndoInset(ATOMIC_UNDO, this); + cur.recordUndoInset(this); params_.index = from_utf8(cmd.getArg(1)); break; } InsetIndexParams params; InsetIndex::string2params(to_utf8(cmd.argument()), params); - cur.recordUndoInset(ATOMIC_UNDO, this); + cur.recordUndoInset(this); params_.index = params.index; // what we really want here is a TOC update, but that means // a full buffer update @@ -351,15 +350,22 @@ void InsetIndex::string2params(string const & in, InsetIndexParams & params) } -void InsetIndex::addToToc(DocIterator const & cpit) const +void InsetIndex::addToToc(DocIterator const & cpit, bool output_active, + UpdateType utype) const { DocIterator pit = cpit; pit.push_back(CursorSlice(const_cast(*this))); docstring str; - text().forToc(str, 0); - buffer().tocBackend().toc("index").push_back(TocItem(pit, 0, str)); + string type = "index"; + if (buffer().masterBuffer()->params().use_indices) + type += ":" + to_utf8(params_.index); + // this is unlikely to be terribly long + text().forOutliner(str, INT_MAX); + TocBuilder & b = buffer().tocBackend().builder(type); + b.pushItem(pit, str, output_active); // Proceed with the rest of the inset. - InsetCollapsable::addToToc(cpit); + InsetCollapsable::addToToc(cpit, output_active, utype); + b.pop(); } @@ -429,7 +435,8 @@ ParamInfo const & InsetPrintIndex::findInfo(string const & /* cmdName */) { static ParamInfo param_info_; if (param_info_.empty()) { - param_info_.add("type", ParamInfo::LATEX_OPTIONAL); + param_info_.add("type", ParamInfo::LATEX_OPTIONAL, + ParamInfo::HANDLING_ESCAPE); param_info_.add("name", ParamInfo::LATEX_REQUIRED); } return param_info_; @@ -496,6 +503,7 @@ void InsetPrintIndex::doDispatch(Cursor & cur, FuncRequest & cmd) cur.noScreenUpdate(); break; } + cur.recordUndo(); setParams(p); break; } @@ -556,7 +564,7 @@ void InsetPrintIndex::latex(otexstream & os, OutputParams const & runparams_in) { if (!buffer().masterBuffer()->params().use_indices) { if (getParam("type") == from_ascii("idx")) - os << "\\printindex{}"; + os << "\\printindex" << termcmd; return; } OutputParams runparams = runparams_in; @@ -686,21 +694,28 @@ docstring InsetPrintIndex::xhtml(XHTMLStream &, OutputParams const & op) const if (bp.use_indices && getParam("type") != from_ascii("idx")) return docstring(); - Toc const & toc = buffer().tocBackend().toc("index"); - if (toc.empty()) + shared_ptr toc = buffer().tocBackend().toc("index"); + if (toc->empty()) return docstring(); - // Collection the index entries in a form we can use them. - Toc::const_iterator it = toc.begin(); - Toc::const_iterator const en = toc.end(); + // Collect the index entries in a form we can use them. + Toc::const_iterator it = toc->begin(); + Toc::const_iterator const en = toc->end(); vector entries; for (; it != en; ++it) - entries.push_back(IndexEntry(it->str(), it->dit())); + if (it->isOutput()) + entries.push_back(IndexEntry(it->str(), it->dit())); + + if (entries.empty()) + // not very likely that all the index entries are in notes or + // whatever, but.... + return docstring(); + stable_sort(entries.begin(), entries.end()); Layout const & lay = bp.documentClass().htmlTOCLayout(); string const & tocclass = lay.defaultCSSClass(); - string const tocattr = "class='tochead " + tocclass + "'"; + string const tocattr = "class='index " + tocclass + "'"; // we'll use our own stream, because we are going to defer everything. // that's how we deal with the fact that we're probably inside a standard @@ -708,9 +723,10 @@ docstring InsetPrintIndex::xhtml(XHTMLStream &, OutputParams const & op) const odocstringstream ods; XHTMLStream xs(ods); - xs << html::StartTag("div", "class='index'"); + xs << html::StartTag("div", tocattr); xs << html::StartTag(lay.htmltag(), lay.htmlattr()) - << _("Index") + << translateIfPossible(from_ascii("Index"), + op.local_font->language()->lang()) << html::EndTag(lay.htmltag()); xs << html::StartTag("ul", "class='main'"); Font const dummy;