commit ded0dc4c1cb97bf2f793033a48084ad0a54d5883
Author: Kornel Benko <[email protected]>
Date: Sat Sep 29 09:23:30 2018 +0200
Try to make findadv more robust if not ignoring format
If searching for instance '.+' , the found string expanded
to the end of search buffer. So we have to replace
'.' with '[^\}]'.
Also all constructs like '[^abc]' had to be changed to '[^abc\}]'
to not go behind the actual format.
There is still problem using '*', but constructs usin '+' seem to work now.
('.*' finds everything from first char in correct format
to (including) end of next format change
while '.+' find _only_ characters in correct format)
---
src/lyxfind.cpp | 24 ++++++++++++++++++++----
1 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp
index 0e79172..ffe7df2 100644
--- a/src/lyxfind.cpp
+++ b/src/lyxfind.cpp
@@ -929,6 +929,20 @@ MatchStringAdv::MatchStringAdv(lyx::Buffer & buf,
FindAndReplaceOptions const &
) {
++close_wildcards;
}
+ if (!opt.ignoreformat) {
+ // Remove extra '}' at end
+ regex_replace(par_as_string, par_as_string,
"(.*)\\\\}$", "$1");
+ // save '\.'
+ regex_replace(par_as_string, par_as_string, "\\\\\\.",
"_xxbdotxx_");
+ // handle '.' -> '[^]', replace later as '[^\}]'
+ regex_replace(par_as_string, par_as_string, "\\.",
"[^]");
+ // replace '[^...]' with '[^...\}]'
+ regex_replace(par_as_string, par_as_string,
"\\[\\^([^\\\\\\]]*)\\]", "_xxbrlxx_$1\\}_xxbrrxx_");
+ regex_replace(par_as_string, par_as_string,
"_xxbrlxx_", "[^");
+ regex_replace(par_as_string, par_as_string,
"_xxbrrxx_", "]");
+ // restore '\.'
+ regex_replace(par_as_string, par_as_string,
"_xxbdotxx_", "\\.");
+ }
LYXERR(Debug::FIND, "par_as_string now is '" << par_as_string
<< "'");
LYXERR(Debug::FIND, "Open braces: " << open_braces);
LYXERR(Debug::FIND, "Close .*? : " << close_wildcards);
@@ -974,10 +988,12 @@ int MatchStringAdv::findAux(DocIterator const & cur, int
len, bool at_begin) con
return 0;
match_results<string::const_iterator> const & m = *re_it;
- // Check braces on the segment that matched the entire regexp
expression,
- // plus the last subexpression, if a (.*?) was inserted in the
constructor.
- if (!braces_match(m[0].first, m[0].second, open_braces))
- return 0;
+ if (0) { // Kornel Benko: DO NOT CHECKK
+ // Check braces on the segment that matched the entire
regexp expression,
+ // plus the last subexpression, if a (.*?) was inserted
in the constructor.
+ if (!braces_match(m[0].first, m[0].second, open_braces))
+ return 0;
+ }
// Check braces on segments that matched all (.*?)
subexpressions,
// except the last "padding" one inserted by lyx.