findadv: almost all test cases, including \regex[{}, back to working with std::regex.

This commit is contained in:
Tommaso Cucinotta 2017-04-16 23:10:17 +02:00
parent 5ef6d596b6
commit 664798128a
3 changed files with 44 additions and 15 deletions

View File

@ -63,7 +63,7 @@ echo
if [ ! -d $LYX_HOME ]; then if [ ! -d $LYX_HOME ]; then
mkdir -p $LYX_HOME mkdir -p $LYX_HOME
# mkdir -p $LYX_USERDIR mkdir -p $LYX_USERDIR
# cp preferences $LYX_USERDIR # cp preferences $LYX_USERDIR
cd $LYX_HOME cd $LYX_HOME
echo "Initializing testing environment . . ." echo "Initializing testing environment . . ."

View File

@ -672,13 +672,23 @@ string escape_for_regex(string s, bool match_latex)
bool regex_replace(string const & s, string & t, string const & searchstr, bool regex_replace(string const & s, string & t, string const & searchstr,
string const & replacestr) string const & replacestr)
{ {
lyx::regex e(searchstr); LYXERR(Debug::FIND, "regex_replace() - s='" << s
<< "', searchstr='" << searchstr
<< "', replacestr='" << replacestr);
#if LYX_USE_STD_REGEX
// this is the default anyway
lyx::regex e(searchstr, regex_constants::ECMAScript);
#else
// TBD: check
lyx::regex e(searchstr, regex_constants::ECMAScript);
#endif
ostringstream oss; ostringstream oss;
ostream_iterator<char, char> it(oss); ostream_iterator<char, char> it(oss);
lyx::regex_replace(it, s.begin(), s.end(), e, replacestr); lyx::regex_replace(it, s.begin(), s.end(), e, replacestr);
// tolerate t and s be references to the same variable // tolerate t and s be references to the same variable
bool rv = (s != oss.str()); bool rv = (s != oss.str());
t = oss.str(); t = oss.str();
LYXERR(Debug::FIND, "regex_replace() - t='" << t << "', rv=" << rv);
return rv; return rv;
} }
@ -841,11 +851,11 @@ static size_t identifyLeading(string const & s)
{ {
string t = s; string t = s;
// @TODO Support \item[text] // @TODO Support \item[text]
while (regex_replace(t, t, "^\\\\(emph|textbf|subsubsection|subsection|section|subparagraph|paragraph|part)\\*?\\{", "") while (regex_replace(t, t, REGEX_BOS "\\\\(emph|textbf|subsubsection|subsection|section|subparagraph|paragraph|part)\\*?\\{", "")
|| regex_replace(t, t, "^\\$", "") || regex_replace(t, t, REGEX_BOS "\\$", "")
|| regex_replace(t, t, "^\\\\\\[ ", "") || regex_replace(t, t, REGEX_BOS "\\\\\\[ ", "")
|| regex_replace(t, t, "^\\\\item ", "") || regex_replace(t, t, REGEX_BOS "\\\\item ", "")
|| regex_replace(t, t, "^\\\\begin\\{[a-zA-Z_]*\\*?\\} ", "")) || regex_replace(t, t, REGEX_BOS "\\\\begin\\{[a-zA-Z_]*\\*?\\} ", ""))
LYXERR(Debug::FIND, " after removing leading $, \\[ , \\emph{, \\textbf{, etc.: '" << t << "'"); LYXERR(Debug::FIND, " after removing leading $, \\[ , \\emph{, \\textbf{, etc.: '" << t << "'");
return s.find(t); return s.find(t);
} }
@ -857,13 +867,13 @@ static int identifyClosing(string & t)
int open_braces = 0; int open_braces = 0;
do { do {
LYXERR(Debug::FIND, "identifyClosing(): t now is '" << t << "'"); LYXERR(Debug::FIND, "identifyClosing(): t now is '" << t << "'");
if (regex_replace(t, t, "(.*[^\\\\])\\$\\'", "$1")) if (regex_replace(t, t, "(.*[^\\\\])\\$" REGEX_EOS, "$1"))
continue; continue;
if (regex_replace(t, t, "(.*[^\\\\]) \\\\\\]\\'", "$1")) if (regex_replace(t, t, "(.*[^\\\\]) \\\\\\]" REGEX_EOS, "$1"))
continue; continue;
if (regex_replace(t, t, "(.*[^\\\\]) \\\\end\\{[a-zA-Z_]*\\*?\\}\\'", "$1")) if (regex_replace(t, t, "(.*[^\\\\]) \\\\end\\{[a-zA-Z_]*\\*?\\}" REGEX_EOS, "$1"))
continue; continue;
if (regex_replace(t, t, "(.*[^\\\\])\\}\\'", "$1")) { if (regex_replace(t, t, "(.*[^\\\\])\\}" REGEX_EOS, "$1")) {
++open_braces; ++open_braces;
continue; continue;
} }
@ -933,13 +943,14 @@ MatchStringAdv::MatchStringAdv(lyx::Buffer & buf, FindAndReplaceOptions const &
LYXERR(Debug::FIND, "Open braces: " << open_braces); LYXERR(Debug::FIND, "Open braces: " << open_braces);
LYXERR(Debug::FIND, "Close .*? : " << close_wildcards); LYXERR(Debug::FIND, "Close .*? : " << close_wildcards);
LYXERR(Debug::FIND, "Replaced text (to be used as regex): " << par_as_string); LYXERR(Debug::FIND, "Replaced text (to be used as regex): " << par_as_string);
// If entered regexp must match at begin of searched string buffer // If entered regexp must match at begin of searched string buffer
string regexp_str = string("\\`") + lead_as_regexp + par_as_string; string regexp_str = lead_as_regexp + par_as_string;
LYXERR(Debug::FIND, "Setting regexp to : '" << regexp_str << "'"); LYXERR(Debug::FIND, "Setting regexp to : '" << regexp_str << "'");
regexp = lyx::regex(regexp_str); regexp = lyx::regex(regexp_str);
// If entered regexp may match wherever in searched string buffer // If entered regexp may match wherever in searched string buffer
string regexp2_str = string("\\`.*") + lead_as_regexp + ".*" + par_as_string; string regexp2_str = lead_as_regexp + ".*" + par_as_string;
LYXERR(Debug::FIND, "Setting regexp2 to: '" << regexp2_str << "'"); LYXERR(Debug::FIND, "Setting regexp2 to: '" << regexp2_str << "'");
regexp2 = lyx::regex(regexp2_str); regexp2 = lyx::regex(regexp2_str);
} }
@ -959,8 +970,16 @@ int MatchStringAdv::findAux(DocIterator const & cur, int len, bool at_begin) con
if (use_regexp) { if (use_regexp) {
LYXERR(Debug::FIND, "Searching in regexp mode: at_begin=" << at_begin); LYXERR(Debug::FIND, "Searching in regexp mode: at_begin=" << at_begin);
regex const & p_regexp = at_begin ? regexp : regexp2; regex const *p_regexp;
sregex_iterator re_it(str.begin(), str.end(), p_regexp); regex_constants::match_flag_type flags;
if (at_begin) {
flags = regex_constants::match_continuous;
p_regexp = &regexp;
} else {
flags = regex_constants::match_default;
p_regexp = &regexp2;
}
sregex_iterator re_it(str.begin(), str.end(), *p_regexp, flags);
if (re_it == sregex_iterator()) if (re_it == sregex_iterator())
return 0; return 0;
match_results<string::const_iterator> const & m = *re_it; match_results<string::const_iterator> const & m = *re_it;

View File

@ -43,4 +43,14 @@ using LR_NS::regex_constants::match_flag_type;
#undef LR_NS #undef LR_NS
#ifdef LYX_USE_STD_REGEX
// Match Begin and End of String when using ECMAScript (default std::regex)
#define REGEX_BOS "^"
#define REGEX_EOS "$"
#else
// Match Begin and End of String when using Perl RE (default boost::regex)
#define REGEX_BOS "\\`"
#define REGEX_EOS "\\'"
#endif
#endif #endif