diff --git a/CHANGELOG.md b/CHANGELOG.md index f5f28c4..9f4d176 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.4.1 +### Bug fixes +- Fix generate slug. + ## 1.4.0 Happly new year 🎉 ### Features - Display TOC in the custom sidebar, `data-sub-max-level`. diff --git a/src/render.js b/src/render.js index 75bed94..d6f33f5 100644 --- a/src/render.js +++ b/src/render.js @@ -2,7 +2,7 @@ import marked from 'marked' import Prism from 'prismjs' import * as tpl from './tpl' import { activeLink, scrollActiveSidebar, bindToggle, scroll2Top, sticky } from './event' -import { genTree, getRoute, isMobile } from './util' +import { genTree, getRoute, isMobile, slugify } from './util' let OPTIONS = {} const CACHE = {} @@ -21,9 +21,7 @@ const renderer = new marked.Renderer() * @link https://github.com/chjj/marked#overriding-renderer-methods */ renderer.heading = function (text, level) { - const slug = text.toLowerCase() - .replace(/<(?:.|\n)*?>/gm, '') - .replace(/[^\w|\u4e00-\u9fa5]+/g, '-') + const slug = slugify(text) let route = '' if (OPTIONS.router) { diff --git a/src/util.js b/src/util.js index 5471518..c5e381b 100644 --- a/src/util.js +++ b/src/util.js @@ -105,3 +105,32 @@ export function getRoute () { export function isMobile () { return document.body.clientWidth <= 600 } + +export function slugify (string) { + const re = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,.\/:;<=>?@\[\]^`{|}~]/g + const maintainCase = false + const replacement = '-' + slugify.occurrences = slugify.occurrences || {} + + if (typeof string !== 'string') return '' + if (!maintainCase) string = string.toLowerCase() + + let slug = string.trim() + .replace(re, '') + .replace(/\s/g, replacement) + let occurrences = slugify.occurrences[slug] + + if (slugify.occurrences.hasOwnProperty(slug)) { + occurrences++ + } else { + occurrences = 0 + } + + slugify.occurrences[slug] = occurrences + + if (occurrences) { + slug = slug + '-' + occurrences + } + + return slug +}