
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.
150 lines
3.7 KiB
JavaScript
150 lines
3.7 KiB
JavaScript
/**
|
|
* This file contains information and classes for the various kinds of styles
|
|
* used in TeX. It provides a generic `Style` class, which holds information
|
|
* about a specific style. It then provides instances of all the different kinds
|
|
* of styles possible, and provides functions to move between them and get
|
|
* information about them.
|
|
*/
|
|
|
|
var sigmas = require("./fontMetrics.js").sigmas;
|
|
|
|
var metrics = [{}, {}, {}];
|
|
var i;
|
|
for (var key in sigmas) {
|
|
if (sigmas.hasOwnProperty(key)) {
|
|
for (i = 0; i < 3; i++) {
|
|
metrics[i][key] = sigmas[key][i];
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; i < 3; i++) {
|
|
metrics[i].emPerEx = sigmas.xHeight[i] / sigmas.quad[i];
|
|
}
|
|
|
|
/**
|
|
* The main style class. Contains a unique id for the style, a size (which is
|
|
* the same for cramped and uncramped version of a style), a cramped flag, and a
|
|
* size multiplier, which gives the size difference between a style and
|
|
* textstyle.
|
|
*/
|
|
function Style(id, size, multiplier, cramped) {
|
|
this.id = id;
|
|
this.size = size;
|
|
this.cramped = cramped;
|
|
this.sizeMultiplier = multiplier;
|
|
this.metrics = metrics[size > 0 ? size - 1 : 0];
|
|
}
|
|
|
|
/**
|
|
* Get the style of a superscript given a base in the current style.
|
|
*/
|
|
Style.prototype.sup = function() {
|
|
return styles[sup[this.id]];
|
|
};
|
|
|
|
/**
|
|
* Get the style of a subscript given a base in the current style.
|
|
*/
|
|
Style.prototype.sub = function() {
|
|
return styles[sub[this.id]];
|
|
};
|
|
|
|
/**
|
|
* Get the style of a fraction numerator given the fraction in the current
|
|
* style.
|
|
*/
|
|
Style.prototype.fracNum = function() {
|
|
return styles[fracNum[this.id]];
|
|
};
|
|
|
|
/**
|
|
* Get the style of a fraction denominator given the fraction in the current
|
|
* style.
|
|
*/
|
|
Style.prototype.fracDen = function() {
|
|
return styles[fracDen[this.id]];
|
|
};
|
|
|
|
/**
|
|
* Get the cramped version of a style (in particular, cramping a cramped style
|
|
* doesn't change the style).
|
|
*/
|
|
Style.prototype.cramp = function() {
|
|
return styles[cramp[this.id]];
|
|
};
|
|
|
|
/**
|
|
* HTML class name, like "displaystyle cramped"
|
|
*/
|
|
Style.prototype.cls = function() {
|
|
return sizeNames[this.size] + (this.cramped ? " cramped" : " uncramped");
|
|
};
|
|
|
|
/**
|
|
* HTML Reset class name, like "reset-textstyle"
|
|
*/
|
|
Style.prototype.reset = function() {
|
|
return resetNames[this.size];
|
|
};
|
|
|
|
/**
|
|
* Return if this style is tightly spaced (scriptstyle/scriptscriptstyle)
|
|
*/
|
|
Style.prototype.isTight = function() {
|
|
return this.size >= 2;
|
|
};
|
|
|
|
// IDs of the different styles
|
|
var D = 0;
|
|
var Dc = 1;
|
|
var T = 2;
|
|
var Tc = 3;
|
|
var S = 4;
|
|
var Sc = 5;
|
|
var SS = 6;
|
|
var SSc = 7;
|
|
|
|
// String names for the different sizes
|
|
var sizeNames = [
|
|
"displaystyle textstyle",
|
|
"textstyle",
|
|
"scriptstyle",
|
|
"scriptscriptstyle",
|
|
];
|
|
|
|
// Reset names for the different sizes
|
|
var resetNames = [
|
|
"reset-textstyle",
|
|
"reset-textstyle",
|
|
"reset-scriptstyle",
|
|
"reset-scriptscriptstyle",
|
|
];
|
|
|
|
// Instances of the different styles
|
|
var styles = [
|
|
new Style(D, 0, 1.0, false),
|
|
new Style(Dc, 0, 1.0, true),
|
|
new Style(T, 1, 1.0, false),
|
|
new Style(Tc, 1, 1.0, true),
|
|
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),
|
|
];
|
|
|
|
// Lookup tables for switching from one style to another
|
|
var sup = [S, Sc, S, Sc, SS, SSc, SS, SSc];
|
|
var sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc];
|
|
var fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc];
|
|
var fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc];
|
|
var cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc];
|
|
|
|
// We only export some of the styles. Also, we don't export the `Style` class so
|
|
// no more styles can be generated.
|
|
module.exports = {
|
|
DISPLAY: styles[D],
|
|
TEXT: styles[T],
|
|
SCRIPT: styles[S],
|
|
SCRIPTSCRIPT: styles[SS],
|
|
};
|