mirror of
https://github.com/Smaug123/KaTeX
synced 2025-10-05 03:08:40 +00:00
Revert "Remove trailing commas for IE 9 compatibility"
This reverts commit 4d2e46e7f6
.
Having trailing commans makes diffs easier to read as it avoids modifying a
line just to add a trailing comma if there is another item to add at the end
of a list. There are plans to switch to ES6 notation and to translate that
to ES5 as part of the build process. Since that translation would remove
trailing commas, the IE9 problems that originally motivated the commit
should vanish soon.
This commit is contained in:
@@ -4,9 +4,7 @@
|
||||
"brace-style": [2, "1tbs", { "allowSingleLine": true }],
|
||||
// We'd possibly like to remove the 'properties': 'never' one day.
|
||||
"camelcase": [2, { "properties": "never" }],
|
||||
// IE 9 doesn't like trailing commas. TODO(emily): change this back to
|
||||
// always-multiline once we babelify the code.
|
||||
"comma-dangle": [2, "never"],
|
||||
"comma-dangle": [2, "always-multiline"],
|
||||
"comma-spacing": [2, { "before": false, "after": true }],
|
||||
"constructor-super": 2,
|
||||
"curly": 2,
|
||||
|
@@ -13,7 +13,7 @@ beforeEach(function() {
|
||||
compare: function(actual, left, right, result) {
|
||||
var message = {
|
||||
pass: true,
|
||||
message: "'" + actual + "' split correctly"
|
||||
message: "'" + actual + "' split correctly",
|
||||
};
|
||||
|
||||
var startData = [{type: "text", data: actual}];
|
||||
@@ -59,9 +59,9 @@ beforeEach(function() {
|
||||
}
|
||||
|
||||
return message;
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
@@ -75,7 +75,7 @@ describe("A delimiter splitter", function() {
|
||||
"(", ")",
|
||||
[
|
||||
{type: "text", data: "hello "},
|
||||
{type: "text", data: "( world"}
|
||||
{type: "text", data: "( world"},
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -83,7 +83,7 @@ describe("A delimiter splitter", function() {
|
||||
expect("hello ) world").toSplitInto(
|
||||
"(", ")",
|
||||
[
|
||||
{type: "text", data: "hello ) world"}
|
||||
{type: "text", data: "hello ) world"},
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -94,7 +94,7 @@ describe("A delimiter splitter", function() {
|
||||
{type: "text", data: "hello "},
|
||||
{type: "math", data: " world ",
|
||||
rawData: "( world )", display: false},
|
||||
{type: "text", data: " boo"}
|
||||
{type: "text", data: " boo"},
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -105,7 +105,7 @@ describe("A delimiter splitter", function() {
|
||||
{type: "text", data: "hello "},
|
||||
{type: "math", data: " world ",
|
||||
rawData: "[[ world ]]", display: false},
|
||||
{type: "text", data: " boo"}
|
||||
{type: "text", data: " boo"},
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -119,7 +119,7 @@ describe("A delimiter splitter", function() {
|
||||
{type: "text", data: " boo "},
|
||||
{type: "math", data: " more ",
|
||||
rawData: "( more )", display: false},
|
||||
{type: "text", data: " stuff"}
|
||||
{type: "text", data: " stuff"},
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -131,7 +131,7 @@ describe("A delimiter splitter", function() {
|
||||
{type: "math", data: " world ",
|
||||
rawData: "( world )", display: false},
|
||||
{type: "text", data: " boo "},
|
||||
{type: "text", data: "( left"}
|
||||
{type: "text", data: "( left"},
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -142,7 +142,7 @@ describe("A delimiter splitter", function() {
|
||||
{type: "text", data: "hello "},
|
||||
{type: "math", data: " world { ) } ",
|
||||
rawData: "( world { ) } )", display: false},
|
||||
{type: "text", data: " boo"}
|
||||
{type: "text", data: " boo"},
|
||||
]);
|
||||
|
||||
expect("hello ( world { { } ) } ) boo").toSplitInto(
|
||||
@@ -151,7 +151,7 @@ describe("A delimiter splitter", function() {
|
||||
{type: "text", data: "hello "},
|
||||
{type: "math", data: " world { { } ) } ",
|
||||
rawData: "( world { { } ) } )", display: false},
|
||||
{type: "text", data: " boo"}
|
||||
{type: "text", data: " boo"},
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -162,7 +162,7 @@ describe("A delimiter splitter", function() {
|
||||
{type: "text", data: "hello "},
|
||||
{type: "math", data: " world \\) ",
|
||||
rawData: "( world \\) )", display: false},
|
||||
{type: "text", data: " boo"}
|
||||
{type: "text", data: " boo"},
|
||||
]);
|
||||
|
||||
/* TODO(emily): make this work maybe?
|
||||
@@ -184,7 +184,7 @@ describe("A delimiter splitter", function() {
|
||||
{type: "text", data: "hello "},
|
||||
{type: "math", data: " world ",
|
||||
rawData: "$ world $", display: false},
|
||||
{type: "text", data: " boo"}
|
||||
{type: "text", data: " boo"},
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -196,7 +196,7 @@ describe("A delimiter splitter", function() {
|
||||
{type: "text", data: "hello "},
|
||||
{type: "math", data: " world ",
|
||||
rawData: "( world )", display: true},
|
||||
{type: "text", data: " boo"}
|
||||
{type: "text", data: " boo"},
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -204,7 +204,7 @@ describe("A delimiter splitter", function() {
|
||||
var startData = [
|
||||
{type: "text", data: "hello ( world ) boo"},
|
||||
{type: "math", data: "math", rawData: "(math)", display: true},
|
||||
{type: "text", data: "hello ( world ) boo"}
|
||||
{type: "text", data: "hello ( world ) boo"},
|
||||
];
|
||||
|
||||
expect(splitAtDelimiters(startData, "(", ")", false)).toEqual(
|
||||
@@ -217,7 +217,7 @@ describe("A delimiter splitter", function() {
|
||||
{type: "text", data: "hello "},
|
||||
{type: "math", data: " world ",
|
||||
rawData: "( world )", display: false},
|
||||
{type: "text", data: " boo"}
|
||||
{type: "text", data: " boo"},
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -225,7 +225,7 @@ describe("A delimiter splitter", function() {
|
||||
var startData = [
|
||||
{type: "text", data: "hello ( world ) boo"},
|
||||
{type: "math", data: "hello ( world ) boo",
|
||||
rawData: "(hello ( world ) boo)", display: true}
|
||||
rawData: "(hello ( world ) boo)", display: true},
|
||||
];
|
||||
|
||||
expect(splitAtDelimiters(startData, "(", ")", false)).toEqual(
|
||||
@@ -235,7 +235,7 @@ describe("A delimiter splitter", function() {
|
||||
rawData: "( world )", display: false},
|
||||
{type: "text", data: " boo"},
|
||||
{type: "math", data: "hello ( world ) boo",
|
||||
rawData: "(hello ( world ) boo)", display: true}
|
||||
rawData: "(hello ( world ) boo)", display: true},
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
@@ -27,7 +27,7 @@ var renderMathInText = function(text, delimiters) {
|
||||
var math = data[i].data;
|
||||
try {
|
||||
katex.render(math, span, {
|
||||
displayMode: data[i].display
|
||||
displayMode: data[i].display,
|
||||
});
|
||||
} catch (e) {
|
||||
if (!(e instanceof katex.ParseError)) {
|
||||
@@ -73,14 +73,14 @@ var defaultOptions = {
|
||||
delimiters: [
|
||||
{left: "$$", right: "$$", display: true},
|
||||
{left: "\\[", right: "\\]", display: true},
|
||||
{left: "\\(", right: "\\)", display: false}
|
||||
{left: "\\(", right: "\\)", display: false},
|
||||
// LaTeX uses this, but it ruins the display of normal `$` in text:
|
||||
// {left: "$", right: "$", display: false},
|
||||
],
|
||||
|
||||
ignoredTags: [
|
||||
"script", "noscript", "style", "textarea", "pre", "code"
|
||||
]
|
||||
"script", "noscript", "style", "textarea", "pre", "code",
|
||||
],
|
||||
};
|
||||
|
||||
var extend = function(obj) {
|
||||
|
@@ -43,7 +43,7 @@ var splitAtDelimiters = function(startData, leftDelim, rightDelim, display) {
|
||||
currIndex = nextIndex;
|
||||
finalData.push({
|
||||
type: "text",
|
||||
data: text.slice(0, currIndex)
|
||||
data: text.slice(0, currIndex),
|
||||
});
|
||||
lookingForLeft = false;
|
||||
}
|
||||
@@ -57,7 +57,7 @@ var splitAtDelimiters = function(startData, leftDelim, rightDelim, display) {
|
||||
|
||||
finalData.push({
|
||||
type: "text",
|
||||
data: text.slice(currIndex, nextIndex)
|
||||
data: text.slice(currIndex, nextIndex),
|
||||
});
|
||||
|
||||
currIndex = nextIndex;
|
||||
@@ -78,7 +78,7 @@ var splitAtDelimiters = function(startData, leftDelim, rightDelim, display) {
|
||||
rawData: text.slice(
|
||||
currIndex,
|
||||
nextIndex + rightDelim.length),
|
||||
display: display
|
||||
display: display,
|
||||
});
|
||||
|
||||
currIndex = nextIndex + rightDelim.length;
|
||||
@@ -89,7 +89,7 @@ var splitAtDelimiters = function(startData, leftDelim, rightDelim, display) {
|
||||
|
||||
finalData.push({
|
||||
type: "text",
|
||||
data: text.slice(currIndex)
|
||||
data: text.slice(currIndex),
|
||||
});
|
||||
} else {
|
||||
finalData.push(startData[i]);
|
||||
|
@@ -25,52 +25,52 @@ var opts = require("nomnom")
|
||||
.option("browser", {
|
||||
abbr: "b",
|
||||
"default": "firefox",
|
||||
help: "Name of the browser to use"
|
||||
help: "Name of the browser to use",
|
||||
})
|
||||
.option("container", {
|
||||
abbr: "c",
|
||||
type: "string",
|
||||
help: "Name or ID of a running docker container to contact"
|
||||
help: "Name or ID of a running docker container to contact",
|
||||
})
|
||||
.option("seleniumURL", {
|
||||
full: "selenium-url",
|
||||
help: "Full URL of the Selenium web driver"
|
||||
help: "Full URL of the Selenium web driver",
|
||||
})
|
||||
.option("seleniumIP", {
|
||||
full: "selenium-ip",
|
||||
help: "IP address of the Selenium web driver"
|
||||
help: "IP address of the Selenium web driver",
|
||||
})
|
||||
.option("seleniumPort", {
|
||||
full: "selenium-port",
|
||||
"default": 4444,
|
||||
help: "Port number of the Selenium web driver"
|
||||
help: "Port number of the Selenium web driver",
|
||||
})
|
||||
.option("katexURL", {
|
||||
full: "katex-url",
|
||||
help: "Full URL of the KaTeX development server"
|
||||
help: "Full URL of the KaTeX development server",
|
||||
})
|
||||
.option("katexIP", {
|
||||
full: "katex-ip",
|
||||
help: "Full URL of the KaTeX development server"
|
||||
help: "Full URL of the KaTeX development server",
|
||||
})
|
||||
.option("katexPort", {
|
||||
full: "katex-port",
|
||||
help: "Port number of the KaTeX development server"
|
||||
help: "Port number of the KaTeX development server",
|
||||
})
|
||||
.option("include", {
|
||||
abbr: "i",
|
||||
help: "Comma-separated list of test cases to process"
|
||||
help: "Comma-separated list of test cases to process",
|
||||
})
|
||||
.option("exclude", {
|
||||
abbr: "x",
|
||||
help: "Comma-separated list of test cases to exclude"
|
||||
help: "Comma-separated list of test cases to exclude",
|
||||
})
|
||||
.option("verify", {
|
||||
flag: true,
|
||||
help: "Check whether screenshot matches current file content"
|
||||
help: "Check whether screenshot matches current file content",
|
||||
})
|
||||
.option("wait", {
|
||||
help: "Wait this many seconds between page load and screenshot"
|
||||
help: "Wait this many seconds between page load and screenshot",
|
||||
})
|
||||
.parse();
|
||||
|
||||
@@ -208,7 +208,7 @@ function tryConnect() {
|
||||
}
|
||||
var sock = net.connect({
|
||||
host: seleniumIP,
|
||||
port: +seleniumPort
|
||||
port: +seleniumPort,
|
||||
});
|
||||
sock.on("connect", function() {
|
||||
sock.end();
|
||||
@@ -278,7 +278,7 @@ function imageDimensions(img) {
|
||||
return {
|
||||
buf: buf,
|
||||
width: buf.readUInt32BE(16),
|
||||
height: buf.readUInt32BE(20)
|
||||
height: buf.readUInt32BE(20),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -399,7 +399,7 @@ function takeScreenshot(key) {
|
||||
}
|
||||
}
|
||||
var opt = new jspngopt.Optimizer({
|
||||
pako: pako
|
||||
pako: pako,
|
||||
});
|
||||
var buf = opt.bufferSync(img.buf);
|
||||
if (loadExpected) {
|
||||
|
@@ -49,7 +49,7 @@ Q.all([
|
||||
readFile(path.join(ssDir, "test.tex"), "utf-8"),
|
||||
ensureDir(tmpDir),
|
||||
ensureDir(teximgDir),
|
||||
ensureDir(diffDir)
|
||||
ensureDir(diffDir),
|
||||
]).spread(function(data) {
|
||||
template = data;
|
||||
// dirs have been created, template has been read, now rasterize.
|
||||
@@ -80,14 +80,14 @@ function processTestCase(key) {
|
||||
var fftLatex = writeFile(texFile, tex).then(function() {
|
||||
// Step 2: call "pdflatex key" to create key.pdf
|
||||
return execFile("pdflatex", [
|
||||
"-interaction", "nonstopmode", key
|
||||
"-interaction", "nonstopmode", key,
|
||||
], {cwd: tmpDir});
|
||||
}).then(function() {
|
||||
console.log("Typeset " + key);
|
||||
// Step 3: call "convert ... key.pdf key.png" to create key.png
|
||||
return execFile("convert", [
|
||||
"-density", dpi, "-units", "PixelsPerInch", "-flatten",
|
||||
"-depth", "8", pdfFile, pngFile
|
||||
"-depth", "8", pdfFile, pngFile,
|
||||
]);
|
||||
}).then(function() {
|
||||
console.log("Rasterized " + key);
|
||||
@@ -168,7 +168,7 @@ function processTestCase(key) {
|
||||
// First image is red, second green, third blue channel of result
|
||||
"-channel", "RGB", "-combine",
|
||||
"-trim", // remove everything with the same color as the corners
|
||||
diffFile // output file name
|
||||
diffFile, // output file name
|
||||
]);
|
||||
}).then(function() {
|
||||
console.log("Compared " + key);
|
||||
@@ -245,7 +245,7 @@ function fftImage(image) {
|
||||
real: real,
|
||||
imag: imag,
|
||||
width: image.width,
|
||||
height: image.height
|
||||
height: image.height,
|
||||
};
|
||||
}
|
||||
|
||||
|
2
katex.js
2
katex.js
@@ -70,5 +70,5 @@ module.exports = {
|
||||
* to change. Use at your own risk.
|
||||
*/
|
||||
__parse: generateParseTree,
|
||||
ParseError: ParseError
|
||||
ParseError: ParseError,
|
||||
};
|
||||
|
@@ -64,7 +64,7 @@ app.get("/katex.css", function(req, res, next) {
|
||||
|
||||
less.render(data, {
|
||||
paths: [path.join(__dirname, "static")],
|
||||
filename: "katex.less"
|
||||
filename: "katex.less",
|
||||
}, function(err, output) {
|
||||
if (err) {
|
||||
console.error(String(err));
|
||||
|
@@ -46,7 +46,7 @@ Options.prototype.extend = function(extension) {
|
||||
parentStyle: this.style,
|
||||
parentSize: this.size,
|
||||
phantom: this.phantom,
|
||||
font: this.font
|
||||
font: this.font,
|
||||
};
|
||||
|
||||
for (var key in extension) {
|
||||
@@ -63,7 +63,7 @@ Options.prototype.extend = function(extension) {
|
||||
*/
|
||||
Options.prototype.withStyle = function(style) {
|
||||
return this.extend({
|
||||
style: style
|
||||
style: style,
|
||||
});
|
||||
};
|
||||
|
||||
@@ -72,7 +72,7 @@ Options.prototype.withStyle = function(style) {
|
||||
*/
|
||||
Options.prototype.withSize = function(size) {
|
||||
return this.extend({
|
||||
size: size
|
||||
size: size,
|
||||
});
|
||||
};
|
||||
|
||||
@@ -81,7 +81,7 @@ Options.prototype.withSize = function(size) {
|
||||
*/
|
||||
Options.prototype.withColor = function(color) {
|
||||
return this.extend({
|
||||
color: color
|
||||
color: color,
|
||||
});
|
||||
};
|
||||
|
||||
@@ -90,7 +90,7 @@ Options.prototype.withColor = function(color) {
|
||||
*/
|
||||
Options.prototype.withPhantom = function() {
|
||||
return this.extend({
|
||||
phantom: true
|
||||
phantom: true,
|
||||
});
|
||||
};
|
||||
|
||||
@@ -99,7 +99,7 @@ Options.prototype.withPhantom = function() {
|
||||
*/
|
||||
Options.prototype.withFont = function(font) {
|
||||
return this.extend({
|
||||
font: font || this.font
|
||||
font: font || this.font,
|
||||
});
|
||||
};
|
||||
|
||||
@@ -171,7 +171,7 @@ var colorMap = {
|
||||
"katex-grayH": "#3b3e40",
|
||||
"katex-grayI": "#21242c",
|
||||
"katex-kaBlue": "#314453",
|
||||
"katex-kaGreen": "#71B307"
|
||||
"katex-kaGreen": "#71B307",
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -277,7 +277,7 @@ Parser.prototype.handleUnsupportedCmd = function() {
|
||||
"text",
|
||||
{
|
||||
body: textordArray,
|
||||
type: "text"
|
||||
type: "text",
|
||||
},
|
||||
this.mode);
|
||||
|
||||
@@ -286,7 +286,7 @@ Parser.prototype.handleUnsupportedCmd = function() {
|
||||
{
|
||||
color: this.settings.errorColor,
|
||||
value: [textNode],
|
||||
type: "color"
|
||||
type: "color",
|
||||
},
|
||||
this.mode);
|
||||
|
||||
@@ -367,7 +367,7 @@ Parser.prototype.parseAtom = function() {
|
||||
return new ParseNode("supsub", {
|
||||
base: base,
|
||||
sup: superscript,
|
||||
sub: subscript
|
||||
sub: subscript,
|
||||
}, this.mode);
|
||||
} else {
|
||||
// Otherwise return the original body
|
||||
@@ -378,12 +378,12 @@ Parser.prototype.parseAtom = function() {
|
||||
// A list of the size-changing functions, for use in parseImplicitGroup
|
||||
var sizeFuncs = [
|
||||
"\\tiny", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize",
|
||||
"\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"
|
||||
"\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge",
|
||||
];
|
||||
|
||||
// A list of the style-changing functions, for use in parseImplicitGroup
|
||||
var styleFuncs = [
|
||||
"\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"
|
||||
"\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle",
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -422,7 +422,7 @@ Parser.prototype.parseImplicitGroup = function() {
|
||||
return new ParseNode("leftright", {
|
||||
body: body,
|
||||
left: left.value.value,
|
||||
right: right.value.value
|
||||
right: right.value.value,
|
||||
}, this.mode);
|
||||
} else if (func === "\\begin") {
|
||||
// begin...end is similar to left...right
|
||||
@@ -440,7 +440,7 @@ Parser.prototype.parseImplicitGroup = function() {
|
||||
mode: this.mode,
|
||||
envName: envName,
|
||||
parser: this,
|
||||
positions: args.pop()
|
||||
positions: args.pop(),
|
||||
};
|
||||
var result = env.handler(context, args);
|
||||
this.expect("\\end", false);
|
||||
@@ -460,7 +460,7 @@ Parser.prototype.parseImplicitGroup = function() {
|
||||
return new ParseNode("sizing", {
|
||||
// Figure out what size to use based on the list of functions above
|
||||
size: "size" + (utils.indexOf(sizeFuncs, func) + 1),
|
||||
value: body
|
||||
value: body,
|
||||
}, this.mode);
|
||||
} else if (utils.contains(styleFuncs, func)) {
|
||||
// If we see a styling function, parse out the implict body
|
||||
@@ -469,7 +469,7 @@ Parser.prototype.parseImplicitGroup = function() {
|
||||
// Figure out what style to use by pulling out the style from
|
||||
// the function name
|
||||
style: func.slice(1, func.length - 5),
|
||||
value: body
|
||||
value: body,
|
||||
}, this.mode);
|
||||
} else {
|
||||
// Defer to parseFunction if it's not a function we handle
|
||||
@@ -520,7 +520,7 @@ Parser.prototype.callFunction = function(name, args, positions, token) {
|
||||
funcName: name,
|
||||
parser: this,
|
||||
positions: positions,
|
||||
token: token
|
||||
token: token,
|
||||
};
|
||||
return functions[name].handler(context, args);
|
||||
};
|
||||
@@ -731,7 +731,7 @@ Parser.prototype.parseSizeGroup = function(optional) {
|
||||
}
|
||||
var data = {
|
||||
number: +(match[1] + match[2]), // sign + magnitude, cast to number
|
||||
unit: match[3]
|
||||
unit: match[3],
|
||||
};
|
||||
if (data.unit !== "em" && data.unit !== "ex" && data.unit !== "mu") {
|
||||
throw new ParseError("Invalid unit: '" + data.unit + "'", res);
|
||||
|
@@ -109,7 +109,7 @@ var sizeNames = [
|
||||
"displaystyle textstyle",
|
||||
"textstyle",
|
||||
"scriptstyle",
|
||||
"scriptscriptstyle"
|
||||
"scriptscriptstyle",
|
||||
];
|
||||
|
||||
// Reset names for the different sizes
|
||||
@@ -117,7 +117,7 @@ var resetNames = [
|
||||
"reset-textstyle",
|
||||
"reset-textstyle",
|
||||
"reset-scriptstyle",
|
||||
"reset-scriptscriptstyle"
|
||||
"reset-scriptscriptstyle",
|
||||
];
|
||||
|
||||
// Instances of the different styles
|
||||
@@ -129,7 +129,7 @@ var styles = [
|
||||
new Style(S, 2, 0.7, false),
|
||||
new Style(Sc, 2, 0.7, true),
|
||||
new Style(SS, 3, 0.5, false),
|
||||
new Style(SSc, 3, 0.5, true)
|
||||
new Style(SSc, 3, 0.5, true),
|
||||
];
|
||||
|
||||
// Lookup tables for switching from one style to another
|
||||
@@ -145,5 +145,5 @@ module.exports = {
|
||||
DISPLAY: styles[D],
|
||||
TEXT: styles[T],
|
||||
SCRIPT: styles[S],
|
||||
SCRIPTSCRIPT: styles[SS]
|
||||
SCRIPTSCRIPT: styles[SS],
|
||||
};
|
||||
|
@@ -20,14 +20,14 @@ var greekCapitals = [
|
||||
"\\Upsilon",
|
||||
"\\Phi",
|
||||
"\\Psi",
|
||||
"\\Omega"
|
||||
"\\Omega",
|
||||
];
|
||||
|
||||
// The following have to be loaded from Main-Italic font, using class mainit
|
||||
var mainitLetters = [
|
||||
"\u0131", // dotless i, \imath
|
||||
"\u0237", // dotless j, \jmath
|
||||
"\u00a3" // \pounds
|
||||
"\u00a3", // \pounds
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -378,7 +378,7 @@ var sizingMultiplier = {
|
||||
size7: 1.44,
|
||||
size8: 1.73,
|
||||
size9: 2.07,
|
||||
size10: 2.49
|
||||
size10: 2.49,
|
||||
};
|
||||
|
||||
// A map of spacing functions to their attributes, like size and corresponding
|
||||
@@ -386,32 +386,32 @@ var sizingMultiplier = {
|
||||
var spacingFunctions = {
|
||||
"\\qquad": {
|
||||
size: "2em",
|
||||
className: "qquad"
|
||||
className: "qquad",
|
||||
},
|
||||
"\\quad": {
|
||||
size: "1em",
|
||||
className: "quad"
|
||||
className: "quad",
|
||||
},
|
||||
"\\enspace": {
|
||||
size: "0.5em",
|
||||
className: "enspace"
|
||||
className: "enspace",
|
||||
},
|
||||
"\\;": {
|
||||
size: "0.277778em",
|
||||
className: "thickspace"
|
||||
className: "thickspace",
|
||||
},
|
||||
"\\:": {
|
||||
size: "0.22222em",
|
||||
className: "mediumspace"
|
||||
className: "mediumspace",
|
||||
},
|
||||
"\\,": {
|
||||
size: "0.16667em",
|
||||
className: "thinspace"
|
||||
className: "thinspace",
|
||||
},
|
||||
"\\!": {
|
||||
size: "-0.16667em",
|
||||
className: "negativethinspace"
|
||||
}
|
||||
className: "negativethinspace",
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -424,15 +424,15 @@ var fontMap = {
|
||||
// styles
|
||||
"mathbf": {
|
||||
variant: "bold",
|
||||
fontName: "Main-Bold"
|
||||
fontName: "Main-Bold",
|
||||
},
|
||||
"mathrm": {
|
||||
variant: "normal",
|
||||
fontName: "Main-Regular"
|
||||
fontName: "Main-Regular",
|
||||
},
|
||||
"textit": {
|
||||
variant: "italic",
|
||||
fontName: "Main-Italic"
|
||||
fontName: "Main-Italic",
|
||||
},
|
||||
|
||||
// "mathit" is missing because it requires the use of two fonts: Main-Italic
|
||||
@@ -442,28 +442,28 @@ var fontMap = {
|
||||
// families
|
||||
"mathbb": {
|
||||
variant: "double-struck",
|
||||
fontName: "AMS-Regular"
|
||||
fontName: "AMS-Regular",
|
||||
},
|
||||
"mathcal": {
|
||||
variant: "script",
|
||||
fontName: "Caligraphic-Regular"
|
||||
fontName: "Caligraphic-Regular",
|
||||
},
|
||||
"mathfrak": {
|
||||
variant: "fraktur",
|
||||
fontName: "Fraktur-Regular"
|
||||
fontName: "Fraktur-Regular",
|
||||
},
|
||||
"mathscr": {
|
||||
variant: "script",
|
||||
fontName: "Script-Regular"
|
||||
fontName: "Script-Regular",
|
||||
},
|
||||
"mathsf": {
|
||||
variant: "sans-serif",
|
||||
fontName: "SansSerif-Regular"
|
||||
fontName: "SansSerif-Regular",
|
||||
},
|
||||
"mathtt": {
|
||||
variant: "monospace",
|
||||
fontName: "Typewriter-Regular"
|
||||
}
|
||||
fontName: "Typewriter-Regular",
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
@@ -476,5 +476,5 @@ module.exports = {
|
||||
makeOrd: makeOrd,
|
||||
prependChildren: prependChildren,
|
||||
sizingMultiplier: sizingMultiplier,
|
||||
spacingFunctions: spacingFunctions
|
||||
spacingFunctions: spacingFunctions,
|
||||
};
|
||||
|
@@ -114,7 +114,7 @@ var getTypeOfDomTree = function(node) {
|
||||
}
|
||||
} else {
|
||||
if (utils.contains(["mord", "mop", "mbin", "mrel", "mopen", "mclose",
|
||||
"mpunct", "minner"], node.classes[0])) {
|
||||
"mpunct", "minner"], node.classes[0])) {
|
||||
return node.classes[0];
|
||||
}
|
||||
}
|
||||
@@ -344,7 +344,7 @@ groupTypes.supsub = function(group, options) {
|
||||
sub.height - 0.8 * style.metrics.xHeight);
|
||||
|
||||
supsub = buildCommon.makeVList([
|
||||
{type: "elem", elem: submid}
|
||||
{type: "elem", elem: submid},
|
||||
], "shift", subShift, options);
|
||||
|
||||
supsub.children[0].style.marginRight = scriptspace;
|
||||
@@ -361,7 +361,7 @@ groupTypes.supsub = function(group, options) {
|
||||
sup.depth + 0.25 * style.metrics.xHeight);
|
||||
|
||||
supsub = buildCommon.makeVList([
|
||||
{type: "elem", elem: supmid}
|
||||
{type: "elem", elem: supmid},
|
||||
], "shift", -supShift, options);
|
||||
|
||||
supsub.children[0].style.marginRight = scriptspace;
|
||||
@@ -385,7 +385,7 @@ groupTypes.supsub = function(group, options) {
|
||||
|
||||
supsub = buildCommon.makeVList([
|
||||
{type: "elem", elem: submid, shift: subShift},
|
||||
{type: "elem", elem: supmid, shift: -supShift}
|
||||
{type: "elem", elem: supmid, shift: -supShift},
|
||||
], "individualShift", null, options);
|
||||
|
||||
// See comment above about subscripts not being shifted
|
||||
@@ -472,7 +472,7 @@ groupTypes.genfrac = function(group, options) {
|
||||
|
||||
frac = buildCommon.makeVList([
|
||||
{type: "elem", elem: denomreset, shift: denomShift},
|
||||
{type: "elem", elem: numerreset, shift: -numShift}
|
||||
{type: "elem", elem: numerreset, shift: -numShift},
|
||||
], "individualShift", null, options);
|
||||
} else {
|
||||
// Rule 15d
|
||||
@@ -503,7 +503,7 @@ groupTypes.genfrac = function(group, options) {
|
||||
frac = buildCommon.makeVList([
|
||||
{type: "elem", elem: denomreset, shift: denomShift},
|
||||
{type: "elem", elem: mid, shift: midShift},
|
||||
{type: "elem", elem: numerreset, shift: -numShift}
|
||||
{type: "elem", elem: numerreset, shift: -numShift},
|
||||
], "individualShift", null, options);
|
||||
}
|
||||
|
||||
@@ -724,7 +724,7 @@ groupTypes.spacing = function(group, options) {
|
||||
// generate these.
|
||||
return makeSpan(
|
||||
["mspace",
|
||||
buildCommon.spacingFunctions[group.value].className],
|
||||
buildCommon.spacingFunctions[group.value].className],
|
||||
[], options);
|
||||
}
|
||||
};
|
||||
@@ -764,7 +764,7 @@ groupTypes.op = function(group, options) {
|
||||
|
||||
// Most operators have a large successor symbol, but these don't.
|
||||
var noSuccessor = [
|
||||
"\\smallint"
|
||||
"\\smallint",
|
||||
];
|
||||
|
||||
var large = false;
|
||||
@@ -859,7 +859,7 @@ groupTypes.op = function(group, options) {
|
||||
{type: "kern", size: fontMetrics.metrics.bigOpSpacing5},
|
||||
{type: "elem", elem: submid},
|
||||
{type: "kern", size: subKern},
|
||||
{type: "elem", elem: base}
|
||||
{type: "elem", elem: base},
|
||||
], "top", top, options);
|
||||
|
||||
// Here, we shift the limits by the slant of the symbol. Note
|
||||
@@ -874,7 +874,7 @@ groupTypes.op = function(group, options) {
|
||||
{type: "elem", elem: base},
|
||||
{type: "kern", size: supKern},
|
||||
{type: "elem", elem: supmid},
|
||||
{type: "kern", size: fontMetrics.metrics.bigOpSpacing5}
|
||||
{type: "kern", size: fontMetrics.metrics.bigOpSpacing5},
|
||||
], "bottom", bottom, options);
|
||||
|
||||
// See comment above about slants
|
||||
@@ -897,7 +897,7 @@ groupTypes.op = function(group, options) {
|
||||
{type: "elem", elem: base},
|
||||
{type: "kern", size: supKern},
|
||||
{type: "elem", elem: supmid},
|
||||
{type: "kern", size: fontMetrics.metrics.bigOpSpacing5}
|
||||
{type: "kern", size: fontMetrics.metrics.bigOpSpacing5},
|
||||
], "bottom", bottom, options);
|
||||
|
||||
// See comment above about slants
|
||||
@@ -1017,7 +1017,7 @@ groupTypes.overline = function(group, options) {
|
||||
{type: "elem", elem: innerGroup},
|
||||
{type: "kern", size: 3 * ruleWidth},
|
||||
{type: "elem", elem: line},
|
||||
{type: "kern", size: ruleWidth}
|
||||
{type: "kern", size: ruleWidth},
|
||||
], "firstBaseline", null, options);
|
||||
|
||||
return makeSpan(["mord", "overline"], [vlist], options);
|
||||
@@ -1043,7 +1043,7 @@ groupTypes.underline = function(group, options) {
|
||||
{type: "kern", size: ruleWidth},
|
||||
{type: "elem", elem: line},
|
||||
{type: "kern", size: 3 * ruleWidth},
|
||||
{type: "elem", elem: innerGroup}
|
||||
{type: "elem", elem: innerGroup},
|
||||
], "top", innerGroup.height, options);
|
||||
|
||||
return makeSpan(["mord", "underline"], [vlist], options);
|
||||
@@ -1110,7 +1110,7 @@ groupTypes.sqrt = function(group, options) {
|
||||
{type: "elem", elem: inner},
|
||||
{type: "kern", size: lineClearance},
|
||||
{type: "elem", elem: line},
|
||||
{type: "kern", size: ruleWidth}
|
||||
{type: "kern", size: ruleWidth},
|
||||
], "firstBaseline", null, options);
|
||||
}
|
||||
|
||||
@@ -1187,7 +1187,7 @@ groupTypes.styling = function(group, options) {
|
||||
"display": Style.DISPLAY,
|
||||
"text": Style.TEXT,
|
||||
"script": Style.SCRIPT,
|
||||
"scriptscript": Style.SCRIPTSCRIPT
|
||||
"scriptscript": Style.SCRIPTSCRIPT,
|
||||
};
|
||||
|
||||
var newStyle = styleMap[group.value.style];
|
||||
@@ -1444,7 +1444,7 @@ groupTypes.accent = function(group, options) {
|
||||
accentBody = buildCommon.makeVList([
|
||||
{type: "elem", elem: body},
|
||||
{type: "kern", size: -clearance},
|
||||
{type: "elem", elem: accentBody}
|
||||
{type: "elem", elem: accentBody},
|
||||
], "firstBaseline", null, options);
|
||||
|
||||
// Shift the accent over by the skew. Note we shift by twice the skew
|
||||
|
@@ -195,7 +195,7 @@ groupTypes.genfrac = function(group, options) {
|
||||
var node = new mathMLTree.MathNode(
|
||||
"mfrac",
|
||||
[buildGroup(group.value.numer, options),
|
||||
buildGroup(group.value.denom, options)]);
|
||||
buildGroup(group.value.denom, options)]);
|
||||
|
||||
if (!group.value.hasBarLine) {
|
||||
node.setAttribute("linethickness", "0px");
|
||||
@@ -249,7 +249,7 @@ groupTypes.sqrt = function(group, options) {
|
||||
node = new mathMLTree.MathNode(
|
||||
"mroot", [
|
||||
buildGroup(group.value.body, options),
|
||||
buildGroup(group.value.index, options)
|
||||
buildGroup(group.value.index, options),
|
||||
]);
|
||||
} else {
|
||||
node = new mathMLTree.MathNode(
|
||||
@@ -299,7 +299,7 @@ groupTypes.accent = function(group, options) {
|
||||
var node = new mathMLTree.MathNode(
|
||||
"mover",
|
||||
[buildGroup(group.value.base, options),
|
||||
accentNode]);
|
||||
accentNode]);
|
||||
|
||||
node.setAttribute("accent", "true");
|
||||
|
||||
@@ -417,7 +417,7 @@ groupTypes.styling = function(group, options) {
|
||||
"display": ["0", "true"],
|
||||
"text": ["0", "false"],
|
||||
"script": ["1", "false"],
|
||||
"scriptscript": ["2", "false"]
|
||||
"scriptscript": ["2", "false"],
|
||||
};
|
||||
|
||||
var attr = styleAttributes[group.value.style];
|
||||
@@ -452,7 +452,7 @@ groupTypes.overline = function(group, options) {
|
||||
var node = new mathMLTree.MathNode(
|
||||
"mover",
|
||||
[buildGroup(group.value.body, options),
|
||||
operator]);
|
||||
operator]);
|
||||
node.setAttribute("accent", "true");
|
||||
|
||||
return node;
|
||||
@@ -466,7 +466,7 @@ groupTypes.underline = function(group, options) {
|
||||
var node = new mathMLTree.MathNode(
|
||||
"munder",
|
||||
[buildGroup(group.value.body, options),
|
||||
operator]);
|
||||
operator]);
|
||||
node.setAttribute("accentunder", "true");
|
||||
|
||||
return node;
|
||||
|
@@ -18,7 +18,7 @@ var buildTree = function(tree, expression, settings) {
|
||||
// Setup the default options
|
||||
var options = new Options({
|
||||
style: startStyle,
|
||||
size: "size5"
|
||||
size: "size5",
|
||||
});
|
||||
|
||||
// `buildHTML` sometimes messes with the parse tree (like turning bins ->
|
||||
@@ -27,7 +27,7 @@ var buildTree = function(tree, expression, settings) {
|
||||
var htmlNode = buildHTML(tree, options);
|
||||
|
||||
var katexNode = makeSpan(["katex"], [
|
||||
mathMLNode, htmlNode
|
||||
mathMLNode, htmlNode,
|
||||
]);
|
||||
|
||||
if (settings.displayMode) {
|
||||
|
@@ -331,7 +331,7 @@ var stackLargeDelimiters = [
|
||||
"(", ")", "[", "\\lbrack", "]", "\\rbrack",
|
||||
"\\{", "\\lbrace", "\\}", "\\rbrace",
|
||||
"\\lfloor", "\\rfloor", "\\lceil", "\\rceil",
|
||||
"\\surd"
|
||||
"\\surd",
|
||||
];
|
||||
|
||||
// delimiters that always stack
|
||||
@@ -340,12 +340,12 @@ var stackAlwaysDelimiters = [
|
||||
"\\Uparrow", "\\Downarrow", "\\Updownarrow",
|
||||
"|", "\\|", "\\vert", "\\Vert",
|
||||
"\\lvert", "\\rvert", "\\lVert", "\\rVert",
|
||||
"\\lgroup", "\\rgroup", "\\lmoustache", "\\rmoustache"
|
||||
"\\lgroup", "\\rgroup", "\\lmoustache", "\\rmoustache",
|
||||
];
|
||||
|
||||
// and delimiters that never stack
|
||||
var stackNeverDelimiters = [
|
||||
"<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt"
|
||||
"<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt",
|
||||
];
|
||||
|
||||
// Metrics of the different sizes. Found by looking at TeX's output of
|
||||
@@ -396,7 +396,7 @@ var stackNeverDelimiterSequence = [
|
||||
{type: "large", size: 1},
|
||||
{type: "large", size: 2},
|
||||
{type: "large", size: 3},
|
||||
{type: "large", size: 4}
|
||||
{type: "large", size: 4},
|
||||
];
|
||||
|
||||
// Delimiters that always stack try the small delimiters first, then stack
|
||||
@@ -404,7 +404,7 @@ var stackAlwaysDelimiterSequence = [
|
||||
{type: "small", style: Style.SCRIPTSCRIPT},
|
||||
{type: "small", style: Style.SCRIPT},
|
||||
{type: "small", style: Style.TEXT},
|
||||
{type: "stack"}
|
||||
{type: "stack"},
|
||||
];
|
||||
|
||||
// Delimiters that stack when large try the small and then large delimiters, and
|
||||
@@ -417,7 +417,7 @@ var stackLargeDelimiterSequence = [
|
||||
{type: "large", size: 2},
|
||||
{type: "large", size: 3},
|
||||
{type: "large", size: 4},
|
||||
{type: "stack"}
|
||||
{type: "stack"},
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -546,5 +546,5 @@ var makeLeftRightDelim = function(delim, height, depth, options, mode,
|
||||
module.exports = {
|
||||
sizedDelim: makeSizedDelim,
|
||||
customSizedDelim: makeCustomSizedDelim,
|
||||
leftRightDelim: makeLeftRightDelim
|
||||
leftRightDelim: makeLeftRightDelim,
|
||||
};
|
||||
|
@@ -186,7 +186,7 @@ var iCombinations = {
|
||||
'ï': '\u0131\u0308',
|
||||
'í': '\u0131\u0301',
|
||||
// 'ī': '\u0131\u0304', // enable when we add Extended Latin
|
||||
'ì': '\u0131\u0300'
|
||||
'ì': '\u0131\u0300',
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -332,5 +332,5 @@ symbolNode.prototype.toMarkup = function() {
|
||||
module.exports = {
|
||||
span: span,
|
||||
documentFragment: documentFragment,
|
||||
symbolNode: symbolNode
|
||||
symbolNode: symbolNode,
|
||||
};
|
||||
|
@@ -75,7 +75,7 @@ function defineEnvironment(names, props, handler) {
|
||||
greediness: 1,
|
||||
allowedInText: !!props.allowedInText,
|
||||
numOptionalArgs: props.numOptionalArgs || 0,
|
||||
handler: handler
|
||||
handler: handler,
|
||||
};
|
||||
for (var i = 0; i < names.length; ++i) {
|
||||
module.exports[names[i]] = data;
|
||||
@@ -85,7 +85,7 @@ function defineEnvironment(names, props, handler) {
|
||||
// Arrays are part of LaTeX, defined in lttab.dtx so its documentation
|
||||
// is part of the source2e.pdf file of LaTeX2e source documentation.
|
||||
defineEnvironment("array", {
|
||||
numArgs: 1
|
||||
numArgs: 1,
|
||||
}, function(context, args) {
|
||||
var colalign = args[0];
|
||||
colalign = colalign.value.map ? colalign.value : [colalign];
|
||||
@@ -94,12 +94,12 @@ defineEnvironment("array", {
|
||||
if ("lcr".indexOf(ca) !== -1) {
|
||||
return {
|
||||
type: "align",
|
||||
align: ca
|
||||
align: ca,
|
||||
};
|
||||
} else if (ca === "|") {
|
||||
return {
|
||||
type: "separator",
|
||||
separator: "|"
|
||||
separator: "|",
|
||||
};
|
||||
}
|
||||
throw new ParseError(
|
||||
@@ -109,7 +109,7 @@ defineEnvironment("array", {
|
||||
var res = {
|
||||
type: "array",
|
||||
cols: cols,
|
||||
hskipBeforeAndAfter: true // \@preamble in lttab.dtx
|
||||
hskipBeforeAndAfter: true, // \@preamble in lttab.dtx
|
||||
};
|
||||
res = parseArray(context.parser, res);
|
||||
return res;
|
||||
@@ -123,7 +123,7 @@ defineEnvironment([
|
||||
"bmatrix",
|
||||
"Bmatrix",
|
||||
"vmatrix",
|
||||
"Vmatrix"
|
||||
"Vmatrix",
|
||||
], {
|
||||
}, function(context) {
|
||||
var delimiters = {
|
||||
@@ -132,18 +132,18 @@ defineEnvironment([
|
||||
"bmatrix": ["[", "]"],
|
||||
"Bmatrix": ["\\{", "\\}"],
|
||||
"vmatrix": ["|", "|"],
|
||||
"Vmatrix": ["\\Vert", "\\Vert"]
|
||||
"Vmatrix": ["\\Vert", "\\Vert"],
|
||||
}[context.envName];
|
||||
var res = {
|
||||
type: "array",
|
||||
hskipBeforeAndAfter: false // \hskip -\arraycolsep in amsmath
|
||||
hskipBeforeAndAfter: false, // \hskip -\arraycolsep in amsmath
|
||||
};
|
||||
res = parseArray(context.parser, res);
|
||||
if (delimiters) {
|
||||
res = new ParseNode("leftright", {
|
||||
body: [res],
|
||||
left: delimiters[0],
|
||||
right: delimiters[1]
|
||||
right: delimiters[1],
|
||||
}, context.mode);
|
||||
}
|
||||
return res;
|
||||
@@ -165,19 +165,19 @@ defineEnvironment("cases", {
|
||||
// For now we use the metrics for TEXT style which is what we were
|
||||
// doing before. Before attempting to get the current style we
|
||||
// should look at TeX's behavior especially for \over and matrices.
|
||||
postgap: Style.TEXT.metrics.quad
|
||||
postgap: Style.TEXT.metrics.quad,
|
||||
}, {
|
||||
type: "align",
|
||||
align: "l",
|
||||
pregap: 0,
|
||||
postgap: 0
|
||||
}]
|
||||
postgap: 0,
|
||||
}],
|
||||
};
|
||||
res = parseArray(context.parser, res);
|
||||
res = new ParseNode("leftright", {
|
||||
body: [res],
|
||||
left: "\\{",
|
||||
right: "."
|
||||
right: ".",
|
||||
}, context.mode);
|
||||
return res;
|
||||
});
|
||||
@@ -190,7 +190,7 @@ defineEnvironment("aligned", {
|
||||
}, function(context) {
|
||||
var res = {
|
||||
type: "array",
|
||||
cols: []
|
||||
cols: [],
|
||||
};
|
||||
res = parseArray(context.parser, res);
|
||||
var emptyGroup = new ParseNode("ordgroup", [], context.mode);
|
||||
@@ -216,7 +216,7 @@ defineEnvironment("aligned", {
|
||||
type: "align",
|
||||
align: align,
|
||||
pregap: pregap,
|
||||
postgap: 0
|
||||
postgap: 0,
|
||||
};
|
||||
}
|
||||
return res;
|
||||
|
@@ -54,7 +54,7 @@ var sigmas = {
|
||||
subDrop: [0.050, 0.071, 0.100], // sigma19
|
||||
delim1: [2.390, 1.700, 1.980], // sigma20
|
||||
delim2: [1.010, 1.157, 1.420], // sigma21
|
||||
axisHeight: [0.250, 0.250, 0.250] // sigma22
|
||||
axisHeight: [0.250, 0.250, 0.250], // sigma22
|
||||
};
|
||||
|
||||
// These font metrics are extracted from TeX by using
|
||||
@@ -97,7 +97,7 @@ var metrics = {
|
||||
bigOpSpacing4: xi12,
|
||||
bigOpSpacing5: xi13,
|
||||
ptPerEm: ptPerEm,
|
||||
doubleRuleSep: doubleRuleSep
|
||||
doubleRuleSep: doubleRuleSep,
|
||||
};
|
||||
|
||||
// This map contains a mapping from font name and character code to character
|
||||
@@ -242,7 +242,7 @@ var extraCharacterMap = {
|
||||
'ь': 'a',
|
||||
'э': 'e',
|
||||
'ю': 'm',
|
||||
'я': 'r'
|
||||
'я': 'r',
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -266,7 +266,7 @@ var getCharacterMetrics = function(character, style) {
|
||||
height: metrics[1],
|
||||
italic: metrics[2],
|
||||
skew: metrics[3],
|
||||
width: metrics[4]
|
||||
width: metrics[4],
|
||||
};
|
||||
}
|
||||
};
|
||||
@@ -274,5 +274,5 @@ var getCharacterMetrics = function(character, style) {
|
||||
module.exports = {
|
||||
metrics: metrics,
|
||||
sigmas: sigmas,
|
||||
getCharacterMetrics: getCharacterMetrics
|
||||
getCharacterMetrics: getCharacterMetrics,
|
||||
};
|
||||
|
@@ -254,7 +254,7 @@ module.exports = {
|
||||
"57368": [0.25142, 0.75726, 0, 0],
|
||||
"57369": [0.25142, 0.75726, 0, 0],
|
||||
"57370": [0.13597, 0.63597, 0, 0],
|
||||
"57371": [0.13597, 0.63597, 0, 0]
|
||||
"57371": [0.13597, 0.63597, 0, 0],
|
||||
},
|
||||
"Caligraphic-Regular": {
|
||||
"48": [0, 0.43056, 0, 0],
|
||||
@@ -292,7 +292,7 @@ module.exports = {
|
||||
"87": [0, 0.68333, 0.08222, 0.08334],
|
||||
"88": [0, 0.68333, 0.14643, 0.13889],
|
||||
"89": [0.09722, 0.68333, 0.08222, 0.08334],
|
||||
"90": [0, 0.68333, 0.07944, 0.13889]
|
||||
"90": [0, 0.68333, 0.07944, 0.13889],
|
||||
},
|
||||
"Fraktur-Regular": {
|
||||
"33": [0, 0.69141, 0, 0],
|
||||
@@ -385,7 +385,7 @@ module.exports = {
|
||||
"58116": [0.18906, 0.47534, 0, 0],
|
||||
"58117": [0, 0.69141, 0, 0],
|
||||
"58118": [0, 0.62119, 0, 0],
|
||||
"58119": [0, 0.47534, 0, 0]
|
||||
"58119": [0, 0.47534, 0, 0],
|
||||
},
|
||||
"Main-Bold": {
|
||||
"33": [0, 0.69444, 0, 0],
|
||||
@@ -640,7 +640,7 @@ module.exports = {
|
||||
"10217": [0.25, 0.75, 0, 0],
|
||||
"10815": [0, 0.68611, 0, 0],
|
||||
"10927": [0.19667, 0.69667, 0, 0],
|
||||
"10928": [0.19667, 0.69667, 0, 0]
|
||||
"10928": [0.19667, 0.69667, 0, 0],
|
||||
},
|
||||
"Main-Italic": {
|
||||
"33": [0, 0.69444, 0.12417, 0],
|
||||
@@ -760,7 +760,7 @@ module.exports = {
|
||||
"8217": [0, 0.69444, 0.12417, 0],
|
||||
"8220": [0, 0.69444, 0.1685, 0],
|
||||
"8221": [0, 0.69444, 0.06961, 0],
|
||||
"8463": [0, 0.68889, 0, 0]
|
||||
"8463": [0, 0.68889, 0, 0],
|
||||
},
|
||||
"Main-Regular": {
|
||||
"32": [0, 0, 0, 0],
|
||||
@@ -1041,7 +1041,7 @@ module.exports = {
|
||||
"10236": [0.011, 0.511, 0, 0],
|
||||
"10815": [0, 0.68333, 0, 0],
|
||||
"10927": [0.13597, 0.63597, 0, 0],
|
||||
"10928": [0.13597, 0.63597, 0, 0]
|
||||
"10928": [0.13597, 0.63597, 0, 0],
|
||||
},
|
||||
"Math-BoldItalic": {
|
||||
"47": [0.19444, 0.69444, 0, 0],
|
||||
@@ -1137,7 +1137,7 @@ module.exports = {
|
||||
"981": [0.19444, 0.69444, 0, 0],
|
||||
"982": [0, 0.44444, 0.03194, 0],
|
||||
"1009": [0.19444, 0.44444, 0, 0],
|
||||
"1013": [0, 0.44444, 0, 0]
|
||||
"1013": [0, 0.44444, 0, 0],
|
||||
},
|
||||
"Math-Italic": {
|
||||
"47": [0.19444, 0.69444, 0, 0],
|
||||
@@ -1233,7 +1233,7 @@ module.exports = {
|
||||
"981": [0.19444, 0.69444, 0, 0.08334],
|
||||
"982": [0, 0.43056, 0.02778, 0],
|
||||
"1009": [0.19444, 0.43056, 0, 0.08334],
|
||||
"1013": [0, 0.43056, 0, 0.05556]
|
||||
"1013": [0, 0.43056, 0, 0.05556],
|
||||
},
|
||||
"Math-Regular": {
|
||||
"65": [0, 0.68333, 0, 0.13889],
|
||||
@@ -1328,7 +1328,7 @@ module.exports = {
|
||||
"981": [0.19444, 0.69444, 0, 0.08334],
|
||||
"982": [0, 0.43056, 0.02778, 0],
|
||||
"1009": [0.19444, 0.43056, 0, 0.08334],
|
||||
"1013": [0, 0.43056, 0, 0.05556]
|
||||
"1013": [0, 0.43056, 0, 0.05556],
|
||||
},
|
||||
"SansSerif-Regular": {
|
||||
"33": [0, 0.69444, 0, 0],
|
||||
@@ -1447,7 +1447,7 @@ module.exports = {
|
||||
"8216": [0, 0.69444, 0, 0],
|
||||
"8217": [0, 0.69444, 0, 0],
|
||||
"8220": [0, 0.69444, 0, 0],
|
||||
"8221": [0, 0.69444, 0, 0]
|
||||
"8221": [0, 0.69444, 0, 0],
|
||||
},
|
||||
"Script-Regular": {
|
||||
"65": [0, 0.7, 0.22925, 0],
|
||||
@@ -1475,7 +1475,7 @@ module.exports = {
|
||||
"87": [0, 0.7, 0.27523, 0],
|
||||
"88": [0, 0.7, 0.26006, 0],
|
||||
"89": [0, 0.7, 0.2939, 0],
|
||||
"90": [0, 0.7, 0.24037, 0]
|
||||
"90": [0, 0.7, 0.24037, 0],
|
||||
},
|
||||
"Size1-Regular": {
|
||||
"40": [0.35001, 0.85, 0, 0],
|
||||
@@ -1520,7 +1520,7 @@ module.exports = {
|
||||
"10753": [0.25001, 0.75, 0, 0],
|
||||
"10754": [0.25001, 0.75, 0, 0],
|
||||
"10756": [0.25001, 0.75, 0, 0],
|
||||
"10758": [0.25001, 0.75, 0, 0]
|
||||
"10758": [0.25001, 0.75, 0, 0],
|
||||
},
|
||||
"Size2-Regular": {
|
||||
"40": [0.65002, 1.15, 0, 0],
|
||||
@@ -1557,7 +1557,7 @@ module.exports = {
|
||||
"10753": [0.55001, 1.05, 0, 0],
|
||||
"10754": [0.55001, 1.05, 0, 0],
|
||||
"10756": [0.55001, 1.05, 0, 0],
|
||||
"10758": [0.55001, 1.05, 0, 0]
|
||||
"10758": [0.55001, 1.05, 0, 0],
|
||||
},
|
||||
"Size3-Regular": {
|
||||
"40": [0.95003, 1.45, 0, 0],
|
||||
@@ -1578,7 +1578,7 @@ module.exports = {
|
||||
"8970": [0.95003, 1.45, 0, 0],
|
||||
"8971": [0.95003, 1.45, 0, 0],
|
||||
"10216": [0.95003, 1.45, 0, 0],
|
||||
"10217": [0.95003, 1.45, 0, 0]
|
||||
"10217": [0.95003, 1.45, 0, 0],
|
||||
},
|
||||
"Size4-Regular": {
|
||||
"40": [1.25003, 1.75, 0, 0],
|
||||
@@ -1625,7 +1625,7 @@ module.exports = {
|
||||
"57680": [0, 0.12, 0, 0],
|
||||
"57681": [0, 0.12, 0, 0],
|
||||
"57682": [0, 0.12, 0, 0],
|
||||
"57683": [0, 0.12, 0, 0]
|
||||
"57683": [0, 0.12, 0, 0],
|
||||
},
|
||||
"Typewriter-Regular": {
|
||||
"33": [0, 0.61111, 0, 0],
|
||||
@@ -1747,6 +1747,6 @@ module.exports = {
|
||||
"937": [0, 0.61111, 0, 0],
|
||||
"2018": [0, 0.61111, 0, 0],
|
||||
"2019": [0, 0.61111, 0, 0],
|
||||
"8242": [0, 0.61111, 0, 0]
|
||||
}
|
||||
"8242": [0, 0.61111, 0, 0],
|
||||
},
|
||||
};
|
||||
|
158
src/functions.js
158
src/functions.js
@@ -95,7 +95,7 @@ function defineFunction(names, props, handler) {
|
||||
allowedInText: !!props.allowedInText,
|
||||
numOptionalArgs: props.numOptionalArgs || 0,
|
||||
infix: !!props.infix,
|
||||
handler: handler
|
||||
handler: handler,
|
||||
};
|
||||
for (var i = 0; i < names.length; ++i) {
|
||||
module.exports[names[i]] = data;
|
||||
@@ -115,14 +115,14 @@ var ordargument = function(arg) {
|
||||
// A normal square root
|
||||
defineFunction("\\sqrt", {
|
||||
numArgs: 1,
|
||||
numOptionalArgs: 1
|
||||
numOptionalArgs: 1,
|
||||
}, function(context, args) {
|
||||
var index = args[0];
|
||||
var body = args[1];
|
||||
return {
|
||||
type: "sqrt",
|
||||
body: body,
|
||||
index: index
|
||||
index: index,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -130,23 +130,23 @@ defineFunction("\\sqrt", {
|
||||
var textFunctionStyles = {
|
||||
"\\text": undefined, "\\textrm": "mathrm", "\\textsf": "mathsf",
|
||||
"\\texttt": "mathtt", "\\textnormal": "mathrm", "\\textbf": "mathbf",
|
||||
"\\textit": "textit"
|
||||
"\\textit": "textit",
|
||||
};
|
||||
|
||||
defineFunction([
|
||||
"\\text", "\\textrm", "\\textsf", "\\texttt", "\\textnormal",
|
||||
"\\textbf", "\\textit"
|
||||
"\\textbf", "\\textit",
|
||||
], {
|
||||
numArgs: 1,
|
||||
argTypes: ["text"],
|
||||
greediness: 2,
|
||||
allowedInText: true
|
||||
allowedInText: true,
|
||||
}, function(context, args) {
|
||||
var body = args[0];
|
||||
return {
|
||||
type: "text",
|
||||
body: ordargument(body),
|
||||
style: textFunctionStyles[context.funcName]
|
||||
style: textFunctionStyles[context.funcName],
|
||||
};
|
||||
});
|
||||
|
||||
@@ -155,36 +155,36 @@ defineFunction("\\color", {
|
||||
numArgs: 2,
|
||||
allowedInText: true,
|
||||
greediness: 3,
|
||||
argTypes: ["color", "original"]
|
||||
argTypes: ["color", "original"],
|
||||
}, function(context, args) {
|
||||
var color = args[0];
|
||||
var body = args[1];
|
||||
return {
|
||||
type: "color",
|
||||
color: color.value,
|
||||
value: ordargument(body)
|
||||
value: ordargument(body),
|
||||
};
|
||||
});
|
||||
|
||||
// An overline
|
||||
defineFunction("\\overline", {
|
||||
numArgs: 1
|
||||
numArgs: 1,
|
||||
}, function(context, args) {
|
||||
var body = args[0];
|
||||
return {
|
||||
type: "overline",
|
||||
body: body
|
||||
body: body,
|
||||
};
|
||||
});
|
||||
|
||||
// An underline
|
||||
defineFunction("\\underline", {
|
||||
numArgs: 1
|
||||
numArgs: 1,
|
||||
}, function(context, args) {
|
||||
var body = args[0];
|
||||
return {
|
||||
type: "underline",
|
||||
body: body
|
||||
body: body,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -192,7 +192,7 @@ defineFunction("\\underline", {
|
||||
defineFunction("\\rule", {
|
||||
numArgs: 2,
|
||||
numOptionalArgs: 1,
|
||||
argTypes: ["size", "size", "size"]
|
||||
argTypes: ["size", "size", "size"],
|
||||
}, function(context, args) {
|
||||
var shift = args[0];
|
||||
var width = args[1];
|
||||
@@ -201,7 +201,7 @@ defineFunction("\\rule", {
|
||||
type: "rule",
|
||||
shift: shift && shift.value,
|
||||
width: width.value,
|
||||
height: height.value
|
||||
height: height.value,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -209,51 +209,51 @@ defineFunction("\\rule", {
|
||||
// mu-units. In current KaTeX we relax this; both commands accept any unit.
|
||||
defineFunction(["\\kern", "\\mkern"], {
|
||||
numArgs: 1,
|
||||
argTypes: ["size"]
|
||||
argTypes: ["size"],
|
||||
}, function(context, args) {
|
||||
return {
|
||||
type: "kern",
|
||||
dimension: args[0].value
|
||||
dimension: args[0].value,
|
||||
};
|
||||
});
|
||||
|
||||
// A KaTeX logo
|
||||
defineFunction("\\KaTeX", {
|
||||
numArgs: 0
|
||||
numArgs: 0,
|
||||
}, function(context) {
|
||||
return {
|
||||
type: "katex"
|
||||
type: "katex",
|
||||
};
|
||||
});
|
||||
|
||||
defineFunction("\\phantom", {
|
||||
numArgs: 1
|
||||
numArgs: 1,
|
||||
}, function(context, args) {
|
||||
var body = args[0];
|
||||
return {
|
||||
type: "phantom",
|
||||
value: ordargument(body)
|
||||
value: ordargument(body),
|
||||
};
|
||||
});
|
||||
|
||||
// Math class commands except \mathop
|
||||
defineFunction([
|
||||
"\\mathord", "\\mathbin", "\\mathrel", "\\mathopen",
|
||||
"\\mathclose", "\\mathpunct", "\\mathinner"
|
||||
"\\mathclose", "\\mathpunct", "\\mathinner",
|
||||
], {
|
||||
numArgs: 1
|
||||
numArgs: 1,
|
||||
}, function(context, args) {
|
||||
var body = args[0];
|
||||
return {
|
||||
type: "mclass",
|
||||
mclass: "m" + context.funcName.substr(5),
|
||||
value: ordargument(body)
|
||||
value: ordargument(body),
|
||||
};
|
||||
});
|
||||
|
||||
// Build a relation by placing one symbol on top of another
|
||||
defineFunction("\\stackrel", {
|
||||
numArgs: 2
|
||||
numArgs: 2,
|
||||
}, function(context, args) {
|
||||
var top = args[0];
|
||||
var bottom = args[1];
|
||||
@@ -263,41 +263,41 @@ defineFunction("\\stackrel", {
|
||||
limits: true,
|
||||
alwaysHandleSupSub: true,
|
||||
symbol: false,
|
||||
value: ordargument(bottom)
|
||||
value: ordargument(bottom),
|
||||
}, bottom.mode);
|
||||
|
||||
var supsub = new ParseNode("supsub", {
|
||||
base: bottomop,
|
||||
sup: top,
|
||||
sub: null
|
||||
sub: null,
|
||||
}, top.mode);
|
||||
|
||||
return {
|
||||
type: "mclass",
|
||||
mclass: "mrel",
|
||||
value: [supsub]
|
||||
value: [supsub],
|
||||
};
|
||||
});
|
||||
|
||||
// \mod-type functions
|
||||
defineFunction("\\bmod", {
|
||||
numArgs: 0
|
||||
numArgs: 0,
|
||||
}, function(context, args) {
|
||||
return {
|
||||
type: "mod",
|
||||
modType: "bmod",
|
||||
value: null
|
||||
value: null,
|
||||
};
|
||||
});
|
||||
|
||||
defineFunction(["\\pod", "\\pmod", "\\mod"], {
|
||||
numArgs: 1
|
||||
numArgs: 1,
|
||||
}, function(context, args) {
|
||||
var body = args[0];
|
||||
return {
|
||||
type: "mod",
|
||||
modType: context.funcName.substr(1),
|
||||
value: ordargument(body)
|
||||
value: ordargument(body),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -318,7 +318,7 @@ var delimiterSizes = {
|
||||
"\\big" : {mclass: "mord", size: 1},
|
||||
"\\Big" : {mclass: "mord", size: 2},
|
||||
"\\bigg" : {mclass: "mord", size: 3},
|
||||
"\\Bigg" : {mclass: "mord", size: 4}
|
||||
"\\Bigg" : {mclass: "mord", size: 4},
|
||||
};
|
||||
|
||||
var delimiters = [
|
||||
@@ -333,13 +333,13 @@ var delimiters = [
|
||||
"\\uparrow", "\\Uparrow",
|
||||
"\\downarrow", "\\Downarrow",
|
||||
"\\updownarrow", "\\Updownarrow",
|
||||
"."
|
||||
".",
|
||||
];
|
||||
|
||||
var fontAliases = {
|
||||
"\\Bbb": "\\mathbb",
|
||||
"\\bold": "\\mathbf",
|
||||
"\\frak": "\\mathfrak"
|
||||
"\\frak": "\\mathfrak",
|
||||
};
|
||||
|
||||
// Single-argument color functions
|
||||
@@ -356,17 +356,17 @@ defineFunction([
|
||||
"\\mintA", "\\mintB", "\\mintC",
|
||||
"\\grayA", "\\grayB", "\\grayC", "\\grayD", "\\grayE",
|
||||
"\\grayF", "\\grayG", "\\grayH", "\\grayI",
|
||||
"\\kaBlue", "\\kaGreen"
|
||||
"\\kaBlue", "\\kaGreen",
|
||||
], {
|
||||
numArgs: 1,
|
||||
allowedInText: true,
|
||||
greediness: 3
|
||||
greediness: 3,
|
||||
}, function(context, args) {
|
||||
var body = args[0];
|
||||
return {
|
||||
type: "color",
|
||||
color: "katex-" + context.funcName.slice(1),
|
||||
value: ordargument(body)
|
||||
value: ordargument(body),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -379,44 +379,44 @@ defineFunction([
|
||||
"\\arcsin", "\\arccos", "\\arctan", "\\arg", "\\cos", "\\cosh",
|
||||
"\\cot", "\\coth", "\\csc", "\\deg", "\\dim", "\\exp", "\\hom",
|
||||
"\\ker", "\\lg", "\\ln", "\\log", "\\sec", "\\sin", "\\sinh",
|
||||
"\\tan", "\\tanh"
|
||||
"\\tan", "\\tanh",
|
||||
], {
|
||||
numArgs: 0
|
||||
numArgs: 0,
|
||||
}, function(context) {
|
||||
return {
|
||||
type: "op",
|
||||
limits: false,
|
||||
symbol: false,
|
||||
body: context.funcName
|
||||
body: context.funcName,
|
||||
};
|
||||
});
|
||||
|
||||
// Limits, not symbols
|
||||
defineFunction([
|
||||
"\\det", "\\gcd", "\\inf", "\\lim", "\\liminf", "\\limsup", "\\max",
|
||||
"\\min", "\\Pr", "\\sup"
|
||||
"\\min", "\\Pr", "\\sup",
|
||||
], {
|
||||
numArgs: 0
|
||||
numArgs: 0,
|
||||
}, function(context) {
|
||||
return {
|
||||
type: "op",
|
||||
limits: true,
|
||||
symbol: false,
|
||||
body: context.funcName
|
||||
body: context.funcName,
|
||||
};
|
||||
});
|
||||
|
||||
// No limits, symbols
|
||||
defineFunction([
|
||||
"\\int", "\\iint", "\\iiint", "\\oint"
|
||||
"\\int", "\\iint", "\\iiint", "\\oint",
|
||||
], {
|
||||
numArgs: 0
|
||||
numArgs: 0,
|
||||
}, function(context) {
|
||||
return {
|
||||
type: "op",
|
||||
limits: false,
|
||||
symbol: true,
|
||||
body: context.funcName
|
||||
body: context.funcName,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -424,28 +424,28 @@ defineFunction([
|
||||
defineFunction([
|
||||
"\\coprod", "\\bigvee", "\\bigwedge", "\\biguplus", "\\bigcap",
|
||||
"\\bigcup", "\\intop", "\\prod", "\\sum", "\\bigotimes",
|
||||
"\\bigoplus", "\\bigodot", "\\bigsqcup", "\\smallint"
|
||||
"\\bigoplus", "\\bigodot", "\\bigsqcup", "\\smallint",
|
||||
], {
|
||||
numArgs: 0
|
||||
numArgs: 0,
|
||||
}, function(context) {
|
||||
return {
|
||||
type: "op",
|
||||
limits: true,
|
||||
symbol: true,
|
||||
body: context.funcName
|
||||
body: context.funcName,
|
||||
};
|
||||
});
|
||||
|
||||
// \mathop class command
|
||||
defineFunction("\\mathop", {
|
||||
numArgs: 1
|
||||
numArgs: 1,
|
||||
}, function(context, args) {
|
||||
var body = args[0];
|
||||
return {
|
||||
type: "op",
|
||||
limits: false,
|
||||
symbol: false,
|
||||
value: ordargument(body)
|
||||
value: ordargument(body),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -453,10 +453,10 @@ defineFunction("\\mathop", {
|
||||
defineFunction([
|
||||
"\\dfrac", "\\frac", "\\tfrac",
|
||||
"\\dbinom", "\\binom", "\\tbinom",
|
||||
"\\\\atopfrac" // can’t be entered directly
|
||||
"\\\\atopfrac", // can’t be entered directly
|
||||
], {
|
||||
numArgs: 2,
|
||||
greediness: 2
|
||||
greediness: 2,
|
||||
}, function(context, args) {
|
||||
var numer = args[0];
|
||||
var denom = args[1];
|
||||
@@ -503,19 +503,19 @@ defineFunction([
|
||||
hasBarLine: hasBarLine,
|
||||
leftDelim: leftDelim,
|
||||
rightDelim: rightDelim,
|
||||
size: size
|
||||
size: size,
|
||||
};
|
||||
});
|
||||
|
||||
// Left and right overlap functions
|
||||
defineFunction(["\\llap", "\\rlap"], {
|
||||
numArgs: 1,
|
||||
allowedInText: true
|
||||
allowedInText: true,
|
||||
}, function(context, args) {
|
||||
var body = args[0];
|
||||
return {
|
||||
type: context.funcName.slice(1),
|
||||
body: body
|
||||
body: body,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -534,9 +534,9 @@ defineFunction([
|
||||
"\\bigl", "\\Bigl", "\\biggl", "\\Biggl",
|
||||
"\\bigr", "\\Bigr", "\\biggr", "\\Biggr",
|
||||
"\\bigm", "\\Bigm", "\\biggm", "\\Biggm",
|
||||
"\\big", "\\Big", "\\bigg", "\\Bigg"
|
||||
"\\big", "\\Big", "\\bigg", "\\Bigg",
|
||||
], {
|
||||
numArgs: 1
|
||||
numArgs: 1,
|
||||
}, function(context, args) {
|
||||
var delim = checkDelimiter(args[0], context);
|
||||
|
||||
@@ -544,14 +544,14 @@ defineFunction([
|
||||
type: "delimsizing",
|
||||
size: delimiterSizes[context.funcName].size,
|
||||
mclass: delimiterSizes[context.funcName].mclass,
|
||||
value: delim.value
|
||||
value: delim.value,
|
||||
};
|
||||
});
|
||||
|
||||
defineFunction([
|
||||
"\\left", "\\right"
|
||||
"\\left", "\\right",
|
||||
], {
|
||||
numArgs: 1
|
||||
numArgs: 1,
|
||||
}, function(context, args) {
|
||||
var delim = checkDelimiter(args[0], context);
|
||||
|
||||
@@ -559,12 +559,12 @@ defineFunction([
|
||||
// why this data doesn't match what is in buildHTML.
|
||||
return {
|
||||
type: "leftright",
|
||||
value: delim.value
|
||||
value: delim.value,
|
||||
};
|
||||
});
|
||||
|
||||
defineFunction("\\middle", {
|
||||
numArgs: 1
|
||||
numArgs: 1,
|
||||
}, function(context, args) {
|
||||
var delim = checkDelimiter(args[0], context);
|
||||
if (!context.parser.leftrightDepth) {
|
||||
@@ -573,21 +573,21 @@ defineFunction("\\middle", {
|
||||
|
||||
return {
|
||||
type: "middle",
|
||||
value: delim.value
|
||||
value: delim.value,
|
||||
};
|
||||
});
|
||||
|
||||
// Sizing functions (handled in Parser.js explicitly, hence no handler)
|
||||
defineFunction([
|
||||
"\\tiny", "\\scriptsize", "\\footnotesize", "\\small",
|
||||
"\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"
|
||||
"\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge",
|
||||
], 0, null);
|
||||
|
||||
// Style changing functions (handled in Parser.js explicitly, hence no
|
||||
// handler)
|
||||
defineFunction([
|
||||
"\\displaystyle", "\\textstyle", "\\scriptstyle",
|
||||
"\\scriptscriptstyle"
|
||||
"\\scriptscriptstyle",
|
||||
], 0, null);
|
||||
|
||||
defineFunction([
|
||||
@@ -599,10 +599,10 @@ defineFunction([
|
||||
"\\mathtt",
|
||||
|
||||
// aliases
|
||||
"\\Bbb", "\\bold", "\\frak"
|
||||
"\\Bbb", "\\bold", "\\frak",
|
||||
], {
|
||||
numArgs: 1,
|
||||
greediness: 2
|
||||
greediness: 2,
|
||||
}, function(context, args) {
|
||||
var body = args[0];
|
||||
var func = context.funcName;
|
||||
@@ -612,31 +612,31 @@ defineFunction([
|
||||
return {
|
||||
type: "font",
|
||||
font: func.slice(1),
|
||||
body: body
|
||||
body: body,
|
||||
};
|
||||
});
|
||||
|
||||
// Accents
|
||||
defineFunction([
|
||||
"\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve",
|
||||
"\\check", "\\hat", "\\vec", "\\dot"
|
||||
"\\check", "\\hat", "\\vec", "\\dot",
|
||||
// We don't support expanding accents yet
|
||||
// "\\widetilde", "\\widehat"
|
||||
], {
|
||||
numArgs: 1
|
||||
numArgs: 1,
|
||||
}, function(context, args) {
|
||||
var base = args[0];
|
||||
return {
|
||||
type: "accent",
|
||||
accent: context.funcName,
|
||||
base: base
|
||||
base: base,
|
||||
};
|
||||
});
|
||||
|
||||
// Infix generalized fractions
|
||||
defineFunction(["\\over", "\\choose", "\\atop"], {
|
||||
numArgs: 0,
|
||||
infix: true
|
||||
infix: true,
|
||||
}, function(context) {
|
||||
var replaceWith;
|
||||
switch (context.funcName) {
|
||||
@@ -655,7 +655,7 @@ defineFunction(["\\over", "\\choose", "\\atop"], {
|
||||
return {
|
||||
type: "infix",
|
||||
replaceWith: replaceWith,
|
||||
token: context.token
|
||||
token: context.token,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -663,19 +663,19 @@ defineFunction(["\\over", "\\choose", "\\atop"], {
|
||||
defineFunction(["\\\\", "\\cr"], {
|
||||
numArgs: 0,
|
||||
numOptionalArgs: 1,
|
||||
argTypes: ["size"]
|
||||
argTypes: ["size"],
|
||||
}, function(context, args) {
|
||||
var size = args[0];
|
||||
return {
|
||||
type: "cr",
|
||||
size: size
|
||||
size: size,
|
||||
};
|
||||
});
|
||||
|
||||
// Environment delimiters
|
||||
defineFunction(["\\begin", "\\end"], {
|
||||
numArgs: 1,
|
||||
argTypes: ["text"]
|
||||
argTypes: ["text"],
|
||||
}, function(context, args) {
|
||||
var nameGroup = args[0];
|
||||
if (nameGroup.type !== "ordgroup") {
|
||||
@@ -688,6 +688,6 @@ defineFunction(["\\begin", "\\end"], {
|
||||
return {
|
||||
type: "environment",
|
||||
name: name,
|
||||
nameGroup: nameGroup
|
||||
nameGroup: nameGroup,
|
||||
};
|
||||
});
|
||||
|
@@ -98,5 +98,5 @@ TextNode.prototype.toMarkup = function() {
|
||||
|
||||
module.exports = {
|
||||
MathNode: MathNode,
|
||||
TextNode: TextNode
|
||||
TextNode: TextNode,
|
||||
};
|
||||
|
@@ -27,6 +27,6 @@ function ParseNode(type, value, mode, firstToken, lastToken) {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
ParseNode: ParseNode
|
||||
ParseNode: ParseNode,
|
||||
};
|
||||
|
||||
|
@@ -18,14 +18,14 @@
|
||||
|
||||
module.exports = {
|
||||
math: {},
|
||||
text: {}
|
||||
text: {},
|
||||
};
|
||||
|
||||
function defineSymbol(mode, font, group, replace, name) {
|
||||
module.exports[mode][name] = {
|
||||
font: font,
|
||||
group: group,
|
||||
replace: replace
|
||||
replace: replace,
|
||||
};
|
||||
}
|
||||
|
||||
|
@@ -11,5 +11,5 @@ var cjkRegex =
|
||||
|
||||
module.exports = {
|
||||
cjkRegex: cjkRegex,
|
||||
hangulRegex: hangulRegex
|
||||
hangulRegex: hangulRegex,
|
||||
};
|
||||
|
@@ -51,7 +51,7 @@ var ESCAPE_LOOKUP = {
|
||||
">": ">",
|
||||
"<": "<",
|
||||
"\"": """,
|
||||
"'": "'"
|
||||
"'": "'",
|
||||
};
|
||||
|
||||
var ESCAPE_REGEX = /[&><"']/g;
|
||||
@@ -102,5 +102,5 @@ module.exports = {
|
||||
hyphenate: hyphenate,
|
||||
indexOf: indexOf,
|
||||
setTextContent: setTextContent,
|
||||
clearNode: clearNode
|
||||
clearNode: clearNode,
|
||||
};
|
||||
|
@@ -19,13 +19,13 @@ beforeEach(function() {
|
||||
parseTree(actual, defaultSettings);
|
||||
return {
|
||||
pass: false,
|
||||
message: "'" + actual + "' parsed without error"
|
||||
message: "'" + actual + "' parsed without error",
|
||||
};
|
||||
} catch (e) {
|
||||
if (expected === undefined) {
|
||||
return {
|
||||
pass: true,
|
||||
message: "'" + actual + "' parsed with error"
|
||||
message: "'" + actual + "' parsed with error",
|
||||
};
|
||||
}
|
||||
var msg = e.message;
|
||||
@@ -34,27 +34,27 @@ beforeEach(function() {
|
||||
return {
|
||||
pass: true,
|
||||
message: "'" + actual + "'" +
|
||||
" parsed with error '" + expected + "'"
|
||||
" parsed with error '" + expected + "'",
|
||||
};
|
||||
} else if (msg.slice(0, 19) === prefix) {
|
||||
return {
|
||||
pass: false,
|
||||
message: "'" + actual + "'" +
|
||||
" parsed with error '" + msg.slice(19) +
|
||||
"' but expected '" + expected + "'"
|
||||
"' but expected '" + expected + "'",
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
pass: false,
|
||||
message: "'" + actual + "'" +
|
||||
" caused error '" + msg +
|
||||
"' but expected '" + exp + "'"
|
||||
"' but expected '" + exp + "'",
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
|
@@ -17,7 +17,7 @@ var Style = require("../src/Style");
|
||||
var defaultSettings = new Settings({});
|
||||
var defaultOptions = new Options({
|
||||
style: Style.TEXT,
|
||||
size: "size5"
|
||||
size: "size5",
|
||||
});
|
||||
|
||||
var _getBuilt = function(expr, settings) {
|
||||
@@ -97,11 +97,11 @@ beforeEach(function() {
|
||||
|
||||
var result = {
|
||||
pass: true,
|
||||
message: "'" + actual + "' succeeded parsing"
|
||||
message: "'" + actual + "' succeeded parsing",
|
||||
};
|
||||
parseAndSetResult(actual, result, usedSettings);
|
||||
return result;
|
||||
}
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
@@ -113,7 +113,7 @@ beforeEach(function() {
|
||||
var result = {
|
||||
pass: false,
|
||||
message: "Expected '" + actual + "' to fail " +
|
||||
"parsing, but it succeeded"
|
||||
"parsing, but it succeeded",
|
||||
};
|
||||
|
||||
try {
|
||||
@@ -130,7 +130,7 @@ beforeEach(function() {
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
@@ -141,7 +141,7 @@ beforeEach(function() {
|
||||
|
||||
var result = {
|
||||
pass: true,
|
||||
message: "'" + actual + "' succeeded in building"
|
||||
message: "'" + actual + "' succeeded in building",
|
||||
};
|
||||
|
||||
expect(actual).toParse(usedSettings);
|
||||
@@ -160,7 +160,7 @@ beforeEach(function() {
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
@@ -170,7 +170,7 @@ beforeEach(function() {
|
||||
var result = {
|
||||
pass: true,
|
||||
message: "Parse trees of '" + actual +
|
||||
"' and '" + expected + "' are equivalent"
|
||||
"' and '" + expected + "' are equivalent",
|
||||
};
|
||||
|
||||
var actualTree = parseAndSetResult(actual, result);
|
||||
@@ -189,9 +189,9 @@ beforeEach(function() {
|
||||
"' and '" + expected + "' are not equivalent";
|
||||
}
|
||||
return result;
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
|
||||
});
|
||||
});
|
||||
@@ -1177,7 +1177,7 @@ describe("A TeX-compliant parser", function() {
|
||||
"\\rule{1em}",
|
||||
"\\llap",
|
||||
"\\bigl",
|
||||
"\\text"
|
||||
"\\text",
|
||||
];
|
||||
|
||||
for (var i = 0; i < missingGroups.length; i++) {
|
||||
@@ -1204,7 +1204,7 @@ describe("A TeX-compliant parser", function() {
|
||||
// work
|
||||
// "\\llap \\frac x y",
|
||||
"\\llap \\llap x",
|
||||
"\\sqrt \\llap x"
|
||||
"\\sqrt \\llap x",
|
||||
];
|
||||
|
||||
for (var i = 0; i < badArguments.length; i++) {
|
||||
@@ -1222,7 +1222,7 @@ describe("A TeX-compliant parser", function() {
|
||||
"\\frac x {\\llap y}",
|
||||
"\\llap {\\frac x y}",
|
||||
"\\llap {\\llap x}",
|
||||
"\\sqrt {\\llap x}"
|
||||
"\\sqrt {\\llap x}",
|
||||
];
|
||||
|
||||
for (var i = 0; i < goodArguments.length; i++) {
|
||||
@@ -1235,7 +1235,7 @@ describe("A TeX-compliant parser", function() {
|
||||
"x^\\sqrt x",
|
||||
"x^\\llap x",
|
||||
"x_\\sqrt x",
|
||||
"x_\\llap x"
|
||||
"x_\\llap x",
|
||||
];
|
||||
|
||||
for (var i = 0; i < badSupSubscripts.length; i++) {
|
||||
@@ -1248,7 +1248,7 @@ describe("A TeX-compliant parser", function() {
|
||||
"x^{\\sqrt x}",
|
||||
"x^{\\llap x}",
|
||||
"x_{\\sqrt x}",
|
||||
"x_{\\llap x}"
|
||||
"x_{\\llap x}",
|
||||
];
|
||||
|
||||
for (var i = 0; i < goodSupSubscripts.length; i++) {
|
||||
@@ -1287,7 +1287,7 @@ describe("A TeX-compliant parser", function() {
|
||||
"\\frac x \\left( y \\right)",
|
||||
"\\llap \\left( x \\right)",
|
||||
"\\sqrt \\left( x \\right)",
|
||||
"x^\\left( x \\right)"
|
||||
"x^\\left( x \\right)",
|
||||
];
|
||||
|
||||
for (var i = 0; i < badLeftArguments.length; i++) {
|
||||
@@ -1301,7 +1301,7 @@ describe("A TeX-compliant parser", function() {
|
||||
"\\frac x {\\left( y \\right)}",
|
||||
"\\llap {\\left( x \\right)}",
|
||||
"\\sqrt {\\left( x \\right)}",
|
||||
"x^{\\left( x \\right)}"
|
||||
"x^{\\left( x \\right)}",
|
||||
];
|
||||
|
||||
for (var i = 0; i < goodLeftArguments.length; i++) {
|
||||
@@ -1721,17 +1721,17 @@ describe("A parse tree generator", function() {
|
||||
"base": {
|
||||
"type": "mathord",
|
||||
"value": "\\sigma",
|
||||
"mode": "math"
|
||||
"mode": "math",
|
||||
},
|
||||
"sup": {
|
||||
"type": "textord",
|
||||
"value": "2",
|
||||
"mode": "math"
|
||||
"mode": "math",
|
||||
},
|
||||
"sub": undefined
|
||||
"sub": undefined,
|
||||
},
|
||||
"mode": "math"
|
||||
}
|
||||
"mode": "math",
|
||||
},
|
||||
]));
|
||||
});
|
||||
});
|
||||
@@ -1860,7 +1860,7 @@ describe("An array environment", function() {
|
||||
var parse = getParsed("\\begin{array}r1\\\\20\\end{array}");
|
||||
expect(parse[0].type).toBe("array");
|
||||
expect(parse[0].value.cols).toEqual([
|
||||
{ type: "align", align: "r" }
|
||||
{ type: "align", align: "r" },
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -1873,7 +1873,7 @@ describe("An array environment", function() {
|
||||
{ type: "separator", separator: "|" },
|
||||
{ type: "separator", separator: "|" },
|
||||
{ type: "align", align: "c" },
|
||||
{ type: "separator", separator: "|" }
|
||||
{ type: "separator", separator: "|" },
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -1948,7 +1948,7 @@ describe("A parser that does not throw on unsupported commands", function() {
|
||||
var errorColor = "#933";
|
||||
var noThrowSettings = new Settings({
|
||||
throwOnError: false,
|
||||
errorColor: errorColor
|
||||
errorColor: errorColor,
|
||||
});
|
||||
|
||||
it("should still parse on unrecognized control sequences", function() {
|
||||
@@ -2009,7 +2009,7 @@ describe("A macro expander", function() {
|
||||
it("should allow for multiple expansion", function() {
|
||||
compareParseTree("1\\foo2", "1aa2", {
|
||||
"\\foo": "\\bar\\bar",
|
||||
"\\bar": "a"
|
||||
"\\bar": "a",
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@@ -7,7 +7,7 @@ var childProcess = require("child_process");
|
||||
var opts = require("nomnom")
|
||||
.option("spacing", {
|
||||
flag: true,
|
||||
help: "Print mismatches involving spacing commands"
|
||||
help: "Print mismatches involving spacing commands",
|
||||
})
|
||||
.parse();
|
||||
|
||||
@@ -16,7 +16,7 @@ var keys = Object.keys(symbols.math);
|
||||
keys.sort();
|
||||
var types = [
|
||||
"mathord", "op", "bin", "rel", "open", "close", "punct", "inner",
|
||||
"spacing", "accent", "textord"
|
||||
"spacing", "accent", "textord",
|
||||
];
|
||||
|
||||
process.nextTick(writeTexFile);
|
||||
|
@@ -36,11 +36,11 @@ describe("unicode", function() {
|
||||
|
||||
var result = {
|
||||
pass: true,
|
||||
message: "'" + actual + "' succeeded parsing"
|
||||
message: "'" + actual + "' succeeded parsing",
|
||||
};
|
||||
parseAndSetResult(actual, result, usedSettings);
|
||||
return result;
|
||||
}
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
@@ -52,7 +52,7 @@ describe("unicode", function() {
|
||||
var result = {
|
||||
pass: false,
|
||||
message: "Expected '" + actual + "' to fail " +
|
||||
"parsing, but it succeeded"
|
||||
"parsing, but it succeeded",
|
||||
};
|
||||
|
||||
try {
|
||||
@@ -69,9 +69,9 @@ describe("unicode", function() {
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
|
Reference in New Issue
Block a user