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); }); // 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`. // 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: "/", // ----------------------------------------------------------------- // These are all optional (defaults are shown): dir: { input: 'src', includes: '_components', layouts: '_layouts', output: 'dist', }, }; };