const slugify = require("@sindresorhus/slugify"); const markdownIt = require("markdown-it"); const fs = require('fs'); 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(require('markdown-it-plantuml'), { openMarker: '```plantuml', closeMarker: '```' }) .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) { return self.renderToken(tokens, idx, options, env, self); }; md.renderer.rules.fence = (tokens, idx, options, env, slf) => { const token = tokens[idx]; if (token.info === 'mermaid') { const code = token.content.trim(); return `
${code}`; } if (token.info === 'transclusion') { const code = token.content.trim(); return `
((.|\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("
", "") ? `${title}` : `${callout.charAt(0).toUpperCase()}${callout.substring(1).toLowerCase()}`; return ""; }); return `${titleDiv} ${content}`; }); }); eleventyConfig.addPassthroughCopy("src/site/img"); eleventyConfig.addPlugin(faviconPlugin, { destination: 'dist' }); eleventyConfig.addFilter('jsonify', function (variable) { return JSON.stringify(variable); }); return { dir: { input: "src/site", output: "dist", data: `_data` }, templateFormats: ["njk", "md", "11ty.js", "css"], htmlTemplateEngine: "njk", markdownTemplateEngine: "njk", passthroughFileCopy: true, }; }; 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 } }