73 lines
2.3 KiB
JavaScript
73 lines
2.3 KiB
JavaScript
// @flow
|
|
import defineFunction from "../defineFunction";
|
|
import mathMLTree from "../mathMLTree";
|
|
import Style from "../Style";
|
|
import {sizingGroup} from "./sizing";
|
|
|
|
import * as mml from "../buildMathML";
|
|
|
|
const styleMap = {
|
|
"display": Style.DISPLAY,
|
|
"text": Style.TEXT,
|
|
"script": Style.SCRIPT,
|
|
"scriptscript": Style.SCRIPTSCRIPT,
|
|
};
|
|
|
|
defineFunction({
|
|
type: "styling",
|
|
names: [
|
|
"\\displaystyle", "\\textstyle", "\\scriptstyle",
|
|
"\\scriptscriptstyle",
|
|
],
|
|
props: {
|
|
numArgs: 0,
|
|
allowedInText: true,
|
|
primitive: true,
|
|
},
|
|
handler({breakOnTokenText, funcName, parser}, args) {
|
|
// parse out the implicit body
|
|
const body = parser.parseExpression(true, breakOnTokenText);
|
|
|
|
// TODO: Refactor to avoid duplicating styleMap in multiple places (e.g.
|
|
// here and in buildHTML and de-dupe the enumeration of all the styles).
|
|
// $FlowFixMe: The names above exactly match the styles.
|
|
const style: StyleStr = funcName.slice(1, funcName.length - 5);
|
|
return {
|
|
type: "styling",
|
|
mode: parser.mode,
|
|
// Figure out what style to use by pulling out the style from
|
|
// the function name
|
|
style,
|
|
body,
|
|
};
|
|
},
|
|
htmlBuilder(group, options) {
|
|
// Style changes are handled in the TeXbook on pg. 442, Rule 3.
|
|
const newStyle = styleMap[group.style];
|
|
const newOptions = options.havingStyle(newStyle).withFont('');
|
|
return sizingGroup(group.body, newOptions, options);
|
|
},
|
|
mathmlBuilder(group, options) {
|
|
// Figure out what style we're changing to.
|
|
const newStyle = styleMap[group.style];
|
|
const newOptions = options.havingStyle(newStyle);
|
|
|
|
const inner = mml.buildExpression(group.body, newOptions);
|
|
|
|
const node = new mathMLTree.MathNode("mstyle", inner);
|
|
|
|
const styleAttributes = {
|
|
"display": ["0", "true"],
|
|
"text": ["0", "false"],
|
|
"script": ["1", "false"],
|
|
"scriptscript": ["2", "false"],
|
|
};
|
|
|
|
const attr = styleAttributes[group.style];
|
|
|
|
node.setAttribute("scriptlevel", attr[0]);
|
|
node.setAttribute("displaystyle", attr[1]);
|
|
|
|
return node;
|
|
},
|
|
});
|