commit 3bbce7f24afbb469fff5ad352778af73d57b44d8
Author: Juergen Spitzmueller <[email protected]>
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;
-- 
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to