|
|
|
import buildCommon from "../buildCommon"; |
|
import defineFunction from "../defineFunction"; |
|
import mathMLTree from "../mathMLTree"; |
|
import {makeEm} from "../units"; |
|
|
|
import * as html from "../buildHTML"; |
|
import * as mml from "../buildMathML"; |
|
|
|
import type Options from "../Options"; |
|
import type {AnyParseNode} from "../parseNode"; |
|
import type {HtmlBuilder} from "../defineFunction"; |
|
import type {documentFragment as HtmlDocumentFragment} from "../domTree"; |
|
|
|
export function sizingGroup( |
|
value: AnyParseNode[], |
|
options: Options, |
|
baseOptions: Options, |
|
): HtmlDocumentFragment { |
|
const inner = html.buildExpression(value, options, false); |
|
const multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; |
|
|
|
|
|
|
|
for (let i = 0; i < inner.length; i++) { |
|
const pos = inner[i].classes.indexOf("sizing"); |
|
if (pos < 0) { |
|
Array.prototype.push.apply(inner[i].classes, |
|
options.sizingClasses(baseOptions)); |
|
} else if (inner[i].classes[pos + 1] === "reset-size" + options.size) { |
|
|
|
|
|
|
|
inner[i].classes[pos + 1] = "reset-size" + baseOptions.size; |
|
} |
|
|
|
inner[i].height *= multiplier; |
|
inner[i].depth *= multiplier; |
|
} |
|
|
|
return buildCommon.makeFragment(inner); |
|
} |
|
|
|
const sizeFuncs = [ |
|
"\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", |
|
"\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge", |
|
]; |
|
|
|
export const htmlBuilder: HtmlBuilder<"sizing"> = (group, options) => { |
|
|
|
|
|
|
|
const newOptions = options.havingSize(group.size); |
|
return sizingGroup(group.body, newOptions, options); |
|
}; |
|
|
|
defineFunction({ |
|
type: "sizing", |
|
names: sizeFuncs, |
|
props: { |
|
numArgs: 0, |
|
allowedInText: true, |
|
}, |
|
handler: ({breakOnTokenText, funcName, parser}, args) => { |
|
const body = parser.parseExpression(false, breakOnTokenText); |
|
|
|
return { |
|
type: "sizing", |
|
mode: parser.mode, |
|
|
|
size: sizeFuncs.indexOf(funcName) + 1, |
|
body, |
|
}; |
|
}, |
|
htmlBuilder, |
|
mathmlBuilder: (group, options) => { |
|
const newOptions = options.havingSize(group.size); |
|
const inner = mml.buildExpression(group.body, newOptions); |
|
|
|
const node = new mathMLTree.MathNode("mstyle", inner); |
|
|
|
|
|
|
|
|
|
|
|
|
|
node.setAttribute("mathsize", makeEm(newOptions.sizeMultiplier)); |
|
|
|
return node; |
|
}, |
|
}); |
|
|