diff --git a/CHANGELOG.md b/CHANGELOG.md
index b77b5ef8..c6880154 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,7 @@
## Unreleased
-...
+* Make `katex` dependency optional by inlining copy of [markdown-it-texmath](https://github.com/goessner/markdown-it-texmath) (see [#15](https://github.com/nextjournal/markdown/issues/15))
## 0.7.186
diff --git a/README.md b/README.md
index c65be45e..7b5b5da5 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ A cross-platform clojure library for [Markdown](https://en.wikipedia.org/wiki/Ma
## Features
* _Focus on data_: parsing yields an AST ([à la Pandoc](https://nextjournal.github.io/markdown/notebooks/pandoc)) of nested data representing a structured document.
-* _Cross Platform_: using [commonmark-java](https://github.com/commonmark/commonmark-java) on the JVM and [markdown-it](https://github.com/markdown-it/markdown-it) for clojurescript
+* _Cross Platform_: using [commonmark-java](https://github.com/commonmark/commonmark-java) on the JVM and [markdown-it](https://github.com/markdown-it/markdown-it) for ClojureScript.
* _Configurable [Hiccup](https://github.com/weavejester/hiccup) conversion_.
## Try
diff --git a/deps.edn b/deps.edn
index 47f1d0a8..59327203 100644
--- a/deps.edn
+++ b/deps.edn
@@ -9,7 +9,8 @@
:aliases
{:nextjournal/clerk
{:extra-paths ["notebooks" "dev"]
- :extra-deps {io.github.nextjournal/clerk {:mvn/version "0.17.1102"
+ :extra-deps {io.github.nextjournal/clerk {:git/sha "39b73a0acf0b29ff8fef70ff462f170c21026a3f"
+ ;; :mvn/version "0.17.1102"
:exclusions [io.github.nextjournal/markdown]}}
:jvm-opts ["-Dclojure.main.report=stderr"
#_"-Dclerk.resource_manifest={\"/js/viewer.js\" \"js/viewer.js\"}"] ;;
@@ -28,7 +29,7 @@
org.babashka/http-client {:mvn/version "0.3.11"}
org.clojure/data.json {:mvn/version "2.4.0"}
org.clojure/test.check {:mvn/version "1.1.1"}
- io.github.nextjournal/clerk {:git/sha "f4c5488e36c8df11fe352889544e7deb9af73cb7"
+ io.github.nextjournal/clerk {:git/sha "39b73a0acf0b29ff8fef70ff462f170c21026a3f"
:exclusions [io.github.nextjournal/markdown]}
nubank/matcher-combinators {:mvn/version "3.8.3"}
hiccup/hiccup {:mvn/version "2.0.0-RC5"}}}
diff --git a/dev/nextjournal/markdown/render.cljs b/dev/nextjournal/markdown/render.cljs
index 990d0e54..4f030429 100644
--- a/dev/nextjournal/markdown/render.cljs
+++ b/dev/nextjournal/markdown/render.cljs
@@ -5,7 +5,6 @@
syntaxHighlighting]]
["@codemirror/state" :refer [EditorState]]
["@codemirror/view" :refer [EditorView keymap]]
- ["katex" :as katex]
["react" :as react]
[clojure.string :as str]
[nextjournal.clerk.render :as render]
@@ -76,33 +75,41 @@
(react/isValidElement result) result
:else [render/inspect result]))]]))
-(def renderers
+(defn renderers [katex]
(assoc md.transform/default-hiccup-renderers
:code (fn [_ctx node] [clojure-editor {:doc (md.transform/->text node)}])
:todo-item (fn [ctx {:as node :keys [attrs]}]
(md.transform/into-markup [:li [:input {:type "checkbox" :default-checked (:checked attrs)}]] ctx node))
:formula (fn [_ctx node]
- [:span {:dangerouslySetInnerHTML {:__html (.renderToString katex (md.transform/->text node))}}])
+ [:span {:dangerouslySetInnerHTML (r/unsafe-html (.renderToString katex (md.transform/->text node)))}])
:block-formula (fn [_ctx node]
- [:div {:dangerouslySetInnerHTML {:__html (.renderToString katex (md.transform/->text node) #js {:displayMode true})}}])))
+ [:div {:dangerouslySetInnerHTML (r/unsafe-html (.renderToString katex (md.transform/->text node) #js {:displayMode true}))}])))
(defn inspect-expanded [x]
(r/with-let [expanded-at (r/atom {:hover-path [] :prompt-multi-expand? false})]
(render/inspect-presented {:!expanded-at expanded-at}
(v/present x))))
-(defn try-markdown [init-text]
- (let [text->state (fn [text]
+
+
+(defn try-markdown* [{:keys [init-text katex]}]
+ (let [text->state (fn [katex text]
(let [parsed (md/parse text)]
{:parsed parsed
- :hiccup (nextjournal.markdown.transform/->hiccup renderers parsed)}))
- !state (hooks/use-state (text->state init-text))]
+ :hiccup (nextjournal.markdown.transform/->hiccup (renderers katex) parsed)}))
+ !state (hooks/use-state (text->state katex init-text))]
[:div.grid.grid-cols-2.m-10
[:div.m-2.p-2.text-xl.border-2.overflow-y-scroll.bg-slate-100 {:style {:height "20rem"}}
- [editor {:doc init-text :on-change #(reset! !state (text->state %)) :lang :markdown}]]
+ [editor {:doc init-text :on-change #(reset! !state (text->state katex %)) :lang :markdown}]]
[:div.m-2.p-2.font-medium.overflow-y-scroll {:style {:height "20rem"}}
[inspect-expanded (:parsed @!state)]]
[:div.m-2.p-2.overflow-x-scroll
[inspect-expanded (:hiccup @!state)]]
[:div.m-2.p-2.bg-slate-50.viewer-markdown
[v/html (:hiccup @!state)]]]))
+
+(defn try-markdown [init-text]
+ (let [katex (hooks/use-d3-require "katex@0.16.4")]
+ (when katex
+ [try-markdown* {:init-text init-text
+ :katex katex}])))
diff --git a/package.json b/package.json
index de384b4d..2b91baf5 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,6 @@
"d3-require": "^1.2.4",
"emoji-regex": "^10.0.0",
"framer-motion": "^6.2.8",
- "katex": "^0.12.0",
"lezer-clojure": "1.0.0-rc.0",
"markdown-it": "^14.1.0",
"markdown-it-block-image": "^0.0.3",
diff --git a/src/deps.cljs b/src/deps.cljs
index ee6ca8e2..6d052ca4 100644
--- a/src/deps.cljs
+++ b/src/deps.cljs
@@ -1,6 +1,5 @@
{:npm-deps
- {"katex" "^0.12.0"
- "markdown-it" "^14.1.0"
+ {"markdown-it" "^14.1.0"
"markdown-it-block-image" "^0.0.3"
"markdown-it-footnote" "^3.0.3"
"markdown-it-texmath" "^1.0.0"
diff --git a/src/js/markdown-it-texmath.js b/src/js/markdown-it-texmath.js
new file mode 100644
index 00000000..8c2a3362
--- /dev/null
+++ b/src/js/markdown-it-texmath.js
@@ -0,0 +1,369 @@
+/*---------------------------------------------------------------------------------------------
+ * 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';
+
+function escapeHTML(text) {
+ return text
+ .replace(/&/g, "&")
+ .replace(//g, ">")
+ .replace(/"/g, """)
+ .replace(/'/g, "'")
+ .replace(/\//g, "/");
+}
+
+function texmath(md, options) {
+ 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;
+ katexOptions.macros = katexOptions.macros || options && options.macros; // ensure backwards compatibility
+
+ if (!texmath.katex) { // else ... deprecated `use` method was used ...
+ if (options && typeof options.engine === 'object') {
+ texmath.katex = options.engine;
+ }
+ else if (typeof module === "object")
+ null; // DIFFERENCE: removed this: texmath.katex = require('katex');
+ else // artifical error object.
+ texmath.katex = { renderToString() { return 'No math renderer found.' } };
+ }
+
+ // 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 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 ..
+
+texmath.inline = (rule) =>
+ function(state, silent) {
+ const pos = state.pos;
+ const str = state.src;
+ const pre = str.startsWith(rule.tag, rule.rex.lastIndex = pos) && (!rule.pre || rule.pre(str, rule.outerSpace, pos)); // valid pre-condition ...
+ const match = pre && rule.rex.exec(str);
+ const res = !!match && pos < rule.rex.lastIndex && (!rule.post || rule.post(str, rule.outerSpace, rule.rex.lastIndex - 1));
+
+ if (res) {
+ if (!silent) {
+ const token = state.push(rule.name, 'math', 0);
+ token.content = match[1];
+ token.markup = rule.tag;
+ }
+ state.pos = rule.rex.lastIndex;
+ }
+ return res;
+ }
+
+texmath.block = (rule) =>
+ function block(state, begLine, endLine, silent) {
+ const pos = state.bMarks[begLine] + state.tShift[begLine];
+ const str = state.src;
+ const pre = str.startsWith(rule.tag, rule.rex.lastIndex = pos) && (!rule.pre || rule.pre(str, false, pos)); // valid pre-condition ....
+ const match = pre && rule.rex.exec(str);
+ const res = !!match
+ && pos < rule.rex.lastIndex
+ && (!rule.post || rule.post(str, false, rule.rex.lastIndex - 1));
+
+ if (res && !silent) { // match and valid post-condition ...
+ const endpos = rule.rex.lastIndex - 1;
+ let curline;
+
+ for (curline = begLine; curline < endLine; curline++)
+ if (endpos >= state.bMarks[curline] + state.tShift[curline] && endpos <= state.eMarks[curline]) // line for end of block math found ...
+ break;
+
+ // "this will prevent lazy continuations from ever going past our end marker"
+ // s. https://github.com/markdown-it/markdown-it-container/blob/master/index.js
+ const lineMax = state.lineMax;
+ const parentType = state.parentType;
+ state.lineMax = curline;
+ state.parentType = 'math';
+
+ if (parentType === 'blockquote') // remove all leading '>' inside multiline formula
+ match[1] = match[1].replace(/(\n*?^(?:\s*>)+)/gm,'');
+ // begin token
+ let token = state.push(rule.name, 'math', 0); // 'math_block'
+ token.block = true;
+ token.tag = rule.tag;
+ token.markup = '';
+ token.content = match[1];
+ token.info = match[match.length-1]; // eq.no
+ token.map = [ begLine, curline+1 ];
+// token.hidden = true;
+ // end token ... superfluous ...
+
+ state.parentType = parentType;
+ state.lineMax = lineMax;
+ state.line = curline+1;
+ }
+ return res;
+ }
+
+texmath.render = function(tex,displayMode,options) {
+ options.displayMode = displayMode;
+ let res;
+ try {
+ res = texmath.katex.renderToString(tex, options);
+ }
+ catch(err) {
+ res = escapeHTML(`${tex}:${err.message}`)
+ }
+ return res;
+}
+
+// ! deprecated ... use options !
+texmath.use = function(katex) { // math renderer used ...
+ texmath.katex = katex; // ... katex solely at current ...
+ return texmath;
+}
+
+/*
+function dollar(state, silent) {
+ var start, max, marker, matchStart, matchEnd, token,
+ pos = state.pos,
+ ch = state.src.charCodeAt(pos);
+
+ if (ch !== 0x24) { return false; } // $
+
+ start = pos;
+ pos++;
+ max = state.posMax;
+
+ while (pos < max && state.src.charCodeAt(pos) === 0x24) { pos++; }
+
+ marker = state.src.slice(start, pos);
+
+ matchStart = matchEnd = pos;
+
+ while ((matchStart = state.src.indexOf('$', matchEnd)) !== -1) {
+ matchEnd = matchStart + 1;
+
+ while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x24) { matchEnd++; }
+
+ if (matchEnd - matchStart === marker.length) {
+ if (!silent) {
+ token = state.push('math_inline', 'math', 0);
+ token.markup = marker;
+ token.content = state.src.slice(pos, matchStart)
+ .replace(/[ \n]+/g, ' ')
+ .trim();
+ }
+ state.pos = matchEnd;
+ return true;
+ }
+ }
+
+ if (!silent) { state.pending += marker; }
+ state.pos += marker.length;
+ return true;
+};
+*/
+
+// used for enable/disable math rendering by `markdown-it`
+texmath.inlineRuleNames = ['math_inline','math_inline_double'];
+texmath.blockRuleNames = ['math_block','math_block_eqno'];
+
+texmath.$_pre = (str,outerSpace,beg) => {
+ const prv = beg > 0 ? str[beg-1].charCodeAt(0) : false;
+ return outerSpace ? !prv || prv === 0x20 // space (avoiding regex's for performance reasons)
+ : !prv || prv !== 0x5c // no backslash,
+ && (prv < 0x30 || prv > 0x39); // no decimal digit .. before opening '$'
+}
+texmath.$_post = (str,outerSpace,end) => {
+ const nxt = str[end+1] && str[end+1].charCodeAt(0);
+ return outerSpace ? !nxt || nxt === 0x20 // space (avoiding regex's for performance reasons)
+ || nxt === 0x2e // '.'
+ || nxt === 0x2c // ','
+ || nxt === 0x3b // ';'
+ : !nxt || nxt < 0x30 || nxt > 0x39; // no decimal digit .. after closing '$'
+}
+
+texmath.rules = {
+ brackets: {
+ inline: [
+ { name: 'math_inline',
+ rex: /\\\((.+?)\\\)/gy,
+ tmpl: '$1',
+ tag: '\\('
+ }
+ ],
+ block: [
+ { name: 'math_block_eqno',
+ rex: /\\\[(((?!\\\]|\\\[)[\s\S])+?)\\\]\s*?\(([^)$\r\n]+?)\)/gmy,
+ tmpl: '',
+ tag: '\\['
+ },
+ { name: 'math_block',
+ rex: /\\\[([\s\S]+?)\\\]/gmy,
+ tmpl: '',
+ tag: '\\['
+ }
+ ]
+ },
+ doxygen: {
+ inline: [
+ { name: 'math_inline',
+ rex: /\\f\$(.+?)\\f\$/gy,
+ tmpl: '$1',
+ tag: '\\f$'
+ }
+ ],
+ block: [
+ { name: 'math_block_eqno',
+ rex: /\\f\[([^]+?)\\f\]\s*?\(([^)\s]+?)\)/gmy,
+ tmpl: '',
+ tag: '\\f['
+ },
+ { name: 'math_block',
+ rex: /\\f\[([^]+?)\\f\]/gmy,
+ tmpl: '',
+ tag: '\\f['
+ }
+ ]
+ },
+ gitlab: {
+ inline: [
+ { name: 'math_inline',
+ rex: /\$`(.+?)`\$/gy,
+ tmpl: '$1',
+ tag: '$`'
+ }
+ ],
+ block: [
+ { name: 'math_block_eqno',
+ rex: /`{3}math\s*([^`]+?)\s*?`{3}\s*\(([^)\r\n]+?)\)/gm,
+ tmpl: '',
+ tag: '```math'
+ },
+ { name: 'math_block',
+ rex: /`{3}math\s*([^`]*?)\s*`{3}/gm,
+ tmpl: '',
+ tag: '```math'
+ }
+ ]
+ },
+ julia: {
+ inline: [
+ { name: 'math_inline',
+ rex: /`{2}([^`]+?)`{2}/gy,
+ tmpl: '$1',
+ tag: '``'
+ },
+ { name: 'math_inline',
+ rex: /\$((?:\S?)|(?:\S.*?\S))\$/gy,
+ tmpl: '$1',
+ tag: '$',
+ spaceEnclosed: false,
+ pre: texmath.$_pre,
+ post: texmath.$_post,
+
+ }
+ ],
+ block: [
+ { name: 'math_block_eqno',
+ rex: /`{3}math\s+?([^`]+?)\s+?`{3}\s*?\(([^)$\r\n]+?)\)/gmy,
+ tmpl: '',
+ tag: '```math'
+ },
+ { name: 'math_block',
+ rex: /`{3}math\s+?([^`]+?)\s+?`{3}/gmy,
+ tmpl: '',
+ tag: '```math'
+ }
+ ]
+ },
+ kramdown: {
+ inline: [
+ { name: 'math_inline',
+ rex: /\${2}(.+?)\${2}/gy,
+ tmpl: '$1',
+ tag: '$$'
+ }
+ ],
+ block: [
+ { name: 'math_block_eqno',
+ rex: /\${2}([^$]+?)\${2}\s*?\(([^)\s]+?)\)/gmy,
+ tmpl: '',
+ tag: '$$'
+ },
+ { name: 'math_block',
+ rex: /\${2}([^$]+?)\${2}/gmy,
+ tmpl: '',
+ tag: '$$'
+ }
+ ]
+ },
+ beg_end: {
+ inline: [],
+ block: [
+ {
+ name: "math_block",
+ rex: /(\\(?:begin)\{([a-z]+)\}[\s\S]+?\\(?:end)\{\2\})/gmy, // regexp to match \begin{...}...\end{...} environment.
+ tmpl: "",
+ tag: "\\"
+ }
+ ]
+ },
+ dollars: {
+ inline: [
+ { name: 'math_inline_double',
+ rex: /\${2}([^$]*?[^\\])\${2}/gy,
+ tmpl: '',
+ tag: '$$',
+ displayMode: true,
+ pre: texmath.$_pre,
+ post: texmath.$_post
+ },
+ { name: 'math_inline',
+ rex: /\$((?:[^\s\\])|(?:\S.*?[^\s\\]))\$/gy,
+ tmpl: '$1',
+ tag: '$',
+ outerSpace: false,
+ pre: texmath.$_pre,
+ post: texmath.$_post
+ }
+ ],
+ block: [
+ { name: 'math_block_eqno',
+ rex: /\${2}([^$]*?[^\\])\${2}\s*?\(([^)\s]+?)\)/gmy,
+ tmpl: '',
+ tag: '$$'
+ },
+ { name: 'math_block',
+ rex: /\${2}([^$]*?[^\\])\${2}/gmy,
+ tmpl: '',
+ tag: '$$'
+ }
+ ]
+ }
+};
+
+if (typeof module === "object" && module.exports)
+ module.exports = texmath;
diff --git a/src/js/markdown.js b/src/js/markdown.js
index 7bd755ea..4286d453 100644
--- a/src/js/markdown.js
+++ b/src/js/markdown.js
@@ -1,7 +1,7 @@
let MarkdownIt = require('markdown-it'),
MD = new MarkdownIt({html: true, linkify: true, breaks: false})
-let texmath = require('markdown-it-texmath')
+let texmath = require('./markdown-it-texmath.js')
MD.use(texmath, {delimiters: "dollars"})
let blockImage = require("markdown-it-block-image")
diff --git a/yarn.lock b/yarn.lock
index 09dd9ca8..b9eede0c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -331,11 +331,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
inherits "^2.0.1"
safe-buffer "^5.0.1"
-commander@^2.19.0:
- version "2.20.3"
- resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
- integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
-
console-browserify@^1.1.0:
version "1.2.0"
resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz"
@@ -451,7 +446,7 @@ emoji-regex@^10.0.0:
entities@^4.4.0:
version "4.5.0"
- resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+ resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
esbuild@^0.12.28:
@@ -563,13 +558,6 @@ isexe@^2.0.0:
resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-katex@^0.12.0:
- version "0.12.0"
- resolved "https://registry.npmjs.org/katex/-/katex-0.12.0.tgz"
- integrity sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg==
- dependencies:
- commander "^2.19.0"
-
lezer-clojure@1.0.0-rc.0:
version "1.0.0-rc.0"
resolved "https://registry.npmjs.org/lezer-clojure/-/lezer-clojure-1.0.0-rc.0.tgz"
@@ -579,7 +567,7 @@ lezer-clojure@1.0.0-rc.0:
linkify-it@^5.0.0:
version "5.0.0"
- resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421"
+ resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz"
integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==
dependencies:
uc.micro "^2.0.0"
@@ -603,7 +591,7 @@ markdown-it-footnote@^3.0.3:
markdown-it-texmath@^1.0.0:
version "1.0.0"
- resolved "https://registry.npmjs.org/markdown-it-texmath/-/markdown-it-texmath-1.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/markdown-it-texmath/-/markdown-it-texmath-1.0.0.tgz#65703b235d07a8f96bc58cbf9d478af57154e5f0"
integrity sha512-4hhkiX8/gus+6e53PLCUmUrsa6ZWGgJW2XCW6O0ASvZUiezIK900ZicinTDtG3kAO2kon7oUA/ReWmpW2FByxg==
markdown-it-toc-done-right@^4.2.0:
@@ -611,10 +599,9 @@ markdown-it-toc-done-right@^4.2.0:
resolved "https://registry.npmjs.org/markdown-it-toc-done-right/-/markdown-it-toc-done-right-4.2.0.tgz"
integrity sha512-UB/IbzjWazwTlNAX0pvWNlJS8NKsOQ4syrXZQ/C72j+jirrsjVRT627lCaylrKJFBQWfRsPmIVQie8x38DEhAQ==
-
markdown-it@^14.1.0:
version "14.1.0"
- resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45"
+ resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz"
integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==
dependencies:
argparse "^2.0.1"
@@ -635,7 +622,7 @@ md5.js@^1.3.4:
mdurl@^2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0"
+ resolved "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz"
integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==
miller-rabin@^4.0.0:
@@ -761,7 +748,7 @@ public-encrypt@^4.0.0:
punycode.js@^2.3.1:
version "2.3.1"
- resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7"
+ resolved "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz"
integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==
punycode@1.3.2:
@@ -988,7 +975,7 @@ tty-browserify@0.0.0:
uc.micro@^2.0.0, uc.micro@^2.1.0:
version "2.1.0"
- resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee"
+ resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz"
integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==
url@^0.11.0: