From 4cfda6eb7a525efaf28c1c29b28eecd710fb230e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAnar=20Berg?= Date: Fri, 7 Jun 2024 14:31:55 -0700 Subject: [PATCH] Add CSS stylesheet Mark function idents and zero-width operator with appropriate classes such that they can be selected with CSS and correct space around them added. Also move the cancel enclose style rule to the CSS stylesheet. Fixes: #103 --- README.md | 2 + docs/index.html | 14 +- package-lock.json | 147 ++++++++++++++++++ package.json | 1 + rollup.config.js | 14 ++ src/compiler/tokenizer/lexemes.js | 50 +++--- src/compiler/transformer/transforms/styles.js | 13 +- .../transformer/transforms/styles.test.js | 18 --- src/custom-element.js | 73 +++++++++ src/stylesheets/core.css | 78 ++++++++++ test/snapshots/accents.js.snap | Bin 547 -> 548 bytes test/snapshots/basics.js.snap | Bin 390 -> 392 bytes test/snapshots/colors.js.md | 8 +- test/snapshots/colors.js.snap | Bin 751 -> 684 bytes test/snapshots/enclosed.js.md | 2 +- test/snapshots/enclosed.js.snap | Bin 249 -> 178 bytes test/snapshots/fonts.js.snap | Bin 1146 -> 1195 bytes test/snapshots/fractions.js.snap | Bin 664 -> 664 bytes test/snapshots/groupings.js.snap | Bin 1029 -> 1018 bytes test/snapshots/identifiers.js.snap | Bin 428 -> 426 bytes test/snapshots/matrices.js.snap | Bin 919 -> 916 bytes test/snapshots/numbers.js.snap | Bin 555 -> 557 bytes test/snapshots/operators.js.snap | Bin 1103 -> 1111 bytes test/snapshots/options.js.snap | Bin 577 -> 576 bytes test/snapshots/roots.js.snap | Bin 618 -> 620 bytes test/snapshots/standard-functions.js.md | 12 +- test/snapshots/standard-functions.js.snap | Bin 713 -> 751 bytes test/snapshots/sub-supscripts.js.md | 4 +- test/snapshots/sub-supscripts.js.snap | Bin 683 -> 723 bytes test/snapshots/under-overscrips.js.snap | Bin 629 -> 627 bytes test/snapshots/whitespace.js.snap | Bin 372 -> 368 bytes 31 files changed, 368 insertions(+), 68 deletions(-) create mode 100644 src/stylesheets/core.css diff --git a/README.md b/README.md index e62de4b..7fdd4d5 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ and include the **module**: ```html + ``` …the **custom element**: @@ -38,6 +39,7 @@ and include the **module**: ```html + ``` #### Usage diff --git a/docs/index.html b/docs/index.html index 1cd5717..a366d88 100644 --- a/docs/index.html +++ b/docs/index.html @@ -230,11 +230,20 @@
Client
>min) + +
  • + Stylesheet (full; not needed for custom element) +
  • …and include the module:

    -
    <script type="module" src="mathup.js"></script>
    +
    <script type="module" src="mathup.js"></script>
    +<link rel="stylesheet" href="mathup.css" />

    …the custom element:

    @@ -242,7 +251,8 @@
    Client

    …or the script:

    -
    <script src="mathup.iife.js"></script>
    +
    <script src="mathup.iife.js"></script>
    +<link rel="stylesheet" href="mathup.css" />
    diff --git a/package-lock.json b/package-lock.json index ff50421..87a3a7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "jsdom": "^22.1.0", "prettier": "3.0.3", "rollup": "^4.3.0", + "rollup-plugin-copy": "^3.5.0", "typescript": "^5.2.2" } }, @@ -2241,6 +2242,25 @@ "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", "dev": true }, + "node_modules/@types/fs-extra": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", @@ -2253,6 +2273,21 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -2432,6 +2467,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/array.prototype.findlastindex": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", @@ -3099,6 +3143,12 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -4335,6 +4385,29 @@ "node": ">= 6" } }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -4575,6 +4648,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -5462,6 +5541,15 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -6552,6 +6640,59 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup-plugin-copy": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz", + "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^8.0.1", + "colorette": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "10.0.1", + "is-plain-object": "^3.0.0" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/rollup-plugin-copy/node_modules/globby": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-copy/node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup-plugin-copy/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/rrweb-cssom": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", @@ -7419,6 +7560,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", diff --git a/package.json b/package.json index 6ee233c..a98e8f4 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,7 @@ "jsdom": "^22.1.0", "prettier": "3.0.3", "rollup": "^4.3.0", + "rollup-plugin-copy": "^3.5.0", "typescript": "^5.2.2" } } diff --git a/rollup.config.js b/rollup.config.js index 1280a82..63a6374 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,5 +1,8 @@ +import path from "node:path"; + import babel from "@rollup/plugin-babel"; import terser from "@rollup/plugin-terser"; +import copy from "rollup-plugin-copy"; /** * @typedef {import("rollup").RollupOptions} RollupOptions @@ -47,10 +50,21 @@ const defaultConfig = { plugins: [terser()], }, ], + plugins: [ babel({ babelHelpers: "runtime", }), + + copy({ + targets: [ + { + src: path.resolve("./src/stylesheets/core.css"), + dest: path.resolve("dist/"), + rename: "mathup.css", + }, + ], + }), ], }; diff --git a/src/compiler/tokenizer/lexemes.js b/src/compiler/tokenizer/lexemes.js index 3360e7f..1d09b33 100644 --- a/src/compiler/tokenizer/lexemes.js +++ b/src/compiler/tokenizer/lexemes.js @@ -82,6 +82,8 @@ export function isPunctOpen(char) { return PUNCT_CLOSE_RE.test(char); } +const FUNCTION_IDENT_ATTRS = { class: "mathup-function-ident" }; + export const KNOWN_IDENTS = new Map([ ["CC", { value: "ℂ" }], ["Delta", { value: "Δ", attrs: { mathvariant: "normal" } }], @@ -102,25 +104,25 @@ export const KNOWN_IDENTS = new Map([ ["alpha", { value: "α" }], ["beta", { value: "β" }], ["chi", { value: "χ" }], - ["cos", { value: "cos" }], - ["cosh", { value: "cosh" }], - ["cot", { value: "cot" }], - ["csc", { value: "csc" }], + ["cos", { value: "cos", attrs: { ...FUNCTION_IDENT_ATTRS } }], + ["cosh", { value: "cosh", attrs: { ...FUNCTION_IDENT_ATTRS } }], + ["cot", { value: "cot", attrs: { ...FUNCTION_IDENT_ATTRS } }], + ["csc", { value: "csc", attrs: { ...FUNCTION_IDENT_ATTRS } }], ["delta", { value: "δ" }], - ["det", { value: "det" }], - ["dim", { value: "dim" }], + ["det", { value: "det", attrs: { ...FUNCTION_IDENT_ATTRS } }], + ["dim", { value: "dim", attrs: { ...FUNCTION_IDENT_ATTRS } }], ["epsilon", { value: "ɛ" }], ["eta", { value: "η" }], ["gamma", { value: "γ" }], - ["gcd", { value: "gcd" }], + ["gcd", { value: "gcd", attrs: { ...FUNCTION_IDENT_ATTRS } }], ["iota", { value: "ι" }], ["kappa", { value: "κ" }], ["lambda", { value: "λ" }], - ["lcm", { value: "lcm" }], - ["ln", { value: "ln" }], - ["log", { value: "log" }], - ["max", { value: "max" }], - ["min", { value: "min" }], + ["lcm", { value: "lcm", attrs: { ...FUNCTION_IDENT_ATTRS } }], + ["ln", { value: "ln", attrs: { ...FUNCTION_IDENT_ATTRS } }], + ["log", { value: "log", attrs: { ...FUNCTION_IDENT_ATTRS } }], + ["max", { value: "max", attrs: { ...FUNCTION_IDENT_ATTRS } }], + ["min", { value: "min", attrs: { ...FUNCTION_IDENT_ATTRS } }], ["mu", { value: "μ" }], ["nu", { value: "ν" }], ["omega", { value: "ω" }], @@ -130,12 +132,12 @@ export const KNOWN_IDENTS = new Map([ ["pi", { value: "π" }], ["psi", { value: "ψ" }], ["rho", { value: "ρ" }], - ["sec", { value: "sec" }], + ["sec", { value: "sec", attrs: { ...FUNCTION_IDENT_ATTRS } }], ["sigma", { value: "σ" }], - ["sin", { value: "sin" }], - ["sinh", { value: "sinh" }], - ["tan", { value: "tan" }], - ["tanh", { value: "tanh" }], + ["sin", { value: "sin", attrs: { ...FUNCTION_IDENT_ATTRS } }], + ["sinh", { value: "sinh", attrs: { ...FUNCTION_IDENT_ATTRS } }], + ["tan", { value: "tan", attrs: { ...FUNCTION_IDENT_ATTRS } }], + ["tanh", { value: "tanh", attrs: { ...FUNCTION_IDENT_ATTRS } }], ["tau", { value: "τ" }], ["theta", { value: "θ" }], ["upsilon", { value: "υ" }], @@ -148,10 +150,10 @@ export const KNOWN_OPS = new Map([ ["!=", { value: "≠" }], ["!==", { value: "≢" }], ["!in", { value: "∉" }], - [".$", { value: "\u2061" }], - [".*", { value: "\u2062" }], - [".+", { value: "\u2064" }], - [".,", { value: "\u2063" }], + [".$", { value: "\u2061", attrs: { class: "mathup-function-application" } }], + [".*", { value: "\u2062", attrs: { class: "mathup-invisible-times" } }], + [".+", { value: "\u2064", attrs: { class: "mathup-invisible-add" } }], + [".,", { value: "\u2063", attrs: { class: "mathup-invisible-separator" } }], ["'", { value: "′", attrs: { lspace: 0, rspace: 0 } }], ["''", { value: "″", attrs: { lspace: 0, rspace: 0 } }], ["'''", { value: "‴", attrs: { lspace: 0, rspace: 0 } }], @@ -318,6 +320,9 @@ export const KNOWN_PREFIX = new Map([ // Roots ["root", { name: "root", arity: 2 }], ["sqrt", { name: "sqrt" }], + + // Enclose + ["cancel", { name: "row", attrs: { class: "mathup-enclose-cancel" } }], ]); export const KNOWN_COMMANDS = new Map([ @@ -356,7 +361,4 @@ export const KNOWN_COMMANDS = new Map([ ["bg.red", { name: "background", value: "red" }], ["bg.white", { name: "background", value: "white" }], ["bg.yellow", { name: "background", value: "yellow" }], - - // Enclose - ["cancel", { name: "enclose", value: "updiagonalstrike" }], ]); diff --git a/src/compiler/transformer/transforms/styles.js b/src/compiler/transformer/transforms/styles.js index 41e5cdb..b4735c0 100644 --- a/src/compiler/transformer/transforms/styles.js +++ b/src/compiler/transformer/transforms/styles.js @@ -1,8 +1,5 @@ /** @typedef {import("../index.js").Tag} Tag */ -const UP_DIAGONAL_STROKE_BACKGROUND = - "linear-gradient(to bottom right, transparent calc(50% - 0.1ex), currentColor calc(50% - 0.05ex), currentColor calc(50% + 0.05ex), transparent calc(50% + 0.1ex))"; - /** * @param {string} name * @param {string} value @@ -26,15 +23,9 @@ export function applyStyles(styles, tag) { const combinedStyles = new Map(); for (const [name, value] of styles) { - if ( - name === "background" || - (name === "enclose" && value === "updiagonalstrike") - ) { + if (name === "background") { const currentValue = combinedStyles.get("background"); - const backgroundValue = - name === "background" - ? withCustomProperty(name, value) - : UP_DIAGONAL_STROKE_BACKGROUND; + const backgroundValue = withCustomProperty(name, value); if (currentValue) { combinedStyles.set("background", `${currentValue},${backgroundValue}`); diff --git a/src/compiler/transformer/transforms/styles.test.js b/src/compiler/transformer/transforms/styles.test.js index adf489d..8be63fd 100644 --- a/src/compiler/transformer/transforms/styles.test.js +++ b/src/compiler/transformer/transforms/styles.test.js @@ -54,24 +54,6 @@ test("applyStyles overrides backgrounds", (t) => { }); }); -test("applyStyles stacks enclose over backgrounds", (t) => { - const styles = new Map([ - ["enclose", "updiagonalstrike"], - ["background", "red"], - ]); - const tag = { - tag: "mrow", - }; - - t.deepEqual(applyStyles(styles, tag), { - tag: "mrow", - attrs: { - style: - "background:linear-gradient(to bottom right, transparent calc(50% - 0.1ex), currentColor calc(50% - 0.05ex), currentColor calc(50% + 0.05ex), transparent calc(50% + 0.1ex)),var(--mathup-background-red, red);", - }, - }); -}); - test("applyStyles conserves existing attrs", (t) => { const styles = new Map([["color", "red"]]); const tag = { diff --git a/src/custom-element.js b/src/custom-element.js index 88aebc3..7a4a4f2 100644 --- a/src/custom-element.js +++ b/src/custom-element.js @@ -4,6 +4,77 @@ import mathup from "./index.js"; const MATHML_NS = "http://www.w3.org/1998/Math/MathML"; +// Replace with (when available): +// import stylesheet from "./stylesheets/core.css" with { type: "css" }; +const stylesheet = new CSSStyleSheet(); +stylesheet.replaceSync(` + :is( + mo.mathup-function-application, + :not(mfrac, msub, msup, msubsup, munder, mover, munderover) + > :is( + .mathup-function-ident, + :is(msub, msup, msubsup, munder, mover, munderover):has( + > .mathup-function-ident:first-child + ) + ) + ) + + :is( + mi, + mn, + :is(mrow, msub, msup, msubsup, munder, mover, munderover):has( + > :is(mn, mi):first-child + ) + ), + :not(mfrac, msub, msup, msubsup, munder, mover, munderover) + > :is( + mi, + mo.mathup-function-application, + mo.mathup-invisible-times + ) + + :is( + .mathup-function-ident, + :is(msub, msup, msubsup, munder, mover, munderover):has( + > .mathup-function-ident:first-child + ) + ), + :not(mfrac, msub, msup, msubsup, munder, mover, munderover) + > :is( + mi, + mn, + mo.mathup-invisible-add, + mo.mathup-invisible-times, + :is(mrow, msub, msup, msubsup, munder, mover, munderover):has( + > :is(mi, mn):first-child + ) + ) + + mfrac, + :not(mfrac, msub, msup, msubsup, munder, mover, munderover) + > mfrac + + :is( + mi, + mn, + mfrac, + mroot, + msqrt, + mo.mathup-invisible-times, + :is(mrow, msub, msup, msubsup, munder, mover, munderover):has( + > :is(mi, mn):first-child + ) + ) { + padding-inline-start: 0.35ex; + } + + .mathup-enclose-cancel { + background: linear-gradient( + to bottom right, + transparent calc(50% - 0.1ex), + currentColor calc(50% - 0.05ex), + currentColor calc(50% + 0.05ex), + transparent calc(50% + 0.1ex) + ); + } +`); + const template = document.createElement("template"); { const slot = document.createElement("slot"); @@ -21,6 +92,8 @@ export default class MathUpElement extends HTMLElement { super(); const shadow = this.attachShadow({ mode: "open" }); + shadow.adoptedStyleSheets = [stylesheet]; + const shadowRoot = /** @type {DocumentFragment} */ (template.content.cloneNode(true)); diff --git a/src/stylesheets/core.css b/src/stylesheets/core.css new file mode 100644 index 0000000..2c4c59b --- /dev/null +++ b/src/stylesheets/core.css @@ -0,0 +1,78 @@ +/* Space beween function ident and parentless parameter: sin θ */ +:is( + mo.mathup-function-application, /* sin .$ θ */ + /* Prevent sin/cos */ + :not(mfrac, msub, msup, msubsup, munder, mover, munderover) + > :is( + .mathup-function-ident, + :is(msub, msup, msubsup, munder, mover, munderover):has( + /* log_b n, sin^2 θ */ + > .mathup-function-ident:first-child + ) + ) +) + + :is( + mi, + mn, + :is(mrow, msub, msup, msubsup, munder, mover, munderover):has( + /* sin x^2 */ + > :is(mn, mi):first-child + ) +), + +/* Space between ident and function ident: a sin */ +:not(mfrac, msub, msup, msubsup, munder, mover, munderover) + > :is( + mi, + mo.mathup-function-application, /* cos .$ sin */ + mo.mathup-invisible-times /* a .* sin */ + ) + + :is( + .mathup-function-ident, + :is(msub, msup, msubsup, munder, mover, munderover):has( + /* a sin^2 */ + > .mathup-function-ident:first-child + ) +), + +/* Space before fractions: a b/c */ +:not(mfrac, msub, msup, msubsup, munder, mover, munderover) + > :is( + mi, + mn, + mo.mathup-invisible-add, /* a .+ b/c */ + mo.mathup-invisible-times, /* a .* b/c */ + :is(mrow, msub, msup, msubsup, munder, mover, munderover):has( + /* a^2 b/c */ + > :is(mi, mn):first-child + ) + ) + + mfrac, + +/* Space after fractions: b/c d */ +:not(mfrac, msub, msup, msubsup, munder, mover, munderover) + > mfrac + + :is( + mi, + mn, + mfrac, + mroot, + msqrt, + mo.mathup-invisible-times, /* b/c .* d */ + :is(mrow, msub, msup, msubsup, munder, mover, munderover):has( + /* b/c d^2 */ + > :is(mi, mn):first-child + ) + ) { + padding-inline-start: 0.35ex; +} + +.mathup-enclose-cancel { + background: linear-gradient( + to bottom right, + transparent calc(50% - 0.1ex), + currentColor calc(50% - 0.05ex), + currentColor calc(50% + 0.05ex), + transparent calc(50% + 0.1ex) + ); +} diff --git a/test/snapshots/accents.js.snap b/test/snapshots/accents.js.snap index b4c1ab0e3357d32c29b006a0459ef805cb2c557d..ae586e98104cc5c8e68897aaa7135177a11d98c2 100644 GIT binary patch literal 548 zcmV+<0^9vTRzV@Ml00000000BEmAg*EFcgN{BE;O4$?Ap}IvnjwyK>`(tW{?EyvUSra3s@?6mohUyPhSnxofvg3q_%|Q5Ebvs5~$wM`RH)7z$%;1lkG-zPH)~eJDD+M~pr6}gW{zwianH-oem$%0;K;K_7 zLGxwb%)}g}Q)sqM83ldx2Rg9I@%#>vZRUVhTZi)s_;p|mPysZ-pe`AcT`C%&gMW3XH!QPsRS0#uvI{LP;G9+E;6^3Lxh3q8Bw?A&#EElIh>q+Q+ zez}blGD(sLx#ZFm=urZC`IKL7Glk5O>0{@EI%*k;Nf!}JTChD||82><|tDE2)7 literal 547 zcmV+;0^I#URzVpbyT5Iu;KG$}BK(QV>Z7#0L zAqyzKjvtE%00000000BEmAg*EFcgNHBE;O4$?Ap}I&-id?u%;#RlYth_sDt@1;_n+bxtA53$-U z7DN==>WNrU)d?cgxjXN9%)JnEJu&m^{7phFhp5{=wMFy*J6gxHPkr(z=dT3!Z~o&L zu6h#cL5RAUhAIc|hQMoy!JoHrP|tkLEh-{opbc#dLk{fEWPSz>2pzBl6o>jW5WrMaX9W-0qpI5*=2Qk1f0o*{KN-c|aFsXqiv_*!2 zgrj~ub>YdpAD5XOWPF`A?TAR!74g$#(lNV9ScQS^Wmk8wQ}K3!HYm7T-p%Q@L8L3Z zjIoLvhZr%yX$^@w>_`>I*`-h!i&?2VCd&>4OZ3S;p-Jh*)}=sk;J&n@HqNiz~JX*)q^`w7I07ZESnnytYm zDNV-eQ4!|ZZ!kZapG4NbNn0xRQfS^h&+kpTUCbgre-WE+EQyS8I(i8CDhj|lK`}s4 z1aKNBSO~(I0E7XTA{qKbFcgcBOYyc10wmGnaL+g}cF$nnI2s)0G1tsqC3~o{*^16^ zQZQKu@lqq66hz8=$8t@|n(#9f9^g5lDC(h`8vUZC+Y{)(>8*7$b-Fa?s)huZNwOeS z52Bbp3e!k49hWBJr>;p!$^R?-`kyfB2)kN%Qic=0&bF|8%dSDWIa}&EWFF%LNnTXv zO7-{t0l7bRP0AYsUTNXeI{fqbrN)a{mT(M#2dwthK53vky(#lyey#Ns^|zuk<-S)f mb^UBh``Q8?fNl4)=Du&b?aE!1QWb4GRPDcUSoa~V0{{T&uC;3b literal 390 zcmV;10eSvGRzV8#*-RMRm zw1jpU9yKQO>>JES^GRe-pap`F3rYLy_x*pA?P3?wwZEi9e$?5Jv=8N3OeXxjeb$ltr4{0X1zC`? z2T@EP(lpRa$AyWwNs1-~|F7`tf5NCG>}cUp5suk9J3{j#y9UMKY^&oVvk1pXFj<`` z)!(}ZWbQEKvf6-GTKKdI|9pO_aXHHp4k4HVvw5{o8t6`MN?n*=Yc)l+COfB#({iir kXIom=X6lAb_p|1{ue+_%U6xW6O*>TWzj0XiA*}-d0BJ0>8~^|S diff --git a/test/snapshots/colors.js.md b/test/snapshots/colors.js.md index 300e1b5..d757192 100644 --- a/test/snapshots/colors.js.md +++ b/test/snapshots/colors.js.md @@ -96,18 +96,18 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 - 'a' + 'a' > Snapshot 2 - '𝐚' + '𝐚' ## Cancel and background > Snapshot 1 - 'a' + 'a' > Snapshot 2 - '𝐚' + '𝐚' diff --git a/test/snapshots/colors.js.snap b/test/snapshots/colors.js.snap index 0884896cef48aacb07b9e070b06645b6400dd6d2..dcef853861812b767a16f079081dc230ac9d91ba 100644 GIT binary patch literal 684 zcmV;d0#p4#RzVxD>5{-E=pkuS`+YwA`f<+30bwW>pT1!k zNrK5f6cGZ55ynL%C``qaN%8SK455TCp4}eY9jMRFox#1G$6f;E)c2AI2)QJ9WaaZ7 zy@7n!anyfV>g11{35QD?sOxag@}cJ@k?*t}3{OywH$ecR^laLfG5}#l66fDtSrd2bbSaCAo%Qd48a3feB|> zTJ!v{r1z^%@7DK07k&ZBunp9;;KslhQ-nvBysad{K0?Z>h1!G2~VYyyv z-SnjW7D+Rn5^RIwuJ~V^otzqW$~7XCI^%taV%3i{G=#t_4gcu|esDQiC$W0oA`aeZ zAk@$XEnxmI7!EZKvLA=P5)rf2f;8sDg|>5kn08JJy8mBdeARTH^wfRr*^$+ja9e(a zTGKu6v%6X+$&Fx@`ekv-K^lV9^iBCk8l^=aN&$f=Ry_<+Jltzc!}&Cl*arEnDTS_L z)3SJH(rau=3m5lI9_Bw)Gi{oAtkHjagJw1~+`mJpv@|_{6k(Ekm`~g^amz`B2oz#u zmB5%H!UT3uUeapSC-oBw8uGv7@LuCEYt5nKt8=8;WXQ0ZTRk>$C(Ak>?_11kXu8(s Sb$-!kwDC6peLjwE4FCXNGD}PV literal 751 zcmV@g9(KJk4h;NHWl)^$sLD%Y$Vm3!?06g{Usz#tT3 zg6>x1b9bIYUTZehUKBLrN6jvWV;iWkzFl=-dt-ndIjG~QYp%KWGuNCA7dq$2w}Bj# z>-K;;o6<9tE9NxhisheeD2G$XBMtf4GRR{@2pifUnG<}Rg(tu6*~-g8&f#a8?ETY}))PBZGTv&@9xfGamm@?~mC4B%@7GuF3}Ki}Oqtq`GZlg%7Cq2mR2b6r zM60Iz<*!H(@qox|C9~px`r-J!;ijA;LKH>U*M_3IcPwYZO0jQiYsN0dup zQUCC@qI}V^oi9y#icKov=%z`-_@^qSSux*e^j}<{m~#s5@(@ZT4R)ctz$Df%J~%7lAFaRq zu!=|%Oc9L#?fMu|Q4eT*V`5+gXrurIdgWi0hMVxXQqg4iH7i32*XyLz+>(iMB~#SNertk#U+cQD h%lyMKmW`#U@Uu{bg&_82*U3;de*p}tm Snapshot 1 - 'x' + 'x' diff --git a/test/snapshots/enclosed.js.snap b/test/snapshots/enclosed.js.snap index 9e29a67f086eb69a46d53b3540965835b399a554..316e2ccee04cd909749d0e29c91b4a2e08b39180 100644 GIT binary patch literal 178 zcmV;j08RfvRzV}7S9$;d0LQ#c9RL6T literal 249 zcmV} z3E2SVaUY8a00000000Ahk3kB8Kp2Ish}PX;5CTOlTevB6<0abuj-w8aGcxlFw)7}= zo^H@(QV1f5-r{Y(4<2tUGNEW~hC4%!f)y!9$^;RVVY4;F5t3N)0(@5*<_|Q;4b|nwJ&&1T{$0f}S9uAgB|C zI}(s^e`LMu6WZw+rAjFM&BN%A;C+Oj1KxYUJ=;ki9~z!aHNSWPtM`_z1pxp68eeD2 diff --git a/test/snapshots/fonts.js.snap b/test/snapshots/fonts.js.snap index 5227c9a00ef7af3e51e8265c4359a446ab5bd8f7..4ee70ff84838793aecd679c61a5f9dd66c6de48a 100644 GIT binary patch literal 1195 zcmV;c1XTM$RzVoVIJ6cBoK zE^IYUs2__600000000B+SYL13R20uZh-aQ)LNG59S|@74ctFsmK}?ehLI?yx0wEr5 z?3=}k|77=Gx7`C0D+Y~rY-yX@t!Yo)j`3gGY`W$;I_sp@AMTdxLspv$;C1TgBq*#dm6bqfDB>YnTEHP@rGHM$48S{MC zj8QC;y27ehl<^+easu{}0`_bQW|htq3yzgSB*vd8#`8VndEz)Ec5u8>`@6kj!SSLM zEizdk%p$Is%ex+Ph@CI}z0n^$<$to`xq@rNH8n0S+Eg<<$04rCHP7vos*nEVgpsZ= zI-%C8Yz$N?ae7B_n(23nk>~Oe6}@vjV+mqg#%%uZc=JlUHxG@sNUif#F;n(zb5yw3 zm2gu^P6%=xL2e+(<|N+hcM#V9Kv+MR#JjnR&TE}y?cdkgxFAN2nnMrbo?3&13(6cmygl-+0x+8bFmJI`bllD;UMx6n zXD8z2WFNxqY-hL;WXDd`+KWTb73vz))Xp={uV+x$Qf7sfoXWwA-RJUx`7~deN;t%e zow^^STO}H&b;5}7SZY0;?wmw+chfp$20k5|W~Ov}C?$soW*Iaio7+k@;pl8WPxuK^ zwrTXsqA#JY3v@b@a`20|c+%I#3S#^<-)q%~itZens*dHj^Z};V#0pCqqB~tF=@(%?l J(Gh-aRlLeQxt)Kp{%tpBCS=)giAfq=2D#9X*Q{( z@6J6~dAJh)9eAkn$brKP4wdctf)g9psqMAt!d&_fzT=@R{A%?$HJ2qbmx%~`p9gL; zWnoRrm8``qUku64Wn@n&WRK=#tbPp9Sx%7|zoQs04ULzm;r0G!+qmZO2#HNj zQ=d^+E>>OcJJhb$|6VT!&-EW}aaRgL-6j$83?|Cti0U>4;chZj1^MSQMTVm2kUCcl zvouqg(<_Qot>~08FIHnIMsi(alG@CiukIahNs0I3p7B;JcCsyN4Q@Bbg?nBJH>2cq zXDhl4tOHl3@xJ^k@Efo@jrWzWfgZ4}_ZEt`wdX{%sKe|tHPpq7VZ=s(XA}kuL0w@8 z%V(`wGQ2)IZqiOE)aKOG4tKfmsAkr^I@F(zB zKl~gqKLXAI7>+&$!hRUb|Fj=&_QP&JjI~|>E&`W;*yju2OQ6#aZ|WtD>l%nT&7;xV zG~oHnC}mzIPrMzM5}_@W29fPScOy1!SoVHr+wW}uzRo5jb`;n|lo#S*wT79<_Y{$@ z-BY1VREhVU;HuI=&sU~oxL;N9rjq~hdwded6n1`-55+$k(ua%|wr7IiQ@>@*JJS(G z%E93-Fcn|kG(M}CSBK_zw${+9*U+lhI+OWzuv~SpTy?Hb=BIR+3H+4aGJ&5m`4jkU z{0?9>+_*iNUl&VZ7fWIHl4gJH7q;Rg-HDIB4%C$3vxDIJeLU01n^z(jcZr~X6L{e+ zHAz;OY!gvfP_w}M#rhv9*3~2V+OyxD{vUVz^y|a^kltlH*NzxH9(h$En9m7(zJgCT z*@`2wo18>Eot;Ct$#I4oQzmw5tvxwH-LhO0wRh6zfv1tMsq7UlR8$Q-bziLFh0va7+5Dnp(;J`7 z`q$q-hFn#7pO_DDuRdX!Q z5iTX^z+hQRMoX`88deW|XkuQk%OvNgtYzoBryT*z5NKS)~@(kN*8 M2L&k8DA5!E00+b{)Bpeg diff --git a/test/snapshots/fractions.js.snap b/test/snapshots/fractions.js.snap index 389d124417ae05249f4ac1076f81c4419e66c06e..76cf3cbaadfa041acc885131b4d3e7d344a1fee3 100644 GIT binary patch literal 664 zcmV;J0%!d}RzVKk3$3j;TlaR zps7koKoRh^gPa*tl9ylKQ9^;OehK%C}W{KnVd}OgI!5lxdYn9SjBJphmg|t@$ z)d}+de~)7c3u+h(g>CBoq94D4Q{jjlj%~~FCyU|VtJzy}YfHo-y;h^5CzJEOXTzwpwKoR8u9j$1Y(iObwgbsLF5 ziY6rMUUsv)CRn9Op7#^8Pv!DuYhF9dTFpxPK#dk>rXr+XNnOd9y#jzQj%vLvkE|u4 yAg8Wpc=rCRi=lEhXOo3?*ZOwpcPZ3#ygX-llNTA-WqUE3m&y;V_LAqB2><{KtUMk7 literal 664 zcmV;J0%!d}RzVt!~@PU=&) zy?!lT-ye$z00000000Bcl|66NFc`=04k2bnCQMmcfe58YNa)U@QUy#fu(Vs9#OYa0 z>|i^(A~Cdp3KCm)hO#lT^BLef^b_zAa4xoE=jG_}CQhe|eSYHq&;Q5vbDD%Hi}uCa zk603!V!lO0o}w25BpgMOFe-?kC>K*E#nEXTBZ;=*g~6pk`59guTpr#YXGl)rI4j>! z4+7CRP`_m>tXhE{3+9np>fq`Y!vatyL5{ebmcU1na{Oj9-!KypMW`+>rBB|<$fH5r9>^bmy`Rm)&G!4%##W6suDBJo`WRywdj zO@iwG-{V-qf(FJyVUxPQ=*O?%I2?(`v28g18=-$vk68P=dUN#dge2#r%hW_JFRRG?9uG)QDcd4$E1M!6M45c6@ zLUIxoorP*=^uRNHebg*f-#?suaxce>fdtbCPgW!^@Csb@@?qXOu=#pvi^JD1ej#B% zU{z1ca%CpFse?t4S9yP}=W!0-d@SgOS!-BnE~v@k%s4{gIhRhx%n?u#hmG1+MK%&) y$+7PlJbQQ2$Kb5Zn`EKgjk;a?T?@4xuh&_h<}0zdG6g diff --git a/test/snapshots/groupings.js.snap b/test/snapshots/groupings.js.snap index 3e3f8b5d82378784ef17f8d89af8c78e47bd9328..0e9843fa3adc802a610469e4441d0b0dac19e4f8 100644 GIT binary patch literal 1018 zcmV8#Jm56|HBHNMer`^X0n+i&1UO@7R+(x<$d4#{bsjP zwwYNMFW!SB(uT(HG-sYGP?=-14pJb=svv8?iJ;gOH73Q{u4Q3~=hlu5oEY%G!Q%s` z21UuivSySV&X$al!%zjN3F8IHJt!FGN=1i-m&CxOqC}Pr>|pb*&vX~90wx-E^sWtLN*anB$>}^%x~(Q^?Q)rjLa0&Wj9ZnrbJEr+gXq`P7{B@+T1OT(GX#A$6k?}pUc+UytBMt7`deZpFO z(-ljJq+$J!)e(qQPl>?G)bQfXt>wW+hjHs&H%~n^2H7V%8}LF~o|6M`F}fQ}m_tb?bkSlA5Lk-H!;HCb&`{Xt*4NAdHHnZ$E2eb0^=}%&$PaC;8) zOU?4tepp_NNBIz;ly`{Z+N9D%F0-4IIRx9umGs`=q(*;iu&150k&=YX9=6L~QCb_X z4u`{x@!&_{xtdaHTrL$I>Wj9oq9{tZd4RCKpG`GfMuAF#ZDfIoo5>fzU9BfiD`zVl z(288Qw-GDuBmp+%*}w%NmQO;az}GbR`D}P%kg(-{T~9-gxRn~0lxHH0#7qqk#nR*0 zM$~i4z*C+@zqAzm9##-BTI;XF*pF*j5exSt?J^{j^$rSSnJqNdU5FX2)eo5+XXW5J zU6@z|j;ny!B5)*$1IZ#Cs%jpZ8_M2w-hGS}&}`tucF?-Ki)5a6QA#Boz-8~CLiDHw zeE-BIPK@wOr{bS>DxkHo6U#!SBj}EuxQ8mj&MCZdr@lYwxfH3hK)ORAVrctLS&~OG z1pNz(x*G)$(EwBZvKi1yoh`ZA@!M&g1A{cV^22G_%oJDC#z0PX{0NAyIZiNwgpJG^%po~ zjX&;LFdvHu00000000B+SI=t`K@?6a;!(WyqD*rTMImZWV!BYJR6#FVORX0tyOU(d z?#y;)woSB!R*O_ylnQ#YQV(Jg@BSD54-q_z;N96~XLo0Jv)ROe7R;eZciz75d%xf8 zRVyad8|=k<#4$Hfb8N<;uFXKjfqDaR1~{!DUPlgQ1lp`lIa}W|49Ma9`jNu1g7+CY zS~xMn$`<5xt!z1TS^TA-iinOTi`;QhQ9DyESu{Ar8WjIyPfR=KpJ1)hc~(l-aJD1o zpOy~5Bcerp(0ZAlZBgoXFmC$puHS%d2r%)8C4Ku@8JoNL#%6{k zvh&Ny8mSMd?7p1-VYA_tCP5Lh~*H)Ag?UMLKJkick6h#WRx(KWL*>uyUMAVG%G%%13Tge;1 zU8N__NM}nNq!hVoZ!=chNdk1*HIc&rHarqM1-`DpFJ!}G4F@g%>qZ)S#H~cTC_NKl z#AZe7AdtI`a0zj(ilCQd^-D>???DA&t-bL&i2bCJ6|rzXQVs($S@)nImf1oRy@f=a z);?r*oYn4ix;V8YE{!z=sQ3mPTPRtiqcz1t^P}0j&byDX0-E!k*a=#Xdl64xk75Ot ztb{IH_PZ6LxI`o8;E9Q?7~$El;-7{U(B9mQWuesJcgHa9fr_AWGPe@e_a`-%B6a3V zhZG`)cFv?Fc_ahSzYqzj++jBKUKZo!$J?Eqxc1aFU~E>7e6N@36jiHO$6i-S4vjY0JT92f-*M@0*TaxInG*m2TWj>= diff --git a/test/snapshots/identifiers.js.snap b/test/snapshots/identifiers.js.snap index ffbeb53d5aa747527793bb4c4d85209c260cfa84..b5ef9dadbd7f56aba06e1f61d23a2a81bf16a320 100644 GIT binary patch literal 426 zcmV;b0agA%RzVntUT_1}G00000000Ap(mhK9F&qZ)o+5&qW4BlkTM#-p3Fi$i;^5Rl1qai+)Qio% za7k@PTd!JY6~v-g717ZbeAnHjeusV%seSpUw3wTI+yhU-Lu#2c^UN#{FNmOmk;3dk zKuDIOc+U4pU}8=Xb&=}@4rXWz2Nb(v8Zj>qAr+WWGeNnFeQtY#mui-U1zy$Gh9jeq z=BJHB#)p z-@Dw?yD0UBN6;HyNj{N$D!DY^?7~FK_HxWZ880viq84!l%}^3>l&8W*@%2Riou+#3 U6oorcSIB4l0@3_V=Mn?}0EzX>cmMzZ literal 428 zcmV;d0aN}#RzVdMrkzjzvenxtdvS)OL zWf(u+10RbB00000000Ap(>+VWKpY0}MiIfyvD;Y?TM#-p2{nU@I5>4s!NF^CHD{At z$X%_Yt*O>o1+gerMRfE9-*tDX-@#8}Yuo&rVu6>nmBGkx zr1@w=k4%^0zLy@fUm$e;5+aG_!;th3s?kh z0|Q_gxC7h;R)Bl*LhU=fmiCB28+SCkpvBg9OH=Z6+BhutQwgs^!{t7u>$5gCav6qw zv$uD#t9M@N4Gy6`9yN5&$l!b0)YMDLj< Wy3Q1ZGf`K_-}nX5{7&Z*1ONa{c+!jj diff --git a/test/snapshots/matrices.js.snap b/test/snapshots/matrices.js.snap index ecd989a56cf0404db5bac99e2751016cb1cadbed..47c1de7bd661543cfddc31150689356b162288df 100644 GIT binary patch literal 916 zcmV;F18e+2RzVQ?>)P;eGnJFtj0_4PT?D*{1ZaXzYBA8T0`&Rg(5kF@8epr1kt)9yP;Km)KC2_F<>hBoT!)&PcQ=t-wY>SbBtAj-+x|qO6 zpljOXB{!vlevl5jGdDmD+C(>i!i>0r3J#D02)KO>DBMI6X(3M)H5XQKn-Y$d&&8=` zVj*OLaHTQwfT#_nqQK?$Rj|3Z8Su1*o3p2h94`T3NO%LD`c&qOX6L2ZOTrd$;%ZbtwY!A~jny3MU-j1j~ z#+#^)Ga+F2#g_q9`7IO32hm7cPQ)(FTJ`8qt0xAvS_-QFlF!MPWGsKp@pMi`31q=_ zX-1r*9rXu%Uo$&q7xzbSZD8QKW|!0z*xf!9gF zq#TwE(?el8Y9?g$BR9|)?7sIr7Oqh-ti1eF0a+IJgjlnjeEo>Mw|Hh#F867jj$&$cM*ze+CKxrg(B~mbl@4RA8j4LxVUM)5E_JJ%o*m33%zmRgkQ;C1^`J-rYSYQ1f%? ql*bxa@R%^|5Q?>)P;eGnJFtj0({BcMQ6va-{B`xP`c;~A9-0Hy6gcqZzI8ojulXUN1z_2L%o*>l|Urti0`UDsD%e(_z2Wh zi;Vc9M9}w>LHFl<)SyR%2{^WiPA%#H!~p{ONCO;q5JOT1r;3^jYq)0-M^YoXIMqxn z222o#3ycgvTVttkFx$HVwwAU$p4M?^?ljTEHy9$4o;HwkKx1fIl|#No@P8{CxZ;rf?dn|jH3kD+ZYGGQuM~l}I>WtCp;x1#c)NTaN5{Q}C`bw&MYSgXb?juj7JA zxGX8Uhr)EURLI&HbYvIJ5_FVTn^>0(o2;mA2OHdSd+_E%>~=0Ac$0yWeW0091ruvGv6 diff --git a/test/snapshots/numbers.js.snap b/test/snapshots/numbers.js.snap index 9253bbe6df858410e8291da14255ef12bc65c840..763c31013d042a3ca82be1ea0f6a8fcda129dcd1 100644 GIT binary patch literal 557 zcmV+|0@D3KRzVlf4ks#X>Mz#p(>w&@@A3lR8~i4DoNUizLn=iGDeOxUP-)ZOEq zE)rOHsP);$F0CWo4+vt=uN;&3z%d^&u>{`=NDVQrx3OsIQ&qz-s+r1htTL^ryvkI{`}Rsd z>oEMz$IZMLm8gRr~42wo3_LgF*L^)`~cZ5A1|Ju2C@Sn1mLC=X2oY zLGarY{O(CGqwOdRqt`i$@f6HORWmN9jP^6~&v>m2_uA{6r*NzMBt9~FUN8m^dT%~7 z+mPV{g7dp}tBm1BOUA&1R+<9U8_0Lj@}yt^ngr7W5y?>gNE7Ove2>c*++8~+!C71b zJg?O-eIUDu|42PQ4f#uku~d#;>H6yi+SdiuKdrCkH~*i~^It7n<*E7dQe|Z|>*h36 z9ALn9Ymw?`*;E!2E}f$mWKd9+VCT}=StG(0tR$cj0##xe()oYeoid|=`6&y5*C-R; vbkU~yJ8-7FY==cJp>ox-2T%E3F>EwjwhAhZM7!ve-S74uOtS3|E(QPq`}q-@ literal 555 zcmV+`0@VFMRzV{ptblv-4*P@Y+mp`e_gr>B>Iu%!uViw24aGt6`R5po8eSklwS@B482EfT~PJ;b~+GQeW*0tL?b-b<8iAAVYfbN>xL^g zG{C7I;?Qm^(U6mvqwAefo>-Jwm79r~*3P3u!vO|ZG!&N>z(XNlAuTm8In`FFq^LAi z$xZ_;h=8ea0X&2rbxeXvXWHFZ3uI;@f(y+YP1L{y8ng)Jeu(Xuv2k<7&4o~_FpNj> zb(TkJg+fWbLXf)?X3GDB;^)To0020N^mhON diff --git a/test/snapshots/operators.js.snap b/test/snapshots/operators.js.snap index 33c6fa2184aec38065d03ec73f9a9e71745e3e0f..cfcb48f73d8cf05d72a098aca5a68d3d56170009 100644 GIT binary patch literal 1111 zcmV-d1gQH#RzV|(mB+Un}v9q{1iIw}FPhxh?2tVbgW`2g=KUh)S7JoX`H$-%SqM^$%q_pCkZsym0F zX6n87d+%58y?V9Q>pINr`#(L#f(QpM87CMwF>n~Y0GNk45{!dIB5W|*rOun!P0ZN!l&FwY{sl7fD%f$qvc=c^#UJ(Ys^K-fqClLd|ix;O%-F~6q6 zd<;CqG4;!6-)U&m8CrPjiQ*>wWi4CZ`nAFjOn{9-DVCLudKE9;2QXyO_v?(x9E+y^vpyH!2mmBz-i92>ZlOq-H^;qXya0`@pEV}~fq@>T(VpM|Ze`a<))aJs$wE}+i{`^U{AHohiH%<+27U=Aa!+n;pKK4*N1xe9wRA_?_ zN{t$RB;Q&Nh`fp6<+hq?a^lqlodDxEXEm<1sPVf=twu%@xVTGicy24m{=z zD02yN%GI*tfmSWIcj&!RPL-!eOqHA2<4a{wvpmOaRoTeA>2pghKgP@=7!Fs80An^6 z8E@g<*|cG312=^l#77RR>Gb}I$SS=I-uvFt$doUQn)%wVM_3I8Hh4`d2et`MT7?D~M>#>C`8%bnO>*a zneMS?HpzkqpK&z^nu9M;h({I02Y6TU;tvo!?!mKo@NCbcd!}b*<7|wY9ERR>Ree=o zS5;RpHtH7Do9?YA$itq6W-CW2(-E*JIR~hN81yIuGuSi1RE;_{0Exj@H4yx$)y`m- zK*u$y=U!Pf4CujA``4B>l>EQ)`qIYoj;akkQ>)sH&hRhQ2CEhRt=bq=G`wAy z4k~CPFgW6=)L_V5*v8O*nvp-@G!=C&oX{*EW@z1}M z>)r;MiUEa9?`VtY9;Sq+s_jr0`|IrCeN)K&QWE51?fawK*Cd18&VA7V{EfM2!*w7p z!5M6L=GefV-Fx?;*#W;paLEJ0>0TmOI~kk5IVWRug1zq5N0QOKF{4f>KDV%h_^2YT zkYXQcSv-*eY1#F>p72Rw<6VLclu4!)NxyFAab5y8c+(0LMnZ)gqgzEKMZGvwQLA~& z3FH?V2+sgA$}s>(!PC5lOru1xU5yBMs1Pt;Qttt*H3UAe0;Bv$2LO{xt$XpcLIVX2 zMEpIEwa`F(jl@ks6&OlImAz>G+`~7k-ov-6-NQ@w{+5TLP!Gd4@~>J%8M1ROg|A8o zpUdeGoCtYI2ZgX`s8qWkU9XF}%(ajkL88>70$!Fk^&D?tAKnzjOT=9yxIS&y`#SoZ z?qwch(7=dfCyvu=%gX8hSd$p1I@eQlHu~W{PFNT5QO=)&gy>EgTKkVuqktdbSIMDd zDe@pMOJ^FYGry6ZRirCvjQ_+y;k%Q;w|S<=pMONM&-5zCV%b`=b3R&)xU$q`V>9B9~Z@66*Wk$A6xMh&RPhLbVU~ Vq+B7$=fapD?=NSwUKaTi002kJ8d(4U diff --git a/test/snapshots/options.js.snap b/test/snapshots/options.js.snap index 370156186524690bed5367a0d7ee5b55664235cd..f6198cdf9ed37d201d2adaf56d42cac6f5e1b685 100644 GIT binary patch literal 576 zcmV-G0>Ax1RzVBc>{O@UJBXq*4{WIMHNzn5B{5Pzi;N7nTssuDmgP>zcDI^vk&{H zg(*3nL;c@}Mb0FYXbelCkcE+0np~0jbdjb=_~zNo!Rq{LwQjb@pwp6${Q9>Y~0fdw#g+LAh^;s+PrI8srGWTnlC=@a} z8u^D|Af#n(@TU&`g~ewYla*saM&pS;u^dZ;!xcGPBg1r0RzVpRNB(!}2ydWVSZW4!B zv*XCVQJKUG@WOA5XZ`^GfSa%leaA#+CDgiT+EI4Mg zCZXYUSS^Q6$T(6o1JuXzof-7UC=YbLlomj3P< PuCnwS#pQ@q%Lo7f>iH4S diff --git a/test/snapshots/roots.js.snap b/test/snapshots/roots.js.snap index eb674f9b04ff8e65e6b641515a5493b8a1b99ded..904f9c617ba573aa83d005bfea2444862bf39365 100644 GIT binary patch literal 620 zcmV-y0+angRzVmG1X2wdoY%8He?D&K71BhSf5A+}MCCJX$p0ORb5@LZDmg9TpoO92;*SVYqgoh_` z^)psjkvKiXG9l@tdwLZ8QXd-r?U<=pE%be{PXsblC< zITH%{6vKt@QVe}pzj5=p=158o_F@Y>wBQE?e3os(Qw&)_w24_n^COCt1c5-|NvtHm ztX|Ift;%6==)08F%ej@-@+@U=RG_qI6$gayxdbsy)M;Jjg{FFCQT1yw1)p!g=UbE> zTE{0frRMP(mZ?``9avbSF0AgtXPMC5VIQnlOW?g6d*kLfe6q;i-P9h+;d-_7UCQ%l z4m$Kkdy_KHSxUUJP0)>SI`pyB72@2!= zoxu)VFMsGv41;QV^E`Oa!=;s$DA`dH5$hN#?@(Bf;%imAC8+!CP7 z-;`+CxOnoOlPG3DAcZ;DMdWK72&7%@H+yi;97|JP?X4M4RJne@TyhIj_O!s@b)$(wD3)ON|h>7c5n z@^etx!vowy(Kamz!7nZBoY5SgawfjF$;Bfu@*XFr>6aUH2%;G;y33S%> G2LJ&1PdM)Y literal 618 zcmV-w0+sziRzV)q&hFK0N?33t zE`B13B|&N*ix0|&mB!za-;yuN5ol)&3S`~BCW{;1v#pB=LIca^WzHU6*OGh4ueCtj|g>_i534BN2c#EfW@=~4qvTTY|Ulk763(j zmZD?h^7#iwLZl}QO3eHXNWLLGc*fOky{2bQO;zdW&G&XobwQ0V241;tQLtSd)Jigq z+UZ9Eh1621il&G+)c=K3|23=rHz#*BKsgYJ^xoT=c>OlFy2xYvZdD?cS+a0isLJm6 zE3$H9++wHNV^m_QP-y>&G`PBST*Y3~?^#>9|MLJ{mdjt+x_J`+$zx*iA595#*7gSg E01omqS^xk5 diff --git a/test/snapshots/standard-functions.js.md b/test/snapshots/standard-functions.js.md index f75154e..b7c5003 100644 --- a/test/snapshots/standard-functions.js.md +++ b/test/snapshots/standard-functions.js.md @@ -8,37 +8,37 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 - 'tan=sincos' + 'tan=sincos' ## The hyperbolic function > Snapshot 1 - 'sinhx=exex2,coshx=ex+ex2,tanhx=sinhxcoshx.' + 'sinhx=exex2,coshx=ex+ex2,tanhx=sinhxcoshx.' ## Logarithm change of base > Snapshot 1 - 'logbx=logkxlogkb' + 'logbx=logkxlogkb' ## Logarithm powers > Snapshot 1 - 'lnx2=2lnx' + 'lnx2=2lnx' ## Logarithm division > Snapshot 1 - 'lnxy=lnxlny' + 'lnxy=lnxlny' ## 2×2 determinants > Snapshot 1 - 'det(A)=|abcd|=adcd' + 'det(A)=|abcd|=adcd' ## Fermats little theorem diff --git a/test/snapshots/standard-functions.js.snap b/test/snapshots/standard-functions.js.snap index f47e0306c21cdb7f054065367fbf5fef07fe535d..9d880115aaf9306b295555c21ee8ec112f393901 100644 GIT binary patch literal 751 zcmVr@+VqNGK&hn@5)%UwH{6X*;x^XB zcCcTrt;E6vtSoFuMXX3j`~-dje*p0(*ih0qjgyp1Q5P~Ka{S)&`@Z+y=k?5wWpJ+F ze4@Z0rpsF=M9irGG(|6%NHvldRG}wQXA7nUNpvJZzg~wS0do3n(7V>lp8nO|jVqsf z9w!iCk24g+MC+-OtuQppAOI1oRk*;i$+5NTM&bm{KdM1j){Tx8JUvWCCOk;akWVyi4q<<64dLy+8A6@<9RS2~Ugqy_8^rI{V*8$OzT*U& z^aI58TT5Y)oNPHxHM&mo3~d|mwX zt3Pc?&i8{hr?BZ%YS)g8cI98DRSny`Y>aWR!`LeB#Z#&{0gYk?5K{yZm5TC~3SYM> z{JXc+$;8Ud9G|pwqQFOHeyjIjX7g@cx8XV=0YwWILNs;8qX!S^(m`&eoN;b3b&f`l h^1arksT+?S%w<@1R8k}I?~Ro~{sSeRDh1pM001pkz+154{MfM*7j+uZ?bus^9qf=+^k&vP0qNT-$W!?WGT|wJsYX~HDx}HG z*G27y`T>4xqQS3ES8Zh9xk+Jq7~!?C&C=d-63pb8bnTKs51LS4)>S{*(RIq^|I0e> z|DRP#E*@Q_d-e*K@^SS|SE3P5hlqVeMD1;my}bR3t{}rA%|Vn_dkAO(Ldel@@qSut z|1nZ*=j*TrmC=<37Db@`Ro8WJ+5U z3stoSsT5&V`PyX08#NlxSO+b}8_Zo|w7j&yy>)=oT3G6@?Q9)1;JHBc*2!?#IZ(fu zeg8ZIF%pR7m_Q1UxwyOTPK>`bp^%4Aib&w5FNs=VVP-%3aF*zfU`Be%?mj< zC^*QlkXIm5L>bB*GrVcd@VB80g@sLhzHqRK1gC0IOmVJ!F86((oEI=cV2fjsF1(ZJ vqsOT9fNzX5t34Lp>GVl$bCRa-eBuQ;jWwf+UL*fbtg7Tcd^F6o+6Vvusg_c= diff --git a/test/snapshots/sub-supscripts.js.md b/test/snapshots/sub-supscripts.js.md index 4feddf0..6c51b17 100644 --- a/test/snapshots/sub-supscripts.js.md +++ b/test/snapshots/sub-supscripts.js.md @@ -74,13 +74,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 - '(XT)ij=Xji' + '(XT)ij=Xji' ## The natural logarithm > Snapshot 1 - 'lnx=1x1t𝑑t' + 'lnx=1x1t𝑑t' ## Powers of powers of two diff --git a/test/snapshots/sub-supscripts.js.snap b/test/snapshots/sub-supscripts.js.snap index 86ad24b38327b50e42e5f2fd548bb3cded430d4e..233ac835f3e8fca7b1c31a04b346da5f7effabca 100644 GIT binary patch literal 723 zcmV;^0xbPORzVouD;aQSE1$Tq{aNsdB^VmT zH8pj8wtCb8aQiu;2@CX2^#!#Mek#-0(nd zAE*?LnLv;Nl_Dlk<~sk;WIOl1v+jA7vG7&}T8BokXD&JwH2()1SNF-LOq>Sf4Qv6DVchD+qGl!}JZ7I3lPg5r+aQ zCcJQV_(kvTexqSZWYeq2;;RMs|5dQrp)GgZPKp49Di@Fd!p2Zwm9{j^Ps{Zmx@m9& zX_V9X1<}I^qRI;i)m~5a5E=E>?J_(1uBUvXY>>q#i=!tS2^cqmR2@{kt6M-w4vW3K z>xI8Qot|n_RLj^_ZcMh>q__gv2ynep6XyD{Zw>e>dxmt6ul(;$gZ(J7{szNJjtKz? F003gHRxJPk literal 683 zcmV;c0#yA$RzV{_EC^&Gp;8>3k48|!{r<(^a-e^mOTm@Sz5Wc!B<#=B zE9#0v*zc*Uws2wfibuUaex*`oDKW(VU5hzdBz&MOQfRT7*8HlS*4@7gK6L~`E4jL+ z$MDn$e(7#J zIH4+g0@T7PW9C=>gUxo~U9j$XrSvyS(8@JxcipPF#_ODd>=~3C&-JPh!KgqU{mV|^ z;QtETy=<)T%^J(T*`K}T>CgQ4Zn;ITm0nN7(Pz`TX>A$`9=i~cBVI+DHb$$@R>Rk6 zFF}AnnQ@qclujU5XLLime>nB}Zt8`@l$biq4TObTwQ_O%&1~Ri(Y)m=%VS|S<}j`~ z$;zpGR<(x<26dh9cf+3_&(2KRvhS}{nQy*JbNzXuW5A3hbLwY2b(ZgyJKtvhR{r-V R)xGJczX86t61$xU003g&OWgnf diff --git a/test/snapshots/under-overscrips.js.snap b/test/snapshots/under-overscrips.js.snap index 2927d4f849cc6eb27aa66a5266be0d7002cf6445..22e5103a6ad507102195daa7f403dd5c9aef532f 100644 GIT binary patch literal 627 zcmV-(0*w7ZRzV zygYvvgCC0s00000000BUl`)UgFc^k=AjHfDh{38DKnPMe-IiLMIO!%9gv70G>|Q@L zwnOaDumQsfv7GJ}Hl$Iuy~RR^9l0-uL@H=VCgEWi(fx zzA_CuX4wI#Bqnba$^>Ppic(0l0wqYIW>Ty77nBlBj-Fl}Tptvlooj;|J5NGR^bCi* zd@aopXHW4TaBrvzdU#}y8esXv7ehG^d*+U=xZgn23#g`)Xt0+@rIIS1`^t2gnU zCoff(3!Yr#PcH#R#0kHUb98jS-My%^y$xYcH-LTouaerb zxJ~NTp^PaLC?y&sx<}cR3D6+L{cfjUHc791A6QhtzfLTT1-4L{wlU zZ!py`M;bU&DDU>>ZzuF0gVw!RX1-8*_ZR3FUk-^hMW_}@Be%M_nvb-9z`si zit}$+5*gw2kccFL9|TA#!d!%$BvKGTVIn3>iqmU^poGUS*1ZQ_{#v{5JzU!z#86Ix zL0lYCPZAsteD$8MV7c&Z%wy~SaN+Mm!IiUEB7q1Y}3x}*+R|Nmgb?A zqC91GOJ9MlNbQenaE*;l<+VJ!s89u-7+)&NqZ(L@?M z3{5St6IY29z~?UwI8wn4^$rdCYDFtFwM{#_;J=C+m$qCkC7hu&bhX}+uop|f?))pK zRxECu+Bjkn!W3{Q2?I|M9%D+>l5V#<{iaTO?}uklN$~s3&=_C?C2=ML6;*vKmet6{ zV-7=W8fp`u_vT^r7wrLh+A%)$o2oo)5B4i4ImrMbF{XLCj=>&Tg?ZEcFVJvX@!VWi zSn(25O{PF95CO7wZ~n1N|LHaE#Zuc4WG!D*>wNrPt>3&!5UkQHE^suqn_w%dcKU zUnIk!tRIUA00000000BElD$sDKoEo-Aw;=8o8R zj(07alAjkzo)kI8U=xKDh-+`=o4MVaM?q}EDZMX{HOE*U+}aF*6&kPxf%1TGmZM=P zlxCzG|Zj9p3&b?}x2bBI!KR5F zavdd%{Jco}q&N+s303KU@ZiBd_q)gEdKLw-4yW`nMWg;D+mHO