* 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 "MathStream.h"
#include "MetricsInfo.h"
-#include "support/debug.h"
#include "Dimension.h"
+#include "BufferEncodings.h"
+#include "LaTeXFeatures.h"
#include "TextPainter.h"
-#include "support/lstrings.h"
-
#include "frontends/FontMetrics.h"
+#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);
}
dim = fm.dimension(char_);
kerning_ = fm.rbearing(char_) - dim.wid;
}
- int const em = mathed_char_width(mi.base.font, 'M');
+ int const em = mathed_font_em(mi.base.font);
if (isBinaryOp(char_))
dim.wid += static_cast<int>(0.5*em+0.5);
else if (char_ == '\'')
dim.wid += 2 * theFontMetrics(font_).width(' ');
lyxerr << "InsetMathChar::metrics: " << dim << endl;
#endif
- // Cache the inset dimension.
- setDimCache(mi, dim);
}
void InsetMathChar::draw(PainterInfo & pi, int x, int y) const
{
//lyxerr << "drawing '" << char_ << "' font: " << pi.base.fontname << endl;
- int const em = mathed_char_width(pi.base.font, 'M');
+ int const em = mathed_font_em(pi.base.font);
if (isBinaryOp(char_))
x += static_cast<int>(0.25*em+0.5);
else if (char_ == '\'')
}
+void InsetMathChar::validate(LaTeXFeatures & features) const
+{
+ if (!isASCII(char_))
+ BufferEncodings::validate(char_, features, true);
+}
+
+
void InsetMathChar::normalize(NormalStream & os) const
{
os << "[char ";
}
+// 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.
void InsetMathChar::mathmlize(MathStream & ms) const
{
+ std::string entity;
switch (char_) {
- case '<': ms << "<"; break;
- case '>': ms << ">"; break;
- case '&': ms << "&"; break;
- default: ms.os().put(char_); break;
+ case '<': entity = "<"; break;
+ case '>': entity = ">"; break;
+ case '&': entity = "&"; break;
+ case ' ': {
+ ms << from_ascii(" ");
+ return;
+ }
+ default: break;
+ }
+
+ if (ms.inText()) {
+ if (entity.empty())
+ ms.os().put(char_);
+ else
+ ms << from_ascii(entity);
+ return;
+ }
+
+ if (!entity.empty()) {
+ ms << "<mo>" << from_ascii(entity) << "</mo>";
+ return;
+ }
+
+ char const * type =
+ (isAlphaASCII(char_) || Encodings::isMathAlpha(char_))
+ ? "mi" : "mo";
+ // we don't use MTag and ETag because we do not want the spacing
+ ms << "<" << type << ">" << char_type(char_) << "</" << type << ">";
+}
+
+
+void InsetMathChar::htmlize(HtmlStream & ms) const
+{
+ std::string entity;
+ switch (char_) {
+ case '<': entity = "<"; break;
+ case '>': entity = ">"; break;
+ case '&': entity = "&"; break;
+ case ' ': entity = " "; break;
+ default: break;
+ }
+
+ bool have_entity = !entity.empty();
+
+ if (ms.inText()) {
+ if (have_entity)
+ ms << from_ascii(entity);
+ else
+ ms.os().put(char_);
+ return;
}
+
+ if (have_entity) {
+ // an operator, so give some space
+ ms << ' ' << from_ascii(entity) << ' ';
+ return;
+ }
+
+ if (isAlphaASCII(char_) || Encodings::isMathAlpha(char_))
+ // we don't use MTag and ETag because we do not want the spacing
+ ms << MTag("i") << char_type(char_) << ETag("i");
+ else
+ // an operator, so give some space
+ ms << " " << char_type(char_) << " ";
}