diff --git a/browser/lib/markdown-toc-generator.js b/browser/lib/markdown-toc-generator.js index 716be83a..eae448ec 100644 --- a/browser/lib/markdown-toc-generator.js +++ b/browser/lib/markdown-toc-generator.js @@ -5,6 +5,7 @@ import toc from 'markdown-toc' import diacritics from 'diacritics-map' import stripColor from 'strip-color' +import mdlink from 'markdown-link' const EOL = require('os').EOL @@ -42,6 +43,12 @@ function caseSensitiveSlugify (str) { return str } +function linkify (tok, text, slug, opts) { + var uniqeID = opts.num === 0 ? '' : '-' + opts.num + tok.content = mdlink(text, '#' + slug + uniqeID) + return tok +} + const TOC_MARKER_START = '' const TOC_MARKER_END = '' @@ -84,7 +91,7 @@ export function generateInEditor (editor) { * @returns generatedTOC String containing generated TOC */ export function generate (markdownText) { - const generatedToc = toc(markdownText, {slugify: caseSensitiveSlugify}) + const generatedToc = toc(markdownText, {slugify: caseSensitiveSlugify, linkify: linkify}) return TOC_MARKER_START + EOL + EOL + generatedToc.content + EOL + EOL + TOC_MARKER_END } diff --git a/browser/lib/markdown.js b/browser/lib/markdown.js index 13ef758a..2a7b66b0 100644 --- a/browser/lib/markdown.js +++ b/browser/lib/markdown.js @@ -7,7 +7,7 @@ import _ from 'lodash' import ConfigManager from 'browser/main/lib/ConfigManager' import katex from 'katex' import { lastFindInArray } from './utils' -import ee from 'browser/main/lib/eventEmitter' +import anchor from '@enyaxu/markdown-it-anchor' function createGutter (str, firstLineNumber) { if (Number.isNaN(firstLineNumber)) firstLineNumber = 1 @@ -118,12 +118,13 @@ class Markdown { this.md.use(require('markdown-it-imsize')) this.md.use(require('markdown-it-footnote')) this.md.use(require('markdown-it-multimd-table')) - this.md.use(require('markdown-it-named-headers'), { - slugify: (header) => { - return encodeURI(header.trim() + this.md.use(anchor, { + slugify: (title) => { + var slug = encodeURI(title.trim() .replace(/[\]\[\!\"\#\$\%\&\'\(\)\*\+\,\.\/\:\;\<\=\>\?\@\\\^\_\{\|\}\~]/g, '') .replace(/\s+/g, '-')) .replace(/\-+$/, '') + return slug } }) this.md.use(require('markdown-it-kbd')) diff --git a/package.json b/package.json index b74045a5..1fb8e380 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ }, "homepage": "https://boostnote.io", "dependencies": { + "@enyaxu/markdown-it-anchor": "^5.0.2", "@rokt33r/markdown-it-math": "^4.0.1", "@rokt33r/season": "^5.3.0", "@susisu/mte-kernel": "^2.0.0", @@ -81,7 +82,6 @@ "markdown-it-imsize": "^2.0.1", "markdown-it-kbd": "^1.1.1", "markdown-it-multimd-table": "^2.0.1", - "markdown-it-named-headers": "^0.0.4", "markdown-it-plantuml": "^1.1.0", "markdown-it-smartarrows": "^1.0.1", "markdown-it-sub": "^1.0.0", @@ -105,11 +105,11 @@ "sander": "^0.5.1", "sanitize-html": "^1.18.2", "striptags": "^2.2.1", + "turndown": "^4.0.2", + "turndown-plugin-gfm": "^1.0.2", "typo-js": "^1.0.3", "unique-slug": "2.0.0", - "uuid": "^3.2.1", - "turndown":"^4.0.2", - "turndown-plugin-gfm":"^1.0.2" + "uuid": "^3.2.1" }, "devDependencies": { "ava": "^0.25.0", diff --git a/tests/lib/snapshots/markdown-test.js.md b/tests/lib/snapshots/markdown-test.js.md index eefb232c..30a146a0 100644 --- a/tests/lib/snapshots/markdown-test.js.md +++ b/tests/lib/snapshots/markdown-test.js.md @@ -37,7 +37,7 @@ Generated by [AVA](https://ava.li). > Snapshot 1 - `

abbr

␊ + `

abbr

The HTML specification
␊ is maintained by the W3C.

␊ ` @@ -67,8 +67,8 @@ Generated by [AVA](https://ava.li). > Snapshot 1 - `

definition list

␊ -

list 1

␊ + `

definition list

␊ +

list 1

Term 1
Definition 1
␊ @@ -78,7 +78,7 @@ Generated by [AVA](https://ava.li).

Term 3
␊ ~

␊ -

list 2

␊ +

list 2

Term 1
␊ @@ -98,10 +98,10 @@ Generated by [AVA](https://ava.li). > Snapshot 1 - `

Welcome to Boostnote!

␊ -

Click here to edit markdown 👋

␊ + `

Welcome to Boostnote!

␊ +

Click here to edit markdown 👋

␊ -

Docs 📝

␊ +

Docs 📝


␊ -

Article Archive 📚

␊ +

Article Archive 📚


␊ -

Community 🍻

␊ +

Community 🍻