|
|
|
import defineFunction, {ordargument} from "../defineFunction"; |
|
import buildCommon from "../buildCommon"; |
|
import {assertNodeType} from "../parseNode"; |
|
import ParseError from "../ParseError"; |
|
|
|
import * as html from "../buildHTML"; |
|
import * as mml from "../buildMathML"; |
|
|
|
defineFunction({ |
|
type: "html", |
|
names: ["\\htmlClass", "\\htmlId", "\\htmlStyle", "\\htmlData"], |
|
props: { |
|
numArgs: 2, |
|
argTypes: ["raw", "original"], |
|
allowedInText: true, |
|
}, |
|
handler: ({parser, funcName, token}, args) => { |
|
const value = assertNodeType(args[0], "raw").string; |
|
const body = args[1]; |
|
|
|
if (parser.settings.strict) { |
|
parser.settings.reportNonstrict("htmlExtension", |
|
"HTML extension is disabled on strict mode"); |
|
} |
|
|
|
let trustContext; |
|
const attributes = {}; |
|
|
|
switch (funcName) { |
|
case "\\htmlClass": |
|
attributes.class = value; |
|
trustContext = { |
|
command: "\\htmlClass", |
|
class: value, |
|
}; |
|
break; |
|
case "\\htmlId": |
|
attributes.id = value; |
|
trustContext = { |
|
command: "\\htmlId", |
|
id: value, |
|
}; |
|
break; |
|
case "\\htmlStyle": |
|
attributes.style = value; |
|
trustContext = { |
|
command: "\\htmlStyle", |
|
style: value, |
|
}; |
|
break; |
|
case "\\htmlData": { |
|
const data = value.split(","); |
|
for (let i = 0; i < data.length; i++) { |
|
const keyVal = data[i].split("="); |
|
if (keyVal.length !== 2) { |
|
throw new ParseError( |
|
"Error parsing key-value for \\htmlData"); |
|
} |
|
attributes["data-" + keyVal[0].trim()] = keyVal[1].trim(); |
|
} |
|
|
|
trustContext = { |
|
command: "\\htmlData", |
|
attributes, |
|
}; |
|
break; |
|
} |
|
default: |
|
throw new Error("Unrecognized html command"); |
|
} |
|
|
|
if (!parser.settings.isTrusted(trustContext)) { |
|
return parser.formatUnsupportedCmd(funcName); |
|
} |
|
return { |
|
type: "html", |
|
mode: parser.mode, |
|
attributes, |
|
body: ordargument(body), |
|
}; |
|
}, |
|
htmlBuilder: (group, options) => { |
|
const elements = html.buildExpression(group.body, options, false); |
|
|
|
const classes = ["enclosing"]; |
|
if (group.attributes.class) { |
|
classes.push(...group.attributes.class.trim().split(/\s+/)); |
|
} |
|
|
|
const span = buildCommon.makeSpan(classes, elements, options); |
|
for (const attr in group.attributes) { |
|
if (attr !== "class" && group.attributes.hasOwnProperty(attr)) { |
|
span.setAttribute(attr, group.attributes[attr]); |
|
} |
|
} |
|
return span; |
|
}, |
|
mathmlBuilder: (group, options) => { |
|
return mml.buildExpressionRow(group.body, options); |
|
}, |
|
}); |
|
|