[prev in list] [next in list] [prev in thread] [next in thread] 

List:       lyx-cvs
Subject:    [LyX/master] LyXHTML: implement multiple indices
From:       Thibaut Cuvelier <tcuvelier () lyx ! org>
Date:       2022-10-31 17:40:12
Message-ID: 20221031174012.0FF2C2805F5 () lyx ! lyx ! org
[Download RAW message or body]

commit 2b177172f17d524cd27727319799112cbc62fa7d
Author: Thibaut Cuvelier <tcuvelier@lyx.org>
Date:   Thu Sep 1 02:04:05 2022 +0200

    LyXHTML: implement multiple indices
---
 src/insets/InsetCommandParams.cpp |   20 +++++++++++++++++---
 src/insets/InsetCommandParams.h   |    4 ++++
 src/insets/InsetIndex.cpp         |   19 ++++++-------------
 src/insets/InsetIndex.h           |    2 ++
 4 files changed, 29 insertions(+), 16 deletions(-)

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;
-- 
lyx-cvs mailing list
lyx-cvs@lists.lyx.org
http://lists.lyx.org/mailman/listinfo/lyx-cvs


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic