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
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;
|