diff --git a/package-lock.json b/package-lock.json index e258274..c9258ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,19 @@ { "name": "markdown-it-texmath", - "version": "0.9.6", + "version": "0.9.7", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "0.9.6", + "name": "markdown-it-texmath", + "version": "0.9.7", "license": "MIT", + "dependencies": { + "mathjax": "^3.2.1" + }, "devDependencies": { - "katex": "^0.15.1", - "markdown-it": "^12.2.0" + "katex": "^0.15.6", + "markdown-it": "^13.0.1" } }, "node_modules/argparse": { @@ -28,18 +32,21 @@ } }, "node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", "dev": true, + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/katex": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.1.tgz", - "integrity": "sha512-KIk+gizli0gl1XaJlCYS8/donGMbzXYTka6BbH3AgvDJTOwyDY4hJ+YmzJ1F0y/3XzX5B9ED8AqB2Hmn2AZ0uA==", + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.6.tgz", + "integrity": "sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA==", "dev": true, "funding": [ "https://opencollective.com/katex", @@ -53,23 +60,23 @@ } }, "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", "dev": true, "dependencies": { "uc.micro": "^1.0.1" } }, "node_modules/markdown-it": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz", - "integrity": "sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", "dev": true, "dependencies": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, @@ -77,6 +84,11 @@ "markdown-it": "bin/markdown-it.js" } }, + "node_modules/mathjax": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-3.2.1.tgz", + "integrity": "sha512-blUch14trKnfQHjDjy1kdg5bN8jK0bdHbkerQBKCrZ3Anpb81zZ7xnj5J55vsqQoG+Irz3BHBDzRssjeehkzxg==" + }, "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", @@ -104,42 +116,47 @@ "dev": true }, "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", "dev": true }, "katex": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.1.tgz", - "integrity": "sha512-KIk+gizli0gl1XaJlCYS8/donGMbzXYTka6BbH3AgvDJTOwyDY4hJ+YmzJ1F0y/3XzX5B9ED8AqB2Hmn2AZ0uA==", + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.6.tgz", + "integrity": "sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA==", "dev": true, "requires": { "commander": "^8.0.0" } }, "linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", "dev": true, "requires": { "uc.micro": "^1.0.1" } }, "markdown-it": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz", - "integrity": "sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", "dev": true, "requires": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" } }, + "mathjax": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-3.2.1.tgz", + "integrity": "sha512-blUch14trKnfQHjDjy1kdg5bN8jK0bdHbkerQBKCrZ3Anpb81zZ7xnj5J55vsqQoG+Irz3BHBDzRssjeehkzxg==" + }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", diff --git a/package.json b/package.json index a6929e7..d5e01ed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "markdown-it-texmath", - "version": "0.9.7", + "version": "1.0.0", "description": "markdown-it extension for rendering TeX Math", "keywords": [ "TeX", @@ -20,7 +20,7 @@ }, "license": "MIT", "devDependencies": { - "katex": "^0.15.1", - "markdown-it": "^12.2.0" + "katex": "^0.15.6", + "markdown-it": "^13.0.1" } } diff --git a/readme.md b/readme.md index 0e3b39d..4ff23d2 100644 --- a/readme.md +++ b/readme.md @@ -7,6 +7,27 @@ Add TeX math equations to your Markdown documents rendered by [markdown-it](https://github.com/markdown-it/markdown-it) parser. [KaTeX](https://github.com/Khan/KaTeX) is used as a fast math renderer. +## What's New? +* `markdown-it-texmath` reached quite a stable state with version 1.0 . +* Native `begin{...}` / `end{...}` environments are supported as delimiters itself ... thanks to [William Stein](https://github.com/williamstein) for [proposing](https://github.com/goessner/markdown-it-texmath/issues/41). + + ``` + \begin{equation} + a^2+b^2=c^2 + \end{equation} + ``` + They can even be nested. + ``` + \begin{equation} + \begin{pmatrix} + A & B \\ B & C + \end{pmatrix} + \end{equation} + ``` + +* Different delimiters can be merged. Delimiters options property supports array notation for that. Example: `delimiters: ['dollars','beg_end']`. Thanks to [Liu YongLiang](https://github.com/tlylt) for [proposing](https://github.com/goessner/markdown-it-texmath/issues/40). + + ## Features Simplify the process of authoring markdown documents containing math formulas. This extension is a comfortable tool for scientists, engineers and students with markdown as their first choice document format. @@ -39,6 +60,10 @@ This extension is a comfortable tool for scientists, engineers and students with * inline: ``$$...$$`` * display: `$$...$$` * display + equation number: `$$...$$ (1)` + * `'beg_end'` (display math only) + * inline: N/A + * display: `begin{...}...end{...}` + * display + equation number: N/A ## Show me @@ -123,6 +148,14 @@ Use following links for `texmath.js` and `texmath.css` But if someone wants to help here out, pull requests are always welcome. ## CHANGELOG +### [1.0.0] on May 28, 2022 +* Update to KaTeX version `0.15.6`. +* Update to `markdown-it` `13.0.1`. +* [Bug fixed](https://github.com/goessner/markdown-it-texmath/pull/42) in level handling with `markdown-it`. Thanks to [williamstein](https://github.com/williamstein). +* [Bug fixed](https://github.com/goessner/markdown-it-texmath/pull/43) in mapping with `markdown-it`. Thanks to [williamstein](https://github.com/williamstein). +* Supporting native `begin{..}` / `end{...}` environments as delimiters itself. Thanks to [williamstein](https://github.com/williamstein) for [proposing](https://github.com/goessner/markdown-it-texmath/issues/41). +* Merging different delimiters for simultaneous use via `delimiters:[, ]`. Thanks to [tlylt](https://github.com/tlylt) for [proposing](https://github.com/goessner/markdown-it-texmath/issues/40). + ### [0.9.7] on December 07, 2021 * Redundant `` end-tag with display-mode equations removed. All modes were affected ... invisible effect though. Thanks to [yuanbug](https://github.com/yuanbug) for reporting. ### [0.9.6] on November 16, 2021 diff --git a/test/bug-brackets.html b/test/beg_end-test.html similarity index 50% rename from test/bug-brackets.html rename to test/beg_end-test.html index 8413aa0..484c84e 100644 --- a/test/bug-brackets.html +++ b/test/beg_end-test.html @@ -7,25 +7,36 @@ - + beg_end test +
diff --git a/texmath.js b/texmath.js index 779b80e..81f2b5f 100644 --- a/texmath.js +++ b/texmath.js @@ -1,5 +1,5 @@ /*--------------------------------------------------------------------------------------------- - * Copyright (c) Stefan Goessner - 2017-21. All rights reserved. + * Copyright (c) Stefan Goessner - 2017-22. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; @@ -14,7 +14,7 @@ function escapeHTML(text) { } function texmath(md, options) { - const delimiters = options && options.delimiters || 'dollars'; + const delimiters = texmath.mergeDelimiters(options && options.delimiters); const outerSpace = options && options.outerSpace || false; // inline rules, effectively `dollars` require surrounding spaces, i.e ` $\psi$ `, to be accepted as inline formulas. This is primarily a guard against misinterpreting single `$`'s in normal markdown text (relevant for inline math only. Default: `false`, for backwards compatibility). const katexOptions = options && options.katexOptions || {}; katexOptions.throwOnError = katexOptions.throwOnError || false; @@ -30,19 +30,33 @@ function texmath(md, options) { texmath.katex = { renderToString() { return 'No math renderer found.' } }; } - if (delimiters in texmath.rules) { - for (const rule of texmath.rules[delimiters].inline) { - if (!!outerSpace && 'outerSpace' in rule) rule.outerSpace = true; - md.inline.ruler.before('escape', rule.name, texmath.inline(rule)); // ! important - md.renderer.rules[rule.name] = (tokens, idx) => rule.tmpl.replace(/\$1/,texmath.render(tokens[idx].content,!!rule.displayMode,katexOptions)); - } + // inject inline rules to markdown-it + for (const rule of delimiters.inline) { + if (!!outerSpace && 'outerSpace' in rule) rule.outerSpace = true; + md.inline.ruler.before('escape', rule.name, texmath.inline(rule)); // ! important + md.renderer.rules[rule.name] = (tokens, idx) => rule.tmpl.replace(/\$1/,texmath.render(tokens[idx].content,!!rule.displayMode,katexOptions)); + } + // inject block rules to markdown-it + for (const rule of delimiters.block) { + md.block.ruler.before('fence', rule.name, texmath.block(rule)); // ! important for ```math delimiters + md.renderer.rules[rule.name] = (tokens, idx) => rule.tmpl.replace(/\$2/,escapeHTML(tokens[idx].info)) // equation number .. ? + .replace(/\$1/,texmath.render(tokens[idx].content,true,katexOptions)); + } +} + +texmath.mergeDelimiters = function(delims) { + const delimsArr = Array.isArray(delims) ? delims + : typeof delims === "string" ? [delims] + : ['dollars']; + const delimiters = { inline:[], block:[]}; // target of merge process ... - for (const rule of texmath.rules[delimiters].block) { - md.block.ruler.before('fence', rule.name, texmath.block(rule)); // ! important for ```math delimiters - md.renderer.rules[rule.name] = (tokens, idx) => rule.tmpl.replace(/\$2/,escapeHTML(tokens[idx].info)) // equation number .. ? - .replace(/\$1/,texmath.render(tokens[idx].content,true,katexOptions)); + for (const delim of delimsArr) // merge them into delimiters ... + if (delim in texmath.rules) { + delimiters.inline.push(...texmath.rules[delim].inline); + delimiters.block.push(...texmath.rules[delim].block); } - } + + return delimiters; } // texmath.inline = (rule) => dollar; // just for debugging/testing .. @@ -100,7 +114,7 @@ texmath.block = (rule) => token.markup = ''; token.content = match[1]; token.info = match[match.length-1]; // eq.no - token.map = [ begLine, curline ]; + token.map = [ begLine, curline+1 ]; // token.hidden = true; // end token ... superfluous ... @@ -305,6 +319,17 @@ texmath.rules = { } ] }, + beg_end: { + inline: [], + block: [ + { + name: "math_block", + rex: /(\\(?:begin)\{([a-z]+)\}[\s\S]+?\\(?:end)\{\2\})/gmy, // regexp to match \begin{...}...\end{...} environment. + tmpl: "
$1
", + tag: "\\" + } + ] + }, dollars: { inline: [ { name: 'math_inline_double',