X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfind.cpp;h=0ba2acec9010a4d194352901cc12b9143416b047;hb=a99f76477da0a61247f2c886ecd3598eb2dc09ac;hp=7fadd51f4163d0a316d5abc7078076273e5dda19;hpb=46c573c082f2428f6884ba3f773c34a846cf3557;p=features.git diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp index 7fadd51f41..0ba2acec90 100644 --- a/src/lyxfind.cpp +++ b/src/lyxfind.cpp @@ -902,7 +902,7 @@ string correctRegex(string t, bool withformat) } else { if (sub.str(4) == "backslash") { - replace = "\\"; + replace = string("\\"); { // transforms '\backslash \{' into '\{' string next = t.substr(sub.position(2) + sub.str(2).length(), 2); @@ -1111,7 +1111,7 @@ private: ** @todo Normalization should also expand macros, if the corresponding ** search option was checked. **/ - string normalize(docstring const & s, bool ignore_fomat) const; + string convertLF2Space(docstring const & s, bool ignore_fomat) const; // normalized string to search string par_as_string; // regular expression to use for searching @@ -2424,7 +2424,7 @@ void LatexInfo::buildEntries(bool isPatternString) } // Ignore language if there is math somewhere in pattern-string if (isPatternString) { - for (auto s: usedText) { + for (auto const & s: usedText) { // Remove entries created in previous search runs keys.erase(s); } @@ -3669,7 +3669,7 @@ MatchStringAdv::MatchStringAdv(lyx::Buffer & buf, FindAndReplaceOptions & opt) previous_single_replace = true; } // When using regexp, braces are hacked already by escape_for_regex() - par_as_string = normalize(ds, opt.ignoreformat); + par_as_string = convertLF2Space(ds, opt.ignoreformat); open_braces = 0; close_wildcards = 0; @@ -3794,7 +3794,7 @@ MatchResult MatchStringAdv::findAux(DocIterator const & cur, int len, MatchStrin docstring docstr = stringifyFromForSearch(opt, cur, len); string str; - str = normalize(docstr, opt.ignoreformat); + str = convertLF2Space(docstr, opt.ignoreformat); if (!opt.ignoreformat) { str = correctlanguagesetting(str, false, !opt.ignoreformat); // remove closing '}' and '\n' to allow for use of '$' in regex @@ -3988,8 +3988,7 @@ static bool simple_replace(string &t, string from, string to) } #endif -#if 1 -static string convertLF2Space(docstring const &s, bool ignore_format) +string MatchStringAdv::convertLF2Space(docstring const &s, bool ignore_format) const { // Using original docstring to handle '\n' @@ -4056,77 +4055,6 @@ static string convertLF2Space(docstring const &s, bool ignore_format) return(t.str()); } -#else -static string convertLF2Space(docstring const & s, bool ignore_format) -{ - // Using utf8-converted string to handle '\n' - - string t; - t = lyx::to_utf8(s); - // Remove \n at begin - while (!t.empty() && t[0] == '\n') - t = t.substr(1); - // Remove \n* at end - while (!t.empty() && t[t.size() - 1] == '\n') { - t = t.substr(0, t.size() - 1); - } - size_t pos; - // Handle all other '\n' - while ((pos = t.find("\n")) != string::npos) { - if (pos > 1 && t[pos-1] == '\\' && t[pos-2] == '\\' ) { - // Handle '\\\n' - if (isPrintableNonspace(t[pos+1]) && ((pos < 3) || isPrintableNonspace(t[pos-3]))) { - t.replace(pos-2, 3, " "); - } - else { - // Already a space there - t.replace(pos-2, 3, ""); - } - } - else { - if (!isAlnumASCII(t[pos+1]) || !isAlnumASCII(t[pos-1])) { - // '\n' adjacent to non-alpha-numerics, discard - t.replace(pos, 1, ""); - } - else { - // Replace all other \n with spaces - t.replace(pos, 1, " "); - } - if (!ignore_format) { - size_t count = 0; - while ((pos > count + 1) && (t[pos - 1 -count] == '%')) { - count++; - } - if (count > 0) { - t.replace(pos - count, count, ""); - } - } - } - } - return(t); - -} -#endif - -string MatchStringAdv::normalize(docstring const & s, bool ignore_format) const -{ - string t = convertLF2Space(s, ignore_format); - - // The following replaces are not appropriate in non-format-search mode - if (!ignore_format) { - // Remove stale empty \emph{}, \textbf{} and similar blocks from latexify - // Kornel: Added textsl, textsf, textit, texttt and noun - // + allow to seach for colored text too - LYXERR(Debug::FINDVERBOSE, "Removing stale empty macros from: " << t); - while (regex_replace(t, t, "\\\\(emph|noun|text(bf|sl|sf|it|tt)|(u|uu)line|(s|x)out|uwave)(\\{(\\{\\})?\\})+", "")) - LYXERR(Debug::FINDVERBOSE, " further removing stale empty \\emph{}, \\textbf{} macros from: " << t); - while (regex_replace(t, t, "\\\\((sub)?(((sub)?section)|paragraph)|part)\\*?(\\{(\\{\\})?\\})+", "")) - LYXERR(Debug::FINDVERBOSE, " further removing stale empty \\section{}, \\part{}, \\paragraph{} macros from: " << t); - while (regex_replace(t, t, "\\\\(foreignlanguage|textcolor|item)\\{[a-z]+\\}(\\{(\\{\\})?\\})+", "")); - } - return t; -} - docstring stringifyFromCursor(DocIterator const & cur, int len) { LYXERR(Debug::FINDVERBOSE, "Stringifying with len=" << len << " from cursor at pos: " << cur); @@ -4444,15 +4372,20 @@ int findForwardAdv(DocIterator & cur, MatchStringAdv & match) { if (!cur) return 0; - bool repeat = false; + int repeat = 0; DocIterator orig_cur; // to be used if repeat not successful MatchResult orig_mres; + do { + orig_cur = cur; + cur.forwardPos(); + } while (cur.depth() > orig_cur.depth()); + cur = orig_cur; while (!theApp()->longOperationCancelled() && cur) { //(void) findAdvForwardInnermost(cur); LYXERR(Debug::FINDVERBOSE, "findForwardAdv() cur: " << cur); MatchResult mres = match(cur, -1, MatchStringAdv::MatchAnyPlace); string msg = "Starting"; - if (repeat) + if (repeat > 0) msg = "Repeated"; displayMres(mres, msg + " findForwardAdv", cur) int match_len = mres.match_len; @@ -4461,8 +4394,13 @@ int findForwardAdv(DocIterator & cur, MatchStringAdv & match) match_len = 0; } if (match_len <= 0) { - // This should exit nested insets, if any, or otherwise undefine the currsor. - cur.pos() = cur.lastpos(); + if (repeat > 0) { + repeat--; + } + else { + // This should exit nested insets, if any, or otherwise undefine the currsor. + cur.pos() = cur.lastpos(); + } LYXERR(Debug::FINDVERBOSE, "Advancing pos: cur=" << cur); cur.forwardPos(); } @@ -4490,7 +4428,7 @@ int findForwardAdv(DocIterator & cur, MatchStringAdv & match) cur.pos() = cur.pos() + increment; MatchResult mres2 = match(cur, -1, MatchStringAdv::MatchAnyPlace); displayMres(mres2, "findForwardAdv loop", cur) - switch (interpretMatch(mres, mres2)) { + switch (interpretMatch(mres, mres2)) { case MatchResult::newIsTooFar: // behind the expected match firstInvalid = increment; @@ -4498,7 +4436,7 @@ int findForwardAdv(DocIterator & cur, MatchStringAdv & match) increment /= 2; break; case MatchResult::newIsBetter: - // not reached yet, but cur.pos()+increment is bettert + // not reached yet, but cur.pos()+increment is better mres = mres2; firstInvalid -= increment; if (increment > firstInvalid*3/4) @@ -4521,14 +4459,14 @@ int findForwardAdv(DocIterator & cur, MatchStringAdv & match) if (mres.match_len > 0) { if (mres.match_prefix + mres.pos - mres.leadsize > 0) { // The match seems to indicate some deeper level - repeat = true; + repeat = 2; orig_cur = cur; orig_mres = mres; cur.forwardPos(); continue; } } - else if (repeat) { + else if (repeat > 0) { // should never be reached. cur = orig_cur; mres = orig_mres;