From 904129cba6b0bece503b9915b365d80971ad4c5b Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Fri, 25 Dec 2009 23:23:42 +0000 Subject: [PATCH] Get MathML output working for math decorations. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@32636 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/mathed/InsetMathDecoration.cpp | 62 ++++++++++++++++++++++++++++++ src/mathed/InsetMathDecoration.h | 2 + 2 files changed, 64 insertions(+) diff --git a/src/mathed/InsetMathDecoration.cpp b/src/mathed/InsetMathDecoration.cpp index 0ece491a7d..629a440abf 100644 --- a/src/mathed/InsetMathDecoration.cpp +++ b/src/mathed/InsetMathDecoration.cpp @@ -22,9 +22,11 @@ #include "LaTeXFeatures.h" #include "support/debug.h" +#include "support/lassert.h" #include +using namespace std; namespace lyx { @@ -155,5 +157,65 @@ void InsetMathDecoration::validate(LaTeXFeatures & features) const InsetMathNest::validate(features); } +namespace { + struct Attributes { + Attributes() {} + Attributes(bool o, string t) + : over(o), tag(t) {} + bool over; + string tag; + }; + + typedef map Translator; + + void buildTranslator(Translator & t) { + // the decorations we need to support are listed in lib/symbols + t["acute"] = Attributes(true, "´"); + t["bar"] = Attributes(true, "‾"); + t["breve"] = Attributes(true, "˘"); + t["check"] = Attributes(true, "ˇ"); + t["ddddot"] = Attributes(true, "⃜"); + t["dddot"] = Attributes(true, "⃛"); + t["ddot"] = Attributes(true, "¨"); + t["dot"] = Attributes(true, "˙"); + t["grave"] = Attributes(true, "`"); + t["hat"] = Attributes(true, "ˆ"); + t["mathring"] = Attributes(true, "˚"); + t["overbrace"] = Attributes(true, "⏞"); + t["overleftarrow"] = Attributes(true, "⟵"); + t["overleftrightarrow"] = Attributes(true, "⟷"); + t["overrightarrow"] = Attributes(true, "⟶"); + t["tilde"] = Attributes(true, "˜"); + t["underbar"] = Attributes(false, "_"); + t["underbrace"] = Attributes(false, "⏟"); + t["underleftarrow"] = Attributes(false, "⟵"); + t["underleftrightarrow"] = Attributes(false, "⟷"); + t["underline"] = Attributes(false, "&;"); + t["underrightarrow"] = Attributes(false, "⟶"); + t["vec"] = Attributes(true, "→"); + t["widehat"] = Attributes(true, "^"); + t["widetilde"] = Attributes(true, "∼"); + } + + Translator const & translator() { + static Translator t; + if (t.empty()) + buildTranslator(t); + return t; + } +} + +void InsetMathDecoration::mathmlize(MathStream & os) const +{ + Translator const & t = translator(); + Translator::const_iterator cur = t.find(to_utf8(key_->name)); + LASSERT(cur != t.end(), return); + char const * const outag = cur->second.over ? "mover" : "munder"; + os << MTag(outag) + << MTag("mrow") << cell(0) << ETag("mrow") + << from_ascii("" + cur->second.tag + "") + << ETag(outag); +} + } // namespace lyx diff --git a/src/mathed/InsetMathDecoration.h b/src/mathed/InsetMathDecoration.h index a8106d4889..22c9f9bed3 100644 --- a/src/mathed/InsetMathDecoration.h +++ b/src/mathed/InsetMathDecoration.h @@ -41,6 +41,8 @@ public: void validate(LaTeXFeatures & features) const; /// InsetCode lyxCode() const { return MATH_DECORATION_CODE; } + /// + void mathmlize(MathStream &) const; private: virtual Inset * clone() const;