+static docstring buffer_to_latex(Buffer & buffer)
+{
+ OutputParams runparams(&buffer.params().encoding());
+ TexRow texrow;
+ odocstringstream ods;
+ otexstream os(ods, texrow);
+ runparams.nice = true;
+ runparams.flavor = OutputParams::LATEX;
+ runparams.linelen = 80; //lyxrc.plaintext_linelen;
+ // No side effect of file copying and image conversion
+ runparams.dryrun = true;
+ pit_type const endpit = buffer.paragraphs().size();
+ for (pit_type pit = 0; pit != endpit; ++pit) {
+ TeXOnePar(buffer, buffer.text(), pit, os, runparams);
+ LYXERR(Debug::FIND, "searchString up to here: " << ods.str());
+ }
+ return ods.str();
+}
+
+
+static docstring stringifySearchBuffer(Buffer & buffer, FindAndReplaceOptions const & opt)
+{
+ docstring str;
+ if (!opt.ignoreformat) {
+ str = buffer_to_latex(buffer);
+ } else {
+ OutputParams runparams(&buffer.params().encoding());
+ runparams.nice = true;
+ runparams.flavor = OutputParams::LATEX;
+ runparams.linelen = 100000; //lyxrc.plaintext_linelen;
+ runparams.dryrun = true;
+ runparams.for_search = true;
+ 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: '"
+ << par.asString(pos_type(0), par.size(),
+ AS_STR_INSETS | AS_STR_SKIPDELETE | AS_STR_PLAINTEXT,
+ &runparams)
+ << "'");
+ str += par.asString(pos_type(0), par.size(),
+ AS_STR_INSETS | AS_STR_SKIPDELETE | AS_STR_PLAINTEXT,
+ &runparams);
+ }
+ }
+ return str;
+}
+
+
+/// Return separation pos between the leading material and the rest
+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)\\*?\\{", "")
+ || regex_replace(t, t, "^\\$", "")
+ || regex_replace(t, 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);
+}
+
+
+// Remove trailing closure of math, macros and environments, so to catch parts of them.
+static int identifyClosing(string & t)
+{
+ int open_braces = 0;
+ do {
+ LYXERR(Debug::FIND, "identifyClosing(): t now is '" << t << "'");
+ if (regex_replace(t, t, "(.*[^\\\\])\\$\\'", "$1"))
+ continue;
+ if (regex_replace(t, t, "(.*[^\\\\]) \\\\\\]\\'", "$1"))
+ continue;
+ if (regex_replace(t, t, "(.*[^\\\\]) \\\\end\\{[a-zA-Z_]*\\*?\\}\\'", "$1"))
+ continue;
+ if (regex_replace(t, t, "(.*[^\\\\])\\}\\'", "$1")) {
+ ++open_braces;
+ continue;
+ }
+ break;
+ } while (true);
+ return open_braces;
+}
+
+