lewisdale.dev/config/plugins/markdown.js

76 lines
2.1 KiB
JavaScript
Raw Normal View History

const path = require("path");
const markdownIt = require('markdown-it');
const markdownItPrism = require('markdown-it-prism');
const markdownItAnchor = require('markdown-it-anchor');
const markdownItClass = require('@toycode/markdown-it-class');
const markdownItLinkAttributes = require('markdown-it-link-attributes');
const markdownItEmoji = require('markdown-it-emoji');
const markdownItFootnote = require('markdown-it-footnote');
const markdownitMark = require('markdown-it-mark');
const markdownitAbbr = require('markdown-it-abbr');
const markdownItEleventyImg = require('markdown-it-eleventy-img');
2023-02-10 14:38:00 +00:00
const icons = require('./icons.json');
const { slugifyString } = require('../utils');
2023-02-14 17:00:01 +00:00
const markdownLib = markdownIt({
html: true,
breaks: true,
linkify: true,
typographer: true
})
.disable('code')
.use(markdownItPrism, {
defaultLanguage: 'plaintext'
})
.use(markdownItAnchor, {
slugify: slugifyString,
tabIndex: false,
permalink: markdownItAnchor.permalink.headerLink({
class: 'heading-anchor'
})
})
.use(markdownItClass, {
ol: 'list',
ul: 'list'
})
.use(markdownItLinkAttributes, [
{
// match external links
matcher(href) {
return href.match(/^https?:\/\//);
},
attrs: {
target: '_blank',
rel: 'noreferrer noopener'
}
}
])
2023-02-10 14:38:00 +00:00
.use(markdownItEmoji, { defs: icons })
.use(markdownItFootnote)
.use(markdownitMark)
.use(markdownitAbbr)
.use(markdownItEleventyImg, {
imgOptions: {
widths: [300, 600, 1000, 1440],
urlPath: "/img/",
outputDir: path.join("_site", "img"),
formats: ["avif", "webp", "jpeg"]
},
globalAttributes: {
sizes: `(max-width: 300px) 300px,
(max-width: 600px) 600px,
(max-width: 1000px) 1000px,
(max-width: 1440px) 1440px,
100%`
}
});
2023-02-10 14:38:00 +00:00
markdownLib.renderer.rules.emoji = function(token, idx) {
2024-02-09 09:55:12 +00:00
return `<span class="fa-li"><i class="fa-solid fa-${token[idx].markup}" aria-hidden="true"></i></span>`;
2023-02-10 14:38:00 +00:00
};
module.exports = function(eleventyConfig) {
2023-02-14 17:00:01 +00:00
eleventyConfig.addFilter('md', content => content ? markdownLib.render(content) : "");
eleventyConfig.setLibrary('md', markdownLib);
};