]> git.lyx.org Git - lyx.git/commitdiff
Amend 16660d12.
authorThibaut Cuvelier <tcuvelier@lyx.org>
Thu, 21 Mar 2024 20:32:45 +0000 (21:32 +0100)
committerThibaut Cuvelier <tcuvelier@lyx.org>
Thu, 21 Mar 2024 20:32:45 +0000 (21:32 +0100)
The previous commit introduced wrong behaviours for <>. The new code carefully escapes what needs to be escaped from LaTeX, using the now-standard XML tools (XMLStream).

autotests/export/xhtml/math_output_latex.lyx
autotests/export/xhtml/math_output_latex.xhtml
src/insets/InsetLabel.cpp
src/mathed/InsetMathHull.cpp
src/mathed/InsetMathHull.h

index 59d77d2f9bca56c98b79d67f12af954faebe778f..7c49de59f6acd14b80f3f9c39ece7bb9ac318a82 100644 (file)
@@ -100,7 +100,7 @@ The problem occurs when adding a label.
 \begin_layout Standard
 \begin_inset Formula 
 \begin{equation}
-x^{2}\label{eq:1}
+x^{2}<\log x\label{eq:1}
 \end{equation}
 
 \end_inset
index cec2d5ba0d5a36caa46c31816ee11a9b59879934..713def34594fd921fb02e2069f0ba9d312690d1e 100644 (file)
@@ -22,7 +22,7 @@ div.standard {
 <h1 class='title' id='magicparlabel-1'>Math formula output as raw LaTeX</h1>
 <div class='standard' id='magicparlabel-2'>The problem occurs when adding a label. https://www.lyx.org/trac/ticket/13048</div>
 
-<div class='standard' id='magicparlabel-3'><a id="eq_1" /><div class='math'><table class='mathtable'><tr><td class='math'>x^{2}</td><td>(1)</td></tr></table></div>
+<div class='standard' id='magicparlabel-3'><a id="eq_1" /><div class='math'><table class='mathtable'><tr><td class='math'>x^{2}<\log x</td><td>(1)</td></tr></table></div>
 </div>
 </body>
 </html>
index 1ca8ea08ae86c94879006a937ab1e1965a11fdef..ab5a5e1716fee64cd33be06b7d51e6f9b709fe65 100644 (file)
@@ -380,6 +380,8 @@ void InsetLabel::docbook(XMLStream & xs, OutputParams const & runparams) const
 
 docstring InsetLabel::xhtml(XMLStream & xs, OutputParams const &) const
 {
+       // Print the label as an HTML anchor, so that an external link can point to this equation.
+       // (URL: FILE.html#EQ-ID.)
        // FIXME XHTML
        // Unfortunately, the name attribute has been deprecated, so we have to use
        // id here to get the document to validate as XHTML 1.1. This will cause a
index bb368b3b9318ba997db8a14ce8a09bb1cd183c9c..94d293870d6911365b13c9395d798e864df1306a 100644 (file)
@@ -2574,35 +2574,56 @@ void InsetMathHull::mathmlize(MathMLStream & ms) const
 }
 
 
-void InsetMathHull::mathAsLatex(TeXMathStream & os) const
+docstring InsetMathHull::mathAsLatex() const
 {
-       MathEnsurer ensurer(os, false);
        bool const havenumbers = haveNumbers();
        bool const havetable = havenumbers || nrows() > 1 || ncols() > 1;
 
        if (!havetable) {
+               odocstringstream ls;
+               otexrowstream ots(ls);
+               TeXMathStream os(ots, false, true, TeXMathStream::wsPreview);
+               ModeSpecifier specifier(os, MATH_MODE);
+               MathEnsurer ensurer(os, false);
+
                os << cell(index(0, 0));
-               return;
+               return ls.str();
        }
 
-       os << "<table class='mathtable'>";
+       odocstringstream ods;
+       XMLStream xs(ods);
+
+       xs << xml::StartTag("table", "class='mathtable'");
        for (row_type row = 0; row < nrows(); ++row) {
-               os << "<tr>";
+               xs << xml::StartTag("tr");
                for (col_type col = 0; col < ncols(); ++col) {
-                       os << "<td class='math'>";
-                       os << cell(index(row, col));
-                       os << "</td>";
+                       xs << xml::StartTag("td", "class='math'");
+
+                       odocstringstream ls;
+                       otexrowstream ots(ls);
+                       TeXMathStream os(ots, false, true, TeXMathStream::wsPreview);
+                       ModeSpecifier specifier(os, MATH_MODE);
+                       MathEnsurer ensurer(os, false);
+
+                       os << cell(index(0, 0));
+                       // ls.str() contains a raw LaTeX string, which might require some encoding before being valid XML.
+                       xs << ls.str();
+
+                       xs << xml::EndTag("td");
                }
                if (havenumbers) {
-                       os << "<td>";
+                       xs << xml::StartTag("td");
                        docstring const & num = numbers_[row];
-                       if (!num.empty())
-                               os << '(' << num << ')';
-                   os << "</td>";
+                       if (!num.empty()) {
+                               xs << '(' << num << ')';
+                       }
+                       xs << xml::EndTag("td");
                }
-               os << "</tr>";
+               xs << xml::EndTag("tr");
        }
-       os << "</table>";
+       xs << xml::EndTag("table");
+
+       return ods.str();
 }
 
 
@@ -2703,7 +2724,7 @@ docstring InsetMathHull::xhtml(XMLStream & xs, OutputParams const & op) const
                        string const tag = (getType() == hullSimple) ? "span" : "div";
                        xs << xml::CR()
                           << xml::StartTag(tag, "style = \"text-align: center;\"")
-                          << xml::CompTag("img", "src=\"" + filename + "\" alt=\"Mathematical Equation\"")
+                          << xml::CompTag("img", "src=\"" + filename + R"(" alt="Mathematical Equation")")
                           << xml::EndTag(tag)
                           << xml::CR();
                        success = true;
@@ -2716,12 +2737,8 @@ docstring InsetMathHull::xhtml(XMLStream & xs, OutputParams const & op) const
        if (!success /* || mathtype != BufferParams::LaTeX */) {
                // Unfortunately, we cannot use latexString() because we do not want
                // $...$ or whatever.
-               odocstringstream ls;
-               otexrowstream ots(ls);
-               TeXMathStream wi(ots, false, true, TeXMathStream::wsPreview);
-               ModeSpecifier specifier(wi, MATH_MODE);
-               mathAsLatex(wi);
-               docstring const latex = ls.str();
+               // The returned value already has the correct escaping for HTML.
+               docstring const latex = mathAsLatex();
 
                // class='math' allows for use of jsMath
                // http://www.math.union.edu/~dpvc/jsMath/
@@ -2729,8 +2746,7 @@ docstring InsetMathHull::xhtml(XMLStream & xs, OutputParams const & op) const
                // probably should allow for some kind of customization here
                string const tag = (getType() == hullSimple) ? "span" : "div";
                xs << xml::StartTag(tag, "class='math'")
-                  << XMLStream::ESCAPE_AND << latex // Don't escape <> tags: latex might contain them
-                  // (typically, when there is a label).
+                  << XMLStream::ESCAPE_NONE << latex // Don't escape anything: latex might contain XML.
                   << xml::EndTag(tag)
                   << xml::CR();
        }
index cced01c7d0ff1a4db0c339d42439d90ec51314e3..8e527c4d52340a5d30311595c460af923e90bc83 100644 (file)
@@ -151,8 +151,8 @@ public:
        void mathmlize(MathMLStream &) const override;
        ///
        void htmlize(HtmlStream &) const override;
-       ///
-       void mathAsLatex(TeXMathStream &) const;
+       /// Returns the hull as a LaTeX string for embedding in HTML or XML.
+       docstring mathAsLatex() const;
        ///
        void toString(odocstream &) const override;
        ///