From 95701eec3d997a04baafc3a8d3ffe5b50f2d8f74 Mon Sep 17 00:00:00 2001 From: Ole Eskild Steensen Date: Wed, 23 Mar 2022 13:22:11 +0100 Subject: [PATCH 1/4] Mark all headers with an id --- .eleventy.js | 3 ++- package-lock.json | 60 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/.eleventy.js b/.eleventy.js index 6bfa6ca..3d12c1f 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -10,6 +10,7 @@ module.exports = function(eleventyConfig) { html: true }) .use(require("markdown-it-footnote")) + .use(require('markdown-it-named-headings')) .use(require('markdown-it-task-checkbox'), { disabled: true, divWrap: false, @@ -143,4 +144,4 @@ module.exports = function(eleventyConfig) { passthroughFileCopy: true, }; -}; \ No newline at end of file +}; diff --git a/package-lock.json b/package-lock.json index 3331d78..35c80e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "gray-matter": "^4.0.3", "markdown-it": "^12.3.2", "markdown-it-footnote": "^3.0.3", + "markdown-it-named-headings": "^1.1.0", "markdown-it-task-checkbox": "^1.0.6" }, "devDependencies": { @@ -3266,6 +3267,20 @@ "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", "dev": true }, + "node_modules/lodash.kebabcase": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.0.1.tgz", + "integrity": "sha1-XmO8mqKlVi/zuXynry+APeG8uQ4=", + "dependencies": { + "lodash.deburr": "^4.0.0", + "lodash.words": "^4.0.0" + } + }, + "node_modules/lodash.words": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-4.2.0.tgz", + "integrity": "sha1-Xs/q+Oz4rKqODIOGKV8Zk8nPQDY=" + }, "node_modules/lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -3305,6 +3320,15 @@ "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz", "integrity": "sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==" }, + "node_modules/markdown-it-named-headings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/markdown-it-named-headings/-/markdown-it-named-headings-1.1.0.tgz", + "integrity": "sha1-L2zSmADeHp3eCiTo1NEnXfQuoX0=", + "dependencies": { + "lodash.kebabcase": "4.0.1", + "unidecode": "^0.1.8" + } + }, "node_modules/markdown-it-task-checkbox": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/markdown-it-task-checkbox/-/markdown-it-task-checkbox-1.0.6.tgz", @@ -5803,6 +5827,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unidecode": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/unidecode/-/unidecode-0.1.8.tgz", + "integrity": "sha1-77swFTi8RSRqmsjFWdcvAVMFBT4=", + "engines": { + "node": ">= 0.4.12" + } + }, "node_modules/universal-user-agent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", @@ -8716,6 +8748,20 @@ "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", "dev": true }, + "lodash.kebabcase": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.0.1.tgz", + "integrity": "sha1-XmO8mqKlVi/zuXynry+APeG8uQ4=", + "requires": { + "lodash.deburr": "^4.0.0", + "lodash.words": "^4.0.0" + } + }, + "lodash.words": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-4.2.0.tgz", + "integrity": "sha1-Xs/q+Oz4rKqODIOGKV8Zk8nPQDY=" + }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -8761,6 +8807,15 @@ "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz", "integrity": "sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==" }, + "markdown-it-named-headings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/markdown-it-named-headings/-/markdown-it-named-headings-1.1.0.tgz", + "integrity": "sha1-L2zSmADeHp3eCiTo1NEnXfQuoX0=", + "requires": { + "lodash.kebabcase": "4.0.1", + "unidecode": "^0.1.8" + } + }, "markdown-it-task-checkbox": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/markdown-it-task-checkbox/-/markdown-it-task-checkbox-1.0.6.tgz", @@ -10727,6 +10782,11 @@ "which-boxed-primitive": "^1.0.2" } }, + "unidecode": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/unidecode/-/unidecode-0.1.8.tgz", + "integrity": "sha1-77swFTi8RSRqmsjFWdcvAVMFBT4=" + }, "universal-user-agent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", diff --git a/package.json b/package.json index f48b899..b2f1c3f 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "gray-matter": "^4.0.3", "markdown-it": "^12.3.2", "markdown-it-footnote": "^3.0.3", + "markdown-it-named-headings": "^1.1.0", "markdown-it-task-checkbox": "^1.0.6" } } From 7fdcbd599e783760275c0e61106f6fa762074361 Mon Sep 17 00:00:00 2001 From: Ole Eskild Steensen Date: Wed, 23 Mar 2022 16:08:39 +0100 Subject: [PATCH 2/4] Added support for linking to a header --- .eleventy.js | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/.eleventy.js b/.eleventy.js index 3d12c1f..6664deb 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -19,6 +19,7 @@ module.exports = function(eleventyConfig) { ulClass: 'task-list', liClass: 'task-list-item' }) + .use(namedHeadingsFilter) .use(function(md) { //https://github.com/DCsunset/markdown-it-mermaid-plugin const origFenceRule = md.renderer.rules.fence || function(tokens, idx, options, env, self) { @@ -104,10 +105,19 @@ module.exports = function(eleventyConfig) { if (p1.indexOf("],[") > -1 || p1.indexOf('"$"') > -1) { return match; } - const [fileName, linkTitle] = p1.split("|"); + const [fileLink, linkTitle] = p1.split("|"); + + let fileName = fileLink; + let header = ""; + let headerLinkPath = ""; + if(fileLink.includes("#")){ + [fileName, header] = fileLink.split("#"); + headerLinkPath = `#${headerToId(header)}`; + } let permalink = `/notes/${slugify(fileName)}`; const title = linkTitle ? linkTitle : fileName; + try { const file = fs.readFileSync(`./src/site/notes/${fileName}.md`, 'utf8'); @@ -119,7 +129,7 @@ module.exports = function(eleventyConfig) { //Ignore if file doesn't exist } - return `${title}`; + return `${title}`; }); }) @@ -145,3 +155,47 @@ module.exports = function(eleventyConfig) { }; }; + +function headerToId(heading){ + return slugify(heading); +} + +//https://github.com/rstacruz/markdown-it-named-headings/blob/master/index.js +function namedHeadingsFilter(md, options){ + md.core.ruler.push('named_headings', namedHeadings.bind(null, md)); +} + +function namedHeadings (md, state) { + + var ids = {} + + state.tokens.forEach(function (token, i) { + if (token.type === 'heading_open') { + var text = md.renderer.render(state.tokens[i + 1].children, md.options) + var id = headerToId(text); + var uniqId = uncollide(ids, id) + ids[uniqId] = true + setAttr(token, 'id', uniqId) + } + }) +} + +function uncollide (ids, id) { + if (!ids[id]) return id + var i = 1 + while (ids[id + '-' + i]) { i++ } + return id + '-' + i +} + +function setAttr (token, attr, value, options) { + var idx = token.attrIndex(attr) + + if (idx === -1) { + token.attrPush([ attr, value ]) + } else if (options && options.append) { + token.attrs[idx][1] = + token.attrs[idx][1] + ' ' + value + } else { + token.attrs[idx][1] = value + } +} From 5d6781bf569612b52aecabe0831b3e3c48ba6fdb Mon Sep 17 00:00:00 2001 From: Ole Eskild Steensen Date: Wed, 23 Mar 2022 16:22:49 +0100 Subject: [PATCH 3/4] Remove no longer used package --- package-lock.json | 60 ----------------------------------------------- package.json | 1 - 2 files changed, 61 deletions(-) diff --git a/package-lock.json b/package-lock.json index 35c80e5..3331d78 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,6 @@ "gray-matter": "^4.0.3", "markdown-it": "^12.3.2", "markdown-it-footnote": "^3.0.3", - "markdown-it-named-headings": "^1.1.0", "markdown-it-task-checkbox": "^1.0.6" }, "devDependencies": { @@ -3267,20 +3266,6 @@ "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", "dev": true }, - "node_modules/lodash.kebabcase": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.0.1.tgz", - "integrity": "sha1-XmO8mqKlVi/zuXynry+APeG8uQ4=", - "dependencies": { - "lodash.deburr": "^4.0.0", - "lodash.words": "^4.0.0" - } - }, - "node_modules/lodash.words": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-4.2.0.tgz", - "integrity": "sha1-Xs/q+Oz4rKqODIOGKV8Zk8nPQDY=" - }, "node_modules/lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -3320,15 +3305,6 @@ "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz", "integrity": "sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==" }, - "node_modules/markdown-it-named-headings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/markdown-it-named-headings/-/markdown-it-named-headings-1.1.0.tgz", - "integrity": "sha1-L2zSmADeHp3eCiTo1NEnXfQuoX0=", - "dependencies": { - "lodash.kebabcase": "4.0.1", - "unidecode": "^0.1.8" - } - }, "node_modules/markdown-it-task-checkbox": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/markdown-it-task-checkbox/-/markdown-it-task-checkbox-1.0.6.tgz", @@ -5827,14 +5803,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unidecode": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/unidecode/-/unidecode-0.1.8.tgz", - "integrity": "sha1-77swFTi8RSRqmsjFWdcvAVMFBT4=", - "engines": { - "node": ">= 0.4.12" - } - }, "node_modules/universal-user-agent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", @@ -8748,20 +8716,6 @@ "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", "dev": true }, - "lodash.kebabcase": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.0.1.tgz", - "integrity": "sha1-XmO8mqKlVi/zuXynry+APeG8uQ4=", - "requires": { - "lodash.deburr": "^4.0.0", - "lodash.words": "^4.0.0" - } - }, - "lodash.words": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-4.2.0.tgz", - "integrity": "sha1-Xs/q+Oz4rKqODIOGKV8Zk8nPQDY=" - }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -8807,15 +8761,6 @@ "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz", "integrity": "sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==" }, - "markdown-it-named-headings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/markdown-it-named-headings/-/markdown-it-named-headings-1.1.0.tgz", - "integrity": "sha1-L2zSmADeHp3eCiTo1NEnXfQuoX0=", - "requires": { - "lodash.kebabcase": "4.0.1", - "unidecode": "^0.1.8" - } - }, "markdown-it-task-checkbox": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/markdown-it-task-checkbox/-/markdown-it-task-checkbox-1.0.6.tgz", @@ -10782,11 +10727,6 @@ "which-boxed-primitive": "^1.0.2" } }, - "unidecode": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/unidecode/-/unidecode-0.1.8.tgz", - "integrity": "sha1-77swFTi8RSRqmsjFWdcvAVMFBT4=" - }, "universal-user-agent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", diff --git a/package.json b/package.json index b2f1c3f..f48b899 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,6 @@ "gray-matter": "^4.0.3", "markdown-it": "^12.3.2", "markdown-it-footnote": "^3.0.3", - "markdown-it-named-headings": "^1.1.0", "markdown-it-task-checkbox": "^1.0.6" } } From 525a5036a0b4752e72a6319c49783e68c97e0d05 Mon Sep 17 00:00:00 2001 From: Ole Eskild Steensen Date: Wed, 23 Mar 2022 16:24:45 +0100 Subject: [PATCH 4/4] Remove unneccessary markdown-it filter --- .eleventy.js | 1 - 1 file changed, 1 deletion(-) diff --git a/.eleventy.js b/.eleventy.js index 6664deb..13f9b15 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -10,7 +10,6 @@ module.exports = function(eleventyConfig) { html: true }) .use(require("markdown-it-footnote")) - .use(require('markdown-it-named-headings')) .use(require('markdown-it-task-checkbox'), { disabled: true, divWrap: false,