195 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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`.
 | 
						||
    // 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',
 | 
						||
    },
 | 
						||
  };
 | 
						||
};
 |