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 ``; }; export default function(eleventyConfig) { eleventyConfig.addFilter('md', content => content ? markdownLib.render(content) : ""); eleventyConfig.setLibrary('md', markdownLib); }