const { DateTime } = require('luxon') const fs = require('fs') const markdownIt = require('markdown-it') const markdownItAnchor = require('markdown-it-anchor') module.exports = function(eleventyConfig) { // https://www.11ty.dev/docs/data-deep-merge/ eleventyConfig.setDataDeepMerge(true) eleventyConfig.addFilter('readableDate', dateObj => { return DateTime.fromJSDate(dateObj, {zone: 'utc'}).toFormat('dd LLL yyyy') }) // https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-date-string eleventyConfig.addFilter('htmlDateString', (dateObj) => { return DateTime.fromJSDate(dateObj, {zone: 'utc'}).toFormat('yyyy-LL-dd') }) // Get the first `n` elements of a collection. eleventyConfig.addFilter('head', (array, n) => { if( n < 0 ) { return array.slice(n) } return array.slice(0, n) }) // Return the smallest number argument eleventyConfig.addFilter('min', (...numbers) => { return Math.min.apply(null, numbers) }) eleventyConfig.addFilter('filterTagList', tags => { // should match the list in tags.njk return (tags || []).filter(tag => ['all', 'nav', 'post', 'posts'].indexOf(tag) === -1) }) // Convert text to hex eleventyConfig.addFilter('toHex', (str) => { let hex = '' for(let i=0; i4 ) i++ } return hex.trim() }) // Fold lines eleventyConfig.addFilter('fold', (str, size) => { // https://stackoverflow.com/a/29202760/3006854 const numChunks = Math.ceil(str.length/size) const chunks = new Array(numChunks) for (let i = 0, o = 0; i < numChunks; ++i, o += size) chunks[i] = str.substr(o, size) return chunks.join('\n') }) // Create an array of all tags eleventyConfig.addCollection('tagList', function(collection) { let tagSet = new Set() collection.getAll().forEach(item => { (item.data.tags || []).forEach(tag => tagSet.add(tag)) }); return [...tagSet] }) // Customize Markdown library and settings: let markdownLibrary = markdownIt({ html: true, breaks: true, linkify: true })//.use(markdownItAnchor, { // permalink: true, // permalinkClass: "direct-link", // permalinkSymbol: "#" // }) eleventyConfig.setLibrary("md", markdownLibrary) // Override Browsersync defaults (used only with --serve) eleventyConfig.setBrowserSyncConfig({ callbacks: { ready: function(err, browserSync) { const content_404 = fs.readFileSync('_site/404.html') browserSync.addMiddleware("*", (req, res) => { // Provides the 404 content without redirect. res.writeHead(404, {"Content-Type": "text/html charset=UTF-8"}) res.write(content_404) res.end() }) }, }, ui: false, ghostMode: false }) return { // Control which files Eleventy will process // e.g.: *.md, *.njk, *.html, *.liquid templateFormats: [ "md", "njk", 'html', 'liquid', 'css', 'png', 'webp', 'jpg', 'gif', 'js', 'crt', 'pem', 'ttf', 'webmanifest', ], // ----------------------------------------------------------------- // If your site deploys to a subdirectory, change `pathPrefix`. // Don’t worry about leading and trailing slashes, we normalize these. // If you don’t have a subdirectory, use "" or "/' (they do the same thing) // This is only used for link URLs (it does not affect your file structure) // Best paired with the `url` filter: https://www.11ty.dev/docs/filters/url/ // You can also pass this in on the command line using `--pathprefix` // Optional (default is shown) pathPrefix: '/', // ----------------------------------------------------------------- // Pre-process *.md files with: (default: `liquid`) markdownTemplateEngine: 'njk', // Pre-process *.html files with: (default: `liquid`) htmlTemplateEngine: 'njk', // Opt-out of pre-processing global data JSON files: (default: `liquid`) dataTemplateEngine: false, // These are all optional (defaults are shown): dir: { input: '_src', includes: '_includes', data: '_data', output: '_site' } } }