]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfind.cpp
Refactor InsetQuotes.h enums
[lyx.git] / src / lyxfind.cpp
index 5d336b0abcbee57267febc0e2aad8f4634a17dde..95dcf196749c3b4927c908c0e28944c6e90b8e6c 100644 (file)
@@ -17,7 +17,6 @@
 #include "lyxfind.h"
 
 #include "Buffer.h"
-#include "buffer_funcs.h"
 #include "BufferList.h"
 #include "BufferParams.h"
 #include "BufferView.h"
@@ -29,8 +28,6 @@
 #include "output_latex.h"
 #include "OutputParams.h"
 #include "Paragraph.h"
-#include "ParIterator.h"
-#include "TexRow.h"
 #include "Text.h"
 #include "Encoding.h"
 
 #include "frontends/alert.h"
 
 #include "mathed/InsetMath.h"
-#include "mathed/InsetMathGrid.h"
 #include "mathed/InsetMathHull.h"
 #include "mathed/MathData.h"
 #include "mathed/MathStream.h"
 #include "mathed/MathSupport.h"
 
-#include "support/convert.h"
 #include "support/debug.h"
 #include "support/docstream.h"
 #include "support/FileName.h"
 #include "support/gettext.h"
 #include "support/lassert.h"
 #include "support/lstrings.h"
-
-#include "support/regex.h"
 #include "support/textutils.h"
+
 #include <map>
+#include <regex>
 
 using namespace std;
 using namespace lyx::support;
@@ -66,56 +61,51 @@ namespace lyx {
 class IgnoreFormats {
  public:
        ///
-       IgnoreFormats()
-               : ignoreFamily_(false), ignoreSeries_(false),
-                 ignoreShape_(false), ignoreUnderline_(false),
-                 ignoreMarkUp_(false), ignoreStrikeOut_(false),
-                 ignoreSectioning_(false), ignoreFrontMatter_(false),
-                 ignoreColor_(false), ignoreLanguage_(false) {}
+       IgnoreFormats() = default;
        ///
-       bool getFamily() { return ignoreFamily_; }
+       bool getFamily() const { return ignoreFamily_; }
        ///
-       bool getSeries() { return ignoreSeries_; }
+       bool getSeries() const { return ignoreSeries_; }
        ///
-       bool getShape() { return ignoreShape_; }
+       bool getShape() const { return ignoreShape_; }
        ///
-       bool getUnderline() { return ignoreUnderline_; }
+       bool getUnderline() const { return ignoreUnderline_; }
        ///
-       bool getMarkUp() { return ignoreMarkUp_; }
+       bool getMarkUp() const { return ignoreMarkUp_; }
        ///
-       bool getStrikeOut() { return ignoreStrikeOut_; }
+       bool getStrikeOut() const { return ignoreStrikeOut_; }
        ///
-       bool getSectioning() { return ignoreSectioning_; }
+       bool getSectioning() const { return ignoreSectioning_; }
        ///
-       bool getFrontMatter() { return ignoreFrontMatter_; }
+       bool getFrontMatter() const { return ignoreFrontMatter_; }
        ///
-       bool getColor() { return ignoreColor_; }
+       bool getColor() const { return ignoreColor_; }
        ///
-       bool getLanguage() { return ignoreLanguage_; }
+       bool getLanguage() const { return ignoreLanguage_; }
        ///
        void setIgnoreFormat(string const & type, bool value);
 
 private:
        ///
-       bool ignoreFamily_;
+       bool ignoreFamily_ = false;
        ///
-       bool ignoreSeries_;
+       bool ignoreSeries_ = false;
        ///
-       bool ignoreShape_;
+       bool ignoreShape_ = false;
        ///
-       bool ignoreUnderline_;
+       bool ignoreUnderline_ = false;
        ///
-       bool ignoreMarkUp_;
+       bool ignoreMarkUp_ = false;
        ///
-       bool ignoreStrikeOut_;
+       bool ignoreStrikeOut_ = false;
        ///
-       bool ignoreSectioning_;
+       bool ignoreSectioning_ = false;
        ///
-       bool ignoreFrontMatter_;
+       bool ignoreFrontMatter_ = false;
        ///
-       bool ignoreColor_;
+       bool ignoreColor_ = false;
        ///
-       bool ignoreLanguage_;
+       bool ignoreLanguage_ = false;
 };
 
 
@@ -783,10 +773,10 @@ string escape_for_regex(string s, bool match_latex)
 bool regex_replace(string const & s, string & t, string const & searchstr,
                   string const & replacestr)
 {
-       lyx::regex e(searchstr, regex_constants::ECMAScript);
+       regex e(searchstr, regex_constants::ECMAScript);
        ostringstream oss;
        ostream_iterator<char, char> it(oss);
-       lyx::regex_replace(it, s.begin(), s.end(), e, replacestr);
+       regex_replace(it, s.begin(), s.end(), e, replacestr);
        // tolerate t and s be references to the same variable
        bool rv = (s != oss.str());
        t = oss.str();
@@ -891,9 +881,9 @@ private:
        // normalized string to search
        string par_as_string;
        // regular expression to use for searching
-       lyx::regex regexp;
+       regex regexp;
        // same as regexp, but prefixed with a ".*?"
-       lyx::regex regexp2;
+       regex regexp2;
        // leading format material as string
        string lead_as_string;
        // par_as_string after removal of lead_as_string
@@ -915,7 +905,7 @@ static docstring buffer_to_latex(Buffer & buffer)
        odocstringstream ods;
        otexstream os(ods);
        runparams.nice = true;
-       runparams.flavor = OutputParams::XETEX;
+       runparams.flavor = FLAVOR::XETEX;
        runparams.linelen = 10000; //lyxrc.plaintext_linelen;
        // No side effect of file copying and image conversion
        runparams.dryrun = true;
@@ -938,7 +928,7 @@ static docstring stringifySearchBuffer(Buffer & buffer, FindAndReplaceOptions co
                // OutputParams runparams(&buffer.params().encoding());
                OutputParams runparams(encodings.fromLyXName("utf8"));
                runparams.nice = true;
-               runparams.flavor = OutputParams::XETEX;
+               runparams.flavor = FLAVOR::XETEX;
                runparams.linelen = 10000; //lyxrc.plaintext_linelen;
                runparams.dryrun = true;
                runparams.for_search = true;
@@ -965,11 +955,11 @@ static size_t identifyLeading(string const & s)
        // @TODO Support \item[text]
        // Kornel: Added textsl, textsf, textit, texttt and noun
        // + allow to search for colored text too
-       while (regex_replace(t, t, REGEX_BOS "\\\\(((footnotesize|tiny|scriptsize|small|large|Large|LARGE|huge|Huge|emph|noun|minisec|text(bf|md|sl|sf|it|tt))|((textcolor|foreignlanguage|latexenvironment)\\{[a-z]+\\*?\\})|(u|uu)line|(s|x)out|uwave)|((sub)?(((sub)?section)|paragraph)|part|chapter)\\*?)\\{", "")
-              || regex_replace(t, t, REGEX_BOS "\\$", "")
-              || regex_replace(t, t, REGEX_BOS "\\\\\\[", "")
-              || regex_replace(t, t, REGEX_BOS " ?\\\\item\\{[a-z]+\\}", "")
-              || regex_replace(t, t, REGEX_BOS "\\\\begin\\{[a-zA-Z_]*\\*?\\}", ""))
+       while (regex_replace(t, t, "^\\\\(((footnotesize|tiny|scriptsize|small|large|Large|LARGE|huge|Huge|emph|noun|minisec|text(bf|md|sl|sf|it|tt))|((textcolor|foreignlanguage|latexenvironment)\\{[a-z]+\\*?\\})|(u|uu)line|(s|x)out|uwave)|((sub)?(((sub)?section)|paragraph)|part|chapter)\\*?)\\{", "")
+              || regex_replace(t, t, "^\\$", "")
+              || regex_replace(t, t, "^\\\\\\[", "")
+              || regex_replace(t, t, "^ ?\\\\item\\{[a-z]+\\}", "")
+              || regex_replace(t, t, "^\\\\begin\\{[a-zA-Z_]*\\*?\\}", ""))
               ;
        LYXERR(Debug::FIND, "  after removing leading $, \\[ , \\emph{, \\textbf{, etc.: '" << t << "'");
        return s.find(t);
@@ -1070,35 +1060,20 @@ class KeyInfo {
      * so that they can be ignored */
     endArguments
   };
- KeyInfo()
-   : keytype(invalid),
-    head(""),
-    _tokensize(-1),
-    _tokenstart(-1),
-    _dataStart(-1),
-    _dataEnd(-1),
-    parenthesiscount(1),
-    disabled(false),
-    used(false)
-  {};
+ KeyInfo() = default;
  KeyInfo(KeyType type, int parcount, bool disable)
    : keytype(type),
-    _tokensize(-1),
-    _tokenstart(-1),
-    _dataStart(-1),
-    _dataEnd(-1),
     parenthesiscount(parcount),
-    disabled(disable),
-    used(false) {};
-  KeyType keytype;
+    disabled(disable) {}
+  KeyType keytype = invalid;
   string head;
-  int _tokensize;
-  int _tokenstart;
-  int _dataStart;
-  int _dataEnd;
-  int parenthesiscount;
-  bool disabled;
-  bool used;                            /* by pattern */
+  int _tokensize = -1;
+  int _tokenstart = -1;
+  int _dataStart = -1;
+  int _dataEnd = -1;
+  int parenthesiscount = 1;
+  bool disabled = false;
+  bool used = false;                    /* by pattern */
 };
 
 class Border {
@@ -1126,20 +1101,20 @@ public:
   int depts[MAXOPENED];
   int closes[MAXOPENED];
   int actualdeptindex;
-  int previousNotIgnored(int);
-  int nextNotIgnored(int);
+  int previousNotIgnored(int) const;
+  int nextNotIgnored(int) const;
   void handleOpenP(int i);
   void handleCloseP(int i, bool closingAllowed);
   void resetOpenedP(int openPos);
   void addIntervall(int upper);
   void addIntervall(int low, int upper); /* if explicit */
   void removeAccents();
-  void setForDefaultLang(KeyInfo &defLang);
+  void setForDefaultLang(KeyInfo const & defLang) const;
   int findclosing(int start, int end, char up, char down, int repeat);
   void handleParentheses(int lastpos, bool closingAllowed);
   bool hasTitle;
   int langcount;       // Number of disabled language specs up to current position in actual interval
-  int isOpeningPar(int pos);
+  int isOpeningPar(int pos) const;
   string titleValue;
   void output(ostringstream &os, int lastpos);
   // string show(int lastpos);
@@ -1147,7 +1122,7 @@ public:
 
 vector<Border> Intervall::borders = vector<Border>(30);
 
-int Intervall::isOpeningPar(int pos)
+int Intervall::isOpeningPar(int pos) const
 {
   if ((pos < 0) || (size_t(pos) >= par.size()))
     return 0;
@@ -1162,7 +1137,7 @@ int Intervall::isOpeningPar(int pos)
   return 1;
 }
 
-void Intervall::setForDefaultLang(KeyInfo &defLang)
+void Intervall::setForDefaultLang(KeyInfo const & defLang) const
 {
   // Enable the use of first token again
   if (ignoreidx >= 0) {
@@ -1320,6 +1295,7 @@ static void buildAccentsMap()
   accents["imath"] = "ı";
   accents["i"] = "ı";
   accents["jmath"] = "ȷ";
+  accents["cdot"] = "·";
   accents["lyxmathsym{ß}"] = "ß";
   accents["text{ß}"] = "ß";
   accents["ddot{\\imath}"] = "ï";
@@ -1385,7 +1361,7 @@ void Intervall::removeAccents()
 {
   if (accents.empty())
     buildAccentsMap();
-  static regex const accre("\\\\(([\\S]|grave|breve|lyxmathsym|text|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)(?![a-zA-Z]))");
+  static regex const accre("\\\\(([\\S]|grave|breve|lyxmathsym|text|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-zA-Z]))");
   smatch sub;
   for (sregex_iterator itacc(par.begin(), par.end(), accre), end; itacc != end; ++itacc) {
     sub = *itacc;
@@ -1396,7 +1372,11 @@ void Intervall::removeAccents()
       for (size_t i = 0; i < val.size(); i++) {
         par[pos+i] = val[i];
       }
-      addIntervall(pos+val.size(), pos + sub.str(0).size());
+      // Remove possibly following space too
+      if (par[pos+sub.str(0).size()] == ' ')
+       addIntervall(pos+val.size(), pos + sub.str(0).size()+1);
+      else
+       addIntervall(pos+val.size(), pos + sub.str(0).size());
       for (size_t i = pos+val.size(); i < pos + sub.str(0).size(); i++) {
         // remove traces of any remaining chars
         par[i] = ' ';
@@ -1438,7 +1418,7 @@ void Intervall::resetOpenedP(int openPos)
   closes[1] = -1;
 }
 
-int Intervall::previousNotIgnored(int start)
+int Intervall::previousNotIgnored(int start) const
 {
     int idx = 0;                          /* int intervalls */
     for (idx = ignoreidx; idx >= 0; --idx) {
@@ -1450,7 +1430,7 @@ int Intervall::previousNotIgnored(int start)
     return start;
 }
 
-int Intervall::nextNotIgnored(int start)
+int Intervall::nextNotIgnored(int start) const
 {
     int idx = 0;                          /* int intervalls */
     for (idx = 0; idx <= ignoreidx; idx++) {
@@ -1475,7 +1455,7 @@ class LatexInfo {
   void buildEntries(bool);
   void makeKey(const string &, KeyInfo, bool isPatternString);
   void processRegion(int start, int region_end); /*  remove {} parts */
-  void removeHead(KeyInfo&, int count=0);
+  void removeHead(KeyInfo const &, int count=0);
 
  public:
  LatexInfo(string const & par, bool isPatternString)
@@ -1524,7 +1504,7 @@ class LatexInfo {
     else
       return false;
   };
-  int find(int start, KeyInfo::KeyType keytype) {
+  int find(int start, KeyInfo::KeyType keytype) const {
     if (start < 0)
       return -1;
     int tmpIdx = start;
@@ -1535,8 +1515,8 @@ class LatexInfo {
     }
     return -1;
   };
-  int process(ostringstream &os, KeyInfo &actual);
-  int dispatch(ostringstream &os, int previousStart, KeyInfo &actual);
+  int process(ostringstream & os, KeyInfo const & actual);
+  int dispatch(ostringstream & os, int previousStart, KeyInfo & actual);
   // string show(int lastpos) { return interval.show(lastpos);};
   int nextNotIgnored(int start) { return interval_.nextNotIgnored(start);};
   KeyInfo &getKeyInfo(int keyinfo) {
@@ -1546,7 +1526,7 @@ class LatexInfo {
     else
       return entries_[keyinfo];
   };
-  void setForDefaultLang(KeyInfo &defLang) {interval_.setForDefaultLang(defLang);};
+  void setForDefaultLang(KeyInfo const & defLang) {interval_.setForDefaultLang(defLang);};
   void addIntervall(int low, int up) { interval_.addIntervall(low, up); };
 };
 
@@ -1597,14 +1577,14 @@ class MathInfo {
     m.mathSize = end - start;
     entries_.push_back(m);
   }
-  bool empty() { return entries_.empty(); };
-  size_t getEndPos() {
+  bool empty() const { return entries_.empty(); };
+  size_t getEndPos() const {
     if (entries_.empty() || (actualIdx_ >= entries_.size())) {
       return 0;
     }
     return entries_[actualIdx_].mathEnd;
   }
-  size_t getStartPos() {
+  size_t getStartPos() const {
     if (entries_.empty() || (actualIdx_ >= entries_.size())) {
       return 100000;                    /*  definitely enough? */
     }
@@ -1614,7 +1594,7 @@ class MathInfo {
     actualIdx_ = 0;
     return getStartPos();
   }
-  size_t getSize() {
+  size_t getSize() const {
     if (entries_.empty() || (actualIdx_ >= entries_.size())) {
       return size_t(0);
     }
@@ -2220,7 +2200,7 @@ void LatexInfo::processRegion(int start, int region_end)
   }
 }
 
-void LatexInfo::removeHead(KeyInfo &actual, int count)
+void LatexInfo::removeHead(KeyInfo const & actual, int count)
 {
   if (actual.parenthesiscount == 0) {
     // "{\tiny{} ...}" ==> "{{} ...}"
@@ -2504,7 +2484,7 @@ int LatexInfo::dispatch(ostringstream &os, int previousStart, KeyInfo &actual)
   return nextKeyIdx;
 }
 
-int LatexInfo::process(ostringstream &os, KeyInfo &actual )
+int LatexInfo::process(ostringstream & os, KeyInfo const & actual )
 {
   int end = interval_.nextNotIgnored(actual._dataEnd);
   int oldStart = actual._dataStart;
@@ -2708,13 +2688,13 @@ static int identifyClosing(string & t)
        int open_braces = 0;
        do {
                LYXERR(Debug::FIND, "identifyClosing(): t now is '" << t << "'");
-               if (regex_replace(t, t, "(.*[^\\\\])\\$" REGEX_EOS, "$1"))
+               if (regex_replace(t, t, "(.*[^\\\\])\\$$", "$1"))
                        continue;
-               if (regex_replace(t, t, "(.*[^\\\\])\\\\\\]" REGEX_EOS, "$1"))
+               if (regex_replace(t, t, "(.*[^\\\\])\\\\\\]$", "$1"))
                        continue;
-               if (regex_replace(t, t, "(.*[^\\\\])\\\\end\\{[a-zA-Z_]*\\*?\\}" REGEX_EOS, "$1"))
+               if (regex_replace(t, t, "(.*[^\\\\])\\\\end\\{[a-zA-Z_]*\\*?\\}$", "$1"))
                        continue;
-               if (regex_replace(t, t, "(.*[^\\\\])\\}" REGEX_EOS, "$1")) {
+               if (regex_replace(t, t, "(.*[^\\\\])\\}$", "$1")) {
                        ++open_braces;
                        continue;
                }
@@ -2845,10 +2825,10 @@ MatchStringAdv::MatchStringAdv(lyx::Buffer & buf, FindAndReplaceOptions const &
                        regexp2_str = "(" + lead_as_regexp + ").*?" + par_as_string;
                }
                LYXERR(Debug::FIND, "Setting regexp to : '" << regexp_str << "'");
-               regexp = lyx::regex(regexp_str);
+               regexp = regex(regexp_str);
 
                LYXERR(Debug::FIND, "Setting regexp2 to: '" << regexp2_str << "'");
-               regexp2 = lyx::regex(regexp2_str);
+               regexp2 = regex(regexp2_str);
        }
 }
 
@@ -3139,7 +3119,7 @@ docstring stringifyFromCursor(DocIterator const & cur, int len)
                // OutputParams runparams(&cur.buffer()->params().encoding());
                OutputParams runparams(encodings.fromLyXName("utf8"));
                runparams.nice = true;
-               runparams.flavor = OutputParams::XETEX;
+               runparams.flavor = FLAVOR::XETEX;
                runparams.linelen = 10000; //lyxrc.plaintext_linelen;
                // No side effect of file copying and image conversion
                runparams.dryrun = true;
@@ -3185,7 +3165,7 @@ docstring latexifyFromCursor(DocIterator const & cur, int len)
        //OutputParams runparams(&buf.params().encoding());
        OutputParams runparams(encodings.fromLyXName("utf8"));
        runparams.nice = false;
-       runparams.flavor = OutputParams::XETEX;
+       runparams.flavor = FLAVOR::XETEX;
        runparams.linelen = 8000; //lyxrc.plaintext_linelen;
        // No side effect of file copying and image conversion
        runparams.dryrun = true;
@@ -3349,7 +3329,7 @@ int findAdvFinalize(DocIterator & cur, MatchStringAdv const & match)
 
 
 /// Finds forward
-int findForwardAdv(DocIterator & cur, MatchStringAdv & match)
+int findForwardAdv(DocIterator & cur, MatchStringAdv const & match)
 {
        if (!cur)
                return 0;
@@ -3627,7 +3607,7 @@ static int findAdvReplace(BufferView * bv, FindAndReplaceOptions const & opt, Ma
                return 0;
 
        // Build a copy of the replace buffer, adapted to the KeepCase option
-       Buffer & repl_buffer_orig = *theBufferList().getBuffer(FileName(to_utf8(opt.repl_buf_name)), true);
+       Buffer const & repl_buffer_orig = *theBufferList().getBuffer(FileName(to_utf8(opt.repl_buf_name)), true);
        ostringstream oss;
        repl_buffer_orig.write(oss);
        string lyx = oss.str();
@@ -3661,7 +3641,7 @@ static int findAdvReplace(BufferView * bv, FindAndReplaceOptions const & opt, Ma
                // OutputParams runparams(&repl_buffer.params().encoding());
                OutputParams runparams(encodings.fromLyXName("utf8"));
                runparams.nice = false;
-               runparams.flavor = OutputParams::XETEX;
+               runparams.flavor = FLAVOR::XETEX;
                runparams.linelen = 8000; //lyxrc.plaintext_linelen;
                runparams.dryrun = true;
                TeXOnePar(repl_buffer, repl_buffer.text(), 0, os, runparams);