You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1.5 KiB
JavaScript

// @flow
/**
* Provides a single function for parsing an expression using a Parser
* TODO(emily): Remove this
*/
import Parser from "./Parser";
import ParseError from "./ParseError";
import {Token} from "./Token";
import type Settings from "./Settings";
import type {AnyParseNode} from "./parseNode";
/**
* Parses an expression using a Parser, then returns the parsed result.
*/
const parseTree = function(toParse: string, settings: Settings): AnyParseNode[] {
if (!(typeof toParse === 'string' || toParse instanceof String)) {
throw new TypeError('KaTeX can only parse string typed expression');
}
const parser = new Parser(toParse, settings);
// Blank out any \df@tag to avoid spurious "Duplicate \tag" errors
delete parser.gullet.macros.current["\\df@tag"];
let tree = parser.parse();
// Prevent a color definition from persisting between calls to katex.render().
delete parser.gullet.macros.current["\\current@color"];
delete parser.gullet.macros.current["\\color"];
// If the input used \tag, it will set the \df@tag macro to the tag.
// In this case, we separately parse the tag and wrap the tree.
if (parser.gullet.macros.get("\\df@tag")) {
if (!settings.displayMode) {
throw new ParseError("\\tag works only in display equations");
}
tree = [{
type: "tag",
mode: "text",
body: tree,
tag: parser.subparse([new Token("\\df@tag")]),
}];
}
return tree;
};
export default parseTree;