xref: /plugin/hiresimage/script.js (revision a031367de2540f23f1ec5014f50291748a1db5d8)
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})();