forked from Rowland/EG
94 lines
2.4 KiB
JavaScript
94 lines
2.4 KiB
JavaScript
// @flow
|
|
import defineFunction, {ordargument} from "../defineFunction";
|
|
import buildCommon from "../buildCommon";
|
|
import {assertNodeType} from "../parseNode";
|
|
import {MathNode} from "../mathMLTree";
|
|
|
|
import * as html from "../buildHTML";
|
|
import * as mml from "../buildMathML";
|
|
|
|
defineFunction({
|
|
type: "href",
|
|
names: ["\\href"],
|
|
props: {
|
|
numArgs: 2,
|
|
argTypes: ["url", "original"],
|
|
allowedInText: true,
|
|
},
|
|
handler: ({parser}, args) => {
|
|
const body = args[1];
|
|
const href = assertNodeType(args[0], "url").url;
|
|
|
|
if (!parser.settings.isTrusted({
|
|
command: "\\href",
|
|
url: href,
|
|
})) {
|
|
return parser.formatUnsupportedCmd("\\href");
|
|
}
|
|
|
|
return {
|
|
type: "href",
|
|
mode: parser.mode,
|
|
href,
|
|
body: ordargument(body),
|
|
};
|
|
},
|
|
htmlBuilder: (group, options) => {
|
|
const elements = html.buildExpression(group.body, options, false);
|
|
return buildCommon.makeAnchor(group.href, [], elements, options);
|
|
},
|
|
mathmlBuilder: (group, options) => {
|
|
let math = mml.buildExpressionRow(group.body, options);
|
|
if (!(math instanceof MathNode)) {
|
|
math = new MathNode("mrow", [math]);
|
|
}
|
|
math.setAttribute("href", group.href);
|
|
return math;
|
|
},
|
|
});
|
|
|
|
defineFunction({
|
|
type: "href",
|
|
names: ["\\url"],
|
|
props: {
|
|
numArgs: 1,
|
|
argTypes: ["url"],
|
|
allowedInText: true,
|
|
},
|
|
handler: ({parser}, args) => {
|
|
const href = assertNodeType(args[0], "url").url;
|
|
|
|
if (!parser.settings.isTrusted({
|
|
command: "\\url",
|
|
url: href,
|
|
})) {
|
|
return parser.formatUnsupportedCmd("\\url");
|
|
}
|
|
|
|
const chars = [];
|
|
for (let i = 0; i < href.length; i++) {
|
|
let c = href[i];
|
|
if (c === "~") {
|
|
c = "\\textasciitilde";
|
|
}
|
|
chars.push({
|
|
type: "textord",
|
|
mode: "text",
|
|
text: c,
|
|
});
|
|
}
|
|
const body = {
|
|
type: "text",
|
|
mode: parser.mode,
|
|
font: "\\texttt",
|
|
body: chars,
|
|
};
|
|
return {
|
|
type: "href",
|
|
mode: parser.mode,
|
|
href,
|
|
body: ordargument(body),
|
|
};
|
|
},
|
|
});
|