katex
Version:
Fast math typesetting for the web.
89 lines (75 loc) • 2.52 kB
JavaScript
// @flow
import defineFunction, {ordargument} from "../defineFunction";
import buildCommon from "../buildCommon";
import mathMLTree from "../mathMLTree";
import {assertNodeType} from "../parseNode";
import type {AnyParseNode} from '../parseNode';
import * as html from "../buildHTML";
import * as mml from "../buildMathML";
const htmlBuilder = (group, options) => {
const elements = html.buildExpression(
group.body,
options.withColor(group.color),
false
);
// \color isn't supposed to affect the type of the elements it contains.
// To accomplish this, we wrap the results in a fragment, so the inner
// elements will be able to directly interact with their neighbors. For
// example, `\color{red}{2 +} 3` has the same spacing as `2 + 3`
return buildCommon.makeFragment(elements);
};
const mathmlBuilder = (group, options) => {
const inner = mml.buildExpression(group.body,
options.withColor(group.color));
const node = new mathMLTree.MathNode("mstyle", inner);
node.setAttribute("mathcolor", group.color);
return node;
};
defineFunction({
type: "color",
names: ["\\textcolor"],
props: {
numArgs: 2,
allowedInText: true,
argTypes: ["color", "original"],
},
handler({parser}, args) {
const color = assertNodeType(args[0], "color-token").color;
const body = args[1];
return {
type: "color",
mode: parser.mode,
color,
body: (ordargument(body): AnyParseNode[]),
};
},
htmlBuilder,
mathmlBuilder,
});
defineFunction({
type: "color",
names: ["\\color"],
props: {
numArgs: 1,
allowedInText: true,
argTypes: ["color"],
},
handler({parser, breakOnTokenText}, args) {
const color = assertNodeType(args[0], "color-token").color;
// Set macro \current@color in current namespace to store the current
// color, mimicking the behavior of color.sty.
// This is currently used just to correctly color a \right
// that follows a \color command.
parser.gullet.macros.set("\\current@color", color);
// Parse out the implicit body that should be colored.
const body: AnyParseNode[] = parser.parseExpression(true, breakOnTokenText);
return {
type: "color",
mode: parser.mode,
color,
body,
};
},
htmlBuilder,
mathmlBuilder,
});