From 46e14246785ad484153053393f515adac9e51dc2 Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Thu, 17 Dec 2009 17:28:07 +0000 Subject: [PATCH] Make InsetMathExInt handle products as well as sums. We can do more here, but it's actually not clear to me whether we even need to give these things special treatment for MathML. I may revert this. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@32568 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/mathed/InsetMathExInt.cpp | 14 ++++++++++++-- src/mathed/InsetMathExInt.h | 6 ++++-- src/mathed/MathExtern.cpp | 30 +++++++++++++++++------------- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/mathed/InsetMathExInt.cpp b/src/mathed/InsetMathExInt.cpp index be175287e3..ae687bb678 100644 --- a/src/mathed/InsetMathExInt.cpp +++ b/src/mathed/InsetMathExInt.cpp @@ -71,8 +71,16 @@ void InsetMathExInt::draw(PainterInfo &, int, int) const } +bool InsetMathExInt::isExIntOperator(docstring const & name) +{ + std::string const & sname = to_utf8(name); + return sname == "sum" || sname == "prod"; +} + + void InsetMathExInt::maple(MapleStream & os) const { + // FIXME Products and the like may need special treatment. os << symbol_ << '('; if (cell(0).size()) os << cell(0); @@ -87,6 +95,7 @@ void InsetMathExInt::maple(MapleStream & os) const void InsetMathExInt::maxima(MaximaStream & os) const { + // FIXME Products and the like may need special treatment. if (symbol_ == "int") os << "integrate("; else @@ -102,8 +111,10 @@ void InsetMathExInt::maxima(MaximaStream & os) const os << cell(1) << ')'; } + void InsetMathExInt::mathematica(MathematicaStream & os) const { + // FIXME Products and the like may need special treatment. if (symbol_ == "int") os << "Integrate["; else if (symbol_ == "sum") @@ -125,7 +136,7 @@ void InsetMathExInt::mathematica(MathematicaStream & os) const void InsetMathExInt::mathmlize(MathStream & os) const { InsetMathSymbol sym(symbol_); - if (symbol_ == "sum") { + if (isExIntOperator(symbol_)) { bool const lower = !cell(1).empty(); bool const upper = !cell(3).empty(); if (lower && upper) @@ -189,5 +200,4 @@ void InsetMathExInt::write(WriteStream &) const LYXERR0("should not happen"); } - } // namespace lyx diff --git a/src/mathed/InsetMathExInt.h b/src/mathed/InsetMathExInt.h index ced825b890..c2bc39e8a1 100644 --- a/src/mathed/InsetMathExInt.h +++ b/src/mathed/InsetMathExInt.h @@ -17,7 +17,7 @@ // or \sum, \prod... for interfacing external programs #include "InsetMathNest.h" - +#include "support/strfwd.h" namespace lyx { @@ -57,11 +57,13 @@ public: void write(WriteStream & os) const; /// InsetCode lyxCode() const { return MATH_EXINT_CODE; } + /// is this a sum, product, or whatever that we can handle? + /// note that this does not include integrals. + static bool isExIntOperator(docstring const &); private: virtual Inset * clone() const; /// bool hasScripts() const; - /// docstring symbol_; }; diff --git a/src/mathed/MathExtern.cpp b/src/mathed/MathExtern.cpp index 0dd9ecd230..3d85c02a89 100644 --- a/src/mathed/MathExtern.cpp +++ b/src/mathed/MathExtern.cpp @@ -80,7 +80,6 @@ typedef bool TestItemFunc(MathAtom const &); typedef MathAtom ReplaceArgumentFunc(const MathData & ar); - // try to extract a super/subscript // modify iterator position to point behind the thing bool extractScript(MathData & ar, @@ -356,7 +355,7 @@ void splitScripts(MathData & ar) // leave alone sums and integrals InsetMathSymbol const * sym = script->nuc().front()->asSymbolInset(); - if (sym && (sym->name() == "sum" || sym->name() == "int")) + if (sym && (InsetMathExInt::isExIntOperator(sym->name()) || sym->name() == "int")) continue; } @@ -705,25 +704,29 @@ bool testEqualSign(MathAtom const & at) } -bool testSumSymbol(MathAtom const & p) +bool testSumLikeSymbol(MathAtom const & p) { - return testSymbol(p, from_ascii("sum")); + return InsetMathExInt::isExIntOperator(p->name()); } -bool testSum(MathAtom const & at) +docstring testSumLike(MathAtom const & at) { - return - testSumSymbol(at) || - ( at->asScriptInset() + if (testSumLikeSymbol(at)) + return at->name(); + if ( at->asScriptInset() && at->asScriptInset()->nuc().size() - && testSumSymbol(at->asScriptInset()->nuc().back()) ); + && testSumLikeSymbol(at->asScriptInset()->nuc().back()) ) + return at->asScriptInset()->nuc().back()->name(); + return docstring(); } // replace '\sum' ['_^'] f(x) sequences by a real InsetMathExInt +// and similar things, like \prod. The things we extract are +// determined by InsetMathExInt::isExIntOperator(). // assume 'extractDelims' ran before -void extractSums(MathData & ar) +void extractSumLike(MathData & ar) { // we need at least two items... if (ar.size() < 2) @@ -736,11 +739,12 @@ void extractSums(MathData & ar) MathData::iterator it = ar.begin() + i; // is this a sum name? - if (!testSum(ar[i])) + docstring const opname = testSumLike(ar[i]); + if (opname.empty()) continue; // create a proper inset as replacement - auto_ptr p(new InsetMathExInt(buf, from_ascii("sum"))); + auto_ptr p(new InsetMathExInt(buf, opname)); // collect lower bound and summation index InsetMathScript const * sub = ar[i]->asScriptInset(); @@ -949,7 +953,7 @@ void extractStructure(MathData & ar, ExternalMath kind) splitScripts(ar); extractDelims(ar); extractIntegrals(ar, kind); - extractSums(ar); + extractSumLike(ar); extractNumbers(ar); extractMatrices(ar); extractFunctions(ar, kind); -- 2.39.2