]> git.lyx.org Git - features.git/blobdiff - src/lyxfind.cpp
Cmake key-tests: Adapted to changed shortcuts
[features.git] / src / lyxfind.cpp
index 696a2562f60a2f6063c95a3ee5f4f1f67106e684..ae9d965a7408c751722ba5ff3225d03b7a1d8003 100644 (file)
@@ -106,6 +106,8 @@ class IgnoreFormats {
        ///
        void setIgnoreDeleted(bool value);
        ///
+       bool getNonContent() const { return searchNonContent_; }
+       ///
        void setIgnoreFormat(string const & type, bool value, bool fromUser = true);
 
 private:
@@ -132,6 +134,8 @@ private:
        bool userSelectedIgnoreLanguage_ = false;
        ///
        bool ignoreDeleted_ = true;
+       ///
+       bool searchNonContent_ = true;
 };
 
 void IgnoreFormats::setIgnoreFormat(string const & type, bool value, bool fromUser)
@@ -177,6 +181,9 @@ void IgnoreFormats::setIgnoreFormat(string const & type, bool value, bool fromUs
        else if (type == "deleted") {
                ignoreDeleted_ = value;
        }
+       else if (type == "non-output-content") {
+               searchNonContent_ = !value;
+       }
 }
 
 // The global variable that can be changed from outside
@@ -823,16 +830,21 @@ string string2regex(string in)
        return temp2;
 }
 
+static void buildAccentsMap();
+
 string correctRegex(string t, bool withformat)
 {
        /* Convert \backslash => \
         * and \{, \}, \[, \] => {, }, [, ]
         */
        string s("");
-       regex wordre("(\\\\)*(\\\\((backslash|mathcircumflex) ?|[\\[\\]\\{\\}]))");
+       regex wordre("(\\\\)*(\\\\(([a-z]+) ?|[\\[\\]\\{\\}]))");
        size_t lastpos = 0;
        smatch sub;
        bool backslashed = false;
+       if (accents.empty())
+               buildAccentsMap();
+
        for (sregex_iterator it(t.begin(), t.end(), wordre), end; it != end; ++it) {
                sub = *it;
                string replace;
@@ -865,8 +877,15 @@ string correctRegex(string t, bool withformat)
                                        LASSERT(1, /**/);
                                }
                        }
-                       else
-                               replace = sub.str(3);
+                       else {
+                               AccentsIterator it_ac = accents.find(sub.str(4));
+                               if (it_ac == accents.end()) {
+                                       replace = sub.str(3);
+                               }
+                               else {
+                                       replace = it_ac->second;
+                               }
+                       }
                }
                if (lastpos < (size_t) sub.position(2))
                        s += t.substr(lastpos, sub.position(2) - lastpos);
@@ -898,7 +917,7 @@ string escape_for_regex(string s, bool withformat)
                        if (lastpos == s.size())
                                break;
                }
-               size_t end_pos = s.find("\\endregexp{}}", regex_pos + 8);
+               size_t end_pos = s.find("\\endregexp", regex_pos + 8);
                result += correctRegex(s.substr(regex_pos + 8, end_pos -(regex_pos + 8)), withformat);
                lastpos = end_pos + 13;
        }
@@ -1059,6 +1078,9 @@ static docstring buffer_to_latex(Buffer & buffer)
                runparams.for_searchAdv = OutputParams::SearchWithoutDeleted;
        else
                runparams.for_searchAdv = OutputParams::SearchWithDeleted;
+       if (ignoreFormats.getNonContent()) {
+               runparams.for_searchAdv |= OutputParams::SearchNonOutput;
+       }
        pit_type const endpit = buffer.paragraphs().size();
        for (pit_type pit = 0; pit != endpit; ++pit) {
                TeXOnePar(buffer, buffer.text(), pit, os, runparams);
@@ -1067,6 +1089,42 @@ static docstring buffer_to_latex(Buffer & buffer)
        return ods.str();
 }
 
+static string latexNamesToUtf8(docstring strIn)
+{
+       string addtmp = to_utf8(strIn);
+       static regex const rmAcc("(\\\\)*(\\\\([a-z]+) ?)");
+       size_t lastpos = 0;
+       smatch sub;
+       string replace;
+       string add("");
+       if (accents.empty())
+               buildAccentsMap();
+       for (sregex_iterator it_add(addtmp.begin(), addtmp.end(), rmAcc), end; it_add != end; ++it_add) {
+               sub = *it_add;
+               if ((sub.position(2) - sub.position(0)) % 3 == 1) {
+                       continue;
+               }
+               else {
+                       string key = sub.str(3);
+                       AccentsIterator it_ac = accents.find(key);
+                       if (it_ac == accents.end()) {
+                               replace = sub.str(2);
+                       }
+                       else {
+                               replace = it_ac->second;
+                       }
+               }
+               if (lastpos < (size_t) sub.position(2))
+                       add += addtmp.substr(lastpos, sub.position(2) - lastpos);
+               add += replace;
+               lastpos = sub.position(2) + sub.length(2);
+       }
+       if (lastpos == 0)
+               add = addtmp;
+       LYXERR(Debug::FIND, "Adding to search string: '"
+                       << add << "'");
+       return add;
+}
 
 static docstring stringifySearchBuffer(Buffer & buffer, FindAndReplaceOptions const & opt)
 {
@@ -1088,19 +1146,20 @@ static docstring stringifySearchBuffer(Buffer & buffer, FindAndReplaceOptions co
                else {
                        runparams.for_searchAdv = OutputParams::SearchWithDeleted;
                }
+               if (ignoreFormats.getNonContent()) {
+                       runparams.for_searchAdv |= OutputParams::SearchNonOutput;
+               }
+               string t("");
                for (pos_type pit = pos_type(0); pit < (pos_type)buffer.paragraphs().size(); ++pit) {
                        Paragraph const & par = buffer.paragraphs().at(pit);
+                       string add = latexNamesToUtf8(par.asString(pos_type(0), par.size(),
+                                                               option,
+                                                               &runparams));
                        LYXERR(Debug::FIND, "Adding to search string: '"
-                              << par.asString(pos_type(0), par.size(),
-                                              option,
-                                              &runparams)
-                              << "'");
-                       str += par.asString(pos_type(0), par.size(),
-                                           option,
-                                           &runparams);
+                               << add << "'");
+                       t += add;
                }
                // Even in ignore-format we have to remove "\text{}, \lyxmathsym{}" parts
-               string t = to_utf8(str);
                while (regex_replace(t, t, "\\\\(text|lyxmathsym|ensuremath)\\{([^\\}]*)\\}", "$2"));
                str = from_utf8(t);
        }
@@ -1534,6 +1593,9 @@ void static fillMissingUnicodesymbols()
   addAccents("\\o", getutf8(0x00f8));
   addAccents("\\textcrlambda", getutf8(0x019b));
   addAccents("\\j", getutf8(0x0237));
+  addAccents("\\textrevepsilon", getutf8(0x025c));
+  addAccents("\\textbaru", getutf8(0x0289));
+  addAccents("\\textquoteleft", getutf8(0x02bb));
   addAccents("\\textGamma", getutf8(0x0393));
   addAccents("\\Gamma", getutf8(0x0393));
   addAccents("\\textDelta", getutf8(0x0394));
@@ -1730,6 +1792,7 @@ void static fillMissingUnicodesymbols()
   addAccents("\\textdagger", getutf8(0x2020));
   addAccents("\\ddag", getutf8(0x2021));
   addAccents("\\ddagger", getutf8(0x2021));
+  addAccents("\\textdaggerdbl", getutf8(0x2021));
   addAccents("\\textbullet", getutf8(0x2022));
   addAccents("\\bullet", getutf8(0x2022));
   addAccents("\\dots", getutf8(0x2026));
@@ -1816,8 +1879,8 @@ static void buildAccentsMap()
   accents["backslash LaTeXe"]        = getutf8(0xf0013);
   accents["backslash lyxarrow"]      = getutf8(0xf0020);
   accents["ddot{\\imath}"] = "ï";
-  buildaccent("ddot", "aAeEhHiIioOtuUwWxXyY",
-                      "äÃ\84ëÃ\8bḧḦïÃ\8fïöÃ\96áº\97üÃ\9cáº\85áº\84áº\8dáº\8cÿŸ");      // umlaut
+  buildaccent("ddot", "aAeEhHiIoOtuUwWxXyY",
+                      "äÃ\84ëÃ\8bḧḦïÃ\8föÃ\96áº\97üÃ\9cáº\85áº\84áº\8dáº\8cÿŸ");        // umlaut
   buildaccent("dot|.", "aAbBcCdDeEfFGghHIimMnNoOpPrRsStTwWxXyYzZ",
                        "ȧȦḃḂċĊḋḊėĖḟḞĠġḣḢİİṁṀṅṄȯȮṗṖṙṘṡṠṫṪẇẆẋẊẏẎżŻ");  // dot{i} can only happen if ignoring case, but there is no lowercase of 'İ'
   accents["acute{\\imath}"] = "í";
@@ -1862,8 +1925,8 @@ static void buildAccentsMap()
   accents["textdoublegrave{\\i}"] = "ȉ";
   buildaccent("dgrave|textdoublegrave", "AaEeIiOoRrUu",
                                         "ȀȁȄȅȈȉȌȍȐȑȔȕ"); // double grave
-  accents["rcap{\\imath}"] = "È\89";
-  accents["textroundcap{\\i}"] = "È\89";
+  accents["rcap{\\imath}"] = "È\8b";
+  accents["textroundcap{\\i}"] = "È\8b";
   buildaccent("rcap|textroundcap", "AaEeIiOoRrUu",
                                    "ȂȃȆȇȊȋȎȏȒȓȖȗ"); // inverted breve
   buildaccent("slashed", "oO",
@@ -1882,7 +1945,7 @@ void Intervall::removeAccents()
     buildAccentsMap();
   static regex const accre("\\\\(([\\S]|grave|breve|ddot|dot|acute|dacute|mathring|check|hat|bar|tilde|subdot|ogonek|"
          "cedilla|subring|textsubring|subhat|textsubcircum|subtilde|textsubtilde|dgrave|textdoublegrave|rcap|textroundcap|slashed)\\{[^\\{\\}]+\\}"
-      "|((i|imath|jmath|cdot|[a-z]+space)|((backslash )?([lL]y[xX]|[tT]e[xX]|[lL]a[tT]e[xX]e?|lyxarrow))|(brace|guillemot)(left|right)|textasciicircum|mathcircumflex|sim)(?![a-zA-Z]))");
+      "|((i|imath|jmath|cdot|[a-z]+(space)?)|((backslash )?([lL]y[xX]|[tT]e[xX]|[lL]a[tT]e[xX]e?|lyxarrow))|(textquote|brace|guillemot)(left|right)|textasciicircum|mathcircumflex|sim)(?![a-zA-Z]))");
   smatch sub;
   for (sregex_iterator itacc(par.begin(), par.end(), accre), end; itacc != end; ++itacc) {
     sub = *itacc;
@@ -3371,9 +3434,9 @@ void MatchStringAdv::CreateRegexp(FindAndReplaceOptions const & opt, string rege
                                balanced--;
                                if (balanced < 0)
                                        break;
-                               }
-                               skip = 1;
                        }
+                       skip = 1;
+               }
                if (balanced != 0) {
                        regexIsValid = false;
                        regexError = "Unbalanced curly brackets in regexp \"" + regexp_str + "\"";
@@ -3490,6 +3553,7 @@ MatchStringAdv::MatchStringAdv(lyx::Buffer & buf, FindAndReplaceOptions & opt)
                string lead_as_regexp;
                if (lead_size > 0) {
                        lead_as_regexp = string2regex(par_as_string.substr(0, lead_size));
+                       (void)regex_replace(par_as_string_nolead, par_as_string_nolead, "\\$$", "");
                        (void)regex_replace(par_as_string_nolead, par_as_string_nolead, "}$", "");
                        par_as_string = par_as_string_nolead;
                        LYXERR(Debug::FIND, "lead_as_regexp is '" << lead_as_regexp << "'");
@@ -3828,11 +3892,14 @@ docstring stringifyFromCursor(DocIterator const & cur, int len)
                else {
                        runparams.for_searchAdv = OutputParams::SearchWithDeleted;
                }
+               if (ignoreFormats.getNonContent()) {
+                       runparams.for_searchAdv |= OutputParams::SearchNonOutput;
+               }
                LYXERR(Debug::FIND, "Stringifying with cur: "
-                      << cur << ", from pos: " << cur.pos() << ", end: " << end);
-               return par.asString(cur.pos(), end,
-                       option,
-                       &runparams);
+                       << cur << ", from pos: " << cur.pos() << ", end: " << end);
+               return from_utf8(latexNamesToUtf8(par.asString(cur.pos(), end,
+                                                               option,
+                                                               &runparams)));
        } else if (cur.inMathed()) {
                CursorSlice cs = cur.top();
                MathData md = cs.cell();
@@ -3841,10 +3908,9 @@ docstring stringifyFromCursor(DocIterator const & cur, int len)
                         ? md.end()
                         : md.begin() + cs.pos() + len );
                MathData md2;
-               for (MathData::const_iterator it = md.begin() + cs.pos();
-                    it != it_end; ++it)
+               for (MathData::const_iterator it = md.begin() + cs.pos(); it != it_end; ++it)
                        md2.push_back(*it);
-               docstring s = asString(md2);
+               docstring s = from_utf8(latexNamesToUtf8(asString(md2)));
                LYXERR(Debug::FIND, "Stringified math: '" << s << "'");
                return s;
        }
@@ -3852,7 +3918,6 @@ docstring stringifyFromCursor(DocIterator const & cur, int len)
        return docstring();
 }
 
-
 /** Computes the LaTeX export of buf starting from cur and ending len positions
  * after cur, if len is positive, or at the paragraph or innermost inset end
  * if len is -1.
@@ -3881,6 +3946,9 @@ docstring latexifyFromCursor(DocIterator const & cur, int len)
        else {
                runparams.for_searchAdv = OutputParams::SearchWithDeleted;
        }
+       if (ignoreFormats.getNonContent()) {
+               runparams.for_searchAdv |= OutputParams::SearchNonOutput;
+       }
 
        if (cur.inTexted()) {
                // @TODO what about searching beyond/across paragraph breaks ?