From 8c0034d325f0bfbe4100a90e94c9471207003e4c Mon Sep 17 00:00:00 2001 From: Nicolas Doby Date: Thu, 20 Oct 2022 16:10:47 +0200 Subject: [PATCH] refactor: add sass, minify HTML, remove i18n --- .gitignore | 2 + README.md | 8 +- eleventy.config.js | 262 ++++++++++++++---- fr/fr.11tydata.js | 11 - package.json | 60 ++-- postcss.config.js | 16 +- public/js/index.js | 1 - .../_components}/other_links.njk | 4 +- {_includes => src/_components}/postslist.njk | 0 {_includes => src/_components}/tagslist.njk | 0 src/_data/cacheBust.js | 21 ++ {_data => src/_data}/metadata.json | 0 {_includes/layouts => src/_layouts}/base.njk | 18 +- {_includes/layouts => src/_layouts}/home.njk | 2 +- {_includes/layouts => src/_layouts}/post.njk | 19 +- {fr => src/_pages}/404.md | 2 +- src/_pages/_pages.json | 3 + {fr => src/_pages}/all_articles.njk | 4 +- {fr => src/_pages}/blog.njk | 4 +- {fr => src/_pages}/blog/blog.json | 0 {fr => src/_pages}/blog/exemple.md | 4 +- {fr => src/_pages}/blog/exemple_2.md | 4 +- {fr => src/_pages}/blog/exemple_3.md | 2 +- {feed => src/_pages/feed}/feed.11tydata.js | 0 {feed => src/_pages/feed}/feed.njk | 0 {feed => src/_pages/feed}/json.njk | 0 {fr => src/_pages}/index.njk | 4 +- {robots => src/_pages/robots}/robots.njk | 0 .../_pages/sitemap/sitemap.njk | 7 - {fr => src/_pages}/tags.njk | 2 +- .../index.css => src/assets/css/index.scss | 5 + src/assets/js/index.js | 1 + {public/img => src/images}/blog/kitty_1.jpeg | Bin {public/img => src/images}/blog/kitty_2.jpeg | Bin {public/img => src/images}/favicon.svg | 0 {public/img => src/images}/logo.svg | 0 webpack.config.common.js | 69 +++++ webpack.config.dev.js | 8 + webpack.config.js | 42 --- webpack.config.prod.js | 17 ++ 40 files changed, 405 insertions(+), 197 deletions(-) delete mode 100644 fr/fr.11tydata.js delete mode 100644 public/js/index.js rename {_includes => src/_components}/other_links.njk (50%) rename {_includes => src/_components}/postslist.njk (100%) rename {_includes => src/_components}/tagslist.njk (100%) create mode 100644 src/_data/cacheBust.js rename {_data => src/_data}/metadata.json (100%) rename {_includes/layouts => src/_layouts}/base.njk (84%) rename {_includes/layouts => src/_layouts}/home.njk (68%) rename {_includes/layouts => src/_layouts}/post.njk (53%) rename {fr => src/_pages}/404.md (94%) create mode 100644 src/_pages/_pages.json rename {fr => src/_pages}/all_articles.njk (90%) rename {fr => src/_pages}/blog.njk (74%) rename {fr => src/_pages}/blog/blog.json (100%) rename {fr => src/_pages}/blog/exemple.md (98%) rename {fr => src/_pages}/blog/exemple_2.md (99%) rename {fr => src/_pages}/blog/exemple_3.md (99%) rename {feed => src/_pages/feed}/feed.11tydata.js (100%) rename {feed => src/_pages/feed}/feed.njk (100%) rename {feed => src/_pages/feed}/json.njk (100%) rename {fr => src/_pages}/index.njk (92%) rename {robots => src/_pages/robots}/robots.njk (100%) rename sitemap/sitemap.xml.njk => src/_pages/sitemap/sitemap.njk (55%) rename {fr => src/_pages}/tags.njk (92%) rename public/css/index.css => src/assets/css/index.scss (99%) create mode 100644 src/assets/js/index.js rename {public/img => src/images}/blog/kitty_1.jpeg (100%) rename {public/img => src/images}/blog/kitty_2.jpeg (100%) rename {public/img => src/images}/favicon.svg (100%) rename {public/img => src/images}/logo.svg (100%) create mode 100644 webpack.config.common.js create mode 100644 webpack.config.dev.js delete mode 100644 webpack.config.js create mode 100644 webpack.config.prod.js diff --git a/.gitignore b/.gitignore index d1aa60a..a89e41c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ .idea *iml _site/ +dist/ node_modules/ package-lock.json +src/compiled-assets diff --git a/README.md b/README.md index 6441ff0..e847be5 100644 --- a/README.md +++ b/README.md @@ -73,8 +73,8 @@ DEBUG=Eleventy* npx @11ty/eleventy - The `public` folder in your input directory will be copied to the output folder (via `addPassthroughCopy()` in the `.eleventy.js` file). This means `./public/css/*` will live at `./_site/css/*` after your build completes. [When using `--serve` this behavior is emulated](/docs/copy/#passthrough-during-serve) (the files will not show up in `_site`). - The blog post feed template is in `feed/feed.njk`. This is also a good example of using a global data files in that it uses `_data/metadata.json`. - This project uses three layouts: - - `_includes/layouts/base.njk`: the top level HTML structure - - `_includes/layouts/home.njk`: the home page template (wrapped into `base.njk`) - - `_includes/layouts/post.njk`: the blog post template (wrapped into `base.njk`) -- `_includes/postslist.njk` is a Nunjucks include and is a reusable component used to display a list of all the posts. `index.njk` has an example of how to use it. + - `_layouts/base.njk`: the top level HTML structure + - `_layouts/home.njk`: the home page template (wrapped into `base.njk`) + - `_layouts/post.njk`: the blog post template (wrapped into `base.njk`) +- `_components/postslist.njk` is a Nunjucks include and is a reusable component used to display a list of all the posts. `index.njk` has an example of how to use it. diff --git a/eleventy.config.js b/eleventy.config.js index fb15cf6..9a9e8e1 100644 --- a/eleventy.config.js +++ b/eleventy.config.js @@ -1,14 +1,12 @@ -const fs = require("fs"); -const path = require("path"); const { DateTime } = require("luxon"); -const rosetta = require("rosetta"); const markdownItAnchor = require("markdown-it-anchor"); const pluginRss = require("@11ty/eleventy-plugin-rss"); const pluginSyntaxHighlight = require("@11ty/eleventy-plugin-syntaxhighlight"); const pluginNavigation = require("@11ty/eleventy-navigation"); -const { EleventyI18nPlugin, EleventyHtmlBasePlugin } = require("@11ty/eleventy"); -const languageStrings = require("./i18n.js"); +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 }; @@ -18,48 +16,28 @@ let figoptions = { }; const mdLib = markdownIt(options).use(mdfigcaption, figoptions); -const manifestPath = path.resolve(__dirname, "_site", "assets", "manifest.json"); -const manifest = JSON.parse( - fs.readFileSync(manifestPath, { encoding: "utf8" }) -); - module.exports = function(eleventyConfig) { - eleventyConfig.ignores.add("README.md"); + eleventyConfig.setUseGitIgnore(false); eleventyConfig.setLibrary("md", mdLib); - // Adds a universal shortcode to return the URL to a webpack asset. In Nunjack templates: - // {% webpackAsset 'main.js' %} or {% webpackAsset 'main.css' %} - eleventyConfig.addShortcode("webpackAsset", function(name) { - if (!manifest[name]) { - throw new Error(`The asset ${name} does not exist in ${manifestPath}`); - } - return manifest[name]; - }); + // Watch our compiled assets for changes + eleventyConfig.addWatchTarget('./src/compiled-assets/main.css'); + //eleventyConfig.addWatchTarget('./src/compiled-assets/main.js'); + //eleventyConfig.addWatchTarget('./src/compiled-assets/vendor.js'); - // Copy all images directly to dist. - eleventyConfig.addPassthroughCopy({ "public/img": "img" }); + // Copy src/compiled-assets to /assets + eleventyConfig.addPassthroughCopy({ 'src/compiled-assets': 'assets' }); + // Copy all images + eleventyConfig.addPassthroughCopy('src/images'); - // Copy the contents of the `public` folder to the output folder - // For example, `./public/css/` ends up in `_site/css/` - // eleventyConfig.addPassthroughCopy({ - // "./node_modules/prismjs/themes/prism-okaidia.css": "/public/css/prism-theme.css", - // }); - // // Watch our compiled assets for changes - // eleventyConfig.addWatchTarget('./src/compiled-assets/main.css'); - // // Copy src/compiled-assets to /assets - // eleventyConfig.addPassthroughCopy({ 'src/compiled-assets': 'assets' }); - - // Add plugins + // Add plugins eleventyConfig.addPlugin(pluginRss); eleventyConfig.addPlugin(pluginSyntaxHighlight); eleventyConfig.addPlugin(pluginNavigation); eleventyConfig.addPlugin(EleventyHtmlBasePlugin); - eleventyConfig.addPlugin(EleventyI18nPlugin, { - defaultLanguage: "fr", - errorMode: "allow-fallback", - }); + 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); @@ -115,23 +93,26 @@ module.exports = function(eleventyConfig) { }); }); - // Override @11ty/eleventy-dev-server defaults (used only with --serve) + // Override @11ty/eleventy-dev-server defaults (used only with --serve) eleventyConfig.setServerOptions({ showVersion: true, }); - // i18n filter using Rosetta - const rosettaLib = rosetta(languageStrings); + 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, + }); + } - eleventyConfig.addFilter("i18n", function (key, lang) { - const I18N_PREFIX = "i18n."; - if(key.startsWith(I18N_PREFIX)) { - key = key.slice(I18N_PREFIX.length); - } - // depends on page.lang in 2.0.0-canary.14+ - let page = this.page || this.ctx?.page || this.context?.environments?.page || {}; - return rosettaLib.t(key, {}, lang || page.lang); - }); + return content; + }); + } return { // Control which files Eleventy will process @@ -165,10 +146,185 @@ module.exports = function(eleventyConfig) { // These are all optional (defaults are shown): dir: { - input: ".", - includes: "_includes", - data: "_data", - output: "_site" - } + input: 'src', + includes: '_components', + layouts: '_layouts', + output: 'dist', + }, }; }; + +// const fs = require("fs"); +// const path = require("path"); +// const { DateTime } = require("luxon"); +// const rosetta = require("rosetta"); +// const markdownItAnchor = require("markdown-it-anchor"); +// const pluginRss = require("@11ty/eleventy-plugin-rss"); +// const pluginSyntaxHighlight = require("@11ty/eleventy-plugin-syntaxhighlight"); +// const pluginNavigation = require("@11ty/eleventy-navigation"); +// const { EleventyI18nPlugin, EleventyHtmlBasePlugin } = require("@11ty/eleventy"); +// const languageStrings = require("./i18n.js"); +// let markdownIt = require("markdown-it"); +// let options = { +// // whatever options you have set for the library here +// }; +// let mdfigcaption = require('markdown-it-image-figures'); +// let figoptions = { +// figcaption: true +// }; +// const mdLib = markdownIt(options).use(mdfigcaption, figoptions); +// +// const manifestPath = path.resolve(__dirname, "_site", "assets", "manifest.json"); +// const manifest = JSON.parse( +// fs.readFileSync(manifestPath, { encoding: "utf8" }) +// ); +// +// module.exports = function(eleventyConfig) { +// eleventyConfig.ignores.add("README.md"); +// +// eleventyConfig.setLibrary("md", mdLib); +// +// // Adds a universal shortcode to return the URL to a webpack asset. In Nunjack templates: +// // {% webpackAsset 'main.js' %} or {% webpackAsset 'main.css' %} +// eleventyConfig.addShortcode("webpackAsset", function(name) { +// if (!manifest[name]) { +// throw new Error(`The asset ${name} does not exist in ${manifestPath}`); +// } +// return manifest[name]; +// }); +// +// // Copy all images directly to dist. +// eleventyConfig.addPassthroughCopy({ "public/img": "img" }); +// +// // Copy the contents of the `public` folder to the output folder +// // For example, `./public/css/` ends up in `_site/css/` +// // eleventyConfig.addPassthroughCopy({ +// // "./node_modules/prismjs/themes/prism-okaidia.css": "/public/css/prism-theme.css", +// // }); +// // // Watch our compiled assets for changes +// // eleventyConfig.addWatchTarget('./src/compiled-assets/main.css'); +// // // Copy src/compiled-assets to /assets +// // eleventyConfig.addPassthroughCopy({ 'src/compiled-assets': 'assets' }); +// +// // Add plugins +// eleventyConfig.addPlugin(pluginRss); +// eleventyConfig.addPlugin(pluginSyntaxHighlight); +// eleventyConfig.addPlugin(pluginNavigation); +// eleventyConfig.addPlugin(EleventyHtmlBasePlugin); +// +// eleventyConfig.addPlugin(EleventyI18nPlugin, { +// defaultLanguage: "fr", +// errorMode: "allow-fallback", +// }); +// +// 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); +// }); +// +// // Return all the tags used in a collection +// eleventyConfig.addFilter("getAllTags", collection => { +// let tagSet = new Set(); +// for(let item of collection) { +// (item.data.tags || []).forEach(tag => tagSet.add(tag)); +// } +// return Array.from(tagSet).sort((a, b) => { +// return a.localeCompare(b, undefined, {sensitivity: 'base'}); +// }); +// }); +// +// eleventyConfig.addFilter("filterTagList", function filterTagList(tags) { +// return (tags || []).filter(tag => ["all", "nav", "post", "posts"].indexOf(tag) === -1); +// }); +// +// // Customize Markdown library and settings: +// eleventyConfig.amendLibrary("md", mdLib => { +// mdLib.use(markdownItAnchor, { +// permalink: markdownItAnchor.permalink.ariaHidden({ +// placement: "after", +// class: "direct-link", +// symbol: "#", +// }), +// level: [1,2,3,4], +// slugify: eleventyConfig.getFilter("slug") +// }); +// }); +// +// // Override @11ty/eleventy-dev-server defaults (used only with --serve) +// eleventyConfig.setServerOptions({ +// showVersion: true, +// }); +// +// // i18n filter using Rosetta +// const rosettaLib = rosetta(languageStrings); +// +// eleventyConfig.addFilter("i18n", function (key, lang) { +// const I18N_PREFIX = "i18n."; +// if(key.startsWith(I18N_PREFIX)) { +// key = key.slice(I18N_PREFIX.length); +// } +// // depends on page.lang in 2.0.0-canary.14+ +// let page = this.page || this.ctx?.page || this.context?.environments?.page || {}; +// return rosettaLib.t(key, {}, lang || page.lang); +// }); +// +// 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: ".", +// includes: "_includes", +// data: "_data", +// output: "_site" +// } +// }; +// }; diff --git a/fr/fr.11tydata.js b/fr/fr.11tydata.js deleted file mode 100644 index af14c94..0000000 --- a/fr/fr.11tydata.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - lang: "fr", - permalink: function(data) { - // Change (Francais) /fr/blog/my-post URLs to have an implied language code /blog/my-post URLs instead. - let [slashPrefixEmpty, langCode, ...stem] = data.page.filePathStem.split("/"); - let path = stem.join("/"); - - // Account for `permalink: 404.html` style - return stem[stem.length - 1] === "index" ? `${path}.html` : `${path}/index.html`; - } -} diff --git a/package.json b/package.json index c6b4a25..15f8291 100644 --- a/package.json +++ b/package.json @@ -3,38 +3,52 @@ "version": "1.0.0", "description": "Blog IT's on us", "scripts": { - "build": "npm-run-all clean build:assets build:site", - "build:assets": "NODE_ENV=production webpack --mode=production", - "build:site": "NODE_ENV=production eleventy", - "clean": "rm -rf ./_site", - "dev": "npm-run-all clean webpack:assets --parallel dev:*", - "dev:assets": "npm run webpack:assets --watch", - "dev:site": "NODE_ENV=development eleventy --serve", - "webpack:assets": "NODE_ENV=development webpack --mode=development" + "build:assets": "webpack --config webpack.config.prod.js", + "build:site": "ELEVENTY_ENV=production npx eleventy", + "del:assets": "rimraf ./src/compiled-assets", + "del:dist": "rimraf ./dist", + "dev": "npm run dev:assets & npm run dev:site", + "dev:assets": "webpack --config webpack.config.dev.js", + "dev:site": "ELEVENTY_ENV=development npx eleventy --serve", + "prod": "npm-run-all del:dist del:assets build:assets build:site", + "serve:prod": "serve ./dist/" + }, + "repository": { + "type": "git", + "url": "https://git.itsonus.fr/internal/itsonus-blog" }, "dependencies": { "@11ty/eleventy": "^2.0.0-canary.16", "@11ty/eleventy-navigation": "^0.3.5", "@11ty/eleventy-plugin-rss": "^1.2.0", "@11ty/eleventy-plugin-syntaxhighlight": "^4.1.0", - "@babel/core": "^7.10.2", - "@babel/preset-env": "^7.10.2", - "autoprefixer": "^9.8.0", - "babel-loader": "^8.1.0", - "css-loader": "^3.5.3", - "cssnano": "^4.1.10", - "luxon": "^3.0.1", "markdown-it-anchor": "^8.6.4", "markdown-it-image-figures": "^2.1.0", - "mini-css-extract-plugin": "^0.9.0", + "luxon": "^3.0.4", + + "@babel/core": "^7.18.2", + "@babel/preset-env": "^7.18.2", + "autoprefixer": "^10.4.7", + "babel-loader": "^8.2.5", + "core-js": "^3.22.8", + "css-loader": "^6.7.1", + "eslint": "^8.17.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-plugin-import": "^2.26.0", + "html-minifier": "^4.0.0", + "md5-file": "^5.0.0", + "mini-css-extract-plugin": "^2.6.0", "npm-run-all": "^4.1.5", - "postcss-import": "^12.0.1", - "postcss-loader": "^3.0.0", - "postcss-preset-env": "^6.7.0", - "rosetta": "^1.1.0", - "webpack": "^4.43.0", - "webpack-cli": "^3.3.11", - "webpack-manifest-plugin": "^2.2.0" + "css-minimizer-webpack-plugin": "^4.0.0", + "postcss-loader": "^7.0.0", + "rimraf": "^3.0.2", + "sass": "^1.52.2", + "sass-loader": "^13.0.0", + "serve": "^13.0.2", + "terser-webpack-plugin": "^5.3.3", + "webpack": "^5.73.0", + "webpack-cli": "^4.9.2", + "webpack-merge": "^5.8.0" }, "devDependencies": { "prettier": "^2.0.5" diff --git a/postcss.config.js b/postcss.config.js index 988025d..3b16595 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,10 +1,6 @@ -const plugins = [ - require("postcss-import"), - require("postcss-preset-env"), -]; - -if (process.env.NODE_ENV === "production") { - plugins.push(require("cssnano")); -} - -module.exports = { plugins }; +module.exports = { + plugins: [ + // eslint-disable-next-line global-require + require('autoprefixer'), + ], +}; diff --git a/public/js/index.js b/public/js/index.js deleted file mode 100644 index d52773e..0000000 --- a/public/js/index.js +++ /dev/null @@ -1 +0,0 @@ -// console.log("Elevenpack javascript is loaded"); diff --git a/_includes/other_links.njk b/src/_components/other_links.njk similarity index 50% rename from _includes/other_links.njk rename to src/_components/other_links.njk index 2a426f4..a509ae1 100644 --- a/_includes/other_links.njk +++ b/src/_components/other_links.njk @@ -2,8 +2,6 @@ diff --git a/_includes/postslist.njk b/src/_components/postslist.njk similarity index 100% rename from _includes/postslist.njk rename to src/_components/postslist.njk diff --git a/_includes/tagslist.njk b/src/_components/tagslist.njk similarity index 100% rename from _includes/tagslist.njk rename to src/_components/tagslist.njk diff --git a/src/_data/cacheBust.js b/src/_data/cacheBust.js new file mode 100644 index 0000000..f59ab52 --- /dev/null +++ b/src/_data/cacheBust.js @@ -0,0 +1,21 @@ +const md5File = require('md5-file'); + +const cacheBust = () => { + // A "map" of files to cache bust + const files = { + mainCss: './src/compiled-assets/main.css', + // mainJs: './src/compiled-assets/main.js', + // vendorJs: './src/compiled-assets/vendor.js', + }; + + return Object.entries(files).reduce((acc, [key, path]) => { + const now = Date.now(); + const bust = process.env.ELEVENTY_ENV === 'production' ? md5File.sync(path, (_err, hash) => hash) : now; + + acc[key] = bust; + + return acc; + }, {}); +}; + +module.exports = cacheBust; diff --git a/_data/metadata.json b/src/_data/metadata.json similarity index 100% rename from _data/metadata.json rename to src/_data/metadata.json diff --git a/_includes/layouts/base.njk b/src/_layouts/base.njk similarity index 84% rename from _includes/layouts/base.njk rename to src/_layouts/base.njk index 1546485..42783f5 100644 --- a/_includes/layouts/base.njk +++ b/src/_layouts/base.njk @@ -1,29 +1,21 @@ - + {{ title or metadata.title }} - + - - - {%- set alternateUrls = page.url | locale_links %} - {% if alternateUrls.length %} - - {%- for link in alternateUrls %} - - {%- endfor %} - {%- endif %} +
@@ -53,7 +45,7 @@
  • - + Accéder au flux RSS du blog diff --git a/_includes/layouts/home.njk b/src/_layouts/home.njk similarity index 68% rename from _includes/layouts/home.njk rename to src/_layouts/home.njk index ebba6b3..e8f1f01 100644 --- a/_includes/layouts/home.njk +++ b/src/_layouts/home.njk @@ -1,5 +1,5 @@ --- -layout: layouts/base.njk +layout: base.njk templateClass: tmpl-home --- {{ content | safe }} diff --git a/_includes/layouts/post.njk b/src/_layouts/post.njk similarity index 53% rename from _includes/layouts/post.njk rename to src/_layouts/post.njk index bb17091..a8f7bce 100644 --- a/_includes/layouts/post.njk +++ b/src/_layouts/post.njk @@ -1,5 +1,5 @@ --- -layout: layouts/base.njk +layout: base.njk templateClass: tmpl-post ---

    {{ title }}

    @@ -16,19 +16,6 @@ templateClass: tmpl-post
    -{% set i18nLinks = page.url | locale_links %} -{% if i18nLinks.length %} -
      -
    • - {{ "i18n.also" | i18n }} - {%- for link in i18nLinks %} - {{ link.label }} - {%- if not loop.last %},{% endif %} - {%- endfor -%} -
    • -
    -{% endif %} - {%- if collections.posts %} {# these filters are locale-aware in 2.0.0-canary.14 #} {%- set previousPost = collections.posts | getPreviousCollectionItem %} @@ -36,8 +23,8 @@ templateClass: tmpl-post {%- if nextPost or previousPost %} {%- endif %} diff --git a/fr/404.md b/src/_pages/404.md similarity index 94% rename from fr/404.md rename to src/_pages/404.md index 9a37322..472a0f8 100644 --- a/fr/404.md +++ b/src/_pages/404.md @@ -1,5 +1,5 @@ --- -layout: layouts/home.njk +layout: home.njk permalink: 404.html eleventyExcludeFromCollections: true --- diff --git a/src/_pages/_pages.json b/src/_pages/_pages.json new file mode 100644 index 0000000..b60e378 --- /dev/null +++ b/src/_pages/_pages.json @@ -0,0 +1,3 @@ +{ + "permalink": "{{ page.filePathStem.replace('/_pages', '').replace('/index', '') }}/index.html" +} diff --git a/fr/all_articles.njk b/src/_pages/all_articles.njk similarity index 90% rename from fr/all_articles.njk rename to src/_pages/all_articles.njk index 46816a1..148444d 100644 --- a/fr/all_articles.njk +++ b/src/_pages/all_articles.njk @@ -1,7 +1,7 @@ --- -layout: layouts/home.njk +layout: home.njk eleventyNavigation: - key: nav.all + key: Tous les articles order: 3 ---
      diff --git a/fr/blog.njk b/src/_pages/blog.njk similarity index 74% rename from fr/blog.njk rename to src/_pages/blog.njk index c44c7ef..7762ab0 100644 --- a/fr/blog.njk +++ b/src/_pages/blog.njk @@ -1,7 +1,7 @@ --- -layout: layouts/home.njk +layout: home.njk eleventyNavigation: - key: nav.archive + key: Archives order: 2 ---

      Archive

      diff --git a/fr/blog/blog.json b/src/_pages/blog/blog.json similarity index 100% rename from fr/blog/blog.json rename to src/_pages/blog/blog.json diff --git a/fr/blog/exemple.md b/src/_pages/blog/exemple.md similarity index 98% rename from fr/blog/exemple.md rename to src/_pages/blog/exemple.md index 067214f..c5b790b 100644 --- a/fr/blog/exemple.md +++ b/src/_pages/blog/exemple.md @@ -7,14 +7,14 @@ tags: - ACV - EFC - écoconception -layout: layouts/post.njk +layout: post.njk --- ## Introduction Leverage agile Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Semper quis lectus nulla at volutpat. Est pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Enim diam vulputate ut pharetra sit amet. Placerat orci nulla pellentesque dignissim. Gravida rutrum quisque non tellus. Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Diam sollicitudin tempor id eu nisl nunc mi ipsum faucibus. Tempor id eu nisl nunc mi. Cras pulvinar mattis nunc sed blandit libero volutpat sed cras. Eget magna fermentum iaculis eu non diam phasellus. Est lorem ipsum dolor sit amet consectetur adipiscing. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur. Velit scelerisque in dictum non consectetur a. Lectus sit amet est placerat. Viverra aliquet eget sit amet tellus cras adipiscing enim eu. Ut tristique et egestas quis ipsum suspendisse ultrices. Bibendum est ultricies integer quis auctor elit. Aliquam sem et tortor consequat id porta nibh. to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment. -![Un chaton](/img/blog/kitty_1.jpeg "Un chaton tout mignon 😍") +![Un chaton](/images/blog/kitty_1.jpeg "Un chaton tout mignon 😍") Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Semper quis lectus nulla at volutpat. Est pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Enim diam vulputate ut pharetra sit amet. Placerat orci nulla pellentesque dignissim. Gravida rutrum quisque non tellus. Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Diam sollicitudin tempor id eu nisl nunc mi ipsum faucibus. Tempor id eu nisl nunc mi. Cras pulvinar mattis nunc sed blandit libero volutpat sed cras. Eget magna fermentum iaculis eu non diam phasellus. Est lorem ipsum dolor sit amet consectetur adipiscing. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur. Velit scelerisque in dictum non consectetur a. Lectus sit amet est placerat. Viverra aliquet eget sit amet tellus cras adipiscing enim eu. Ut tristique et egestas quis ipsum suspendisse ultrices. Bibendum est ultricies integer quis auctor elit. Aliquam sem et tortor consequat id porta nibh. diff --git a/fr/blog/exemple_2.md b/src/_pages/blog/exemple_2.md similarity index 99% rename from fr/blog/exemple_2.md rename to src/_pages/blog/exemple_2.md index 55f1ff8..5613434 100644 --- a/fr/blog/exemple_2.md +++ b/src/_pages/blog/exemple_2.md @@ -6,7 +6,7 @@ date: 2022-10-15 tags: - accessibilité - écoconception -layout: layouts/post.njk +layout: post.njk --- ## Introduction @@ -48,6 +48,6 @@ console.log('Test'); ## Conclusion -![Un chaton](/img/blog/kitty_2.jpeg) +![Un chaton](/images/blog/kitty_2.jpeg) Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Semper quis lectus nulla at volutpat. Est pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi. Enim diam vulputate ut pharetra sit amet. Placerat orci nulla pellentesque dignissim. Gravida rutrum quisque non tellus. Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Diam sollicitudin tempor id eu nisl nunc mi ipsum faucibus. Tempor id eu nisl nunc mi. Cras pulvinar mattis nunc sed blandit libero volutpat sed cras. Eget magna fermentum iaculis eu non diam phasellus. Est lorem ipsum dolor sit amet consectetur adipiscing. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur. Velit scelerisque in dictum non consectetur a. Lectus sit amet est placerat. Viverra aliquet eget sit amet tellus cras adipiscing enim eu. Ut tristique et egestas quis ipsum suspendisse ultrices. Bibendum est ultricies integer quis auctor elit. Aliquam sem et tortor consequat id porta nibh. diff --git a/fr/blog/exemple_3.md b/src/_pages/blog/exemple_3.md similarity index 99% rename from fr/blog/exemple_3.md rename to src/_pages/blog/exemple_3.md index cf0fc15..f9c5d37 100644 --- a/fr/blog/exemple_3.md +++ b/src/_pages/blog/exemple_3.md @@ -5,7 +5,7 @@ resume: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod date: 2022-10-17 tags: - écoconception -layout: layouts/post.njk +layout: post.njk --- ## Introduction diff --git a/feed/feed.11tydata.js b/src/_pages/feed/feed.11tydata.js similarity index 100% rename from feed/feed.11tydata.js rename to src/_pages/feed/feed.11tydata.js diff --git a/feed/feed.njk b/src/_pages/feed/feed.njk similarity index 100% rename from feed/feed.njk rename to src/_pages/feed/feed.njk diff --git a/feed/json.njk b/src/_pages/feed/json.njk similarity index 100% rename from feed/json.njk rename to src/_pages/feed/json.njk diff --git a/fr/index.njk b/src/_pages/index.njk similarity index 92% rename from fr/index.njk rename to src/_pages/index.njk index 5ba8031..5149c68 100644 --- a/fr/index.njk +++ b/src/_pages/index.njk @@ -1,7 +1,7 @@ --- -layout: layouts/home.njk +layout: home.njk eleventyNavigation: - key: i18n.nav.home + key: Accueil order: 1 --- {% set maxPosts = collections.posts.length | min(5) %} diff --git a/robots/robots.njk b/src/_pages/robots/robots.njk similarity index 100% rename from robots/robots.njk rename to src/_pages/robots/robots.njk diff --git a/sitemap/sitemap.xml.njk b/src/_pages/sitemap/sitemap.njk similarity index 55% rename from sitemap/sitemap.xml.njk rename to src/_pages/sitemap/sitemap.njk index a0f7488..5ffdce4 100644 --- a/sitemap/sitemap.xml.njk +++ b/src/_pages/sitemap/sitemap.njk @@ -9,13 +9,6 @@ eleventyExcludeFromCollections: true {{ absoluteUrl }} {{ page.date | htmlDateString }} - {%- set alternateUrls = page.url | locale_links %} - {%- if alternateUrls.length %} - - {%- for link in alternateUrls %} - - {%- endfor %} - {%- endif %} {%- endfor %} diff --git a/fr/tags.njk b/src/_pages/tags.njk similarity index 92% rename from fr/tags.njk rename to src/_pages/tags.njk index a9c9ac7..ce6791f 100644 --- a/fr/tags.njk +++ b/src/_pages/tags.njk @@ -9,7 +9,7 @@ pagination: - posts - tagList addAllPagesToCollections: true -layout: layouts/home.njk +layout: home.njk eleventyComputed: title: Tags “{{ tag }}” permalink: /tags/{{ tag | slugify }}/ diff --git a/public/css/index.css b/src/assets/css/index.scss similarity index 99% rename from public/css/index.css rename to src/assets/css/index.scss index f4bb2f2..4f50d2c 100644 --- a/public/css/index.css +++ b/src/assets/css/index.scss @@ -1,4 +1,5 @@ @import "prismjs/themes/prism-okaidia.min.css"; + /* Defaults */ :root { --font-family: Century Gothic,Avant Garde,Avenir,TeXGyreAdventorRegular,Verdana,sans-serif; @@ -157,6 +158,10 @@ pre + h2 { margin-top: 2rem; } +img { + max-width: 100%; +} + figure { text-align: center; margin: 0; diff --git a/src/assets/js/index.js b/src/assets/js/index.js new file mode 100644 index 0000000..15c7f56 --- /dev/null +++ b/src/assets/js/index.js @@ -0,0 +1 @@ +import '../css/index.scss'; diff --git a/public/img/blog/kitty_1.jpeg b/src/images/blog/kitty_1.jpeg similarity index 100% rename from public/img/blog/kitty_1.jpeg rename to src/images/blog/kitty_1.jpeg diff --git a/public/img/blog/kitty_2.jpeg b/src/images/blog/kitty_2.jpeg similarity index 100% rename from public/img/blog/kitty_2.jpeg rename to src/images/blog/kitty_2.jpeg diff --git a/public/img/favicon.svg b/src/images/favicon.svg similarity index 100% rename from public/img/favicon.svg rename to src/images/favicon.svg diff --git a/public/img/logo.svg b/src/images/logo.svg similarity index 100% rename from public/img/logo.svg rename to src/images/logo.svg diff --git a/webpack.config.common.js b/webpack.config.common.js new file mode 100644 index 0000000..7575d1f --- /dev/null +++ b/webpack.config.common.js @@ -0,0 +1,69 @@ +// Makes Sass faster! +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const path = require('path'); + +module.exports = { + // Our "entry" point + entry: './src/assets/js/index.js', + output: { + // The global variable name any `exports` from `index.js` will be available at + library: 'SITE', + // Where webpack will compile the assets + path: path.resolve(__dirname, 'src/compiled-assets'), + }, + module: { + rules: [ + // Transpile and polyfill our JavaScript + { + test: /\.js$/, + use: 'babel-loader', + exclude: /node_modules/, + }, + { + // Setting up compiling our Sass + test: /\.scss$/, + use: [ + { + loader: MiniCssExtractPlugin.loader, + }, + { + loader: 'css-loader', + options: { + url: false, + }, + }, + { + loader: 'postcss-loader', + }, + { + loader: 'sass-loader', + options: { + // eslint-disable-next-line global-require + implementation: require('sass'), + sassOptions: { + outputStyle: 'expanded', + }, + }, + }, + ], + }, + ], + }, + // Any `import`s from `node_modules` will compiled in to a `vendor.js` file. + optimization: { + splitChunks: { + cacheGroups: { + commons: { + test: /[\\/]node_modules[\\/]/, + name: 'vendor', + chunks: 'all', + }, + }, + }, + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: '[name].css', + }), + ], +}; diff --git a/webpack.config.dev.js b/webpack.config.dev.js new file mode 100644 index 0000000..c5d8417 --- /dev/null +++ b/webpack.config.dev.js @@ -0,0 +1,8 @@ +const { merge } = require('webpack-merge'); +const common = require('./webpack.config.common.js'); + +module.exports = merge(common, { + mode: 'development', + // Allow watching and live reloading of assets + watch: true, +}); diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 25e811d..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,42 +0,0 @@ -const path = require("path"); -const ManifestPlugin = require("webpack-manifest-plugin"); -const MiniCssExtractPlugin = require("mini-css-extract-plugin"); - -const isDev = process.env.NODE_ENV === "development"; - -const baseFilename = isDev ? "index" : "index.[contenthash]"; - -module.exports = { - mode: isDev ? "development" : "production", - entry: [ - path.resolve(__dirname, "public", "js", "index.js"), - path.resolve(__dirname, "public", "css", "index.css"), - ], - output: { - path: path.resolve(__dirname, "_site", "assets"), - filename: `${baseFilename}.js`, - }, - module: { - rules: [ - { - test: /\.m?js$/, - exclude: /(node_modules)/, - use: { - loader: "babel-loader", - options: { - presets: ["@babel/preset-env"], - }, - }, - }, - { - test: /\.css$/, - use: [MiniCssExtractPlugin.loader, "css-loader", "postcss-loader"], - }, - ], - }, - devtool: isDev ? "eval" : "source-map", - plugins: [ - new MiniCssExtractPlugin({ filename: `${baseFilename}.css` }), - new ManifestPlugin({ publicPath: "/assets/" }), - ], -}; diff --git a/webpack.config.prod.js b/webpack.config.prod.js new file mode 100644 index 0000000..50dc578 --- /dev/null +++ b/webpack.config.prod.js @@ -0,0 +1,17 @@ +const OptimizeCssAssetsPlugin = require('css-minimizer-webpack-plugin'); +const TerserPlugin = require('terser-webpack-plugin'); +const { merge } = require('webpack-merge'); +const common = require('./webpack.config.common.js'); + +module.exports = merge(common, { + // Enable minification and tree-shaking + mode: 'production', + optimization: { + minimizer: [ + new OptimizeCssAssetsPlugin({}), + new TerserPlugin({ + extractComments: false, + }), + ], + }, +});