commit 9a81bb36f4a51891730f052b84ca535f20583c52
Author: Thibaut Cuvelier <[email protected]>
Date: Tue Oct 29 04:06:07 2024 +0100
Math: add a structure to hold font information.
It will allow to merge a lot of code for MathML and HTML: same parsing,
slightly different outputs. The refactoring also shows clearly what parts are
missing in HTML (while being easily fixable). The change is a prerequisite for
implementing font nesting (although it is not done yet).
The new class is not yet used within InsetMathFont; it will come in the
next commit.
Open question: should we use InsetMath::mode_type somewhere? I believe so,
to determine whether the current default is italics or not in MathML.
---
src/mathed/InsetMathFont.cpp | 145 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 145 insertions(+)
diff --git a/src/mathed/InsetMathFont.cpp b/src/mathed/InsetMathFont.cpp
index 25ee4ae53b..584de5c1ad 100644
--- a/src/mathed/InsetMathFont.cpp
+++ b/src/mathed/InsetMathFont.cpp
@@ -28,6 +28,151 @@ using namespace lyx::support;
namespace lyx {
+namespace {
+// Similar to FontInfo and its related enums, but specifically for the math
+// mode.
+//
+// All types have enumerations, like FontEnums.h, even though there are
+// sometimes only two cases: this design ensures some future-proofness and
+// ensures that you cannot inadvertently swap two values.
+class MathFontInfo {
+public:
+ enum MathFontFamily {
+ MATH_NORMAL_FAMILY = 0, // Default value in MathML.
+ MATH_FRAKTUR_FAMILY,
+ MATH_SANS_FAMILY,
+ MATH_MONOSPACE_FAMILY,
+ MATH_DOUBLE_STRUCK_FAMILY,
+ MATH_SCRIPT_FAMILY,
+ MATH_SMALL_CAPS // Not natively supported in any version of
MathML.
+ };
+
+ enum MathFontSeries {
+ MATH_MEDIUM_SERIES = 0, // Default value in MathML. // Default
value in MathML.
+ MATH_BOLD_SERIES
+ };
+
+ enum MathFontShape {
+ MATH_UP_SHAPE = 0,
+ MATH_ITALIC_SHAPE // Default value in MathML mi, not outside.
+ };
+
+ MathFontInfo() :
+ family_(MATH_NORMAL_FAMILY), series_(MATH_MEDIUM_SERIES),
shape_(MATH_UP_SHAPE) {}
+ MathFontInfo(const MathFontFamily family, const MathFontSeries series,
const MathFontShape shape) :
+ family_(family), series_(series), shape_(shape) {}
+
+ static MathFontInfo fromMacro(const docstring& tag)
+ {
+ MathFontInfo font;
+ if (tag == "mathnormal" || tag == "mathrm"
+ || tag == "text" || tag == "textnormal"
+ || tag == "textrm" || tag == "textup"
+ || tag == "textmd")
+ font.shape_ = MATH_UP_SHAPE;
+ else if (tag == "frak" || tag == "mathfrak")
+ font.family_ = MATH_FRAKTUR_FAMILY;
+ else if (tag == "mathbf" || tag == "textbf")
+ font.series_ = MATH_BOLD_SERIES;
+ else if (tag == "mathbb" || tag == "mathbbm"
+ || tag == "mathds")
+ font.family_ = MATH_DOUBLE_STRUCK_FAMILY;
+ else if (tag == "mathcal")
+ font.family_ = MATH_SCRIPT_FAMILY;
+ else if (tag == "mathit" || tag == "textsl"
+ || tag == "emph" || tag == "textit")
+ font.shape_ = MATH_ITALIC_SHAPE;
+ else if (tag == "mathsf" || tag == "textsf")
+ font.family_ = MATH_SANS_FAMILY;
+ else if (tag == "mathtt" || tag == "texttt")
+ font.family_ = MATH_MONOSPACE_FAMILY;
+ else if (tag == "textipa" || tag == "textsc" || tag == "noun")
+ font.family_ = MATH_SMALL_CAPS;
+
+ return font;
+ }
+
+ MathFontFamily family() const { return family_; }
+ MathFontSeries series() const { return series_; }
+ MathFontShape shape() const { return shape_; }
+
+ std::string toMathMLMathVariant(MathMLStream::MathMLVersion
mathml_version) const
+ {
+ return mathml_version == MathMLStream::MathMLVersion::mathml3 ?
+ toMathVariantForMathML3() :
toMathVariantForMathMLCore();
+ }
+
+ std::string toHTMLSpanClass() const
+ {
+ // See the existing classes in InsetMathFont::validate. In
particular,
+ // there is no double-struck style!
+ switch (family_) {
+ case MATH_MONOSPACE_FAMILY:
+ return "monospace";
+ case MATH_FRAKTUR_FAMILY:
+ return "fraktur";
+ case MATH_SCRIPT_FAMILY:
+ return "script";
+ case MATH_SMALL_CAPS:
+ return "noun";
+ case MATH_SANS_FAMILY:
+ return "sans";
+ case MATH_NORMAL_FAMILY:
+ if (series_ == MATH_MEDIUM_SERIES) {
+ return shape_ == MATH_UP_SHAPE ? "normal" :
"italic";
+ }
+ return "bold";
+ case MATH_DOUBLE_STRUCK_FAMILY:
+ // No support for double-struck font in CSS.
+ return "";
+ }
+ }
+
+private:
+ MathFontFamily family_;
+ MathFontSeries series_;
+ MathFontShape shape_;
+
+ std::string toMathVariantForMathML3() const
+ {
+ // mathvariant is the way MathML 3 encodes fonts.
+ // Not all combinations are supported. Official list:
+ // https://www.w3.org/TR/MathML3/chapter3.html#presm.commatt
+ // "initial", "tailed", "looped", and "stretched" are not
implemented,
+ // as they are only useful for Arabic characters (for which LyX
has no
+ // support right now).
+ switch (family_) {
+ case MATH_MONOSPACE_FAMILY:
+ return "monospace";
+ case MATH_DOUBLE_STRUCK_FAMILY:
+ return "double-struck";
+ case MATH_FRAKTUR_FAMILY:
+ return series_ == MATH_BOLD_SERIES ? "bold-fraktur" :
"fraktur";
+ case MATH_SCRIPT_FAMILY:
+ return series_ == MATH_BOLD_SERIES ? "bold-script" :
"script";
+ case MATH_SANS_FAMILY:
+ if (series_ == MATH_MEDIUM_SERIES) {
+ return shape_ == MATH_UP_SHAPE ? "sans-serif" :
"sans-serif-italic";
+ }
+ return shape_ == MATH_UP_SHAPE ? "bold-sans-serif" :
"sans-serif-bold-italic";
+ case MATH_NORMAL_FAMILY:
+ if (series_ == MATH_MEDIUM_SERIES) {
+ return shape_ == MATH_UP_SHAPE ? "normal" :
"italic";
+ }
+ return shape_ == MATH_UP_SHAPE ? "bold" : "bold-italic";
+ case MATH_SMALL_CAPS:
+ // No valid value...
+ return "";
+ }
+ }
+
+ std::string toMathVariantForMathMLCore() const
+ {
+ return shape_ == MATH_UP_SHAPE ? "normal" : "";
+ }
+};
+}
+
InsetMathFont::InsetMathFont(Buffer * buf, latexkeys const * key)
: InsetMathNest(buf, 1), key_(key)
{}
--
lyx-cvs mailing list
[email protected]
https://lists.lyx.org/mailman/listinfo/lyx-cvs