From de36083b9f08f1549a8f25578b2854d8aeecc388 Mon Sep 17 00:00:00 2001 From: Benjamin Schaaf Date: Tue, 21 Jul 2026 13:16:57 +1000 Subject: [PATCH] Avoid re-rendering readmes The readme rendering is slow and memory intensive, but there's no reason to redo all that work every time. We now store a hash of the text used to render the readme inside readmes_renderes.json to avoid re-rendering. --- eleventy.config.mjs | 2 +- render_readmes.mjs | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) 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')