temml 0.10.14 → 0.10.15

Sign up to get free protection for your applications and to get access to all the features.
package/dist/temml.js CHANGED
@@ -974,6 +974,10 @@ var temml = (function () {
974
974
  defineSymbol(math, mathord, "\u220E", "\\QED", true);
975
975
  defineSymbol(math, mathord, "\u2030", "\\permil", true);
976
976
  defineSymbol(text, textord, "\u2030", "\\permil");
977
+ defineSymbol(math, mathord, "\u2609", "\\astrosun", true);
978
+ defineSymbol(math, mathord, "\u263c", "\\sun", true);
979
+ defineSymbol(math, mathord, "\u263e", "\\leftmoon", true);
980
+ defineSymbol(math, mathord, "\u263d", "\\rightmoon", true);
977
981
 
978
982
  // AMS Negated Binary Relations
979
983
  defineSymbol(math, rel, "\u226e", "\\nless", true);
@@ -2132,9 +2136,7 @@ var temml = (function () {
2132
2136
  }
2133
2137
  if (settings.displayMode) {
2134
2138
  math.setAttribute("display", "block");
2135
- math.style.display = math.children.length === 1 && math.children[0].type === "mtable"
2136
- ? "inline"
2137
- : "block math"; // necessary in Chromium.
2139
+ math.style.display = "block math"; // necessary in Chromium.
2138
2140
  // Firefox and Safari do not recognize display: "block math".
2139
2141
  // Set a class so that the CSS file can set display: block.
2140
2142
  math.classes = ["tml-display"];
@@ -3825,10 +3827,20 @@ var temml = (function () {
3825
3827
  node.style.borderBottom = "0.065em solid";
3826
3828
  break
3827
3829
  case "\\cancel":
3828
- node.classes.push("cancel");
3830
+ node.style.background = `linear-gradient(to top left,
3831
+ rgba(0,0,0,0) 0%,
3832
+ rgba(0,0,0,0) calc(50% - 0.06em),
3833
+ rgba(0,0,0,1) 50%,
3834
+ rgba(0,0,0,0) calc(50% + 0.06em),
3835
+ rgba(0,0,0,0) 100%);`;
3829
3836
  break
3830
3837
  case "\\bcancel":
3831
- node.classes.push("bcancel");
3838
+ node.style.background = `linear-gradient(to top right,
3839
+ rgba(0,0,0,0) 0%,
3840
+ rgba(0,0,0,0) calc(50% - 0.06em),
3841
+ rgba(0,0,0,1) 50%,
3842
+ rgba(0,0,0,0) calc(50% + 0.06em),
3843
+ rgba(0,0,0,0) 100%);`;
3832
3844
  break
3833
3845
  /*
3834
3846
  case "\\longdiv":
@@ -3872,7 +3884,18 @@ var temml = (function () {
3872
3884
  break
3873
3885
  }
3874
3886
  case "\\xcancel":
3875
- node.classes.push("xcancel");
3887
+ node.style.background = `linear-gradient(to top left,
3888
+ rgba(0,0,0,0) 0%,
3889
+ rgba(0,0,0,0) calc(50% - 0.06em),
3890
+ rgba(0,0,0,1) 50%,
3891
+ rgba(0,0,0,0) calc(50% + 0.06em),
3892
+ rgba(0,0,0,0) 100%),
3893
+ linear-gradient(to top right,
3894
+ rgba(0,0,0,0) 0%,
3895
+ rgba(0,0,0,0) calc(50% - 0.06em),
3896
+ rgba(0,0,0,1) 50%,
3897
+ rgba(0,0,0,0) calc(50% + 0.06em),
3898
+ rgba(0,0,0,0) 100%);`;
3876
3899
  break
3877
3900
  }
3878
3901
  if (group.backgroundColor) {
@@ -4303,24 +4326,94 @@ var temml = (function () {
4303
4326
  // Write horizontal rules
4304
4327
  if (i === 0 && hlines[0].length > 0) {
4305
4328
  if (hlines[0].length === 2) {
4306
- mtr.classes.push("tml-top-double");
4329
+ mtr.children.forEach(cell => { cell.style.borderTop = "0.15em double"; });
4307
4330
  } else {
4308
- mtr.classes.push(hlines[0][0] ? "tml-top-dashed" : "tml-top-solid");
4331
+ mtr.children.forEach(cell => {
4332
+ cell.style.borderTop = hlines[0][0] ? "0.06em dashed" : "0.06em solid";
4333
+ });
4309
4334
  }
4310
4335
  }
4311
4336
  if (hlines[i + 1].length > 0) {
4312
4337
  if (hlines[i + 1].length === 2) {
4313
- mtr.classes.push("tml-hline-double");
4338
+ mtr.children.forEach(cell => { cell.style.borderBottom = "0.15em double"; });
4314
4339
  } else {
4315
- mtr.classes.push(hlines[i + 1][0] ? "tml-hline-dashed" : "tml-hline-solid");
4340
+ mtr.children.forEach(cell => {
4341
+ cell.style.borderBottom = hlines[i + 1][0] ? "0.06em dashed" : "0.06em solid";
4342
+ });
4316
4343
  }
4317
4344
  }
4318
4345
  tbl.push(mtr);
4319
4346
  }
4320
- let table = new mathMLTree.MathNode("mtable", tbl);
4347
+
4321
4348
  if (group.envClasses.length > 0) {
4322
- table.classes = group.envClasses.map(e => "tml-" + e);
4349
+ const pad = group.envClasses.includes("jot")
4350
+ ? "0.7" // 0.5ex + 0.09em top & bot padding
4351
+ : group.envClasses.includes("small")
4352
+ ? "0.35"
4353
+ : "0.5"; // 0.5ex default top & bot padding
4354
+ const sidePadding = group.envClasses.includes("abut")
4355
+ ? "0"
4356
+ : group.envClasses.includes("cases")
4357
+ ? "0"
4358
+ : group.envClasses.includes("small")
4359
+ ? "0.1389"
4360
+ : group.envClasses.includes("cd")
4361
+ ? "0.25"
4362
+ : "0.4"; // default side padding
4363
+
4364
+ const numCols = tbl.length === 0 ? 0 : tbl[0].children.length;
4365
+
4366
+ const sidePad = (j, hand) => {
4367
+ if (j === 0 && hand === 0) { return "0" }
4368
+ if (j === numCols - 1 && hand === 1) { return "0" }
4369
+ if (group.envClasses[0] !== "align") { return sidePadding }
4370
+ if (hand === 1) { return "0" }
4371
+ if (group.addEqnNum) {
4372
+ return (j % 2) ? "1" : "0"
4373
+ } else {
4374
+ return (j % 2) ? "0" : "1"
4375
+ }
4376
+ };
4377
+
4378
+ // Padding
4379
+ for (let i = 0; i < tbl.length; i++) {
4380
+ for (let j = 0; j < tbl[i].children.length; j++) {
4381
+ tbl[i].children[j].style.padding = `${pad}ex ${sidePad(j, 1)}em ${pad}ex ${sidePad(j, 0)}em`;
4382
+ }
4383
+ }
4384
+
4385
+ // Justification
4386
+ const align = group.envClasses.includes("align") || group.envClasses.includes("alignat");
4387
+ for (let i = 0; i < tbl.length; i++) {
4388
+ const row = tbl[i];
4389
+ if (align) {
4390
+ for (let j = 0; j < row.children.length; j++) {
4391
+ // Chromium does not recognize text-align: left. Use -webkit-
4392
+ // TODO: Remove -webkit- when Chromium no longer needs it.
4393
+ row.children[j].style.textAlign = "-webkit-" + (j % 2 ? "left" : "right");
4394
+ }
4395
+ }
4396
+ if (row.children.length > 1 && group.envClasses.includes("cases")) {
4397
+ row.children[1].style.padding = row.children[1].style.padding.replace(/0em$/, "1em");
4398
+ }
4399
+
4400
+ if (group.envClasses.includes("cases") || group.envClasses.includes("subarray")) {
4401
+ for (const cell of row.children) {
4402
+ cell.style.textAlign = "-webkit-" + "left";
4403
+ }
4404
+ }
4405
+ }
4406
+ } else {
4407
+ // Set zero padding on side of the matrix
4408
+ for (let i = 0; i < tbl.length; i++) {
4409
+ tbl[i].children[0].style.paddingLeft = "0em";
4410
+ if (tbl[i].children.length === tbl[0].children.length) {
4411
+ tbl[i].children[tbl[i].children.length - 1].style.paddingRight = "0em";
4412
+ }
4413
+ }
4323
4414
  }
4415
+
4416
+ let table = new mathMLTree.MathNode("mtable", tbl);
4324
4417
  if (group.scriptLevel === "display") { table.setAttribute("displaystyle", "true"); }
4325
4418
 
4326
4419
  if (group.addEqnNum || group.envClasses.includes("multline")) {
@@ -4400,6 +4493,8 @@ var temml = (function () {
4400
4493
  align = "left " + (align.length > 0 ? align : "center ") + "right ";
4401
4494
  }
4402
4495
  if (align) {
4496
+ // Firefox reads this attribute, not the -webkit-left|right written above.
4497
+ // TODO: When Chrome no longer needs "-webkit-", use CSS and delete the next line.
4403
4498
  table.setAttribute("columnalign", align.trim());
4404
4499
  }
4405
4500
 
@@ -4424,7 +4519,7 @@ var temml = (function () {
4424
4519
  cols,
4425
4520
  addEqnNum: context.envName === "align" || context.envName === "alignat",
4426
4521
  emptySingleRow: true,
4427
- envClasses: ["jot", "abut"], // set row spacing & provisional column spacing
4522
+ envClasses: ["abut", "jot"], // set row spacing & provisional column spacing
4428
4523
  maxNumCols: context.envName === "split" ? 2 : undefined,
4429
4524
  leqno: context.parser.settings.leqno
4430
4525
  },
@@ -4442,18 +4537,22 @@ var temml = (function () {
4442
4537
  // binary. This behavior is implemented in amsmath's \start@aligned.
4443
4538
  let numMaths;
4444
4539
  let numCols = 0;
4445
- if (args[0] && args[0].type === "ordgroup") {
4540
+ const isAlignedAt = context.envName.indexOf("at") > -1;
4541
+ if (args[0] && isAlignedAt) {
4542
+ // alignat environment takes an argument w/ number of columns
4446
4543
  let arg0 = "";
4447
4544
  for (let i = 0; i < args[0].body.length; i++) {
4448
4545
  const textord = assertNodeType(args[0].body[i], "textord");
4449
4546
  arg0 += textord.text;
4450
4547
  }
4548
+ if (isNaN(arg0)) {
4549
+ throw new ParseError("The alignat enviroment requires a numeric first argument.")
4550
+ }
4451
4551
  numMaths = Number(arg0);
4452
4552
  numCols = numMaths * 2;
4453
4553
  }
4454
- const isAligned = !numCols;
4455
4554
  res.body.forEach(function(row) {
4456
- if (!isAligned) {
4555
+ if (isAlignedAt) {
4457
4556
  // Case 1
4458
4557
  const curMaths = row.length / 2;
4459
4558
  if (numMaths < curMaths) {
@@ -4481,14 +4580,10 @@ var temml = (function () {
4481
4580
  align: align
4482
4581
  };
4483
4582
  }
4484
- if (context.envName === "split") ; else if (context.envName.indexOf("ed") > -1) {
4485
- res.envClasses.push("aligned"); // Sets justification
4486
- } else if (isAligned) {
4487
- res.envClasses[1] = context.envName === "align*"
4488
- ? "align-star"
4489
- : "align"; // Sets column spacing & justification
4583
+ if (context.envName === "split") ; else if (isAlignedAt) {
4584
+ res.envClasses.push("alignat"); // Sets justification
4490
4585
  } else {
4491
- res.envClasses.push("aligned"); // Sets justification
4586
+ res.envClasses[0] = "align"; // Sets column spacing & justification
4492
4587
  }
4493
4588
  return res;
4494
4589
  };
@@ -4738,7 +4833,7 @@ var temml = (function () {
4738
4833
  }
4739
4834
  const res = {
4740
4835
  cols: [],
4741
- envClasses: ["jot", "abut"],
4836
+ envClasses: ["abut", "jot"],
4742
4837
  addEqnNum: context.envName === "gather",
4743
4838
  emptySingleRow: true,
4744
4839
  leqno: context.parser.settings.leqno
@@ -11002,7 +11097,7 @@ var temml = (function () {
11002
11097
  * https://mit-license.org/
11003
11098
  */
11004
11099
 
11005
- const version = "0.10.14";
11100
+ const version = "0.10.15";
11006
11101
 
11007
11102
  function postProcess(block) {
11008
11103
  const labelMap = {};
@@ -11053,6 +11148,7 @@ var temml = (function () {
11053
11148
  /* eslint no-console:0 */
11054
11149
 
11055
11150
  /**
11151
+ * @type {import('./temml').render}
11056
11152
  * Parse and build an expression, and place that expression in the DOM node
11057
11153
  * given.
11058
11154
  */
@@ -11090,6 +11186,7 @@ var temml = (function () {
11090
11186
  }
11091
11187
 
11092
11188
  /**
11189
+ * @type {import('./temml').renderToString}
11093
11190
  * Parse and build an expression, and return the markup for that.
11094
11191
  */
11095
11192
  const renderToString = function(expression, options) {
@@ -11098,6 +11195,7 @@ var temml = (function () {
11098
11195
  };
11099
11196
 
11100
11197
  /**
11198
+ * @type {import('./temml').generateParseTree}
11101
11199
  * Parse an expression and return the parse tree.
11102
11200
  */
11103
11201
  const generateParseTree = function(expression, options) {
@@ -11106,6 +11204,7 @@ var temml = (function () {
11106
11204
  };
11107
11205
 
11108
11206
  /**
11207
+ * @type {import('./temml').definePreamble}
11109
11208
  * Take an expression which contains a preamble.
11110
11209
  * Parse it and return the macros.
11111
11210
  */
@@ -11138,6 +11237,7 @@ var temml = (function () {
11138
11237
  };
11139
11238
 
11140
11239
  /**
11240
+ * @type {import('./temml').renderToMathMLTree}
11141
11241
  * Generates and returns the Temml build tree. This is used for advanced
11142
11242
  * use cases (like rendering to custom output).
11143
11243
  */
@@ -11155,6 +11255,7 @@ var temml = (function () {
11155
11255
  }
11156
11256
  };
11157
11257
 
11258
+ /** @type {import('./temml').default} */
11158
11259
  var temml = {
11159
11260
  /**
11160
11261
  * Current Temml version