]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/MathExtern.cpp
Fix bug #7106: iterator out of range while copying multi-row math.
[lyx.git] / src / mathed / MathExtern.cpp
index f9b9f42af2d9a1af304fc4c0e07fbef13adf3903..ce055ea33670a96c97c5bc9b177ff1f63ffcb1fd 100644 (file)
@@ -54,6 +54,7 @@ namespace lyx {
 namespace {
 
 enum ExternalMath {
+       HTML,
        MAPLE,
        MAXIMA,
        MATHEMATICA,
@@ -120,7 +121,7 @@ MathData::iterator extractArgument(MathData & ar,
                // leave out delimiters if this is a function argument
                // unless we are doing MathML, in which case we do want
                // the delimiters
-               if (function && kind != MATHML) {
+               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();
@@ -948,21 +949,22 @@ void extractLims(MathData & ar)
 void extractStructure(MathData & ar, ExternalMath kind)
 {
        //lyxerr << "\nStructure from: " << ar << endl;
-       if (kind != MATHML)
+       if (kind != MATHML && kind != HTML)
                splitScripts(ar);
        extractDelims(ar);
        extractIntegrals(ar, kind);
-       if (kind != MATHML)
+       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;
 }
 
@@ -1417,18 +1419,37 @@ void mathmlize(MathData const & dat, MathStream & os)
 {
        MathData ar = dat;
        extractStructure(ar, MATHML);
-       if (ar.size() == 0)
-               os << "<mrow/>";
-       else if (ar.size() == 1)
+       if (ar.size() == 0) {
+               if (!os.inText())
+                       os << "<mrow/>";
+       } else if (ar.size() == 1)
                os << ar.front();
        else {
-               os << MTag("mrow");
+               if (!os.inText())
+                       os << MTag("mrow");
                for (MathData::const_iterator it = ar.begin(); it != ar.end(); ++it)
                        (*it)->mathmlize(os);
-               os << ETag("mrow");
+               if (!os.inText())
+                       os << ETag("mrow");
+       }
+}
+
+
+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)
 {
@@ -1478,7 +1499,7 @@ MathData pipeThroughExtern(string const & lang, docstring const & extra,
        }
 
        // 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;