diff --git a/eleventy.config.mjs b/eleventy.config.mjs index 731a27ed0..6d654785e 100644 --- a/eleventy.config.mjs +++ b/eleventy.config.mjs @@ -598,7 +598,7 @@ export default async function (eleventyConfig) { installed: stat?.installs?.totals ?? 0, installs_window: stat?.installs?.yearly?.reduce((a, b) => a + b, 0) ?? 0, ...(readme_url !== pkg.readme ? { readme_url } : {}), - ...(renderedReadmes[pkg.readme] ? { rendered_readme: renderedReadmes[pkg.readme] } : {}), + ...(renderedReadmes[pkg.readme] ? { rendered_readme: renderedReadmes[pkg.readme][1] } : {}), ...(source_url !== pkg.source ? { source_url } : {}), } } diff --git a/render_readmes.mjs b/render_readmes.mjs index 4716c177c..b3ff1b838 100644 --- a/render_readmes.mjs +++ b/render_readmes.mjs @@ -5,22 +5,31 @@ import { JSDOM } from 'jsdom' import createDOMPurify from 'dompurify' import { marked } from 'marked' import { configureMarked, renderReadme } from './static/readme-renderer.mjs' +import { createHash } from 'crypto' const args = parseArgs(process.argv.slice(2)) const rawReadmes = readJson(args.input) const dom = new JSDOM('') const DOMPurify = createDOMPurify(dom.window) const parser = new dom.window.DOMParser() + +const oldRenderedReadmes = readJson(args.output) const renderedReadmes = {} configureMarked(marked) for (const [url, text] of Object.entries(rawReadmes)) { + const hash = createHash('sha256').update(text).digest('base64') + if (oldRenderedReadmes[url] && oldRenderedReadmes[url][0] === hash) { + renderedReadmes[url] = [hash, oldRenderedReadmes[url][1]] + continue + } + const html = renderReadme(marked, text, url, { sanitize: html => DOMPurify.sanitize(html), parseHtml: html => parser.parseFromString(html, 'text/html'), }) - renderedReadmes[url] = html + renderedReadmes[url] = [hash, html] } fs.writeFileSync(args.output, JSON.stringify(renderedReadmes, null, 2) + '\n')