79 lines
2.2 KiB
JavaScript
79 lines
2.2 KiB
JavaScript
import path from "node:path";
|
|
import fs from "node:fs";
|
|
import markdownIt from 'markdown-it';
|
|
import markdownItPrism from 'markdown-it-prism';
|
|
import markdownItAnchor from 'markdown-it-anchor';
|
|
import markdownItClass from '@toycode/markdown-it-class';
|
|
import markdownItLinkAttributes from 'markdown-it-link-attributes';
|
|
import { full as markdownItEmoji } from 'markdown-it-emoji';
|
|
import markdownItFootnote from 'markdown-it-footnote';
|
|
import markdownitMark from 'markdown-it-mark';
|
|
import markdownitAbbr from 'markdown-it-abbr';
|
|
import markdownItEleventyImg from 'markdown-it-eleventy-img';
|
|
import markdownItCallouts from 'markdown-it-obsidian-callouts';
|
|
import { slugifyString } from '../utils.js';
|
|
|
|
const icons = JSON.parse(fs.readFileSync('./config/plugins/icons.json'), 'utf-8');
|
|
|
|
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'
|
|
}
|
|
}
|
|
])
|
|
.use(markdownItEmoji, { defs: icons })
|
|
.use(markdownItFootnote)
|
|
.use(markdownitMark)
|
|
.use(markdownitAbbr)
|
|
.use(markdownItCallouts)
|
|
.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%`
|
|
}
|
|
});
|
|
|
|
markdownLib.renderer.rules.emoji = function(token, idx) {
|
|
return `<span class="fa-li"><i class="fa-solid fa-${token[idx].markup}" aria-hidden="true"></i></span>`;
|
|
};
|
|
|
|
export default function(eleventyConfig) {
|
|
eleventyConfig.addFilter('md', content => content ? markdownLib.render(content) : "");
|
|
eleventyConfig.setLibrary('md', markdownLib);
|
|
} |