+//
+// search differential stuff
+//
+
+// tests for 'd' or '\partial'
+bool testDiffItem(MathAtom const & at)
+{
+ return testString(at.nucleus(), "d");
+}
+
+
+bool testDiffArray(MathArray const & ar)
+{
+ return ar.size() && testDiffItem(ar.front());
+}
+
+
+bool testDiffFrac(MathInset * p)
+{
+ MathFracInset * f = p->asFracInset();
+ return f && testDiffArray(f->cell(0)) && testDiffArray(f->cell(1));
+}
+
+
+// is this something like ^number?
+bool extractDiffExponent(MathArray::iterator it, int & i)
+{
+ if (!(*it)->asScriptInset())
+ return false;
+
+ string s;
+ if (!extractString((*it).nucleus(), s))
+ return false;
+ istringstream is(s.c_str());
+ is >> i;
+ return is;
+}
+
+
+void extractDiff(MathArray & ar)
+{
+ //lyxerr << "\nDiffs from: " << ar << "\n";
+ for (MathArray::size_type i = 0; i < ar.size(); ++i) {
+ MathArray::iterator it = ar.begin() + i;
+
+ // is this a "differential fraction"?
+ if (!testDiffFrac(it->nucleus()))
+ continue;
+
+ MathFracInset * f = (*it)->asFracInset();
+ if (!f) {
+ lyxerr << "should not happen\n";
+ continue;
+ }
+
+ // create a proper diff inset
+ MathDiffInset * diff = new MathDiffInset;
+
+ // collect function, let jt point behind last used item
+ MathArray::iterator jt = it + 1;
+ //int n = 1;
+ MathArray & numer = f->cell(0);
+ if (numer.size() > 1 && numer.at(1)->asScriptInset()) {
+ // this is something like d^n f(x) / d... or d^n / d...
+ // FIXME
+ //n = 1;
+ if (numer.size() > 2)
+ diff->cell(0) = MathArray(numer.begin() + 2, numer.end());
+ else
+ jt = extractArgument(diff->cell(0), jt, ar.end());
+ } else {
+ // simply d f(x) / d... or d/d...
+ if (numer.size() > 1)
+ diff->cell(0) = MathArray(numer.begin() + 1, numer.end());
+ else
+ jt = extractArgument(diff->cell(0), jt, ar.end());
+ }
+
+ // collect denominator parts
+ MathArray & denom = f->cell(1);
+ for (MathArray::iterator dt = denom.begin(); dt != denom.end();) {
+ // find the next 'd'
+ MathArray::iterator et = find_if(dt + 1, denom.end(), &testDiffItem);
+
+ // point before this
+ MathArray::iterator st = et - 1;
+ MathScriptInset * script = (*st)->asScriptInset();
+ if (script && script->hasUp()) {
+ // things like d.../dx^n
+ int mult = 1;
+ if (extractNumber(script->up().data_, mult)) {
+ //lyxerr << "mult: " << mult << endl;
+ for (int i = 0; i < mult; ++i)
+ diff->addDer(MathArray(dt + 1, st));
+ }
+ } else {
+ // just d.../dx
+ diff->addDer(MathArray(dt + 1, et));
+ }
+ dt = et;
+ }
+
+ // cleanup
+ ar.erase(it + 1, jt);
+ (*it).reset(diff);
+ }
+ //lyxerr << "\nDiffs to: " << ar << "\n";
+}
+
+
+
+//
+// combine searches
+//
+