diff --git a/themes/chameleon/scripts/heading-link.js b/themes/chameleon/scripts/heading-link.js
index df15349..65e67ed 100644
--- a/themes/chameleon/scripts/heading-link.js
+++ b/themes/chameleon/scripts/heading-link.js
@@ -3,31 +3,30 @@
/*
* Add Link button next to a heading
-* cheerio is provided by hexo package
*/
-const cheerio = require('cheerio')
+const { slugize, stripHTML } = require('hexo-util')
+const svg = ''
-hexo.extend.filter.register('after_render:html', (str) => {
- const $ = cheerio.load(str)
- const svg = ``
+const anchorId = (str, transformOption) => {
+ return slugize(str.trim(), { transform: transformOption })
+}
- const headings = ['h2', 'h3']
+hexo.extend.filter.register('marked:renderer', function (renderer) {
+ const { config } = this
+ renderer.heading = function (text, level) {
+ const transformOption = config.marked.modifyAnchors
+ let id = anchorId(stripHTML(text), transformOption)
+ const headingId = this._headingId
- headings.forEach(heading => {
- $(heading).each((index, element) => {
- if ($(element).children('a').children('svg').length === 0) {
- const text = $(element).text().trim()
+ // Add a number after id if repeated
+ if (headingId[id]) {
+ id += `-${headingId[id]++}`
+ } else {
+ headingId[id] = 1
+ }
- $(element).append($(element).children('a').append(svg))
-
- const cache = $(element).children()
- $(element).text(text + ' ').append(cache)
- }
- })
- })
-
- return $.html()
+ // add headerlink
+ return `${text} `
+ }
})