Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
127 changes: 118 additions & 9 deletions .eleventy.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,34 @@
const slugify = require("@sindresorhus/slugify");
const markdownIt = require("markdown-it");
const fs = require('fs');
const matter = require('gray-matter')
const matter = require('gray-matter');
const faviconPlugin = require('eleventy-favicon');
module.exports = function(eleventyConfig) {

let markdownLib = markdownIt({
breaks: true,
html: true
})
.use(require("markdown-it-footnote"))
.use(require('markdown-it-mathjax3'), {
tex: {
inlineMath: [
["$", "$"]
]
},
options: {
skipHtmlTags: { '[-]': ['pre'] }
}
})
.use(require('markdown-it-task-checkbox'), {
disabled: true,
divWrap: false,
divClass: 'checkbox',
idPrefix: 'cbx_',
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) {
Expand All @@ -26,7 +46,15 @@ module.exports = function(eleventyConfig) {
}
if (token.info.startsWith("ad-")) {
const code = token.content.trim();
return `<pre class="language-${token.info}">${md.render(code)}</pre>`;
if (code && code.toLowerCase().startsWith("title:")) {
const title = code.substring(6, code.indexOf("\n"));
const titleDiv = title ? `<div class="admonition-title">${title}</div>` : '';
return `<div class="language-${token.info} admonition admonition-example admonition-plugin">${titleDiv}${md.render(code.slice(code.indexOf("\n")))}</div>`;
}

const title = `<div class="admonition-title">${token.info.charAt(3).toUpperCase()}${token.info.substring(4).toLowerCase()}</div>`;
return `<div class="language-${token.info} admonition admonition-example admonition-plugin">${title}${md.render(code)}</div>`;

}

// Other languages
Expand Down Expand Up @@ -76,21 +104,31 @@ module.exports = function(eleventyConfig) {

return defaultLinkRule(tokens, idx, options, env, self);
};

});

eleventyConfig.setLibrary("md", markdownLib);

eleventyConfig.addTransform('link', function(str) {
return str && str.replace(/\[\[(.*?)\]\]/g, function(match, p1) {
eleventyConfig.addFilter('link', function(str) {
return str && str.replace(/\[\[(.*?\|.*?)\]\]/g, function(match, p1) {
//Check if it is an embedded excalidraw drawing or mathjax javascript
if (p1.indexOf("],[") > -1 || p1.indexOf('"$"')>-1) {
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');
const frontMatter = matter(file);
Expand All @@ -101,17 +139,44 @@ module.exports = function(eleventyConfig) {
//Ignore if file doesn't exist
}

return `<a class="internal-link" href="${permalink}">${title}</a>`;
return `<a class="internal-link" href="${permalink}${headerLinkPath}">${title}</a>`;
});
})

eleventyConfig.addTransform('highlight', function(str) {
//replace ==random text== with <mark>random text</mark>
eleventyConfig.addFilter('highlight', function(str) {
return str && str.replace(/\=\=(.*?)\=\=/g, function(match, p1) {
return `<mark>${p1}</mark>`;
});
});


eleventyConfig.addTransform('callout-block', function(str) {
return str && str.replace(/<blockquote>((.|\n)*?)<\/blockquote>/g, function(match, content) {
let titleDiv = "";
let calloutType = "";
const calloutMeta = /\[!(\w*)\](\s?.*)/g;
if (!content.match(calloutMeta)) {
return match;
}

content = content.replace(calloutMeta, function(metaInfoMatch, callout, title) {
calloutType = callout;
titleDiv = title.replace("<br>", "") ?
`<div class="admonition-title">${title}</div>` :
`<div class="admonition-title">${callout.charAt(0).toUpperCase()}${callout.substring(1).toLowerCase()}</div>`;
return "";
});

return `<div class="callout-${calloutType} admonition admonition-example admonition-plugin">
${titleDiv}
${content}
</div>`;
});
});

eleventyConfig.addPassthroughCopy("src/site/img");
eleventyConfig.addPlugin(faviconPlugin, { destination: 'dist' });

return {
dir: {
input: "src/site",
Expand All @@ -125,3 +190,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
}
}
Loading