namespace {
enum ExternalMath {
+ HTML,
MAPLE,
MAXIMA,
MATHEMATICA,
typedef MathAtom ReplaceArgumentFunc(const MathData & ar);
+
// try to extract a super/subscript
// modify iterator position to point behind the thing
bool extractScript(MathData & ar,
// something delimited _is_ an argument
if ((*pos)->asDelimInset()) {
// leave out delimiters if this is a function argument
- if (function && kind != MATHML) {
+ // unless we are doing MathML, in which case we do want
+ // the delimiters
+ if (function && kind != MATHML && kind != HTML) {
MathData const & arg = (*pos)->asDelimInset()->cell(0);
MathData::const_iterator cur = arg.begin();
MathData::const_iterator end = arg.end();
// leave alone sums and integrals
InsetMathSymbol const * sym =
script->nuc().front()->asSymbolInset();
- if (sym && (InsetMathExInt::isExIntOperator(sym->name()) || sym->name() == "int"))
+ if (sym && (sym->name() == "sum" || sym->name() == "int"))
continue;
}
}
-bool testSumLikeSymbol(MathAtom const & p)
+bool testSumSymbol(MathAtom const & p)
{
- return InsetMathExInt::isExIntOperator(p->name());
+ return testSymbol(p, from_ascii("sum"));
}
-docstring testSumLike(MathAtom const & at)
+bool testSum(MathAtom const & at)
{
- if (testSumLikeSymbol(at))
- return at->name();
- if ( at->asScriptInset()
+ return
+ testSumSymbol(at) ||
+ ( at->asScriptInset()
&& at->asScriptInset()->nuc().size()
- && testSumLikeSymbol(at->asScriptInset()->nuc().back()) )
- return at->asScriptInset()->nuc().back()->name();
- return docstring();
+ && testSumSymbol(at->asScriptInset()->nuc().back()) );
}
// 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 extractSumLike(MathData & ar)
+void extractSums(MathData & ar)
{
// we need at least two items...
if (ar.size() < 2)
MathData::iterator it = ar.begin() + i;
// is this a sum name?
- docstring const opname = testSumLike(ar[i]);
- if (opname.empty())
+ if (!testSum(ar[i]))
continue;
// create a proper inset as replacement
- auto_ptr<InsetMathExInt> p(new InsetMathExInt(buf, opname));
+ auto_ptr<InsetMathExInt> p(new InsetMathExInt(buf, from_ascii("sum")));
// collect lower bound and summation index
InsetMathScript const * sub = ar[i]->asScriptInset();
void extractStructure(MathData & ar, ExternalMath kind)
{
//lyxerr << "\nStructure from: " << ar << endl;
- splitScripts(ar);
+ if (kind != MATHML && kind != HTML)
+ splitScripts(ar);
extractDelims(ar);
extractIntegrals(ar, kind);
- extractSumLike(ar);
+ if (kind != MATHML && kind != HTML)
+ extractSums(ar);
extractNumbers(ar);
extractMatrices(ar);
extractFunctions(ar, kind);
- extractDets(ar);
- extractDiff(ar);
- extractExps(ar);
- extractLims(ar);
- if (kind != MATHML)
+ if (kind != MATHML && kind != HTML) {
+ extractDets(ar);
+ extractDiff(ar);
+ extractExps(ar);
+ extractLims(ar);
extractStrings(ar);
+ }
//lyxerr << "\nStructure to: " << ar << endl;
}
}
}
+
+void htmlize(MathData const & dat, HtmlStream & os)
+{
+ MathData ar = dat;
+ extractStructure(ar, HTML);
+ if (ar.size() == 0)
+ return;
+ if (ar.size() == 1) {
+ os << ar.front();
+ return;
+ }
+ for (MathData::const_iterator it = ar.begin(); it != ar.end(); ++it)
+ (*it)->htmlize(os);
+}
+
+
// convert this inset somehow to a number
bool extractNumber(MathData const & ar, int & i)
{
}
// run external sript
- string out = captureOutput(file.absFilename(), data);
+ string out = captureOutput(file.absFileName(), data);
MathData res;
mathed_parse_cell(res, from_utf8(out));
return res;