allow case-insensitive matching of stock images
Hunter
Friday, December 19th, 2025 at 11:02 PM
242 const preview = document.getElementById('preview');
243
244 // Stock images loaded from manifest - can be referenced by bare filename
- let stockImages = new Set();
245 + let stockImages = new Map(); // lowercase -> original filename
246
247 // Load stock image list from manifest
248 const stockImagesReady = fetch('resource-manifest.json')
249 .then(r => r.json())
250 .then(manifest => {
251 manifest.images.forEach(path => {
- const filename = path.split('/').pop().toLowerCase();
- stockImages.add(filename);
252 + const filename = path.split('/').pop();
253 + stockImages.set(filename.toLowerCase(), filename);
254 });
255 })
256 .catch(() => console.log('Could not load resource manifest'));
257
- // Rewrite bare image filenames to use images/ prefix
258 + // Rewrite bare image filenames to use images/ prefix (case-insensitive, uses correct case)
259 function rewriteBareImageSrcs(html) {
260 return html.replace(/(<img\s[^>]*\bsrc\s*=\s*["'])([^"'/:]+\.(gif|png|jpg|jpeg|svg|webp))(["'])/gi,
261 (match, before, filename, ext, after) => {
- if (stockImages.has(filename.toLowerCase())) {
- return before + 'images/' + filename + after;
262 + const original = stockImages.get(filename.toLowerCase());
263 + if (original) {
264 + return before + 'images/' + original + after;
265 }
266 return match;
267 });
270 // Expand <images> tags into gallery table
271 function expandImagesTag(html) {
272 return html.replace(/<images\s*\/?>/gi, () => {
- const images = Array.from(stockImages).sort();
273 + const images = Array.from(stockImages.values()).sort();
274 if (images.length === 0) return '<p>No images available</p>';
275 const rows = images.map(filename =>
276 `<tr><td>${filename}</td><td style="text-align:center;"><img src="images/${filename}"></td></tr>`