const fs = require("fs"); const hljs = require("highlight.js"); const twemoji = require("twemoji"); const { DateTime } = require("luxon"); const utils = require("markdown-it/lib/common/utils"); const excerptMinimumLength = 280; const excerptSeparator = "" function extractExcerpt(doc) { if (doc.data.readOnline) return "[[ No Excerpt Available ]]"; if (doc.data.excerpt) return doc.data.excerpt; if (!doc.hasOwnProperty("templateContent")) { console.warn("Failed to extract excerpt: Document has no property `templateContent`."); return ""; } const content = doc.templateContent; if (content.includes(excerptSeparator)) return content.substring(0, content.indexOf(excerptSeparator)).trim(); else if (content.length <= excerptMinimumLength) return content.trim(); const excerptEnd = findExcerptEnd(content); return content.substring(0, excerptEnd).trim(); } function findExcerptEnd(content, skipLength = 0) { if (content === "") return 0; const paragraphEnd = content.indexOf("
", skipLength) + 4; return paragraphEnd + ((paragraphEnd < excerptMinimumLength)? findExcerptEnd(content.substring(paragraphEnd), paragraphEnd):0); } function demark(content) { return content.replace(/(.*?)<\/mark>/gis, (m,a) => "█".repeat(a.length)) } module.exports = (cfg) => { cfg.addPlugin(require("@11ty/eleventy-plugin-rss")); cfg.addFilter("excerpt", post => extractExcerpt(post)); cfg.addFilter("demark", content => demark(content)); cfg.addFilter("date", (date, fmt) => DateTime.fromJSDate(date).toFormat(fmt)); cfg.addPassthroughCopy({"static": "./"}); cfg.setDataDeepMerge(true); cfg.addFilter("fixAnchors", (c,u) => c.replace(/ { if (lang && hljs.getLanguage(lang)) { try { return '' +
hljs.highlight(str, { language: lang, ignoreIllegals: true }).value +
'
';
} catch (__) {} }
return '' + md.utils.escapeHtml(str) + '
';
}
}).use(require("markdown-it-anchor"), {
permalink: true, permalinkBefore: true, permalinkSymbol: "#"})
.use(require("markdown-it-emoji"), {shortcuts: {}})
.use(require("markdown-it-mark"));
md.renderer.rules.emoji = (token, i) =>
`${twemoji.parse(token[i].content)}`;
md.renderer.rules.code_block = (tokens, i, options, env, slf) =>
`` +
utils.escapeHtml(tokens[i].content.replace(/ /g, "\xA0"))+'
\n';
cfg.setLibrary("md", md);
cfg.setBrowserSyncConfig({callbacks: {
ready: (e,b) => b.addMiddleware("*", (req, res) => {
res.writeHead(404, { "Content-Type": "text/html; charset=UTF-8" });
res.write(fs.readFileSync("build/404.html"));
res.end();
})
}});
return {
templateFormats: ["md", "njk"],
markdownTemplateEngine: "njk",
dir: {
input: "posts",
output: "build",
data: "../globals",
layouts: "../layouts",
includes: "../includes",
},
};
};