LyXHTML: implement multiple indices

This commit is contained in:
Thibaut Cuvelier 2022-09-01 02:04:05 +02:00
parent f4b0cf9b59
commit 2b177172f1
4 changed files with 29 additions and 16 deletions

View File

@ -322,7 +322,7 @@ void InsetCommandParams::Read(Lexer & lex, Buffer const * buffer)
preview_ = lex.getBool(); preview_ = lex.getBool();
continue; continue;
} }
if (info_.hasParam(token)) { if (hasParam(token)) {
lex.next(true); lex.next(true);
docstring data = lex.getDocString(); docstring data = lex.getDocString();
if (buffer && token == "filename") { 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 docstring const & InsetCommandParams::operator[](string const & name) const
{ {
static const docstring dummy; static const docstring dummy;
LASSERT(info_.hasParam(name), return dummy); LASSERT(hasParam(name), return dummy);
ParamMap::const_iterator data = params_.find(name); ParamMap::const_iterator data = params_.find(name);
if (data == params_.end() || data->second.empty()) if (data == params_.end() || data->second.empty())
return dummy; return dummy;
@ -620,7 +634,7 @@ docstring const & InsetCommandParams::operator[](string const & name) const
docstring & InsetCommandParams::operator[](string const & name) docstring & InsetCommandParams::operator[](string const & name)
{ {
LATTEST(info_.hasParam(name)); LATTEST(hasParam(name));
// this will add the name in release mode // this will add the name in release mode
ParamInfo::ParamData const & param = info_[name]; ParamInfo::ParamData const & param = info_[name];
if (param.ignore()) if (param.ignore())

View File

@ -146,6 +146,10 @@ public:
/// FIXME Would be better removed, but is used in BufferView.cpp in /// FIXME Would be better removed, but is used in BufferView.cpp in
/// ways that make removal hard. /// ways that make removal hard.
docstring getFirstNonOptParam() const; 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 /// get parameter \p name
/// LyX will assert if name is not a valid parameter. /// LyX will assert if name is not a valid parameter.
docstring const & operator[](std::string const & name) const; docstring const & operator[](std::string const & name) const;

View File

@ -1656,25 +1656,17 @@ docstring InsetPrintIndex::xhtml(XMLStream &, OutputParams const & op) const
{ {
BufferParams const & bp = buffer().masterBuffer()->params(); 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"); shared_ptr<Toc const> toc = buffer().tocBackend().toc("index");
if (toc->empty()) if (toc->empty())
return docstring(); return docstring();
// Collect the index entries in a form we can use them. // Collect the index entries in a form we can use them.
vector<IndexEntry> entries; vector<IndexEntry> entries;
const docstring & indexType = params().getParamOr("type", from_ascii("idx"));
for (const TocItem& item : *toc) { for (const TocItem& item : *toc) {
static_cast<const InsetIndex*>(&(item.dit().inset()))->params_.index; const auto* inset = static_cast<const InsetIndex*>(&(item.dit().inset()));
if (item.isOutput()) if (item.isOutput() && inset->params().index == indexType)
entries.emplace_back(IndexEntry{static_cast<const InsetIndex*>(&(item.dit().inset())), &op}); entries.emplace_back(IndexEntry{inset, &op});
} }
// If all the index entries are in notes or not displayed, get out sooner. // 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(); Layout const & lay = bp.documentClass().htmlTOCLayout();
string const & tocclass = lay.defaultCSSClass(); string const & tocclass = lay.defaultCSSClass();
string const tocattr = "class='index " + tocclass + "'"; 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. // 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 // 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::StartTag("div", tocattr);
xs << xml::CR(); xs << xml::CR();
xs << xml::StartTag(lay.htmltag(), lay.htmlattr()); 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::EndTag(lay.htmltag());
xs << xml::CR(); xs << xml::CR();
xs << xml::StartTag("ul", "class='main'"); xs << xml::StartTag("ul", "class='main'");

View File

@ -54,6 +54,8 @@ public:
static std::string params2string(InsetIndexParams const &); static std::string params2string(InsetIndexParams const &);
/// ///
static void string2params(std::string const &, InsetIndexParams &); static void string2params(std::string const &, InsetIndexParams &);
///
const InsetIndexParams& params() const { return params_; }
private: private:
/// ///
bool hasSettings() const override; bool hasSettings() const override;