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
+ }
+}