[LyX/master] Find: Advanced + Quick:

Kornel Benko kornel at lyx.org
Fri Apr 8 06:06:59 UTC 2022


commit 1f7d90d6367010d32f77a536a246e8fed9b3d381
Author: Kornel Benko <kornel at lyx.org>
Date:   Fri Apr 8 08:40:32 2022 +0200

    Find: Advanced + Quick:
    
    Expand list of quotes to include also '» « › ‹'
    Enable quick find to search for quotes too
---
 src/Paragraph.cpp |   27 +++++++++++++++++++++++----
 src/lyxfind.cpp   |    8 ++++----
 2 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp
index be133b1..92bb883 100644
--- a/src/Paragraph.cpp
+++ b/src/Paragraph.cpp
@@ -4560,6 +4560,23 @@ void Paragraph::changeCase(BufferParams const & bparams, pos_type pos,
 	}
 }
 
+static char_type matchquote(char_type in)
+{
+	switch (in) {
+		case 0x2018:
+		case 0x201a:
+		case 0x203a:
+		case 0x2039:
+			return '\'';	// ‘ ‚ › ‹
+		case 0x00bb:
+		case 0x00ab:
+		case 0x201e:
+		case 0x201c:
+			return '"';	// » « „ “
+		default:
+			return in;
+	}
+}
 
 int Paragraph::find(docstring const & str, bool cs, bool mw,
 		pos_type start_pos, bool del) const
@@ -4590,8 +4607,9 @@ int Paragraph::find(docstring const & str, bool cs, bool mw,
 			if (!insetstring.empty()) {
 				int const insetstringsize = insetstring.length();
 				for (int j = 0; j < insetstringsize && pos < parsize; ++i, ++j) {
-					if ((cs && str[i] != insetstring[j])
-					    || (!cs && uppercase(str[i]) != uppercase(insetstring[j]))) {
+					char_type ij = matchquote(insetstring[j]);
+					if ((cs && str[i] != ij)
+					    || (!cs && uppercase(str[i]) != uppercase(ij))) {
 						nonmatch = true;
 						break;
 					}
@@ -4601,9 +4619,10 @@ int Paragraph::find(docstring const & str, bool cs, bool mw,
 		}
 		if (nonmatch || i == strsize)
 			break;
-		if (cs && str[i] != d->text_[pos])
+		char_type dp = matchquote(d->text_[pos]);
+		if (cs && str[i] != dp)
 			break;
-		if (!cs && uppercase(str[i]) != uppercase(d->text_[pos]))
+		if (!cs && uppercase(str[i]) != uppercase(dp))
 			break;
 	}
 
diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp
index 0f02a39..c3f2b77 100644
--- a/src/lyxfind.cpp
+++ b/src/lyxfind.cpp
@@ -913,10 +913,10 @@ string correctRegex(string t, bool withformat)
 	else if (lastpos < t.length())
 		s += t.substr(lastpos, t.length() - lastpos);
 	// Handle quotes in regex
-	// substitute all '„', '“' with '"'
-	// and all '‚', '‘' with "\'"
-	static std::regex plainquotes { R"(„|“)" };
-	static std::regex innerquotes { R"(‚|‘)" };
+	// substitute all '„', '“', '»', '«' with '"'
+	// and all '‚', '‘', '›', '‹' with "\'"
+	static std::regex plainquotes { R"(„|“|»|«)" };
+	static std::regex innerquotes { R"(‚|‘|›|‹)" };
 	t = std::regex_replace(s, plainquotes, R"(")");
 	s = std::regex_replace(t, innerquotes, R"(')");
 	//LYXERR0("correctRegex output '" << s << "'");


More information about the lyx-cvs mailing list