diff --git a/client/themes/default/scss/app.scss b/client/themes/default/scss/app.scss index 31393718..44123a3c 100644 --- a/client/themes/default/scss/app.scss +++ b/client/themes/default/scss/app.scss @@ -3,6 +3,26 @@ .contents { color: mc('grey', '800'); + h1, h2, h3, h4, h5, h6 { + position: relative; + + &:hover { + .toc-anchor { + display: block; + } + } + + .toc-anchor { + display: none; + position: absolute; + right: 1rem; + bottom: .5rem; + font-size: 1.25rem; + text-decoration: none; + color: mc('grey', '500'); + } + } + h1 { padding-left: 24px; color: mc('blue', '800'); diff --git a/package.json b/package.json index f4179448..2fddb530 100644 --- a/package.json +++ b/package.json @@ -147,6 +147,7 @@ "semver": "5.5.1", "serve-favicon": "2.5.0", "sqlite3": "4.0.2", + "uslug": "1.0.4", "uuid": "3.3.2", "validator": "10.7.1", "validator-as-promised": "1.0.2", diff --git a/server/modules/rendering/markdown-core/renderer.js b/server/modules/rendering/markdown-core/renderer.js index 08de7b2a..2db52790 100644 --- a/server/modules/rendering/markdown-core/renderer.js +++ b/server/modules/rendering/markdown-core/renderer.js @@ -1,5 +1,7 @@ const md = require('markdown-it') +const mdAnchor = require('markdown-it-anchor') const _ = require('lodash') +const uslug = require('uslug') const quoteStyles = { Chinese: '””‘’', @@ -29,6 +31,14 @@ module.exports = { } }) + mkdown.use(mdAnchor, { + slugify: s => uslug(s), + permalink: true, + permalinkClass: 'toc-anchor', + permalinkSymbol: '¶', + permalinkBefore: true + }) + for (let child of this.children) { const renderer = require(`../${_.kebabCase(child.key)}/renderer.js`) renderer.init(mkdown, child.config) diff --git a/yarn.lock b/yarn.lock index 11787a8b..71b3c2e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12085,6 +12085,10 @@ 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.4.1" + resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.4.1.tgz#364200d5f13646ca8bcd44490271335614792300" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -12172,6 +12176,12 @@ use@^3.1.0: dependencies: kind-of "^6.0.2" +uslug@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/uslug/-/uslug-1.0.4.tgz#b9a22f0914e0a86140633dacc302e5f4fa450677" + dependencies: + unorm ">= 1.0.0" + util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"