Remove trailing commas for IE 9 compatibility
Summary: IE 9 doesn't like trailing commas. When we introduced eslint, we added a bunch of trailing commas, which makes IE 9 sad. Test Plan: - `make lint` - Visit http://localhost:7936/ using IE 9 on browserstack. - See that the math loads, and there are no errors in the F12 developer tools. @kevinb
This commit is contained in:
parent
74d55ee0ea
commit
4d2e46e7f6
|
@ -4,7 +4,9 @@
|
|||
"brace-style": [2, "1tbs", { "allowSingleLine": true }],
|
||||
// We'd possibly like to remove the 'properties': 'never' one day.
|
||||
"camelcase": [2, { "properties": "never" }],
|
||||
"comma-dangle": [2, "always-multiline"],
|
||||
// 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-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) {
|
||||
|
|
|
@ -48,7 +48,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.
|
||||
|
@ -79,14 +79,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);
|
||||
|
@ -167,7 +167,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);
|
||||
|
@ -244,7 +244,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
|
||||
};
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
"devDependencies": {
|
||||
"browserify": "^10.2.4",
|
||||
"clean-css": "~2.2.15",
|
||||
"eslint": "^1.10.2",
|
||||
"eslint": "^1.10.3",
|
||||
"express": "~3.3.3",
|
||||
"glob": "^5.0.15",
|
||||
"jasmine": "^2.3.2",
|
||||
|
|
|
@ -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;
|
||||
},
|
||||
}
|
||||
};
|
||||
},
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user