]> git.lyx.org Git - lyx.git/commitdiff
FindAdv: In format search could '$'-char be interpreted as math-start.
authorKornel Benko <kornel@lyx.org>
Fri, 13 May 2022 07:30:30 +0000 (09:30 +0200)
committerKornel Benko <kornel@lyx.org>
Fri, 13 May 2022 07:30:30 +0000 (09:30 +0200)
To handle this case, we use '\lyxdollar' string instead.

Also try to handle '\n' in the docstring directly instead in the
string already converted to utf8.
(The utf8-version is still there, but commented out)

src/Paragraph.cpp
src/lyxfind.cpp

index 8a96e6dbdce5643df7caca39ca853844a297d8aa..73edb5d24045feeee4c64c35afbaca45747fe3df 100644 (file)
@@ -1223,6 +1223,9 @@ void Paragraph::Private::latexSpecialChar(otexstream & os,
                        case '}':
                                os << "\\braceright ";
                                return;
+                       case '$':
+                               os << "\\lyxdollar ";
+                               return;
                        case '~':
                                os << "\\lyxtilde ";
                                return;
index 601f319100ad36f44f42f47e8974b2a3d5e81d08..fddf398377d10cd11ca068f97c2229d63bb8b6b1 100644 (file)
@@ -1967,6 +1967,7 @@ static void buildAccentsMap()
        accents["braceright"]    = getutf8(0xf0031);
        accents["lyxtilde"]      = getutf8(0xf0032);
        accents["sim"]           = getutf8(0xf0032);
+       accents["lyxdollar"]     = getutf8(0xf0033);
        accents["backslash lyx"]           = getutf8(0xf0010);  // Used logos inserted with starting \backslash
        accents["backslash LyX"]           = getutf8(0xf0010);
        accents["backslash tex"]           = getutf8(0xf0011);
@@ -3969,8 +3970,74 @@ static bool simple_replace(string &t, string from, string to)
 }
 #endif
 
-string MatchStringAdv::normalize(docstring const & s, bool ignore_format) const
+#if 1
+static string convertLF2Space(docstring const &s, bool ignore_format)
 {
+       // Using original docstring to handle '\n'
+
+       if (s.size() == 0) return "";
+       stringstream t;
+       size_t pos;
+       size_t start = 0;
+       size_t end = s.size() - 1;
+       while (s[start] == '\n' && start <= end)
+               start++;
+       while (end >= start && s[end] == '\n')
+               end--;
+       if (start >= end + 1)
+               return "";
+       do {
+               bool dospace = true;
+               int skip = -1;
+               pos = s.find('\n', start);
+               if (pos >= end) {
+                       t << lyx::to_utf8(s.substr(start, end + 1 - start));
+                       break;
+               }
+               if ((pos > start+2) &&
+                    s[pos-1] == '\\' &&
+                    s[pos-2] == '\\') {
+                       if (s[pos-1] == '\\' && s[pos-2] == '\\') {
+                               skip = 2;
+                               if ((pos > start+3) &&
+                                   (s[pos+1] == '~' || isSpace(s[pos+1]) ||
+                                    s[pos-3] == '~' || isSpace(s[pos-3]))) {
+                                       // discard '\n'
+                                       dospace = false;
+                               }
+                       }
+                       else if (s[pos-1] == '\\' && s[pos-2] == '\\')
+                               skip = 2;
+               }
+               else if (!ignore_format && (pos > start) &&
+                    s[pos-1] == '%') {
+                       skip = 1;
+                       while ((pos > start+skip) && (s[pos-1-skip] == '%'))
+                               skip++;
+                       if ((pos > start+skip) &&
+                           (s[pos+1] == '~' || isSpace(s[pos+1]) ||
+                            s[pos-1-skip] == '~' || isSpace(s[pos-1-skip]))) {
+                               // discard '%%%%%\n'
+                               dospace = false;
+                       }
+               }
+               else {
+                       dospace = true;
+                       skip = 0;
+               }
+               t << lyx::to_utf8(s.substr(start, pos-skip-start));
+               if (dospace)
+                       t << ' ';
+               start = pos+1;
+       } while (start <= end);
+       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
@@ -4002,17 +4069,26 @@ string MatchStringAdv::normalize(docstring const & s, bool ignore_format) const
                                // 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, "");
-                               }
+               }
+               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);
+
        // 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
@@ -4026,7 +4102,6 @@ string MatchStringAdv::normalize(docstring const & s, bool ignore_format) const
        return t;
 }
 
-
 docstring stringifyFromCursor(DocIterator const & cur, int len)
 {
        LYXERR(Debug::FINDVERBOSE, "Stringifying with len=" << len << " from cursor at pos: " << cur);