1e948b3e4Syifeizhao/** 2e948b3e4Syifeizhao * HiRes Image: Enhances image sharpness by loading original files. 3e948b3e4Syifeizhao */ 4e948b3e4Syifeizhao(function() { 5e948b3e4Syifeizhao "use strict"; 6e948b3e4Syifeizhao 7e948b3e4Syifeizhao const sharpen = function(img) { 8e948b3e4Syifeizhao if (!img || img.dataset.hiResProcessed) return; 9e948b3e4Syifeizhao 10e948b3e4Syifeizhao try { 11e948b3e4Syifeizhao const url = new URL(img.src); 12e948b3e4Syifeizhao 13e948b3e4Syifeizhao // Match images scaled by DokuWiki (containing w= or h=) 14e948b3e4Syifeizhao if (url.searchParams.has('w') || url.searchParams.has('h')) { 15e948b3e4Syifeizhao const w = url.searchParams.get('w'); 16e948b3e4Syifeizhao const h = url.searchParams.get('h'); 17e948b3e4Syifeizhao 18e948b3e4Syifeizhao // Remove scaling parameters and security tokens to fetch original 19e948b3e4Syifeizhao url.searchParams.delete('w'); 20e948b3e4Syifeizhao url.searchParams.delete('h'); 21e948b3e4Syifeizhao url.searchParams.delete('tok'); 22e948b3e4Syifeizhao 23e948b3e4Syifeizhao img.src = url.toString(); 24e948b3e4Syifeizhao 25e948b3e4Syifeizhao // Apply CSS constraints to maintain intended layout size 26e948b3e4Syifeizhao if (w) { 27e948b3e4Syifeizhao img.style.width = w + 'px'; 28*a031367dSyifeizhao } 29*a031367dSyifeizhao else { 30e948b3e4Syifeizhao img.style.width = 'auto'; 31e948b3e4Syifeizhao } 32e948b3e4Syifeizhao 33*a031367dSyifeizhao if (h) { 34*a031367dSyifeizhao img.style.height = h + 'px'; 35*a031367dSyifeizhao } 36*a031367dSyifeizhao else { 37*a031367dSyifeizhao img.style.height = 'auto'; 38*a031367dSyifeizhao } 39*a031367dSyifeizhao 40e948b3e4Syifeizhao // Optimization for High-DPI (Retina) displays 41e948b3e4Syifeizhao img.style.imageRendering = '-webkit-optimize-contrast'; 42e948b3e4Syifeizhao img.dataset.hiResProcessed = "true"; 43e948b3e4Syifeizhao } 44e948b3e4Syifeizhao } catch (e) { 45e948b3e4Syifeizhao // Ignore parsing errors for non-standard URLs 46e948b3e4Syifeizhao } 47e948b3e4Syifeizhao }; 48e948b3e4Syifeizhao 49e948b3e4Syifeizhao const scan = function() { 50e948b3e4Syifeizhao const sel = 'img.media, img.medialeft, img.mediaright, img.mediacenter'; 51e948b3e4Syifeizhao document.querySelectorAll(sel).forEach(sharpen); 52e948b3e4Syifeizhao }; 53e948b3e4Syifeizhao 54e948b3e4Syifeizhao // Run on initial page load 55e948b3e4Syifeizhao if (document.readyState === 'loading') { 56e948b3e4Syifeizhao document.addEventListener('DOMContentLoaded', scan); 57e948b3e4Syifeizhao } else { 58e948b3e4Syifeizhao scan(); // Run immediately 59e948b3e4Syifeizhao } 60e948b3e4Syifeizhao 61e948b3e4Syifeizhao // Dynamic observer for editors (like Prosemirror) or async content 62e948b3e4Syifeizhao const observer = new MutationObserver(function(mutations) { 63e948b3e4Syifeizhao mutations.forEach(function(mutation) { 64e948b3e4Syifeizhao if (mutation.addedNodes) { 65e948b3e4Syifeizhao mutation.addedNodes.forEach(function(node) { 66e948b3e4Syifeizhao if (node.nodeType === 1) { 67e948b3e4Syifeizhao if (node.tagName === 'IMG') { 68e948b3e4Syifeizhao sharpen(node); 69e948b3e4Syifeizhao } else { 70e948b3e4Syifeizhao node.querySelectorAll('img').forEach(sharpen); 71e948b3e4Syifeizhao } 72e948b3e4Syifeizhao } 73e948b3e4Syifeizhao }); 74e948b3e4Syifeizhao } 75e948b3e4Syifeizhao }); 76e948b3e4Syifeizhao }); 77e948b3e4Syifeizhao 78e948b3e4Syifeizhao observer.observe(document.body, { childList: true, subtree: true }); 79e948b3e4Syifeizhao})();