The branch, features/indexmacros, has been updated. - Log -----------------------------------------------------------------
commit 2b177172f17d524cd27727319799112cbc62fa7d Author: Thibaut Cuvelier <tcuvel...@lyx.org> Date: Thu Sep 1 02:04:05 2022 +0200 LyXHTML: implement multiple indices diff --git a/src/insets/InsetCommandParams.cpp b/src/insets/InsetCommandParams.cpp index 09c9ee8..bff358f 100644 --- a/src/insets/InsetCommandParams.cpp +++ b/src/insets/InsetCommandParams.cpp @@ -322,7 +322,7 @@ void InsetCommandParams::Read(Lexer & lex, Buffer const * buffer) preview_ = lex.getBool(); continue; } - if (info_.hasParam(token)) { + if (hasParam(token)) { lex.next(true); docstring data = lex.getDocString(); if (buffer && token == "filename") { @@ -604,10 +604,24 @@ docstring InsetCommandParams::getFirstNonOptParam() const } +bool InsetCommandParams::hasParam(std::string const & name) const +{ + return info_.hasParam(name); +} + + +docstring const & InsetCommandParams::getParamOr(std::string const & name, docstring const & defaultValue) const +{ + if (hasParam(name)) + return (*this)[name]; + return defaultValue; +} + + docstring const & InsetCommandParams::operator[](string const & name) const { static const docstring dummy; - LASSERT(info_.hasParam(name), return dummy); + LASSERT(hasParam(name), return dummy); ParamMap::const_iterator data = params_.find(name); if (data == params_.end() || data->second.empty()) return dummy; @@ -620,7 +634,7 @@ docstring const & InsetCommandParams::operator[](string const & name) const docstring & InsetCommandParams::operator[](string const & name) { - LATTEST(info_.hasParam(name)); + LATTEST(hasParam(name)); // this will add the name in release mode ParamInfo::ParamData const & param = info_[name]; if (param.ignore()) diff --git a/src/insets/InsetCommandParams.h b/src/insets/InsetCommandParams.h index 1800fb5..7ed182a 100644 --- a/src/insets/InsetCommandParams.h +++ b/src/insets/InsetCommandParams.h @@ -146,6 +146,10 @@ public: /// FIXME Would be better removed, but is used in BufferView.cpp in /// ways that make removal hard. docstring getFirstNonOptParam() const; + /// Determine whether a parameter is set + bool hasParam(std::string const & name) const; + /// Get the parameter \p name if it is set, \p defaultValue otherwise + docstring const & getParamOr(std::string const & name, docstring const & defaultValue) const; /// get parameter \p name /// LyX will assert if name is not a valid parameter. docstring const & operator[](std::string const & name) const; diff --git a/src/insets/InsetIndex.cpp b/src/insets/InsetIndex.cpp index f463b19..d17b059 100644 --- a/src/insets/InsetIndex.cpp +++ b/src/insets/InsetIndex.cpp @@ -1656,25 +1656,17 @@ docstring InsetPrintIndex::xhtml(XMLStream &, OutputParams const & op) const { BufferParams const & bp = buffer().masterBuffer()->params(); - // we do not presently support multiple indices, so we refuse to print - // anything but the main index, so as not to generate multiple indices. - // NOTE Multiple index support would require some work. The reason - // is that the TOC does not know about multiple indices. Either it would - // need to be told about them (not a bad idea), or else the index entries - // would need to be collected differently, say, during validation. - if (bp.use_indices && getParam("type") != from_ascii("idx")) - return docstring(); - shared_ptr<Toc const> toc = buffer().tocBackend().toc("index"); if (toc->empty()) return docstring(); // Collect the index entries in a form we can use them. vector<IndexEntry> entries; + const docstring & indexType = params().getParamOr("type", from_ascii("idx")); for (const TocItem& item : *toc) { - static_cast<const InsetIndex*>(&(item.dit().inset()))->params_.index; - if (item.isOutput()) - entries.emplace_back(IndexEntry{static_cast<const InsetIndex*>(&(item.dit().inset())), &op}); + const auto* inset = static_cast<const InsetIndex*>(&(item.dit().inset())); + if (item.isOutput() && inset->params().index == indexType) + entries.emplace_back(IndexEntry{inset, &op}); } // If all the index entries are in notes or not displayed, get out sooner. @@ -1690,6 +1682,7 @@ docstring InsetPrintIndex::xhtml(XMLStream &, OutputParams const & op) const Layout const & lay = bp.documentClass().htmlTOCLayout(); string const & tocclass = lay.defaultCSSClass(); string const tocattr = "class='index " + tocclass + "'"; + docstring const indexName = params().getParamOr("name", from_ascii("Index")); // 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 @@ -1700,7 +1693,7 @@ docstring InsetPrintIndex::xhtml(XMLStream &, OutputParams const & op) const xs << xml::StartTag("div", tocattr); xs << xml::CR(); xs << xml::StartTag(lay.htmltag(), lay.htmlattr()); - xs << translateIfPossible(from_ascii("Index"), op.local_font->language()->lang()); + xs << translateIfPossible(indexName, op.local_font->language()->lang()); xs << xml::EndTag(lay.htmltag()); xs << xml::CR(); xs << xml::StartTag("ul", "class='main'"); diff --git a/src/insets/InsetIndex.h b/src/insets/InsetIndex.h index 6a74b79..6f0708e 100644 --- a/src/insets/InsetIndex.h +++ b/src/insets/InsetIndex.h @@ -54,6 +54,8 @@ public: static std::string params2string(InsetIndexParams const &); /// static void string2params(std::string const &, InsetIndexParams &); + /// + const InsetIndexParams& params() const { return params_; } private: /// bool hasSettings() const override; commit f4b0cf9b599c0994c0e8c60390a65d57d5f7262a Author: Thibaut Cuvelier <tcuvel...@lyx.org> Date: Thu Sep 1 01:13:47 2022 +0200 DocBook: amend 34ea4080 @ for sorting is implemented at 34ea4080, but the user was still shown a warning (now removed). diff --git a/src/insets/InsetIndex.cpp b/src/insets/InsetIndex.cpp index 848d530..f463b19 100644 --- a/src/insets/InsetIndex.cpp +++ b/src/insets/InsetIndex.cpp @@ -320,14 +320,6 @@ void InsetIndex::docbook(XMLStream & xs, OutputParams const & runparams) const InsetText::latex(ots, runparams); docstring latexString = trim(odss.str()); - // Check whether there are unsupported things. @ is supported, but only for sorting, without specific formatting. - if (latexString.find(from_utf8("@\\")) != lyx::docstring::npos) { - docstring error = from_utf8("Unsupported feature: an index entry contains an @\\. " - "Complete entry: \"") + latexString + from_utf8("\""); - LYXERR0(error); - xs << XMLStream::ESCAPE_NONE << (from_utf8("<!-- Output Error: ") + error + from_utf8(" -->\n")); - } - // Handle several indices (indicated in the inset instead of the raw latexString). docstring indexType = from_utf8(""); if (buffer().masterBuffer()->params().use_indices) { commit 35a752e6db95d53dc81e6f8b5f26a8869c13c641 Author: Thibaut Cuvelier <tcuvel...@lyx.org> Date: Thu Sep 1 01:11:40 2022 +0200 DocBook: add test case for multiple indices diff --git a/autotests/export/docbook/index_multiple.lyx b/autotests/export/docbook/index_multiple.lyx new file mode 100644 index 0000000..66542aa --- /dev/null +++ b/autotests/export/docbook/index_multiple.lyx @@ -0,0 +1,248 @@ +#LyX 2.4 created this file. For more info see https://www.lyx.org/ +\lyxformat 609 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass article +\use_default_options true +\maintain_unincluded_children no +\language american +\language_package default +\inputencoding utf8 +\fontencoding auto +\font_roman "default" "default" +\font_sans "default" "default" +\font_typewriter "default" "default" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts false +\font_sc false +\font_roman_osf false +\font_sans_osf false +\font_typewriter_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format default +\output_sync 0 +\bibtex_command default +\index_command default +\float_placement class +\float_alignment class +\paperfontsize default +\spacing single +\use_hyperref false +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices true +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\use_lineno 0 +\index Index +\shortcut idx +\color #008000 +\end_index +\index Secondary +\shortcut sec +\color #550000 +\end_index +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tablestyle default +\tracking_changes false +\output_changes false +\change_bars false +\postpone_fragile_content true +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\docbook_table_output 0 +\docbook_mathml_prefix 1 +\end_header + +\begin_body + +\begin_layout Title +Multiple indices tests +\end_layout + +\begin_layout Standard +\begin_inset Index idx +range none +pageformat default +status open + +\begin_layout Plain Layout +A +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index idx +range none +pageformat default +status open + +\begin_layout Plain Layout +A +\begin_inset IndexMacro subindex +status open + +\begin_layout Plain Layout +B +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index sec +range none +pageformat default +status open + +\begin_layout Plain Layout +A +\begin_inset IndexMacro subindex +status open + +\begin_layout Plain Layout +B +\end_layout + +\end_inset + + +\begin_inset IndexMacro subindex +status open + +\begin_layout Plain Layout +C +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index sec +range none +pageformat default +status open + +\begin_layout Plain Layout +A +\begin_inset IndexMacro subindex +status open + +\begin_layout Plain Layout +D +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Index sec +range none +pageformat default +status open + +\begin_layout Plain Layout +E +\begin_inset IndexMacro subindex +status open + +\begin_layout Plain Layout +F +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset index_print +LatexCommand printindex +type "idx" +name "Index" +literal "false" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset index_print +LatexCommand printindex +type "sec" +name "Index" +literal "false" + +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/autotests/export/docbook/index_multiple.xml b/autotests/export/docbook/index_multiple.xml new file mode 100644 index 0000000..dcc60ec --- /dev/null +++ b/autotests/export/docbook/index_multiple.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- This DocBook file was created by LyX 2.4.0dev + See https://www.lyx.org/ for more information --> +<article xml:lang="en_US" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xi="http://www.w3.org/2001/XInclude" version="5.2"> +<title>Multiple indices tests</title> +<para><indexterm type="idx"><primary>A</primary></indexterm></para> +<para><indexterm type="idx"><primary>A</primary><secondary>B</secondary></indexterm></para> +<para><indexterm type="sec"><primary>A</primary><secondary>B</secondary><tertiary>C</tertiary></indexterm></para> +<para><indexterm type="sec"><primary>A</primary><secondary>D</secondary></indexterm></para> +<para><indexterm type="sec"><primary>E</primary><secondary>F</secondary></indexterm></para> +</article> \ No newline at end of file diff --git a/src/insets/InsetIndex.cpp b/src/insets/InsetIndex.cpp index bcae16c..848d530 100644 --- a/src/insets/InsetIndex.cpp +++ b/src/insets/InsetIndex.cpp @@ -1680,6 +1680,7 @@ docstring InsetPrintIndex::xhtml(XMLStream &, OutputParams const & op) const // Collect the index entries in a form we can use them. vector<IndexEntry> entries; for (const TocItem& item : *toc) { + static_cast<const InsetIndex*>(&(item.dit().inset()))->params_.index; if (item.isOutput()) entries.emplace_back(IndexEntry{static_cast<const InsetIndex*>(&(item.dit().inset())), &op}); } commit 07380a3bc167f6479a6c0c7a639e703d2eedeb9c Author: Thibaut Cuvelier <tcuvel...@lyx.org> Date: Thu Sep 1 00:14:41 2022 +0200 DocBook: add missing test case for index diff --git a/autotests/export/docbook/index_nesting.xml b/autotests/export/docbook/index_nesting.xml new file mode 100644 index 0000000..e80244e --- /dev/null +++ b/autotests/export/docbook/index_nesting.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- This DocBook file was created by LyX 2.4.0dev + See https://www.lyx.org/ for more information --> +<article xml:lang="en_US" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xi="http://www.w3.org/2001/XInclude" version="5.2"> +<title>Index nesting tests</title> +<para><indexterm><primary>A</primary></indexterm></para> +<para><indexterm><primary>A</primary><secondary>B</secondary></indexterm></para> +<para><indexterm><primary>A</primary><secondary>B</secondary><tertiary>C</tertiary></indexterm></para> +<para><indexterm><primary>A</primary><secondary>D</secondary></indexterm></para> +<para><indexterm><primary>E</primary><secondary>F</secondary></indexterm></para> +</article> \ No newline at end of file ----------------------------------------------------------------------- Summary of changes: .../{index_nesting.lyx => index_multiple.lyx} | 29 ++++++++++++++++--- autotests/export/docbook/index_multiple.xml | 11 +++++++ autotests/export/docbook/index_nesting.xml | 11 +++++++ src/insets/InsetCommandParams.cpp | 20 +++++++++++-- src/insets/InsetCommandParams.h | 4 +++ src/insets/InsetIndex.cpp | 26 ++++------------- src/insets/InsetIndex.h | 2 + 7 files changed, 75 insertions(+), 28 deletions(-) copy autotests/export/docbook/{index_nesting.lyx => index_multiple.lyx} (89%) create mode 100644 autotests/export/docbook/index_multiple.xml create mode 100644 autotests/export/docbook/index_nesting.xml hooks/post-receive -- Repository for new features -- lyx-cvs mailing list lyx-cvs@lists.lyx.org http://lists.lyx.org/mailman/listinfo/lyx-cvs