]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfind.cpp
Revert previous commit, which committed too much.
[lyx.git] / src / lyxfind.cpp
index 9e86aea309c589ad84d039a4ca7b9e86df19f32d..86d8b9818189f11ded597a7e93c991317e18d07c 100644 (file)
@@ -40,6 +40,7 @@
 #include "mathed/InsetMathGrid.h"
 #include "mathed/InsetMathHull.h"
 #include "mathed/MathStream.h"
+#include "mathed/MathSupport.h"
 
 #include "support/convert.h"
 #include "support/debug.h"
@@ -355,7 +356,7 @@ bool lyxreplace(BufferView * bv,
        bool matchword     = parse_bool(howto);
        bool all           = parse_bool(howto);
        bool forward       = parse_bool(howto);
-       bool findnext      = parse_bool(howto);
+       bool findnext      = howto.empty() ? true : parse_bool(howto);
 
        int replace_count = 0;
        bool update = false;
@@ -743,21 +744,19 @@ static docstring stringifySearchBuffer(Buffer & buffer, FindAndReplaceOptions co
        if (!opt.ignoreformat) {
                str = buffer_to_latex(buffer);
        } else {
-               ParIterator it = buffer.par_iterator_begin();
-               ParIterator end = buffer.par_iterator_end();
                OutputParams runparams(&buffer.params().encoding());
-               odocstringstream os;
                runparams.nice = true;
                runparams.flavor = OutputParams::LATEX;
                runparams.linelen = 100000; //lyxrc.plaintext_linelen;
                runparams.dryrun = true;
-               for (; it != end; ++it) {
+               for (pos_type pit = pos_type(0); pit < (pos_type)buffer.paragraphs().size(); ++pit) {
+                       Paragraph const & par = buffer.paragraphs().at(pit);
                        LYXERR(Debug::FIND, "Adding to search string: '"
-                               << it->asString(false)
+                               << par.stringify(pos_type(0), par.size(),
+                                                AS_STR_INSETS, runparams)
                                << "'");
-                       str +=
-                               it->stringify(pos_type(0), it->size(),
-                                             AS_STR_INSETS, runparams);
+                       str += par.stringify(pos_type(0), par.size(),
+                                            AS_STR_INSETS, runparams);
                }
        }
        return str;
@@ -768,11 +767,12 @@ static docstring stringifySearchBuffer(Buffer & buffer, FindAndReplaceOptions co
 static size_t identifyLeading(string const & s)  {
        string t = s;
        // @TODO Support \item[text]
-       while (regex_replace(t, t, "\\\\(emph|textbf|subsubsection|subsection|section|subparagraph|paragraph|part)\\{", "")
+       while (regex_replace(t, t, "\\\\(emph|textbf|subsubsection|subsection|section|subparagraph|paragraph|part)\\*?\\{", "")
               || regex_replace(t, t, "^\\$", "")
               || regex_replace(t, t, "^\\\\\\[ ", "")
-              || regex_replace(t, t, "^\\\\item ", ""))
-               LYXERR(Debug::FIND, "  after removing leading $, \\[ , \\emph{, \\textbf{, etc.: " << t);
+              || regex_replace(t, t, "^\\\\item ", "")
+              || regex_replace(t, t, "^\\\\begin\\{[a-zA-Z_]*\\*?\\} ", ""))
+               LYXERR(Debug::FIND, "  after removing leading $, \\[ , \\emph{, \\textbf{, etc.: '" << t << "'");
        return s.find(t);
 }
 
@@ -791,16 +791,14 @@ MatchStringAdv::MatchStringAdv(lyx::Buffer & buf, FindAndReplaceOptions const &
                // Remove trailing closure of math, macros and environments, so to catch parts of them.
                do {
                        LYXERR(Debug::FIND, "par_as_string now is '" << par_as_string << "'");
-                       if (regex_replace(par_as_string, par_as_string, "(.*)[[:blank:]]\\'", "$1"))
-                                       continue;
-                       if (regex_replace(par_as_string, par_as_string, "(.*[^\\\\]) ?\\$\\'", "$1"))
+                       if (regex_replace(par_as_string, par_as_string, "(.*[^\\\\])\\$\\'", "$1"))
                                        continue;
                        // @todo need to account for open square braces as well ?
-                       if (regex_replace(par_as_string, par_as_string, "(.*[^\\\\]) ?\\\\\\]\\'", "$1"))
+                       if (regex_replace(par_as_string, par_as_string, "(.*[^\\\\]) \\\\\\]\\'", "$1"))
                                        continue;
-                       if (regex_replace(par_as_string, par_as_string, "(.*[^\\\\]) ?\\\\end\\{[a-zA-Z_]*\\}\\'", "$1"))
+                       if (regex_replace(par_as_string, par_as_string, "(.*[^\\\\]) \\\\end\\{[a-zA-Z_]*\\*?\\}\\'", "$1"))
                                        continue;
-                       if (regex_replace(par_as_string, par_as_string, "(.*[^\\\\]) ?\\}\\'", "$1")) {
+                       if (regex_replace(par_as_string, par_as_string, "(.*[^\\\\])\\}\\'", "$1")) {
                                ++open_braces;
                                continue;
                        }
@@ -824,10 +822,10 @@ MatchStringAdv::MatchStringAdv(lyx::Buffer & buf, FindAndReplaceOptions const &
                        // Insert .* before trailing '\$' ('$' has been escaped by escape_for_regex)
                        regex_replace(par_as_string, par_as_string, "(.*[^\\\\])(\\\\\\$)\\'", "$1(.*?)$2")
                                // Insert .* before trailing '\\\]' ('\]' has been escaped by escape_for_regex)
-                               || regex_replace(par_as_string, par_as_string, "(.*[^\\\\])(\\\\\\\\\\\\\\])\\'", "$1(.*?)$2")
+                               || regex_replace(par_as_string, par_as_string, "(.*[^\\\\])( \\\\\\\\\\\\\\])\\'", "$1(.*?)$2")
                                // Insert .* before trailing '\\end\{...}' ('\end{...}' has been escaped by escape_for_regex)
                                || regex_replace(par_as_string, par_as_string, 
-                                       "(.*[^\\\\])(\\\\\\\\end\\\\\\{[a-zA-Z_]*\\\\\\})\\'", "$1(.*?)$2")
+                                       "(.*[^\\\\])( \\\\\\\\end\\\\\\{[a-zA-Z_]*)(\\\\\\*)?(\\\\\\})\\'", "$1(.*?)$2$3$4")
                                // Insert .* before trailing '\}' ('}' has been escaped by escape_for_regex)
                                || regex_replace(par_as_string, par_as_string, "(.*[^\\\\])(\\\\\\})\\'", "$1(.*?)$2")
                ) {
@@ -969,15 +967,16 @@ docstring stringifyFromCursor(DocIterator const & cur, int len)
                                << cur << ", from pos: " << cur.pos() << ", end: " << end);
                        return par.stringify(cur.pos(), end, AS_STR_INSETS, runparams);
        } else if (cur.inMathed()) {
-                       odocstringstream os;
+                       docstring s;
                        CursorSlice cs = cur.top();
                        MathData md = cs.cell();
                        MathData::const_iterator it_end = 
                                ( ( len == -1 || cs.pos() + len > int(md.size()) )
                                        ? md.end() : md.begin() + cs.pos() + len );
                        for (MathData::const_iterator it = md.begin() + cs.pos(); it != it_end; ++it)
-                                       os << *it;
-                       return os.str();
+                               s = s + asString(*it);
+                       LYXERR(Debug::FIND, "Stringified math: '" << s << "'");
+                       return s;
        }
        LYXERR(Debug::FIND, "Don't know how to stringify from here: " << cur);
        return docstring();
@@ -1030,7 +1029,7 @@ docstring latexifyFromCursor(DocIterator const & cur, int len)
                MathData::const_iterator it_end = ( ( len == -1 || cs.pos() + len > int(md.size()) )
                        ? md.end() : md.begin() + cs.pos() + len );
                for (MathData::const_iterator it = md.begin() + cs.pos(); it != it_end; ++it)
-                               ods << *it;
+                       ods << asString(*it);
 
                // Retrieve the math environment type, and add '$' or '$]'
                // or others (\end{equation}) accordingly
@@ -1100,10 +1099,14 @@ int findForwardAdv(DocIterator & cur, MatchStringAdv & match)
                return 0;
        while (cur) {
                LYXERR(Debug::FIND, "findForwardAdv() cur: " << cur);
-               if (match(cur, -1, false)) {
+               int match_len = match(cur, -1, false);
+               LYXERR(Debug::FIND, "match_len: " << match_len);
+               if (match_len) {
                        for (; cur; cur.forwardPos()) {
                                LYXERR(Debug::FIND, "Advancing cur: " << cur);
-                               if (match(cur)) {
+                               int match_len = match(cur);
+                               LYXERR(Debug::FIND, "match_len: " << match_len);
+                               if (match_len) {
                                        // Sometimes in finalize we understand it wasn't a match
                                        // and we need to continue the outest loop
                                        int len = findAdvFinalize(cur, match);
@@ -1346,6 +1349,7 @@ static void findAdvReplace(BufferView * bv, FindAndReplaceOptions const & opt, M
                cur.pos() = 0;
        LYXERR(Debug::FIND, "Putting selection at cur=" << cur << " with len: " << sel_len);
        bv->putSelectionAt(DocIterator(cur), sel_len, !opt.forward);
+       bv->processUpdateFlags(Update::Force);
        bv->buffer().updatePreviews();
 }