www/.eleventy.js

150 lines
4.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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; i<str.length; i++){
let h = str.codePointAt(i).toString(16)
if(h.length===1) h='0'+h
hex += h + ' '
if( h.length>4 ) 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`.
// Dont worry about leading and trailing slashes, we normalize these.
// If you dont 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'
}
}
}