itsonus-blog/eleventy.config.js

195 lines
6.1 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 markdownItAnchor = require("markdown-it-anchor");
const pluginTOC = require('eleventy-plugin-toc')
const pluginRss = require("@11ty/eleventy-plugin-rss");
const pluginSyntaxHighlight = require("@11ty/eleventy-plugin-syntaxhighlight");
const pluginNavigation = require("@11ty/eleventy-navigation");
const { EleventyHtmlBasePlugin } = require("@11ty/eleventy");
let markdownIt = require("markdown-it");
const htmlmin = require('html-minifier');
let options = {
// whatever options you have set for the library here
html: true,
typographer: true,
quotes: ['«\xA0', '\xA0»', '\xA0', '\xA0'],
};
let mdfigcaption = require('markdown-it-image-figures');
let figoptions = {
figcaption: true,
lazy: true,
async: true,
};
const mdLib = markdownIt(options).use(mdfigcaption, figoptions);
module.exports = function(eleventyConfig) {
eleventyConfig.setUseGitIgnore(false);
eleventyConfig.setLibrary("md", mdLib);
// Watch our compiled assets for changes
eleventyConfig.addWatchTarget('./src/compiled-assets/main.css');
eleventyConfig.addWatchTarget('./src/compiled-assets/print.css');
//eleventyConfig.addWatchTarget('./src/compiled-assets/main.js');
//eleventyConfig.addWatchTarget('./src/compiled-assets/vendor.js');
// Copy src/compiled-assets to /blog_assets
eleventyConfig.addPassthroughCopy({ 'src/compiled-assets': 'blog_assets' });
// Copy all images
eleventyConfig.addPassthroughCopy('src/blog_images');
// Add plugins
eleventyConfig.addPlugin(pluginRss);
eleventyConfig.addPlugin(pluginSyntaxHighlight);
eleventyConfig.addPlugin(pluginNavigation);
eleventyConfig.addPlugin(EleventyHtmlBasePlugin);
eleventyConfig.addPlugin(pluginTOC, {
tags: ['h2', 'h3'],
wrapperClass: 'table-of-contents',
ul: true,
});
eleventyConfig.addShortcode('getYear', () => {
return new Date().getFullYear();
});
eleventyConfig.addFilter("env", (key, def="NOT DEFINED") => process.env[key] || def);
eleventyConfig.addFilter("readableDate", (dateObj, format = "dd LLLL yyyy") => {
return DateTime.fromJSDate(dateObj, {zone: 'utc', locale: 'fr'}).toFormat(format);
});
// https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-date-string
eleventyConfig.addFilter('htmlDateString', (dateObj) => {
return DateTime.fromJSDate(dateObj, {zone: 'utc', locale: 'fr'}).toFormat('yyyy-LL-dd');
});
// Get the first `n` elements of a collection.
eleventyConfig.addFilter("head", (array, n) => {
if(!Array.isArray(array) || array.length === 0) {
return [];
}
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("filterDraft", articles => {
return articles.filter(article => !article.data.draft);
});
eleventyConfig.addFilter("onlyDraft", articles => {
return articles.filter(article => article.data.draft);
});
// Return all the tags used in a collection
eleventyConfig.addFilter("getAllTags", collection => {
let tags = new Map();
for(let item of collection) {
if (item.data.draft) {
continue;
}
(item.data.tags || []).forEach(tag => {
let number = tags.get(tag) || 0;
tags.set(tag, ++number);
});
}
let sortedTags = new Map([...tags.entries()].sort((a, b) => b[1] - a[1]));
return Array.from(sortedTags.keys());
});
eleventyConfig.addFilter("filterTagList", function filterTagList(tags) {
return (tags || []).filter(tag => ["all", "nav", "article", "articles"].indexOf(tag) === -1);
// const filters = ["all", "nav", "article", "articles"];
// return new Map([...tags].filter(([k, _]) => filters.indexOf(k) === -1));
});
eleventyConfig.addFilter("readableAuthors", (authors) => {
if (authors.length > 1) {
return "par " + authors.slice(0, -1).join(", ") + " et " + authors.slice(-1);
}
return "par " + (authors || []);
});
eleventyConfig.addFilter("noHome", elements => {
return elements.filter(e => {
return e.url !== '/';
});
})
// Customize Markdown library and settings:
eleventyConfig.amendLibrary("md", mdLib => {
mdLib.use(markdownItAnchor, {
level: [1,2,3,4],
slugify: eleventyConfig.getFilter("slug")
});
});
// Override @11ty/eleventy-dev-server defaults (used only with --serve)
eleventyConfig.setServerOptions({
showVersion: true,
});
if (process.env.ELEVENTY_ENV === 'production') {
eleventyConfig.addTransform('htmlmin', (content, outputPath) => {
if (outputPath.endsWith('.html')) {
return htmlmin.minify(content, {
collapseInlineTagWhitespace: false,
collapseWhitespace: true,
removeComments: true,
sortClassName: true,
useShortDoctype: true,
});
}
return content;
});
}
return {
// Control which files Eleventy will process
// e.g.: *.md, *.njk, *.html, *.liquid
templateFormats: [
"md",
"njk",
"html",
"liquid"
],
// Pre-process *.md files with: (default: `liquid`)
markdownTemplateEngine: "njk",
// Pre-process *.html files with: (default: `liquid`)
htmlTemplateEngine: "njk",
// -----------------------------------------------------------------
// 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: "/",
// -----------------------------------------------------------------
// These are all optional (defaults are shown):
dir: {
input: 'src',
includes: '_components',
layouts: '_layouts',
output: 'dist',
},
};
};