From 8edfbd28edd68486ebca8022b1e611539880028b Mon Sep 17 00:00:00 2001
From: hikerpig
Date: Sat, 27 Jul 2019 13:03:20 +0800
Subject: [PATCH] feat: suppport auto generating toc content for the '[TOC]'
placeholder, related #3022
---
browser/lib/markdown.js | 7 ++++++
package.json | 1 +
tests/fixtures/markdowns.js | 11 +++++++++-
tests/lib/markdown-test.js | 5 +++++
tests/lib/snapshots/markdown-test.js.md | 22 +++++++++++++++++++
tests/lib/snapshots/markdown-test.js.snap | Bin 2471 -> 2587 bytes
yarn.lock | 25 ++++++++++++++++++++++
7 files changed, 70 insertions(+), 1 deletion(-)
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+b2␊
`
+## 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 3f5ec41c0d4710ca98ea132da2e1ca9c30ff7799..f6682cfb30d89a73ac1d066d5d0186d24d1044fc 100644
GIT binary patch
literal 2587
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
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"