Framework for math export exceptions. We can throw these if we find

something we don't know how to handle and fall back to images.


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@35024 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Richard Heck 2010-07-29 15:37:42 +00:00
parent 1c0d73425e
commit 7a8a1eca21
2 changed files with 51 additions and 30 deletions

View File

@ -1854,14 +1854,19 @@ int InsetMathHull::docbook(odocstream & os, OutputParams const & runparams) cons
docstring InsetMathHull::xhtml(XHTMLStream & xs, OutputParams const & op) const docstring InsetMathHull::xhtml(XHTMLStream & xs, OutputParams const & op) const
{ {
BufferParams::MathOutput mathtype = buffer().params().html_math_output; BufferParams::MathOutput const mathtype =
buffer().params().html_math_output;
bool success = false;
// FIXME Eventually we would like to do this inset by inset. // FIXME Eventually we would like to do this inset by inset.
switch (mathtype) { if (mathtype == BufferParams::MathML) {
case BufferParams::MathML: {
odocstringstream os; odocstringstream os;
MathStream ms(os); MathStream ms(os);
try {
InsetMathGrid::mathmlize(ms); InsetMathGrid::mathmlize(ms);
success = true;
} catch (MathExportException const &) {}
if (success) {
if (getType() == hullSimple) if (getType() == hullSimple)
xs << html::StartTag("math", xs << html::StartTag("math",
"xmlns=\"http://www.w3.org/1998/Math/MathML\"", true); "xmlns=\"http://www.w3.org/1998/Math/MathML\"", true);
@ -1871,20 +1876,27 @@ docstring InsetMathHull::xhtml(XHTMLStream & xs, OutputParams const & op) const
xs << XHTMLStream::NextRaw() xs << XHTMLStream::NextRaw()
<< os.str() << os.str()
<< html::EndTag("math"); << html::EndTag("math");
break;
} }
case BufferParams::HTML: { } else if (mathtype == BufferParams::HTML) {
odocstringstream os; odocstringstream os;
HtmlStream ms(os); HtmlStream ms(os);
try {
InsetMathGrid::htmlize(ms); InsetMathGrid::htmlize(ms);
success = true;
} catch (MathExportException const &) {}
if (success) {
string const tag = (getType() == hullSimple) ? "span" : "div"; string const tag = (getType() == hullSimple) ? "span" : "div";
xs << html::StartTag(tag, "class='formula'", true) xs << html::StartTag(tag, "class='formula'", true)
<< XHTMLStream::NextRaw() << XHTMLStream::NextRaw()
<< os.str() << os.str()
<< html::EndTag(tag); << html::EndTag(tag);
break;
} }
case BufferParams::Images: { }
// the logic here is ugly, but it's meant to mean: if we've failed with
// one of the earlier attempts OR the mathtype IS Image, then try to
// export an image.
if (!success && mathtype != BufferParams::LaTeX) {
loadPreview(docit_); loadPreview(docit_);
graphics::PreviewImage const * pimage = preview_->getPreviewImage(buffer()); graphics::PreviewImage const * pimage = preview_->getPreviewImage(buffer());
if (pimage) { if (pimage) {
@ -1897,11 +1909,14 @@ docstring InsetMathHull::xhtml(XHTMLStream & xs, OutputParams const & op) const
xs.cr(); xs.cr();
// add the file to the list of files to be exported // add the file to the list of files to be exported
op.exportdata->addExternalFile("xhtml", mathimg); op.exportdata->addExternalFile("xhtml", mathimg);
break; success = true;
} }
LYXERR0("Unable to generate image. Falling through to LaTeX output.");
} }
case BufferParams::LaTeX: {
// so we'll pass this test if we've failed everything else, or
// if mathtype was LaTeX, since we won't have entered any of the
// earlier branches
if (!success) {
string const tag = (getType() == hullSimple) ? "span" : "div"; string const tag = (getType() == hullSimple) ? "span" : "div";
// Unfortunately, we cannot use latexString() because we do not want // Unfortunately, we cannot use latexString() because we do not want
// $...$ or whatever. // $...$ or whatever.
@ -1920,7 +1935,6 @@ docstring InsetMathHull::xhtml(XHTMLStream & xs, OutputParams const & op) const
<< html::EndTag(tag); << html::EndTag(tag);
xs.cr(); xs.cr();
} }
} // end switch
return docstring(); return docstring();
} }

View File

@ -262,6 +262,13 @@ public:
}; };
/// Throw MathExportException to signal that the attempt to export
/// some math in the current format did not succeed. E.g., we can't
/// export xymatrix as MathML, so that will throw, and we'll fall back
/// to images.
class MathExportException : public std::exception {};
class MathStream { class MathStream {
public: public:
/// ///