diff --git a/src/buildHTML.js b/src/buildHTML.js index 9e76f82c8..74dd993e8 100644 --- a/src/buildHTML.js +++ b/src/buildHTML.js @@ -168,16 +168,17 @@ var makeNullDelimiter = function(options) { * This is a map of group types to the function used to handle that type. * Simpler types come at the beginning, while complicated types come afterwards. */ -var groupTypes = { - mathord: function(group, options, prev) { +var groupTypes = {}; + + groupTypes.mathord = function(group, options, prev) { return buildCommon.makeOrd(group, options, "mathord"); - }, + }; - textord: function(group, options, prev) { + groupTypes.textord = function(group, options, prev) { return buildCommon.makeOrd(group, options, "textord"); - }, + }; - bin: function(group, options, prev) { + groupTypes.bin = function(group, options, prev) { var className = "mbin"; // Pull out the most recent element. Do some special handling to find // things at the end of a \color group. Note that we don't use the same @@ -198,46 +199,46 @@ var groupTypes = { return buildCommon.mathsym( group.value, group.mode, options.getColor(), [className]); - }, + }; - rel: function(group, options, prev) { + groupTypes.rel = function(group, options, prev) { return buildCommon.mathsym( group.value, group.mode, options.getColor(), ["mrel"]); - }, + }; - open: function(group, options, prev) { + groupTypes.open = function(group, options, prev) { return buildCommon.mathsym( group.value, group.mode, options.getColor(), ["mopen"]); - }, + }; - close: function(group, options, prev) { + groupTypes.close = function(group, options, prev) { return buildCommon.mathsym( group.value, group.mode, options.getColor(), ["mclose"]); - }, + }; - inner: function(group, options, prev) { + groupTypes.inner = function(group, options, prev) { return buildCommon.mathsym( group.value, group.mode, options.getColor(), ["minner"]); - }, + }; - punct: function(group, options, prev) { + groupTypes.punct = function(group, options, prev) { return buildCommon.mathsym( group.value, group.mode, options.getColor(), ["mpunct"]); - }, + }; - ordgroup: function(group, options, prev) { + groupTypes.ordgroup = function(group, options, prev) { return makeSpan( ["mord", options.style.cls()], buildExpression(group.value, options.reset()) ); - }, + }; - text: function(group, options, prev) { + groupTypes.text = function(group, options, prev) { return makeSpan(["text", "mord", options.style.cls()], buildExpression(group.value.body, options.reset())); - }, + }; - color: function(group, options, prev) { + groupTypes.color = function(group, options, prev) { var elements = buildExpression( group.value.value, options.withColor(group.value.color), @@ -249,9 +250,9 @@ var groupTypes = { // elements will be able to directly interact with their neighbors. For // example, `\color{red}{2 +} 3` has the same spacing as `2 + 3` return new buildCommon.makeFragment(elements); - }, + }; - supsub: function(group, options, prev) { + groupTypes.supsub = function(group, options, prev) { // Superscript and subscripts are handled in the TeXbook on page // 445-446, rules 18(a-f). @@ -370,9 +371,9 @@ var groupTypes = { return makeSpan([getTypeOfGroup(group.value.base)], [base, supsub]); - }, + }; - genfrac: function(group, options, prev) { + groupTypes.genfrac = function(group, options, prev) { // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e). // Figure out what style this fraction should be in based on the // function used @@ -503,9 +504,9 @@ var groupTypes = { ["mord", options.style.reset(), fstyle.cls()], [leftDelim, makeSpan(["mfrac"], [frac]), rightDelim], options.getColor()); - }, + }; - array: function(group, options, prev) { + groupTypes.array = function(group, options, prev) { var r, c; var nr = group.value.body.length; var nc = 0; @@ -664,9 +665,9 @@ var groupTypes = { } body = makeSpan(["mtable"], cols); return makeSpan(["mord"], [body], options.getColor()); - }, + }; - spacing: function(group, options, prev) { + groupTypes.spacing = function(group, options, prev) { if (group.value === "\\ " || group.value === "\\space" || group.value === " " || group.value === "~") { // Spaces are generated by adding an actual space. Each of these @@ -683,25 +684,25 @@ var groupTypes = { ["mord", "mspace", buildCommon.spacingFunctions[group.value].className]); } - }, + }; - llap: function(group, options, prev) { + groupTypes.llap = function(group, options, prev) { var inner = makeSpan( ["inner"], [buildGroup(group.value.body, options.reset())]); var fix = makeSpan(["fix"], []); return makeSpan( ["llap", options.style.cls()], [inner, fix]); - }, + }; - rlap: function(group, options, prev) { + groupTypes.rlap = function(group, options, prev) { var inner = makeSpan( ["inner"], [buildGroup(group.value.body, options.reset())]); var fix = makeSpan(["fix"], []); return makeSpan( ["rlap", options.style.cls()], [inner, fix]); - }, + }; - op: function(group, options, prev) { + groupTypes.op = function(group, options, prev) { // Operators are handled in the TeXbook pg. 443-444, rule 13(a). var supGroup; var subGroup; @@ -858,9 +859,9 @@ var groupTypes = { return base; } - }, + }; - katex: function(group, options, prev) { + groupTypes.katex = function(group, options, prev) { // The KaTeX logo. The offsets for the K and a were chosen to look // good, but the offsets for the T, E, and X were taken from the // definition of \TeX in TeX (see TeXbook pg. 356) @@ -885,9 +886,9 @@ var groupTypes = { return makeSpan( ["katex-logo", "mord"], [k, a, t, e, x], options.getColor()); - }, + }; - overline: function(group, options, prev) { + groupTypes.overline = function(group, options, prev) { // Overlines are handled in the TeXbook pg 443, Rule 9. // Build the inner group in the cramped style. @@ -912,9 +913,9 @@ var groupTypes = { ], "firstBaseline", null, options); return makeSpan(["overline", "mord"], [vlist], options.getColor()); - }, + }; - sqrt: function(group, options, prev) { + groupTypes.sqrt = function(group, options, prev) { // Square roots are handled in the TeXbook pg. 443, Rule 11. // First, we do the same steps as in overline to build the inner group @@ -1011,9 +1012,9 @@ var groupTypes = { return makeSpan(["sqrt", "mord"], [rootVListWrap, delim, body]); } - }, + }; - sizing: function(group, options, prev) { + groupTypes.sizing = function(group, options, prev) { // Handle sizing operators like \Huge. Real TeX doesn't actually allow // these functions inside of math expressions, so we do some special // handling. @@ -1030,9 +1031,9 @@ var groupTypes = { span.maxFontSize = fontSize * options.style.sizeMultiplier; return span; - }, + }; - styling: function(group, options, prev) { + groupTypes.styling = function(group, options, prev) { // Style changes are handled in the TeXbook on pg. 442, Rule 3. // Figure out what style we're changing to. @@ -1050,14 +1051,14 @@ var groupTypes = { group.value.value, options.withStyle(newStyle), prev); return makeSpan([options.style.reset(), newStyle.cls()], inner); - }, + }; - font: function(group, options, prev) { + groupTypes.font = function(group, options, prev) { var font = group.value.font; return buildGroup(group.value.body, options.withFont(font), prev); - }, + }; - delimsizing: function(group, options, prev) { + groupTypes.delimsizing = function(group, options, prev) { var delim = group.value.value; if (delim === ".") { @@ -1071,9 +1072,9 @@ var groupTypes = { [groupToType[group.value.delimType]], [delimiter.sizedDelim( delim, group.value.size, options, group.mode)]); - }, + }; - leftright: function(group, options, prev) { + groupTypes.leftright = function(group, options, prev) { // Build the inner expression var inner = buildExpression(group.value.body, options.reset()); @@ -1120,9 +1121,9 @@ var groupTypes = { return makeSpan( ["minner", options.style.cls()], inner, options.getColor()); - }, + }; - rule: function(group, options, prev) { + groupTypes.rule = function(group, options, prev) { // Make an empty span for the rule var rule = makeSpan(["mord", "rule"], [], options.getColor()); @@ -1162,9 +1163,9 @@ var groupTypes = { rule.depth = -shift; return rule; - }, + }; - accent: function(group, options, prev) { + groupTypes.accent = function(group, options, prev) { // Accents are handled in the TeXbook pg. 443, rule 12. var base = group.value.base; @@ -1268,9 +1269,9 @@ var groupTypes = { } else { return accentWrap; } - }, + }; - phantom: function(group, options, prev) { + groupTypes.phantom = function(group, options, prev) { var elements = buildExpression( group.value.value, options.withPhantom(), @@ -1280,8 +1281,7 @@ var groupTypes = { // \phantom isn't supposed to affect the elements it contains. // See "color" for more details. return new buildCommon.makeFragment(elements); - } -}; + }; /** * buildGroup is the function that takes a group and calls the correct groupType diff --git a/src/buildMathML.js b/src/buildMathML.js index f0f876af2..15346206b 100644 --- a/src/buildMathML.js +++ b/src/buildMathML.js @@ -61,8 +61,9 @@ var getVariant = function(group, options) { * Functions for handling the different types of groups found in the parse * tree. Each function should take a parse group and return a MathML node. */ -var groupTypes = { - mathord: function(group, options) { +var groupTypes = {}; + + groupTypes.mathord = function(group, options) { var node = new mathMLTree.MathNode( "mi", [makeText(group.value, group.mode)]); @@ -72,9 +73,9 @@ var groupTypes = { node.setAttribute("mathvariant", variant); } return node; - }, + }; - textord: function(group, options) { + groupTypes.textord = function(group, options) { var text = makeText(group.value, group.mode); var variant = getVariant(group, options) || "normal"; @@ -93,69 +94,69 @@ var groupTypes = { } return node; - }, + }; - bin: function(group) { + groupTypes.bin = function(group) { var node = new mathMLTree.MathNode( "mo", [makeText(group.value, group.mode)]); return node; - }, + }; - rel: function(group) { + groupTypes.rel = function(group) { var node = new mathMLTree.MathNode( "mo", [makeText(group.value, group.mode)]); return node; - }, + }; - open: function(group) { + groupTypes.open = function(group) { var node = new mathMLTree.MathNode( "mo", [makeText(group.value, group.mode)]); return node; - }, + }; - close: function(group) { + groupTypes.close = function(group) { var node = new mathMLTree.MathNode( "mo", [makeText(group.value, group.mode)]); return node; - }, + }; - inner: function(group) { + groupTypes.inner = function(group) { var node = new mathMLTree.MathNode( "mo", [makeText(group.value, group.mode)]); return node; - }, + }; - punct: function(group) { + groupTypes.punct = function(group) { var node = new mathMLTree.MathNode( "mo", [makeText(group.value, group.mode)]); node.setAttribute("separator", "true"); return node; - }, + }; - ordgroup: function(group, options) { + groupTypes.ordgroup = function(group, options) { var inner = buildExpression(group.value, options); var node = new mathMLTree.MathNode("mrow", inner); return node; - }, + }; - text: function(group, options) { + groupTypes.text = function(group, options) { var inner = buildExpression(group.value.body, options); var node = new mathMLTree.MathNode("mtext", inner); return node; - }, + }; - color: function(group, options) { + groupTypes.color = function(group, options) { var inner = buildExpression(group.value.value, options); var node = new mathMLTree.MathNode("mstyle", inner); @@ -163,9 +164,9 @@ var groupTypes = { node.setAttribute("mathcolor", group.value.color); return node; - }, + }; - supsub: function(group, options) { + groupTypes.supsub = function(group, options) { var children = [buildGroup(group.value.base, options)]; if (group.value.sub) { @@ -188,9 +189,9 @@ var groupTypes = { var node = new mathMLTree.MathNode(nodeType, children); return node; - }, + }; - genfrac: function(group, options) { + groupTypes.genfrac = function(group, options) { var node = new mathMLTree.MathNode( "mfrac", [buildGroup(group.value.numer, options), @@ -229,9 +230,9 @@ var groupTypes = { } return node; - }, + }; - array: function(group, options) { + groupTypes.array = function(group, options) { return new mathMLTree.MathNode( "mtable", group.value.body.map(function(row) { return new mathMLTree.MathNode( @@ -240,9 +241,9 @@ var groupTypes = { "mtd", [buildGroup(cell, options)]); })); })); - }, + }; - sqrt: function(group, options) { + groupTypes.sqrt = function(group, options) { var node; if (group.value.index) { node = new mathMLTree.MathNode( @@ -256,9 +257,9 @@ var groupTypes = { } return node; - }, + }; - leftright: function(group, options) { + groupTypes.leftright = function(group, options) { var inner = buildExpression(group.value.body, options); if (group.value.left !== ".") { @@ -282,9 +283,9 @@ var groupTypes = { var outerNode = new mathMLTree.MathNode("mrow", inner); return outerNode; - }, + }; - accent: function(group, options) { + groupTypes.accent = function(group, options) { var accentNode = new mathMLTree.MathNode( "mo", [makeText(group.value.accent, group.mode)]); @@ -296,9 +297,9 @@ var groupTypes = { node.setAttribute("accent", "true"); return node; - }, + }; - spacing: function(group) { + groupTypes.spacing = function(group) { var node; if (group.value === "\\ " || group.value === "\\space" || @@ -313,9 +314,9 @@ var groupTypes = { } return node; - }, + }; - op: function(group) { + groupTypes.op = function(group) { var node; // TODO(emily): handle big operators using the `largeop` attribute @@ -334,21 +335,21 @@ var groupTypes = { } return node; - }, + }; - katex: function(group) { + groupTypes.katex = function(group) { var node = new mathMLTree.MathNode( "mtext", [new mathMLTree.TextNode("KaTeX")]); return node; - }, + }; - font: function(group, options) { + groupTypes.font = function(group, options) { var font = group.value.font; return buildGroup(group.value.body, options.withFont(font)); - }, + }; - delimsizing: function(group) { + groupTypes.delimsizing = function(group) { var children = []; if (group.value.value !== ".") { @@ -369,9 +370,9 @@ var groupTypes = { } return node; - }, + }; - styling: function(group, options) { + groupTypes.styling = function(group, options) { var inner = buildExpression(group.value.value, options); var node = new mathMLTree.MathNode("mstyle", inner); @@ -389,9 +390,9 @@ var groupTypes = { node.setAttribute("displaystyle", attr[1]); return node; - }, + }; - sizing: function(group, options) { + groupTypes.sizing = function(group, options) { var inner = buildExpression(group.value.value, options); var node = new mathMLTree.MathNode("mstyle", inner); @@ -405,9 +406,9 @@ var groupTypes = { "mathsize", buildCommon.sizingMultiplier[group.value.size] + "em"); return node; - }, + }; - overline: function(group, options) { + groupTypes.overline = function(group, options) { var operator = new mathMLTree.MathNode( "mo", [new mathMLTree.TextNode("\u203e")]); operator.setAttribute("stretchy", "true"); @@ -419,17 +420,17 @@ var groupTypes = { node.setAttribute("accent", "true"); return node; - }, + }; - rule: function(group) { + groupTypes.rule = function(group) { // TODO(emily): Figure out if there's an actual way to draw black boxes // in MathML. var node = new mathMLTree.MathNode("mrow"); return node; - }, + }; - llap: function(group, options) { + groupTypes.llap = function(group, options) { var node = new mathMLTree.MathNode( "mpadded", [buildGroup(group.value.body, options)]); @@ -437,22 +438,21 @@ var groupTypes = { node.setAttribute("width", "0px"); return node; - }, + }; - rlap: function(group, options) { + groupTypes.rlap = function(group, options) { var node = new mathMLTree.MathNode( "mpadded", [buildGroup(group.value.body, options)]); node.setAttribute("width", "0px"); return node; - }, + }; - phantom: function(group, options, prev) { + groupTypes.phantom = function(group, options, prev) { var inner = buildExpression(group.value.value, options); return new mathMLTree.MathNode("mphantom", inner); - } -}; + }; /** * Takes a list of nodes, builds them, and returns a list of the generated