]> git.lyx.org Git - features.git/commitdiff
Findadv: Handle \lettrine{} in initials.module
authorKornel Benko <kornel@lyx.org>
Tue, 5 Feb 2019 07:04:47 +0000 (08:04 +0100)
committerKornel Benko <kornel@lyx.org>
Tue, 5 Feb 2019 07:04:47 +0000 (08:04 +0100)
The problem here is, that selecting any subset of a \lettrine{}
line always creates an initials header. That makes it impossible
to our search engine to find strings, because the regex does not
contain that info. So we have to discard the leading \lettrine part
completely.
We place now a marker (\endarguments) to determine that removable
part.

src/lyxfind.cpp
src/output_latex.cpp

index 6d5abe78814df15e9586c5c1c24dc96c504e8b52..00905d839138bf598187105fd403fd53b6495071 100644 (file)
@@ -1037,7 +1037,10 @@ class KeyInfo {
     /* item */
     isList,
     /* tex, latex, ... like isChar */
-    isIgnored
+    isIgnored,
+    /* like \lettrine[lines=5]{}{} */
+    cleanToStart,
+    endArguments
   };
  KeyInfo()
    : keytype(invalid),
@@ -1755,7 +1758,8 @@ void LatexInfo::buildKeys(bool isPatternString)
   makeKey("par|uldepth|ULdepth|protect|nobreakdash", KeyInfo(KeyInfo::isStandard, 0, true), isPatternString);
   // Remove RTL/LTR marker
   makeKey("l|r|textlr|textfr|textar|beginl|endl", KeyInfo(KeyInfo::isStandard, 0, true), isPatternString);
-
+  makeKey("lettrine", KeyInfo(KeyInfo::cleanToStart, 0, true), isPatternString);
+  makeKey("endarguments", KeyInfo(KeyInfo::endArguments, 0, true), isPatternString);
   if (isPatternString) {
     // Allow the first searched string to rebuild the keys too
     keysBuilt = false;
@@ -1891,6 +1895,35 @@ int LatexInfo::dispatch(ostringstream &os, int previousStart, KeyInfo &actual)
   int nextKeyIdx = 0;
   switch (actual.keytype)
   {
+    case KeyInfo::cleanToStart: {
+      actual._dataEnd = actual._dataStart;
+      if (interval.par[actual._dataStart] == '[') {
+        // Discard optional params
+        actual._dataStart = interval.findclosing(actual._dataStart+1, interval.par.length(), '[', ']') + 1;
+      }
+      actual._dataEnd = actual._dataStart;
+      nextKeyIdx = getNextKey();
+      // Search for end of arguments
+      int tmpIdx = nextKeyIdx;
+      while (tmpIdx > 0) {
+        KeyInfo &nextk = entries[tmpIdx];
+        if (nextk.keytype == KeyInfo::endArguments) {
+          actual._dataEnd = nextk._dataEnd;
+          break;
+        }
+        nextk.disabled = true;
+        tmpIdx++;
+        if (tmpIdx >= int(entries.size()))
+          break;
+      }
+      while (interval.par[actual._dataEnd] == ' ')
+        actual._dataEnd++;
+      interval.addIntervall(0, actual._dataEnd+1);
+      interval.actualdeptindex = 0;
+      interval.depts[0] = actual._dataEnd+1;
+      interval.closes[0] = -1;
+      break;
+    }
     case KeyInfo::noContent: {          /* char like "\hspace{2cm}" */
       interval.addIntervall(actual._dataStart, actual._dataEnd);
     }
@@ -1929,6 +1962,11 @@ int LatexInfo::dispatch(ostringstream &os, int previousStart, KeyInfo &actual)
       }
       break;
     }
+    case KeyInfo::endArguments:
+      removeHead(actual);
+      processRegion(actual._dataStart, actual._dataStart+1);
+      nextKeyIdx = getNextKey();
+      break;
     case KeyInfo::noMain:
       // fall through
     case KeyInfo::isStandard: {
index e6e628a5c24f19c6f1aeb076f2d660bf47c6bed6..47e92c1726f82d1a00d62b750ddc89f711d747af 100644 (file)
@@ -530,6 +530,10 @@ void getArgInsets(otexstream & os, OutputParams const & runparams, Layout::LaTeX
                        }
                }
        }
+       if (runparams.for_search) {
+               // Mark end of arguments for findadv() only
+               os << "\\endarguments{}";
+       }
 }