* Licence details can be found in the file COPYING.
*
* \author Alejandro Aguilar Sierra
- * \author André Pönitz
+ * \author André Pönitz
*
* Full author contact details are available in file CREDITS.
*/
#include "support/debug.h"
#include "support/lstrings.h"
+#include "support/textutils.h"
namespace lyx {
static bool slanted(char_type c)
{
- return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
+ return isAlphaASCII(c) || Encodings::isMathAlpha(c);
}
void InsetMathChar::validate(LaTeXFeatures & features) const
{
- if (char_ >= 0x80) {
- encodings.validate(char_, features);
- features.require("relsize");
- features.require("lyxmathsym");
- }
+ if (char_ >= 0x80)
+ encodings.validate(char_, features, true);
}
}
-void InsetMathChar::mathmlize(MathStream & ms) const
+// We have a bit of a problem here. MathML wants to know whether the
+// character represents an "identifier" or an "operator", and we have
+// no general way of telling. So we shall guess: If it's alpha or
+// mathalpha, then we'll treat it as an identifier, otherwise as an
+// operator.
+// Worst case: We get bad spacing, or bad italics.
+docstring InsetMathChar::mathmlize(MathStream & ms) const
{
switch (char_) {
- case '<': ms << "<"; break;
- case '>': ms << ">"; break;
- case '&': ms << "&"; break;
- default: ms.os().put(char_); break;
+ case '<': ms << "<mo><</mo>"; return docstring();
+ case '>': ms << "<mo>></mo>"; return docstring();
+ case '&': ms << "<mo>&</mo>"; return docstring();
+ default: break;
}
+
+ char const * type =
+ (isalpha(char_) || Encodings::isMathAlpha(char_))
+ ? "mi" : "mo";
+ // we don't use MTag and ETag because we do not want the spacing
+ ms << "<" << type << ">" << char(char_) << "</" << type << ">";
+ return docstring();
}