From 50550a215f72da6f5d3f80efad87449a72cdbf0c Mon Sep 17 00:00:00 2001 From: Kornel Benko Date: Tue, 5 Feb 2019 08:04:47 +0100 Subject: [PATCH 1/1] Findadv: Handle \lettrine{} in initials.module 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 | 42 ++++++++++++++++++++++++++++++++++++++++-- src/output_latex.cpp | 4 ++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp index 6d5abe7881..00905d8391 100644 --- a/src/lyxfind.cpp +++ b/src/lyxfind.cpp @@ -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: { diff --git a/src/output_latex.cpp b/src/output_latex.cpp index e6e628a5c2..47e92c1726 100644 --- a/src/output_latex.cpp +++ b/src/output_latex.cpp @@ -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{}"; + } } -- 2.39.2