const jsdom = require('@tbranyen/jsdom'); const {JSDOM} = jsdom; const minify = require('../utils/minify.js'); const slugify = require('slugify'); const getSize = require('image-size'); module.exports = function(value, outputPath) { if (outputPath.endsWith('.html')) { const DOM = new JSDOM(value, { resources: 'usable' }); const document = DOM.window.document; const articleImages = [...document.querySelectorAll('main article img, .intro img')]; const articleHeadings = [ ...document.querySelectorAll('main article h2, main article h3') ]; const articleEmbeds = [...document.querySelectorAll('main article iframe')]; if (articleImages.length) { articleImages.forEach(image => { image.setAttribute('loading', 'lazy'); const file = image.getAttribute('src'); // if preprod env TODO remove when prod if(this.config.pathPrefix.localeCompare('/')) { // pathPrefix is different from '/' // if(process.env.ELEVENTY_ENV == "preprod") { // not working image.setAttribute('src', this.config.pathPrefix + file); } if (file.indexOf('http') < 0) { const dimensions = getSize('src' + file); image.setAttribute('width', dimensions.width); image.setAttribute('height', dimensions.height);; } // Replace p tags by figure tag for img const figure = document.createElement('figure'); image.removeAttribute('title'); figure.appendChild(image.cloneNode(true)); // If an image has a title it means that the user added a caption // so replace the image with a figure containing that image and a caption if (image.hasAttribute('title')) { const figCaption = document.createElement('figcaption'); figCaption.innerHTML = image.getAttribute('title'); figure.appendChild(figCaption); } image.parentNode.replaceWith(figure); }); } if (articleHeadings.length) { // Loop each heading and add a little anchor and an ID to each one articleHeadings.forEach(heading => { const headingSlug = slugify(heading.textContent.toLowerCase()); const anchor = document.createElement('a'); anchor.setAttribute('href', `#heading-${headingSlug}`); anchor.classList.add('heading-permalink'); anchor.innerHTML = minify(` permalink `); heading.setAttribute('id', `heading-${headingSlug}`); heading.appendChild(anchor); }); } // Look for videos are wrap them in a container element if (articleEmbeds.length) { articleEmbeds.forEach(embed => { if (embed.hasAttribute('allowfullscreen')) { const player = document.createElement('div'); player.classList.add('video-player'); player.appendChild(embed.cloneNode(true)); embed.replaceWith(player); } }); } return '\r\n' + document.documentElement.outerHTML; } return value; };