[NOT PART OF THE DEFAULT BUILD]. *Postfixed all atoms with underscore to avoid conflicts with predefined names in C++ and math.h. *Changed MathML namescape to the new officially published namespace.

git-svn-id: svn://10.0.0.236/trunk@55847 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
rbs%maths.uq.edu.au 1999-12-10 12:47:24 +00:00
parent 43ad4d5101
commit 48dd7c0e78
4 changed files with 201 additions and 145 deletions

View File

@ -38,141 +38,142 @@
******/
MATHML_ATOM(abs, "abs")
MATHML_ATOM(accent, "accent")
MATHML_ATOM(and, "and")
MATHML_ATOM(annotation, "annotation")
MATHML_ATOM(apply, "apply")
MATHML_ATOM(arccos, "arccos")
MATHML_ATOM(arcsin, "arcsin")
MATHML_ATOM(arctan, "arctan")
MATHML_ATOM(bvar, "bvar")
MATHML_ATOM(ci, "ci")
MATHML_ATOM(close, "close")
MATHML_ATOM(cn, "cn")
MATHML_ATOM(compose, "compose")
MATHML_ATOM(condition, "condition")
MATHML_ATOM(conjugate, "conjugate")
MATHML_ATOM(cos, "cos")
MATHML_ATOM(cosh, "cosh")
MATHML_ATOM(cot, "cot")
MATHML_ATOM(coth, "coth")
MATHML_ATOM(csc, "csc")
MATHML_ATOM(csch, "csch")
MATHML_ATOM(declare, "declare")
MATHML_ATOM(degree, "degree")
MATHML_ATOM(determinant, "determinant")
MATHML_ATOM(diff, "diff")
MATHML_ATOM(displaystyle, "displaystyle")
MATHML_ATOM(divide, "divide")
MATHML_ATOM(eq, "eq")
MATHML_ATOM(exists, "exists")
MATHML_ATOM(exp, "exp")
MATHML_ATOM(factorial, "factorial")
MATHML_ATOM(fence, "fence")
MATHML_ATOM(fn, "fn")
MATHML_ATOM(forall, "forall")
MATHML_ATOM(form, "form")
MATHML_ATOM(geq, "geq")
MATHML_ATOM(gt, "gt")
MATHML_ATOM(ident, "ident")
MATHML_ATOM(implies, "implies")
MATHML_ATOM(in, "in")
MATHML_ATOM(_int, "int")
MATHML_ATOM(intersect, "intersect")
MATHML_ATOM(interval, "interval")
MATHML_ATOM(inverse, "inverse")
MATHML_ATOM(lambda, "lambda")
MATHML_ATOM(largeop, "largeop")
MATHML_ATOM(leq, "leq")
MATHML_ATOM(limit, "limit")
MATHML_ATOM(linethickness, "linethickness")
MATHML_ATOM(list, "list")
MATHML_ATOM(ln, "ln")
MATHML_ATOM(log, "log")
MATHML_ATOM(logbase, "logbase")
MATHML_ATOM(lowlimit, "lowlimit")
MATHML_ATOM(lt, "lt")
MATHML_ATOM(maction, "maction")
MATHML_ATOM(maligngroup, "maligngroup")
MATHML_ATOM(malignmark, "malignmark")
MATHML_ATOM(math, "math")
MATHML_ATOM(matrix, "matrix")
MATHML_ATOM(matrixrow, "matrixrow")
MATHML_ATOM(max, "max")
MATHML_ATOM(mean, "mean")
MATHML_ATOM(median, "median")
MATHML_ATOM(merror, "merror")
MATHML_ATOM(mfenced, "mfenced")
MATHML_ATOM(mfrac, "mfrac")
MATHML_ATOM(mi, "mi")
MATHML_ATOM(min, "min")
MATHML_ATOM(minus, "minus")
MATHML_ATOM(mmultiscripts, "mmultiscripts")
MATHML_ATOM(mn, "mn")
MATHML_ATOM(mo, "mo")
MATHML_ATOM(mode, "mode")
MATHML_ATOM(moment, "moment")
MATHML_ATOM(movablelimits, "movablelimits")
MATHML_ATOM(mover, "mover")
MATHML_ATOM(mpadded, "mpadded")
MATHML_ATOM(mphantom, "mphantom")
MATHML_ATOM(mprescripts, "mprescripts")
MATHML_ATOM(mroot, "mroot")
MATHML_ATOM(mrow, "mrow")
MATHML_ATOM(ms, "ms")
MATHML_ATOM(mspace, "mspace")
MATHML_ATOM(msqrt, "msqrt")
MATHML_ATOM(mstyle, "mstyle")
MATHML_ATOM(msub, "msub")
MATHML_ATOM(msubsup, "msubsup")
MATHML_ATOM(msup, "msup")
MATHML_ATOM(mtable, "mtable")
MATHML_ATOM(mtd, "mtd")
MATHML_ATOM(mtext, "mtext")
MATHML_ATOM(mtr, "mtr")
MATHML_ATOM(munder, "munder")
MATHML_ATOM(munderover, "munderover")
MATHML_ATOM(neq, "neq")
MATHML_ATOM(none, "none")
MATHML_ATOM(not, "not")
MATHML_ATOM(notin, "notin")
MATHML_ATOM(notprsubset, "notprsubset")
MATHML_ATOM(notsubset, "notsubset")
MATHML_ATOM(open, "open")
MATHML_ATOM(or, "or")
MATHML_ATOM(partialdiff, "partialdiff")
MATHML_ATOM(plus, "plus")
MATHML_ATOM(power, "power")
MATHML_ATOM(product, "product")
MATHML_ATOM(prsubset, "prsubset")
MATHML_ATOM(quotient, "quotient")
MATHML_ATOM(reln, "reln")
MATHML_ATOM(rem, "rem")
MATHML_ATOM(root, "root")
MATHML_ATOM(scriptlevel, "scriptlevel")
MATHML_ATOM(sdev, "sdev")
MATHML_ATOM(sec, "sec")
MATHML_ATOM(sech, "sech")
MATHML_ATOM(select, "select")
MATHML_ATOM(semantics, "semantics")
MATHML_ATOM(sep, "sep")
MATHML_ATOM(separator, "separator")
MATHML_ATOM(separators, "separators")
MATHML_ATOM(set, "set")
MATHML_ATOM(setdiff, "setdiff")
MATHML_ATOM(sin, "sin")
MATHML_ATOM(sinh, "sinh")
MATHML_ATOM(stretchy, "stretchy")
MATHML_ATOM(subset, "subset")
MATHML_ATOM(sum, "sum")
MATHML_ATOM(tan, "tan")
MATHML_ATOM(tanh, "tanh")
MATHML_ATOM(tendsto, "tendsto")
MATHML_ATOM(times, "times")
MATHML_ATOM(transpose, "transpose")
MATHML_ATOM(_union, "union")
MATHML_ATOM(uplimit, "uplimit")
MATHML_ATOM(var, "var")
MATHML_ATOM(vector, "vector")
MATHML_ATOM(xor, "xor")
MATHML_ATOM(abs_, "abs")
MATHML_ATOM(accent_, "accent")
MATHML_ATOM(and_, "and")
MATHML_ATOM(annotation_, "annotation")
MATHML_ATOM(apply_, "apply")
MATHML_ATOM(arccos_, "arccos")
MATHML_ATOM(arcsin_, "arcsin")
MATHML_ATOM(arctan_, "arctan")
MATHML_ATOM(bvar_, "bvar")
MATHML_ATOM(ci_, "ci")
MATHML_ATOM(close_, "close")
MATHML_ATOM(cn_, "cn")
MATHML_ATOM(compose_, "compose")
MATHML_ATOM(condition_, "condition")
MATHML_ATOM(conjugate_, "conjugate")
MATHML_ATOM(cos_, "cos")
MATHML_ATOM(cosh_, "cosh")
MATHML_ATOM(cot_, "cot")
MATHML_ATOM(coth_, "coth")
MATHML_ATOM(csc_, "csc")
MATHML_ATOM(csch_, "csch")
MATHML_ATOM(declare_, "declare")
MATHML_ATOM(degree_, "degree")
MATHML_ATOM(determinant_, "determinant")
MATHML_ATOM(diff_, "diff")
MATHML_ATOM(displaystyle_, "displaystyle")
MATHML_ATOM(divide_, "divide")
MATHML_ATOM(eq_, "eq")
MATHML_ATOM(exists_, "exists")
MATHML_ATOM(exp_, "exp")
MATHML_ATOM(factorial_, "factorial")
MATHML_ATOM(fence_, "fence")
MATHML_ATOM(fn_, "fn")
MATHML_ATOM(forall_, "forall")
MATHML_ATOM(form_, "form")
MATHML_ATOM(geq_, "geq")
MATHML_ATOM(gt_, "gt")
MATHML_ATOM(ident_, "ident")
MATHML_ATOM(implies_, "implies")
MATHML_ATOM(in_, "in")
MATHML_ATOM(int_, "int")
MATHML_ATOM(intersect_, "intersect")
MATHML_ATOM(interval_, "interval")
MATHML_ATOM(inverse_, "inverse")
MATHML_ATOM(lambda_, "lambda")
MATHML_ATOM(largeop_, "largeop")
MATHML_ATOM(leq_, "leq")
MATHML_ATOM(limit_, "limit")
MATHML_ATOM(linethickness_, "linethickness")
MATHML_ATOM(list_, "list")
MATHML_ATOM(ln_, "ln")
MATHML_ATOM(log_, "log")
MATHML_ATOM(logbase_, "logbase")
MATHML_ATOM(lowlimit_, "lowlimit")
MATHML_ATOM(lt_, "lt")
MATHML_ATOM(maction_, "maction")
MATHML_ATOM(maligngroup_, "maligngroup")
MATHML_ATOM(malignmark_, "malignmark")
MATHML_ATOM(math, "math") // only one without an underscore
MATHML_ATOM(matrix_, "matrix")
MATHML_ATOM(matrixrow_, "matrixrow")
MATHML_ATOM(max_, "max")
MATHML_ATOM(mean_, "mean")
MATHML_ATOM(median_, "median")
MATHML_ATOM(merror_, "merror")
MATHML_ATOM(mfenced_, "mfenced")
MATHML_ATOM(mfrac_, "mfrac")
MATHML_ATOM(mi_, "mi")
MATHML_ATOM(min_, "min")
MATHML_ATOM(minus_, "minus")
MATHML_ATOM(mmultiscripts_, "mmultiscripts")
MATHML_ATOM(mn_, "mn")
MATHML_ATOM(mo_, "mo")
MATHML_ATOM(mode_, "mode")
MATHML_ATOM(moment_, "moment")
MATHML_ATOM(movablelimits_, "movablelimits")
MATHML_ATOM(mover_, "mover")
MATHML_ATOM(mpadded_, "mpadded")
MATHML_ATOM(mphantom_, "mphantom")
MATHML_ATOM(mprescripts_, "mprescripts")
MATHML_ATOM(mroot_, "mroot")
MATHML_ATOM(mrow_, "mrow")
MATHML_ATOM(ms_, "ms")
MATHML_ATOM(mspace_, "mspace")
MATHML_ATOM(msqrt_, "msqrt")
MATHML_ATOM(mstyle_, "mstyle")
MATHML_ATOM(msub_, "msub")
MATHML_ATOM(msubsup_, "msubsup")
MATHML_ATOM(msup_, "msup")
MATHML_ATOM(mtable_, "mtable")
MATHML_ATOM(mtd_, "mtd")
MATHML_ATOM(mtext_, "mtext")
MATHML_ATOM(mtr_, "mtr")
MATHML_ATOM(munder_, "munder")
MATHML_ATOM(munderover_, "munderover")
MATHML_ATOM(neq_, "neq")
MATHML_ATOM(none_, "none")
MATHML_ATOM(not_, "not")
MATHML_ATOM(notin_, "notin")
MATHML_ATOM(notprsubset_, "notprsubset")
MATHML_ATOM(notsubset_, "notsubset")
MATHML_ATOM(open_, "open")
MATHML_ATOM(or_, "or")
MATHML_ATOM(partialdiff_, "partialdiff")
MATHML_ATOM(plus_, "plus")
MATHML_ATOM(power_, "power")
MATHML_ATOM(product_, "product")
MATHML_ATOM(prsubset_, "prsubset")
MATHML_ATOM(quotient_, "quotient")
MATHML_ATOM(reln_, "reln")
MATHML_ATOM(rem_, "rem")
MATHML_ATOM(root_, "root")
MATHML_ATOM(scriptlevel_, "scriptlevel")
MATHML_ATOM(sdev_, "sdev")
MATHML_ATOM(sec_, "sec")
MATHML_ATOM(sech_, "sech")
MATHML_ATOM(select_, "select")
MATHML_ATOM(semantics_, "semantics")
MATHML_ATOM(sep_, "sep")
MATHML_ATOM(separator_, "separator")
MATHML_ATOM(separators_, "separators")
MATHML_ATOM(set_, "set")
MATHML_ATOM(setdiff_, "setdiff")
MATHML_ATOM(sin_, "sin")
MATHML_ATOM(sinh_, "sinh")
MATHML_ATOM(stretchy_, "stretchy")
MATHML_ATOM(subset_, "subset")
MATHML_ATOM(sum_, "sum")
MATHML_ATOM(symmetric_, "symmetric")
MATHML_ATOM(tan_, "tan")
MATHML_ATOM(tanh_, "tanh")
MATHML_ATOM(tendsto_, "tendsto")
MATHML_ATOM(times_, "times")
MATHML_ATOM(transpose_, "transpose")
MATHML_ATOM(union_, "union")
MATHML_ATOM(uplimit_, "uplimit")
MATHML_ATOM(var_, "var")
MATHML_ATOM(vector_, "vector")
MATHML_ATOM(xor_, "xor")

View File

@ -24,7 +24,7 @@
#include "nsINameSpaceManager.h"
#include "nsMathMLAtoms.h"
static const char kMathMLNameSpace[] = "http://www.w3.org/Math/MathML";
static const char kMathMLNameSpace[] = "http://www.w3.org/1998/Math/MathML";
PRInt32 nsMathMLAtoms::nameSpaceID;

View File

@ -78,6 +78,19 @@ struct OperatorNode {
float mRightSpace; // unit is em
};
/*
The MathML REC says:
"If the operator does not occur in the dictionary with the specified form,
the renderer should use one of the forms which is available there, in the
order of preference: infix, postfix, prefix."
The following variable will be used to keep track of all possible forms
encountered in the Operator Dictionary.
*/
#ifndef NS_MATHML_STRICT_LOOKUP
static OperatorNode* gOperatorFound[4];
#endif
// index comparitor: based on the string of the operator and its form bits
class OperatorComparitor: public nsAVLNodeComparitor {
public:
@ -88,18 +101,27 @@ public:
PRInt32 rv;
rv = one->mStr.Compare(two->mStr, PR_FALSE);
if (rv == 0) {
if (0 == rv) {
nsOperatorFlags form1 = NS_MATHML_OPERATOR_GET_FORM(one->mFlags);
nsOperatorFlags form2 = NS_MATHML_OPERATOR_GET_FORM(two->mFlags);
if (form1 < form2) rv = -1;
else if (form1 > form2) rv = 1;
if (form1 == form2) return 0;
else {
rv = (form1 < form2) ? -1 : 1;
#ifndef NS_MATHML_STRICT_LOOKUP
// Record that the operator was found in a different form.
// We don't know which is the input, we grab both of them and check later
gOperatorFound[form1] = one;
gOperatorFound[form2] = two;
#endif
}
}
return rv;
}
};
static PRInt32 gTableRefCount;
static PRInt32 gTableRefCount = 0;
static OperatorNode* gOperatorArray;
static nsAVLTree* gOperatorTree;
static OperatorComparitor* gComparitor;
@ -162,8 +184,27 @@ nsMathMLOperators::LookupOperator(const nsStr& aOperator,
{
NS_ASSERTION(gOperatorTree, "no lookup table, needs addref");
if (gOperatorTree) {
#ifndef NS_MATHML_STRICT_LOOKUP
gOperatorFound[NS_MATHML_OPERATOR_FORM_INFIX] = nsnull;
gOperatorFound[NS_MATHML_OPERATOR_FORM_POSTFIX] = nsnull;
gOperatorFound[NS_MATHML_OPERATOR_FORM_PREFIX] = nsnull;
#endif
OperatorNode node(aOperator, aForm);
OperatorNode* found = (OperatorNode*)gOperatorTree->FindItem(&node);
#ifndef NS_MATHML_STRICT_LOOKUP
// Check if the operator was perhaps found in a different form
// Here we check that we are not referring to the input itself
if (!found) found = gOperatorFound[NS_MATHML_OPERATOR_FORM_INFIX];
if (found == &node) found = nsnull;
if (!found) found = gOperatorFound[NS_MATHML_OPERATOR_FORM_POSTFIX];
if (found == &node) found = nsnull;
if (!found) found = gOperatorFound[NS_MATHML_OPERATOR_FORM_PREFIX];
if (found == &node) found = nsnull;
#endif
if (found) {
NS_ASSERTION(found->mStr.Equals(aOperator), "bad tree");
*aFlags = found->mFlags;

View File

@ -25,12 +25,14 @@
#include "nslayout.h"
#include "nsCoord.h"
// #define NS_MATHML_STRICT_LOOKUP 1 // see documentation of LookupOperator() below
typedef PRUint32 nsOperatorFlags;
// define the bits used to handle the operator
#define NS_MATHML_OPERATOR_MUTABLE 0x80000000 // the very first bit
#define NS_MATHML_OPERATOR_MUTABLE 0x80000000 // the very first bit
#define NS_MATHML_OPERATOR_EMBELLISH_ANCESTOR 0x40000000 // the second bit
// define the bits used in the operator dictionary
@ -45,11 +47,16 @@ typedef PRUint32 nsOperatorFlags;
#define NS_MATHML_OPERATOR_SEPARATOR (1<<6)
#define NS_MATHML_OPERATOR_MOVABLELIMITS (1<<7)
#define NS_MATHML_OPERATOR_SYMMETRIC (1<<8)
// Macros that retrieve those bits
#define NS_MATHML_OPERATOR_IS_MUTABLE(_flags) \
(NS_MATHML_OPERATOR_MUTABLE == ((_flags) & NS_MATHML_OPERATOR_MUTABLE))
#define NS_MATHML_OPERATOR_HAS_EMBELLISH_ANCESTOR(_flags) \
(NS_MATHML_OPERATOR_EMBELLISH_ANCESTOR == ((_flags) & NS_MATHML_OPERATOR_EMBELLISH_ANCESTOR))
#define NS_MATHML_OPERATOR_GET_FORM(_flags) \
((_flags) & NS_MATHML_OPERATOR_FORM)
@ -80,6 +87,8 @@ typedef PRUint32 nsOperatorFlags;
#define NS_MATHML_OPERATOR_IS_MOVABLELIMITS(_flags) \
(NS_MATHML_OPERATOR_MOVABLELIMITS == ((_flags) & NS_MATHML_OPERATOR_MOVABLELIMITS))
#define NS_MATHML_OPERATOR_IS_SYMMETRIC(_flags) \
(NS_MATHML_OPERATOR_SYMMETRIC == ((_flags) & NS_MATHML_OPERATOR_SYMMETRIC))
class nsMathMLOperators {
public:
@ -89,6 +98,11 @@ public:
// Given the string value of an operator and its form (last two bits of flags),
// this method returns true if the operator is found in the operator dictionary.
// Attributes of the operator are returned in the output parameters.
// If the operator is not found under the supplied form but is found under a
// different form, the method returns true as well (it is possible to set
// NS_MATHML_STRICT_LOOKUP to disable this feature). The caller can test the
// output parameter aFlags to know exactly under which form the operator was
// found in the operator dictionary.
static PRBool LookupOperator(const nsStr& aOperator,
const nsOperatorFlags aForm,