[LyX/master] Introduce index-tag-all lfun

Juergen Spitzmueller spitz at lyx.org
Sat Nov 5 16:49:31 UTC 2022


commit 3bbce7f24afbb469fff5ad352778af73d57b44d8
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Sat Nov 5 18:39:33 2022 +0100

    Introduce index-tag-all lfun
    
    This is a convenience function for indexing. It adds a copy of the
    index inset under cursor after any word in the buffer that is equal
    (case-insensitively) to the word preceding the index inset.
    
    The function can be easily used to generate bad indexes (and I warn
    about that in the UserGuide), but if used with care, it can also be
    extremely convenient.
---
 lib/RELEASE-NOTES         |    3 +
 lib/doc/UserGuide.lyx     |  143 ++++++++++++++++++++++++++++++++++++++++++---
 lib/ui/stdcontext.inc     |    2 +
 src/BufferView.cpp        |   74 +++++++++++++++++++++++
 src/FuncCode.h            |    2 +
 src/LyXAction.cpp         |   11 ++++
 src/insets/Inset.h        |    3 +
 src/insets/InsetIndex.cpp |    3 +
 src/insets/InsetIndex.h   |    2 +
 9 files changed, 235 insertions(+), 8 deletions(-)

diff --git a/lib/RELEASE-NOTES b/lib/RELEASE-NOTES
index 2ae5e72..3c211a2 100644
--- a/lib/RELEASE-NOTES
+++ b/lib/RELEASE-NOTES
@@ -142,6 +142,9 @@
 
 * spelling-remove-local removes words for a given language from the document's local
   spelling dictionary.
+
+* index-tag-all adds a copy of the index entry under cursor to after all occurrences of the
+  word that precedes the index inset.
   
 * inset-insert-copy inserts the inset's content (in ToC pane) at the position of the cursor.
 
diff --git a/lib/doc/UserGuide.lyx b/lib/doc/UserGuide.lyx
index 1de5ee5..a0533df 100644
--- a/lib/doc/UserGuide.lyx
+++ b/lib/doc/UserGuide.lyx
@@ -9621,12 +9621,14 @@ Verbatim
 \end_layout
 
 \begin_layout Verbatim
+
 This is Verbatim.
 \end_layout
 
 \begin_layout Verbatim
 \noindent
 \align block
+
 The following 2 lines are empty:
 \end_layout
 
@@ -9639,6 +9641,7 @@ The following 2 lines are empty:
 \end_layout
 
 \begin_layout Verbatim
+
 Almost everything is allowed in Verbatim:"%&$§#~'`
 \backslash
 }][{|
@@ -9662,6 +9665,7 @@ Verbatim
 \end_layout
 
 \begin_layout Verbatim*
+
 This is Verbatim*.
 \end_layout
 
@@ -35407,31 +35411,46 @@ type  "icon"
 arg   "index-insert"
 \end_inset
 
+
+\change_inserted -712698321 1667668430
+ (but see section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "subsec:Convenience-Functions-Index"
+
+\end_inset
+
+ for some advanced methods)
+\change_unchanged
 .
  A
-\change_inserted -712698321 1667110584
+\change_inserted -712698321 1667665903
  collapsible inset
 \change_unchanged
  
 \change_deleted -712698321 1667110543
 box 
-\change_inserted -712698321 1667110812
+\change_inserted -712698321 1667665903
 with green label 
 \change_unchanged
 is inserted
-\change_inserted -712698321 1667110886
+\change_inserted -712698321 1667665903
 ; this
 \change_unchanged
  
 \change_deleted -712698321 1667110903
 contain
-\change_inserted -712698321 1667110904
+\change_inserted -712698321 1667665903
 holds
 \change_deleted -712698321 1667110872
 ing
 \change_unchanged
  the text that appears in the index
-\change_inserted -712698321 1667112993
+\change_inserted -712698321 1667665903
  (if you read this in \SpecialChar LyX
 , see the 
 \begin_inset Quotes eld
@@ -35445,11 +35464,11 @@ Index generation
 \change_unchanged
 .
  The word where the cursor is in
-\change_inserted -712698321 1667112984
+\change_inserted -712698321 1667665903
 ,
 \change_unchanged
  or the currently highlighted text
-\change_inserted -712698321 1667112984
+\change_inserted -712698321 1667665903
 ,
 \change_unchanged
  is proposed by \SpecialChar LyX
@@ -35458,7 +35477,7 @@ Index generation
 the 
 \change_unchanged
 index entry
-\change_inserted -712698321 1667112984
+\change_inserted -712698321 1667665903
  (i.
 \begin_inset space \thinspace{}
 \end_inset
@@ -37423,6 +37442,114 @@ reference "subsec:TeX-Code-Boxes"
 \end_layout
 
 \begin_layout Subsection
+
+\change_inserted -712698321 1667669398
+\begin_inset CommandInset label
+LatexCommand label
+name "subsec:Convenience-Functions-Index"
+
+\end_inset
+
+Convenience Functions for Index Handling
+\end_layout
+
+\begin_layout Standard
+
+\change_inserted -712698321 1667669552
+Indexing a document can be a tedious task, since you often have to insert
+ the same index entry multiple times in order to refer to passages at different
+ pages.
+ This is not only time-consuming, but also error-prone; e.
+\begin_inset space \thinspace{}
+\end_inset
+
+g., you have to remember how exactly an inset entry has been inserted to
+ avoid redundant entries.
+ \SpecialChar LyX
+ provides some functions to ease the task.
+\end_layout
+
+\begin_layout Standard
+
+\change_inserted -712698321 1667669398
+First, if you want to add an entry which you already used before, you can
+ open the outliner via 
+\family sans
+View\SpecialChar menuseparator
+Outline Pane
+\family default
+ (see section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "subsec:The-Outliner"
+
+\end_inset
+
+), select the 
+\family sans
+Index Entries
+\family default
+ section (it is convenient to have this open while indexing anyway), scroll
+ to the entry in question (if you check 
+\family sans
+Sort
+\family default
+, it will be more easier), then 
+\emph on
+right
+\emph default
+-click on the entry and select 
+\family sans
+Insert Copy at Cursor Position
+\family default
+ from the context menu.
+ This will do just what it says: it will insert a copy of that index inset
+ at the position where the cursor is.
+\end_layout
+
+\begin_layout Standard
+
+\change_inserted -712698321 1667669772
+Second, \SpecialChar LyX
+ also provides a semi-automated solution to index a word.
+ If you right-click on an index entry inset, you can select from the context
+ menu 
+\family sans
+Index All Occurrences of this Word
+\family default
+.
+ This will search the whole document (only single documents, not master
+ and child documents) and insert a copy of this index inset after each occurrenc
+e of the word that precedes the inset.
+ Note that casing of the word does not matter, but only full words in the
+ same grammatical form are considered (so if 
+\emph on
+table
+\emph default
+ is the word before the index entry, 
+\emph on
+Table
+\emph default
+ will be considered as well, but not 
+\emph on
+tables
+\emph default
+).
+ Please take care to not overuse this function and to carefully check the
+ result afterwards.
+ Remember, a good index does not simply list all occurrences of a given
+ word in a specific document (that is a concordance rather), but only relevant
+ occurrences! So as convenient as this function might seem, it is suitable
+ especially for particular cases.
+ With others, you will have more work with removing again falsely inserted
+ entries than you would have with manually inserting them at the right place.
+\end_layout
+
+\begin_layout Subsection
 Index 
 \change_deleted -712698321 1667120869
 Program
diff --git a/lib/ui/stdcontext.inc b/lib/ui/stdcontext.inc
index 64cafd0..d6f1fd8 100644
--- a/lib/ui/stdcontext.inc
+++ b/lib/ui/stdcontext.inc
@@ -633,6 +633,8 @@ Menuset
 	Menu "context-index"
 		IndicesContext
 		Separator
+		Item "Index All Occurrences of this Word|W" "index-tag-all"
+		Separator
 		OptItem "Single Page (No Page Range)|P" "inset-modify changeparam range none"
 		OptItem "Start Page Range|t" "inset-modify changeparam range start"
 		OptItem "End Page Range|E" "inset-modify changeparam range end"
diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index b36b8ee..0bbf649 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -38,6 +38,7 @@
 #include "MetricsInfo.h"
 #include "Paragraph.h"
 #include "Session.h"
+#include "texstream.h"
 #include "Text.h"
 #include "TextMetrics.h"
 #include "TexRow.h"
@@ -47,6 +48,7 @@
 #include "insets/InsetCitation.h"
 #include "insets/InsetCommand.h" // ChangeRefs
 #include "insets/InsetGraphics.h"
+#include "insets/InsetIndex.h"
 #include "insets/InsetRef.h"
 #include "insets/InsetText.h"
 
@@ -1760,6 +1762,78 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
 		break;
 	}
 
+	case LFUN_INDEX_TAG_ALL: {
+		Inset * ins = cur.nextInset();
+		if (!ins || ins->lyxCode() != INDEX_CODE)
+			// not at index inset
+			break;
+
+		// clone the index inset
+		InsetIndex * cins =
+			new InsetIndex(static_cast<InsetIndex &>(*cur.nextInset()));
+		// In order to avoid duplication, we compare the
+		// LaTeX output if we find another index inset after
+		// the word
+		odocstringstream oilatex;
+		otexstream oits(oilatex);
+		OutputParams rp(&cur.buffer()->params().encoding());
+		ins->latex(oits, rp);
+		cap::copyInsetToTemp(cur, cins);
+
+		// move backwards into preceding word
+		// skip over other index insets
+		cur.backwardPosIgnoreCollapsed();
+		while (true) {
+			if (cur.inset().lyxCode() == INDEX_CODE)
+				cur.pop_back();
+			else if (cur.prevInset() && cur.prevInset()->lyxCode() == INDEX_CODE)
+				cur.backwardPosIgnoreCollapsed();
+			else
+				break;
+		}
+		if (!cur.inTexted()) {
+			// Nothing to do here.
+			setCursorFromInset(ins);
+			break;
+		}
+		// Get word or selection
+		cur.text()->selectWord(cur, WHOLE_WORD);
+		docstring const searched_string = cur.selectionAsString(false);
+		// Start from the beginning
+		lyx::dispatch(FuncRequest(LFUN_BUFFER_BEGIN));
+		while (findOne(this, searched_string,
+			       false,// case sensitive
+			       true,// match whole word only
+			       true,// forward
+			       false,//find deleted
+			       false,//check wrap
+			       false,// auto-wrap
+			       false,// instant
+			       false// only selection
+			       )) {
+			cur.clearSelection();
+			Inset * ains = cur.nextInset();
+			if (ains && ains->lyxCode() == INDEX_CODE) {
+				// We have an index inset.
+				// Check whether it has the same
+				// LaTeX content and move on if so.
+				odocstringstream filatex;
+				otexstream fits(filatex);
+				ains->latex(fits, rp);
+				if (oilatex.str() == filatex.str())
+					continue;
+			}
+			// Paste the inset and possibly continue
+			cap::pasteFromTemp(cursor(), cursor().buffer()->errorList("Paste"));
+		}
+		// Go back to start position.
+		setCursorFromInset(ins);
+		dr.screenUpdate(cur.result().screenUpdate());
+		if (cur.result().needBufferUpdate())
+			dr.forceBufferUpdate();
+		break;
+	}
+
 	case LFUN_MARK_OFF:
 		cur.clearSelection();
 		dr.setMessage(from_utf8(N_("Mark off")));
diff --git a/src/FuncCode.h b/src/FuncCode.h
index 3667a98..956a3a4 100644
--- a/src/FuncCode.h
+++ b/src/FuncCode.h
@@ -503,6 +503,8 @@ enum FuncCode
 	LFUN_BRANCH_SYNC_ALL,           // sanda 20220415
 	LFUN_INDEXMACRO_INSERT,         // spitz 20220220
 	LFUN_INSET_INSERT_COPY,         // spitz 20221101
+	LFUN_INDEX_TAG_ALL,             // spitz 20221105
+	// 395
 	LFUN_LASTACTION                 // end of the table
 };
 
diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp
index e1f91d2..1692605 100644
--- a/src/LyXAction.cpp
+++ b/src/LyXAction.cpp
@@ -1976,6 +1976,17 @@ void LyXAction::init()
 		{ LFUN_INDEX_INSERT, "index-insert", Noop, Edit },
 
 /*!
+ * \var lyx::FuncCode lyx::LFUN_INDEX_TAG_ALL
+ * \li Action: Tags all occurrences of the word before the cursor with the
+ *             index inset at cursor.
+ * \li Notion: It automatically takes the word on the cursor position.
+ * \li Syntax: index-tag-all
+ * \li Origin: spitz, 5 Nov 2022
+ * \endvar
+ */
+		{ LFUN_INDEX_TAG_ALL, "index-tag-all", AtPoint, Edit },
+
+/*!
  * \var lyx::FuncCode lyx::LFUN_INDEX_PRINT
  * \li Action: Inserts list of Index entries on a new page.
  * \li Syntax: index-print [<TYPE:Name>]
diff --git a/src/insets/Inset.h b/src/insets/Inset.h
index c73fa49..fd55d69 100644
--- a/src/insets/Inset.h
+++ b/src/insets/Inset.h
@@ -46,6 +46,7 @@ class InsetArgument;
 class InsetCollapsible;
 class InsetCommand;
 class InsetGraphics;
+class InsetIndex;
 class InsetIterator;
 class InsetLayout;
 class InsetList;
@@ -146,6 +147,8 @@ public:
 	virtual InsetCommand const * asInsetCommand() const { return nullptr; }
 	/// is this inset based on the InsetArgument class?
 	virtual InsetArgument const * asInsetArgument() const { return nullptr; }
+	/// is this inset based on the InsetIndex class?
+	virtual InsetIndex const * asInsetIndex() const { return nullptr; }
 	/// is this inset based on the InsetGraphics class?
 	virtual InsetGraphics * asInsetGraphics() { return nullptr; }
 	/// is this inset based on the InsetGraphics class?
diff --git a/src/insets/InsetIndex.cpp b/src/insets/InsetIndex.cpp
index 839d094..bec373d 100644
--- a/src/insets/InsetIndex.cpp
+++ b/src/insets/InsetIndex.cpp
@@ -692,6 +692,9 @@ bool InsetIndex::getStatus(Cursor & cur, FuncRequest const & cmd,
 	case LFUN_INDEXMACRO_INSERT:
 		return macrosPossible(cmd.getArg(0));
 
+	case LFUN_INDEX_TAG_ALL:
+		return true;
+
 	default:
 		return InsetCollapsible::getStatus(cur, cmd, flag);
 	}
diff --git a/src/insets/InsetIndex.h b/src/insets/InsetIndex.h
index a89a684..b3fe271 100644
--- a/src/insets/InsetIndex.h
+++ b/src/insets/InsetIndex.h
@@ -58,6 +58,8 @@ public:
 	const InsetIndexParams& params() const { return params_; }
 	///
 	int rowFlags() const override { return CanBreakBefore | CanBreakAfter; }
+	///
+	InsetIndex const * asInsetIndex() const override { return this; }
 private:
 	///
 	bool hasSettings() const override;


More information about the lyx-cvs mailing list