mirror of
https://github.com/Smaug123/KaTeX
synced 2025-10-08 12:38:39 +00:00
* chore(deps): update dependency flow-bin to v0.134.0 [skip netlify] * Fix flow errors Co-authored-by: Renovate Bot <bot@renovateapp.com> Co-authored-by: Young Min Kin <mail@ylem.kim>
89 lines
2.5 KiB
JavaScript
89 lines
2.5 KiB
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,
|
|
});
|