diff --git a/browser/lib/markdown.js b/browser/lib/markdown.js index 49183442..46404cac 100644 --- a/browser/lib/markdown.js +++ b/browser/lib/markdown.js @@ -4,6 +4,7 @@ import emoji from 'markdown-it-emoji' import math from '@rokt33r/markdown-it-math' import mdurl from 'mdurl' import smartArrows from 'markdown-it-smartarrows' +import markdownItTocAndAnchor from '@hikerpig/markdown-it-toc-and-anchor' import _ from 'lodash' import ConfigManager from 'browser/main/lib/ConfigManager' import katex from 'katex' @@ -127,6 +128,12 @@ class Markdown { this.md.use(require('markdown-it-abbr')) this.md.use(require('markdown-it-sub')) this.md.use(require('markdown-it-sup')) + this.md.use(markdownItTocAndAnchor, { + toc: true, + tocPattern: /\[TOC\]/i, + anchorLink: false, + appendIdToHeading: false + }) this.md.use(require('./markdown-it-deflist')) this.md.use(require('./markdown-it-frontmatter')) diff --git a/package.json b/package.json index fd29b286..164e0c03 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "homepage": "https://boostnote.io", "dependencies": { "@enyaxu/markdown-it-anchor": "^5.0.2", + "@hikerpig/markdown-it-toc-and-anchor": "^4.4.0", "@rokt33r/js-sequence-diagrams": "^2.0.6-2", "@rokt33r/markdown-it-math": "^4.0.1", "@rokt33r/season": "^5.3.0", diff --git a/tests/fixtures/markdowns.js b/tests/fixtures/markdowns.js index 340f2ddd..7817b016 100644 --- a/tests/fixtures/markdowns.js +++ b/tests/fixtures/markdowns.js @@ -109,6 +109,14 @@ const footnote = ` hello-world: https://github.com/BoostIO/Boostnote/ ` +const tocPlaceholder = ` +[TOC] +# H1 +## H2 +### H3 +###$ H4 +` + export default { basic, codeblock, @@ -121,5 +129,6 @@ export default { supTexts, deflists, shortcuts, - footnote + footnote, + tocPlaceholder } diff --git a/tests/lib/markdown-test.js b/tests/lib/markdown-test.js index 31ffc518..55a1ce0e 100644 --- a/tests/lib/markdown-test.js +++ b/tests/lib/markdown-test.js @@ -73,3 +73,8 @@ test('Markdown.render() should render footnote correctly', t => { const rendered = md.render(markdownFixtures.footnote) t.snapshot(rendered) }) + +test('Markdown.render() should renders [TOC] placholder correctly', t => { + const rendered = md.render(markdownFixtures.tocPlaceholder) + t.snapshot(rendered) +}) diff --git a/tests/lib/snapshots/markdown-test.js.md b/tests/lib/snapshots/markdown-test.js.md index 4111c2f2..1b66b26a 100644 --- a/tests/lib/snapshots/markdown-test.js.md +++ b/tests/lib/snapshots/markdown-test.js.md @@ -48,6 +48,28 @@ Generated by [AVA](https://ava.li). `c=pmsqrta2+b2c = pmsqrt{a^2 + b^2}␊ ` +## Markdown.render() should renders [TOC] placholder correctly + +> Snapshot 1 + + `

␊ +

␊ +

H1

␊ +

H2

␊ +

H3

␊ +

###$ H4

␊ + ` + ## Markdown.render() should renders abbrevations correctly > Snapshot 1 diff --git a/tests/lib/snapshots/markdown-test.js.snap b/tests/lib/snapshots/markdown-test.js.snap index 3f5ec41c..f6682cfb 100644 Binary files a/tests/lib/snapshots/markdown-test.js.snap and b/tests/lib/snapshots/markdown-test.js.snap differ diff --git a/yarn.lock b/yarn.lock index a10a0fc5..a54e79e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -74,6 +74,14 @@ version "5.0.2" resolved "https://registry.yarnpkg.com/@enyaxu/markdown-it-anchor/-/markdown-it-anchor-5.0.2.tgz#d173f7b60b492aabc17dfba864c4d071f5595f72" +"@hikerpig/markdown-it-toc-and-anchor@^4.4.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@hikerpig/markdown-it-toc-and-anchor/-/markdown-it-toc-and-anchor-4.4.0.tgz#376f7be6a747536661402c944d0c7df9ad71da28" + integrity sha512-i/4bstYYAZx6Pk1W58vpr7SMEdTub7zpzJlakA0eRBkNabHnk3bFqfvUkGxFA1m1m4IxaN1V+k51fOmTPopy6Q== + dependencies: + clone "^2.1.0" + uslug "^1.0.4" + "@ladjs/time-require@^0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@ladjs/time-require/-/time-require-0.1.4.tgz#5c615d75fd647ddd5de9cf6922649558856b21a1" @@ -1814,6 +1822,11 @@ clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" +clone@^2.1.0: + version "2.1.2" + resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + co-with-promise@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co-with-promise/-/co-with-promise-4.6.0.tgz#413e7db6f5893a60b942cf492c4bec93db415ab7" @@ -9552,6 +9565,11 @@ universalify@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" +"unorm@>= 1.0.0": + version "1.6.0" + resolved "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" + integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -9629,6 +9647,13 @@ user-home@^2.0.0: dependencies: os-homedir "^1.0.0" +uslug@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/uslug/-/uslug-1.0.4.tgz#b9a22f0914e0a86140633dacc302e5f4fa450677" + integrity sha1-uaIvCRTgqGFAYz2swwLl9PpFBnc= + dependencies: + unorm ">= 1.0.0" + utf8-byte-length@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"