diff --git a/README.md b/README.md index fdc633bd3..9a1c4df0d 100644 --- a/README.md +++ b/README.md @@ -18,13 +18,17 @@ You can [download KaTeX](https://github.com/khan/katex/releases) and host it on ``` +#### In-browser rendering + Call `katex.render` with a TeX expression and a DOM element to render into: ```js katex.render("c = \\pm\\sqrt{a^2 + b^2}", element); ``` -To generate HTML on the server, you can use `katex.renderToString`: +#### Server side rendering or rendering to a string + +To generate HTML on the server or to generate an HTML string of the rendered math, you can use `katex.renderToString`: ```js var html = katex.renderToString("c = \\pm\\sqrt{a^2 + b^2}"); @@ -33,12 +37,16 @@ var html = katex.renderToString("c = \\pm\\sqrt{a^2 + b^2}"); Make sure to include the CSS and font files, but there is no need to include the JavaScript. -These APIs default to inline math typesetting; for display math you can prepend `\displaystyle` ([#66](https://github.com/Khan/KaTeX/issues/66)): +#### Rendering options + +You can provide an object of options as the last argument to `katex.render` and `katex.renderToString`. Available options are: + +- `displayMode`: `boolean`. If `true` the math will be rendered in display mode, which will put the math in display style (so `\int` and `\sum` are large, for example), and will center the math on the page on its own line. If `false` the math will be rendered in inline mode. (default: `false`) + +For example: ```js -katex.render("\\displaystyle {" + formula + "}", element); -// OR -var html = katex.renderToString("\\displaystyle {" + formula + "}"); +katex.render("c = \\pm\\sqrt{a^2 + b^2}", element, { displayMode: true }); ``` ## Contributing diff --git a/katex.js b/katex.js index b6b96f3cb..368a9b924 100644 --- a/katex.js +++ b/katex.js @@ -7,6 +7,7 @@ */ var ParseError = require("./src/ParseError"); +var Settings = require("./src/Settings"); var buildTree = require("./src/buildTree"); var parseTree = require("./src/parseTree"); @@ -16,11 +17,13 @@ var utils = require("./src/utils"); * Parse and build an expression, and place that expression in the DOM node * given. */ -var render = function(toParse, baseNode) { +var render = function(toParse, baseNode, options) { utils.clearNode(baseNode); - var tree = parseTree(toParse); - var node = buildTree(tree).toNode(); + var settings = new Settings(options); + + var tree = parseTree(toParse, settings); + var node = buildTree(tree, settings).toNode(); baseNode.appendChild(node); }; @@ -42,9 +45,11 @@ if (typeof document !== "undefined") { /** * Parse and build an expression, and return the markup for that. */ -var renderToString = function(toParse) { - var tree = parseTree(toParse); - return buildTree(tree).toMarkup(); +var renderToString = function(toParse, options) { + var settings = new Settings(options); + + var tree = parseTree(toParse, settings); + return buildTree(tree, settings).toMarkup(); }; module.exports = { diff --git a/src/Parser.js b/src/Parser.js index f23e7fd96..5a1cbb5ea 100644 --- a/src/Parser.js +++ b/src/Parser.js @@ -43,9 +43,11 @@ var ParseError = require("./ParseError"); /** * Main Parser class */ -function Parser(input) { +function Parser(input, settings) { // Make a new lexer this.lexer = new Lexer(input); + // Store the settings for use in parsing + this.settings = settings; } /** @@ -69,18 +71,10 @@ function ParseResult(result, newPosition) { * An initial function (without its arguments), or an argument to a function. * The `result` argument should be a ParseResult. */ -function ParseFuncOrArgument(result, isFunction, allowedInText, numArgs, numOptionalArgs, argTypes) { +function ParseFuncOrArgument(result, isFunction) { this.result = result; // Is this a function (i.e. is it something defined in functions.js)? this.isFunction = isFunction; - // Is it allowed in text mode? - this.allowedInText = allowedInText; - // How many arguments? - this.numArgs = numArgs; - // How many optional arguments? - this.numOptionalArgs = numOptionalArgs; - // What types of arguments? - this.argTypes = argTypes; } /** @@ -217,10 +211,10 @@ Parser.prototype.handleSupSubscript = function(pos, mode, symbol, name) { if (!group) { throw new ParseError( "Expected group after '" + symbol + "'", this.lexer, pos); - } else if (group.numArgs > 0) { + } else if (group.isFunction) { // ^ and _ have a greediness, so handle interactions with functions' // greediness - var funcGreediness = functions.getGreediness(group.result.result); + var funcGreediness = functions.funcs[group.result.result].greediness; if (funcGreediness > SUPSUB_GREEDINESS) { return this.parseFunction(pos, mode); } else { @@ -419,7 +413,8 @@ Parser.prototype.parseFunction = function(pos, mode) { if (baseGroup) { if (baseGroup.isFunction) { var func = baseGroup.result.result; - if (mode === "text" && !baseGroup.allowedInText) { + var funcData = functions.funcs[func]; + if (mode === "text" && !funcData.allowedInText) { throw new ParseError( "Can't use function '" + func + "' in text mode", this.lexer, baseGroup.position); @@ -428,17 +423,17 @@ Parser.prototype.parseFunction = function(pos, mode) { var newPos = baseGroup.result.position; var result; - var totalArgs = baseGroup.numArgs + baseGroup.numOptionalArgs; + var totalArgs = funcData.numArgs + funcData.numOptionalArgs; if (totalArgs > 0) { - var baseGreediness = functions.getGreediness(func); + var baseGreediness = funcData.greediness; var args = [func]; var positions = [newPos]; for (var i = 0; i < totalArgs; i++) { - var argType = baseGroup.argTypes && baseGroup.argTypes[i]; + var argType = funcData.argTypes && funcData.argTypes[i]; var arg; - if (i < baseGroup.numOptionalArgs) { + if (i < funcData.numOptionalArgs) { if (argType) { arg = this.parseSpecialGroup(newPos, argType, mode, true); } else { @@ -463,8 +458,9 @@ Parser.prototype.parseFunction = function(pos, mode) { } } var argNode; - if (arg.numArgs > 0) { - var argGreediness = functions.getGreediness(arg.result.result); + if (arg.isFunction) { + var argGreediness = + functions.funcs[arg.result.result].greediness; if (argGreediness > baseGreediness) { argNode = this.parseFunction(newPos, mode); } else { @@ -507,6 +503,11 @@ Parser.prototype.parseFunction = function(pos, mode) { * @return {?ParseFuncOrArgument} */ Parser.prototype.parseSpecialGroup = function(pos, mode, outerMode, optional) { + // Handle `original` argTypes + if (mode === "original") { + mode = outerMode; + } + if (mode === "color" || mode === "size") { // color and size modes are special because they should have braces and // should only lex a single symbol inside @@ -605,23 +606,11 @@ Parser.prototype.parseSymbol = function(pos, mode) { var nucleus = this.lexer.lex(pos, mode); if (functions.funcs[nucleus.text]) { - // If there is a function with this name, we use its data - var func = functions.funcs[nucleus.text]; - - // Here, we replace "original" argTypes with the current mode - var argTypes = func.argTypes; - if (argTypes) { - argTypes = argTypes.slice(); - for (var i = 0; i < argTypes.length; i++) { - if (argTypes[i] === "original") { - argTypes[i] = mode; - } - } - } - + // If there exists a function with this name, we return the function and + // say that it is a function. return new ParseFuncOrArgument( new ParseResult(nucleus.text, nucleus.position), - true, func.allowedInText, func.numArgs, func.numOptionalArgs, argTypes); + true); } else if (symbols[mode][nucleus.text]) { // Otherwise if this is a no-argument function, find the type it // corresponds to in the symbols map diff --git a/src/Settings.js b/src/Settings.js new file mode 100644 index 000000000..49395d9e9 --- /dev/null +++ b/src/Settings.js @@ -0,0 +1,26 @@ +/** + * This is a module for storing settings passed into KaTeX. It correctly handles + * default settings. + */ + +/** + * Helper function for getting a default value if the value is undefined + */ +function get(option, defaultValue) { + return option === undefined ? defaultValue : option; +} + +/** + * The main Settings object + * + * The current options stored are: + * - displayMode: Whether the expression should be typeset by default in + * textstyle or displaystyle (default false) + */ +function Settings(options) { + // allow null options + options = options || {}; + this.displayMode = get(options.displayMode, false); +} + +module.exports = Settings; diff --git a/src/buildTree.js b/src/buildTree.js index 1939331b3..464e6c2f9 100644 --- a/src/buildTree.js +++ b/src/buildTree.js @@ -1135,9 +1135,14 @@ var buildGroup = function(group, options, prev) { /** * Take an entire parse tree, and build it into an appropriate set of nodes. */ -var buildTree = function(tree) { +var buildTree = function(tree, settings) { + var startStyle = Style.TEXT; + if (settings.displayMode) { + startStyle = Style.DISPLAY; + } + // Setup the default options - var options = new Options(Style.TEXT, "size5", ""); + var options = new Options(startStyle, "size5", ""); // Build the expression contained in the tree var expression = buildExpression(tree, options); @@ -1161,7 +1166,11 @@ var buildTree = function(tree) { makeSpan(["katex-inner"], [topStrut, bottomStrut, body]) ]); - return katexNode; + if (settings.displayMode) { + return makeSpan(["katex-display"], [katexNode]); + } else { + return katexNode; + } }; module.exports = buildTree; diff --git a/src/functions.js b/src/functions.js index ec702a8dc..40600a40e 100644 --- a/src/functions.js +++ b/src/functions.js @@ -506,16 +506,6 @@ for (var i = 0; i < duplicatedFunctions.length; i++) { addFuncsWithData(duplicatedFunctions[i].funcs, duplicatedFunctions[i].data); } -// Returns the greediness of a given function. Since greediness is optional, we -// use this function to put in the default value if it is undefined. -var getGreediness = function(func) { - if (functions[func].greediness === undefined) { - return 1; - } else { - return functions[func].greediness; - } -}; - // Set default values of functions for (var f in functions) { if (functions.hasOwnProperty(f)) { @@ -534,6 +524,5 @@ for (var f in functions) { } module.exports = { - funcs: functions, - getGreediness: getGreediness + funcs: functions }; diff --git a/src/parseTree.js b/src/parseTree.js index a778e2c4d..3adba8248 100644 --- a/src/parseTree.js +++ b/src/parseTree.js @@ -8,8 +8,8 @@ var Parser = require("./Parser"); /** * Parses an expression using a Parser, then returns the parsed result. */ -var parseTree = function(toParse) { - var parser = new Parser(toParse); +var parseTree = function(toParse, settings) { + var parser = new Parser(toParse, settings); return parser.parse(); }; diff --git a/static/katex.less b/static/katex.less index fe18a0aff..e394bf730 100644 --- a/static/katex.less +++ b/static/katex.less @@ -1,5 +1,15 @@ @import "fonts.less"; +.katex-display { + display: block; + margin: 1em 0; + text-align: center; + + > .katex { + display: inline-block; + } +} + .katex { font: normal 1.21em KaTeX_Main; line-height: 1.2; diff --git a/test/huxley/Huxleyfile.json b/test/huxley/Huxleyfile.json index 673b58927..06aff0f10 100644 --- a/test/huxley/Huxleyfile.json +++ b/test/huxley/Huxleyfile.json @@ -195,5 +195,11 @@ "name": "Accents", "screenSize": [1024, 768], "url": "http://localhost:7936/test/huxley/test.html?m=\\vec{A}\\vec{x}\\vec x^2\\vec{x}_2^2\\vec{A}^2\\vec{xA}^2" + }, + + { + "name": "DisplayMode", + "screenSize": [1024, 768], + "url": "http://localhost:7936/test/huxley/test.html?m=\\sum_{i=0}^\\infty \\frac{1}{i}&pre=pre&post=post&display=1" } ] diff --git a/test/huxley/Huxleyfolder/DisplayMode.hux/firefox-1.png b/test/huxley/Huxleyfolder/DisplayMode.hux/firefox-1.png new file mode 100644 index 000000000..e560a1f0e Binary files /dev/null and b/test/huxley/Huxleyfolder/DisplayMode.hux/firefox-1.png differ diff --git a/test/huxley/Huxleyfolder/DisplayMode.record.json b/test/huxley/Huxleyfolder/DisplayMode.record.json new file mode 100644 index 000000000..3cae6ac65 --- /dev/null +++ b/test/huxley/Huxleyfolder/DisplayMode.record.json @@ -0,0 +1,5 @@ +[ + { + "action": "screenshot" + } +] diff --git a/test/huxley/Huxleyfolder/Spacing.hux/firefox-1.png b/test/huxley/Huxleyfolder/Spacing.hux/firefox-1.png index 7d33e06bc..1017f9975 100644 Binary files a/test/huxley/Huxleyfolder/Spacing.hux/firefox-1.png and b/test/huxley/Huxleyfolder/Spacing.hux/firefox-1.png differ diff --git a/test/huxley/test.html b/test/huxley/test.html index 6ff6a2281..2b8b4c9fb 100644 --- a/test/huxley/test.html +++ b/test/huxley/test.html @@ -16,13 +16,15 @@ diff --git a/test/katex-spec.js b/test/katex-spec.js index 64d30294c..310cfbef6 100644 --- a/test/katex-spec.js +++ b/test/katex-spec.js @@ -1,17 +1,26 @@ -var katex = require("../katex"); var buildTree = require("../src/buildTree"); -var parseTree = require("../src/parseTree"); +var katex = require("../katex"); var ParseError = require("../src/ParseError"); +var parseTree = require("../src/parseTree"); +var Settings = require("../src/Settings"); + +var defaultSettings = new Settings({}); var getBuilt = function(expr) { expect(expr).toBuild(); - var built = buildTree(parseTree(expr)); + var built = buildTree(parseTree(expr), defaultSettings); // Remove the outer .katex and .katex-inner layers return built.children[0].children[2].children; }; +var getParsed = function(expr) { + expect(expr).toParse(); + + return parseTree(expr, defaultSettings); +}; + beforeEach(function() { jasmine.addMatchers({ toParse: function() { @@ -23,7 +32,7 @@ beforeEach(function() { }; try { - parseTree(actual); + parseTree(actual, defaultSettings); } catch (e) { result.pass = false; if (e instanceof ParseError) { @@ -50,7 +59,7 @@ beforeEach(function() { }; try { - parseTree(actual); + parseTree(actual, defaultSettings); } catch (e) { if (e instanceof ParseError) { result.pass = true; @@ -78,7 +87,7 @@ beforeEach(function() { expect(actual).toParse(); try { - buildTree(parseTree(actual)); + buildTree(parseTree(actual), defaultSettings); } catch (e) { result.pass = false; if (e instanceof ParseError) { @@ -103,8 +112,8 @@ describe("A parser", function() { }); it("should ignore whitespace", function() { - var parseA = parseTree(" x y "); - var parseB = parseTree("xy"); + var parseA = getParsed(" x y "); + var parseB = getParsed("xy"); expect(parseA).toEqual(parseB); }); }); @@ -117,7 +126,7 @@ describe("An ord parser", function() { }); it("should build a list of ords", function() { - var parse = parseTree(expression); + var parse = getParsed(expression); expect(parse).toBeTruthy(); @@ -128,7 +137,7 @@ describe("An ord parser", function() { }); it("should parse the right number of ords", function() { - var parse = parseTree(expression); + var parse = getParsed(expression); expect(parse.length).toBe(expression.length); }); @@ -142,7 +151,7 @@ describe("A bin parser", function() { }); it("should build a list of bins", function() { - var parse = parseTree(expression); + var parse = getParsed(expression); expect(parse).toBeTruthy(); for (var i = 0; i < parse.length; i++) { @@ -160,7 +169,7 @@ describe("A rel parser", function() { }); it("should build a list of rels", function() { - var parse = parseTree(expression); + var parse = getParsed(expression); expect(parse).toBeTruthy(); for (var i = 0; i < parse.length; i++) { @@ -178,7 +187,7 @@ describe("A punct parser", function() { }); it("should build a list of puncts", function() { - var parse = parseTree(expression); + var parse = getParsed(expression); expect(parse).toBeTruthy(); for (var i = 0; i < parse.length; i++) { @@ -196,7 +205,7 @@ describe("An open parser", function() { }); it("should build a list of opens", function() { - var parse = parseTree(expression); + var parse = getParsed(expression); expect(parse).toBeTruthy(); for (var i = 0; i < parse.length; i++) { @@ -214,7 +223,7 @@ describe("A close parser", function() { }); it("should build a list of closes", function() { - var parse = parseTree(expression); + var parse = getParsed(expression); expect(parse).toBeTruthy(); for (var i = 0; i < parse.length; i++) { @@ -253,7 +262,7 @@ describe("A subscript and superscript parser", function() { }); it("should produce supsubs for superscript", function() { - var parse = parseTree("x^2")[0]; + var parse = getParsed("x^2")[0]; expect(parse.type).toBe("supsub"); expect(parse.value.base).toBeDefined(); @@ -262,7 +271,7 @@ describe("A subscript and superscript parser", function() { }); it("should produce supsubs for subscript", function() { - var parse = parseTree("x_3")[0]; + var parse = getParsed("x_3")[0]; expect(parse.type).toBe("supsub"); expect(parse.value.base).toBeDefined(); @@ -271,7 +280,7 @@ describe("A subscript and superscript parser", function() { }); it("should produce supsubs for ^_", function() { - var parse = parseTree("x^2_3")[0]; + var parse = getParsed("x^2_3")[0]; expect(parse.type).toBe("supsub"); expect(parse.value.base).toBeDefined(); @@ -280,7 +289,7 @@ describe("A subscript and superscript parser", function() { }); it("should produce supsubs for _^", function() { - var parse = parseTree("x_3^2")[0]; + var parse = getParsed("x_3^2")[0]; expect(parse.type).toBe("supsub"); expect(parse.value.base).toBeDefined(); @@ -289,8 +298,8 @@ describe("A subscript and superscript parser", function() { }); it("should produce the same thing regardless of order", function() { - var parseA = parseTree("x^2_3"); - var parseB = parseTree("x_3^2"); + var parseA = getParsed("x^2_3"); + var parseB = getParsed("x_3^2"); expect(parseA).toEqual(parseB); }); @@ -350,7 +359,7 @@ describe("A group parser", function() { }); it("should produce a single ord", function() { - var parse = parseTree("{xy}"); + var parse = getParsed("{xy}"); expect(parse.length).toBe(1); @@ -368,7 +377,7 @@ describe("An implicit group parser", function() { }); it("should produce a single object", function() { - var parse = parseTree("\\Large abc"); + var parse = getParsed("\\Large abc"); expect(parse.length).toBe(1); @@ -379,7 +388,7 @@ describe("An implicit group parser", function() { }); it("should apply only after the function", function() { - var parse = parseTree("a \\Large abc"); + var parse = getParsed("a \\Large abc"); expect(parse.length).toBe(2); @@ -390,7 +399,7 @@ describe("An implicit group parser", function() { }); it("should stop at the ends of groups", function() { - var parse = parseTree("a { b \\Large c } d"); + var parse = getParsed("a { b \\Large c } d"); var group = parse[1]; var sizing = group.value[1]; @@ -446,7 +455,7 @@ describe("A frac parser", function() { }); it("should produce a frac", function() { - var parse = parseTree(expression)[0]; + var parse = getParsed(expression)[0]; expect(parse.type).toMatch("frac"); expect(parse.value.numer).toBeDefined(); @@ -460,13 +469,13 @@ describe("A frac parser", function() { }); it("should parse dfrac and tfrac as fracs", function() { - var dfracParse = parseTree(dfracExpression)[0]; + var dfracParse = getParsed(dfracExpression)[0]; expect(dfracParse.type).toMatch("frac"); expect(dfracParse.value.numer).toBeDefined(); expect(dfracParse.value.denom).toBeDefined(); - var tfracParse = parseTree(tfracExpression)[0]; + var tfracParse = getParsed(tfracExpression)[0]; expect(tfracParse.type).toMatch("frac"); expect(tfracParse.value.numer).toBeDefined(); @@ -486,13 +495,13 @@ describe("An over parser", function() { it("should produce a frac", function() { var parse; - parse = parseTree(simpleOver)[0]; + parse = getParsed(simpleOver)[0]; expect(parse.type).toMatch("frac"); expect(parse.value.numer).toBeDefined(); expect(parse.value.denom).toBeDefined(); - parse = parseTree(complexOver)[0]; + parse = getParsed(complexOver)[0]; expect(parse.type).toMatch("frac"); expect(parse.value.numer).toBeDefined(); @@ -500,14 +509,14 @@ describe("An over parser", function() { }); it("should create a numerator from the atoms before \\over", function () { - var parse = parseTree(complexOver)[0]; + var parse = getParsed(complexOver)[0]; var numer = parse.value.numer; expect(numer.value.length).toEqual(4); }); it("should create a demonimator from the atoms after \\over", function () { - var parse = parseTree(complexOver)[0]; + var parse = getParsed(complexOver)[0]; var denom = parse.value.numer; expect(denom.value.length).toEqual(4); @@ -515,9 +524,7 @@ describe("An over parser", function() { it("should handle empty numerators", function () { var emptyNumerator = "\\over x"; - expect(emptyNumerator).toParse(); - - var parse = parseTree(emptyNumerator)[0]; + var parse = getParsed(emptyNumerator)[0]; expect(parse.type).toMatch("frac"); expect(parse.value.numer).toBeDefined(); expect(parse.value.denom).toBeDefined(); @@ -525,9 +532,7 @@ describe("An over parser", function() { it("should handle empty denominators", function () { var emptyDenominator = "1 \\over"; - expect(emptyDenominator).toParse(); - - var parse = parseTree(emptyDenominator)[0]; + var parse = getParsed(emptyDenominator)[0]; expect(parse.type).toMatch("frac"); expect(parse.value.numer).toBeDefined(); expect(parse.value.denom).toBeDefined(); @@ -535,9 +540,7 @@ describe("An over parser", function() { it("should handle \\displaystyle correctly", function () { var displaystyleExpression = "\\displaystyle 1 \\over 2"; - expect(displaystyleExpression).toParse(); - - var parse = parseTree(displaystyleExpression)[0]; + var parse = getParsed(displaystyleExpression)[0]; expect(parse.type).toMatch("frac"); expect(parse.value.numer.value[0].type).toMatch("styling"); expect(parse.value.denom).toBeDefined(); @@ -545,9 +548,7 @@ describe("An over parser", function() { it("should handle nested factions", function () { var nestedOverExpression = "{1 \\over 2} \\over 3"; - expect(nestedOverExpression).toParse(); - - var parse = parseTree(nestedOverExpression)[0]; + var parse = getParsed(nestedOverExpression)[0]; expect(parse.type).toMatch("frac"); expect(parse.value.numer.value[0].type).toMatch("frac"); expect(parse.value.numer.value[0].value.numer.value[0].value).toMatch(1); @@ -574,7 +575,7 @@ describe("A sizing parser", function() { }); it("should produce a sizing node", function() { - var parse = parseTree(sizeExpression)[0]; + var parse = getParsed(sizeExpression)[0]; expect(parse.type).toMatch("sizing"); expect(parse.value).toBeDefined(); @@ -596,14 +597,14 @@ describe("A text parser", function() { }); it("should produce a text", function() { - var parse = parseTree(textExpression)[0]; + var parse = getParsed(textExpression)[0]; expect(parse.type).toMatch("text"); expect(parse.value).toBeDefined(); }); it("should produce textords instead of mathords", function() { - var parse = parseTree(textExpression)[0]; + var parse = getParsed(textExpression)[0]; var group = parse.value.body; expect(group[0].type).toMatch("textord"); @@ -626,7 +627,7 @@ describe("A text parser", function() { }); it("should contract spaces", function() { - var parse = parseTree(spaceTextExpression)[0]; + var parse = getParsed(spaceTextExpression)[0]; var group = parse.value.body; expect(group[0].type).toMatch("spacing"); @@ -636,7 +637,7 @@ describe("A text parser", function() { }); it("should ignore a space before the text group", function() { - var parse = parseTree(leadingSpaceTextExpression)[0]; + var parse = getParsed(leadingSpaceTextExpression)[0]; // [m, o, o] expect(parse.value.body.length).toBe(3); expect( @@ -655,7 +656,7 @@ describe("A color parser", function() { }); it("should build a color node", function() { - var parse = parseTree(colorExpression)[0]; + var parse = getParsed(colorExpression)[0]; expect(parse.type).toMatch("color"); expect(parse.value.color).toBeDefined(); @@ -667,7 +668,7 @@ describe("A color parser", function() { }); it("should correctly extract the custom color", function() { - var parse = parseTree(customColorExpression)[0]; + var parse = getParsed(customColorExpression)[0]; expect(parse.value.color).toMatch("#fA6"); }); @@ -690,20 +691,20 @@ describe("A tie parser", function() { }); it("should produce spacing in math mode", function() { - var parse = parseTree(mathTie); + var parse = getParsed(mathTie); expect(parse[1].type).toMatch("spacing"); }); it("should produce spacing in text mode", function() { - var text = parseTree(textTie)[0]; + var text = getParsed(textTie)[0]; var parse = text.value.body; expect(parse[1].type).toMatch("spacing"); }); it("should not contract with spaces in text mode", function() { - var text = parseTree(textTie)[0]; + var text = getParsed(textTie)[0]; var parse = text.value.body; expect(parse[2].type).toMatch("spacing"); @@ -725,22 +726,22 @@ describe("A delimiter sizing parser", function() { }); it("should produce a delimsizing", function() { - var parse = parseTree(normalDelim)[0]; + var parse = getParsed(normalDelim)[0]; expect(parse.type).toMatch("delimsizing"); }); it("should produce the correct direction delimiter", function() { - var leftParse = parseTree(normalDelim)[0]; - var rightParse = parseTree(bigDelim)[0]; + var leftParse = getParsed(normalDelim)[0]; + var rightParse = getParsed(bigDelim)[0]; expect(leftParse.value.delimType).toMatch("open"); expect(rightParse.value.delimType).toMatch("close"); }); it("should parse the correct size delimiter", function() { - var smallParse = parseTree(normalDelim)[0]; - var bigParse = parseTree(bigDelim)[0]; + var smallParse = getParsed(normalDelim)[0]; + var bigParse = getParsed(bigDelim)[0]; expect(smallParse.value.size).toEqual(1); expect(bigParse.value.size).toEqual(4); @@ -755,7 +756,7 @@ describe("An overline parser", function() { }); it("should produce an overline", function() { - var parse = parseTree(overline)[0]; + var parse = getParsed(overline)[0]; expect(parse.type).toMatch("overline"); }); @@ -785,14 +786,14 @@ describe("A rule parser", function() { }); it("should produce a rule", function() { - var parse = parseTree(emRule)[0]; + var parse = getParsed(emRule)[0]; expect(parse.type).toMatch("rule"); }); it("should list the correct units", function() { - var emParse = parseTree(emRule)[0]; - var exParse = parseTree(exRule)[0]; + var emParse = getParsed(emRule)[0]; + var exParse = getParsed(exRule)[0]; expect(emParse.value.width.unit).toMatch("em"); expect(emParse.value.height.unit).toMatch("em"); @@ -802,16 +803,14 @@ describe("A rule parser", function() { }); it("should parse the number correctly", function() { - var hardNumberParse = parseTree(hardNumberRule)[0]; + var hardNumberParse = getParsed(hardNumberRule)[0]; expect(hardNumberParse.value.width.number).toBeCloseTo(1.24); expect(hardNumberParse.value.height.number).toBeCloseTo(2.45); }); it("should parse negative sizes", function() { - expect("\\rule{-1em}{- 0.2em}").toParse(); - - var parse = parseTree("\\rule{-1em}{- 0.2em}")[0]; + var parse = getParsed("\\rule{-1em}{- 0.2em}")[0]; expect(parse.value.width.number).toBeCloseTo(-1); expect(parse.value.height.number).toBeCloseTo(-0.2); @@ -827,7 +826,7 @@ describe("A left/right parser", function() { }); it("should produce a leftright", function() { - var parse = parseTree(normalLeftRight)[0]; + var parse = getParsed(normalLeftRight)[0]; expect(parse.type).toMatch("leftright"); expect(parse.value.left).toMatch("\\("); @@ -876,7 +875,7 @@ describe("A sqrt parser", function() { }); it("should produce sqrts", function() { - var parse = parseTree(sqrt)[0]; + var parse = getParsed(sqrt)[0]; expect(parse.type).toMatch("sqrt"); }); @@ -1036,18 +1035,16 @@ describe("A style change parser", function() { }); it("should produce the correct style", function() { - var displayParse = parseTree("\\displaystyle x")[0]; + var displayParse = getParsed("\\displaystyle x")[0]; expect(displayParse.value.style).toMatch("display"); - var scriptscriptParse = parseTree("\\scriptscriptstyle x")[0]; + var scriptscriptParse = getParsed("\\scriptscriptstyle x")[0]; expect(scriptscriptParse.value.style).toMatch("scriptscript"); }); it("should only change the style within its group", function() { var text = "a b { c d \\displaystyle e f } g h"; - expect(text).toParse(); - - var parse = parseTree(text); + var parse = getParsed(text); var displayNode = parse[2].value[2]; @@ -1108,13 +1105,13 @@ describe("An accent parser", function() { }); it("should produce accents", function() { - var parse = parseTree("\\vec x")[0]; + var parse = getParsed("\\vec x")[0]; expect(parse.type).toMatch("accent"); }); it("should be grouped more tightly than supsubs", function() { - var parse = parseTree("\\vec x^2")[0]; + var parse = getParsed("\\vec x^2")[0]; expect(parse.type).toMatch("supsub"); }); @@ -1144,7 +1141,7 @@ describe("An accent builder", function() { describe("A parser error", function () { it("should report the position of an error", function () { try { - parseTree("\\sqrt}"); + parseTree("\\sqrt}", defaultSettings); } catch (e) { expect(e.position).toEqual(5); }