xyc
2024-05-17 6b24f642b01cf3cd1be0d5833273fa2867d389e1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
function loadStylesheets(stylesheets, {
    before: beforeDefault, after: afterDefault, favicon: faviconDefault,
    canvas: canvasDefault, image: imageDefault = true,
    acceptErrors
} = {}) {
    stylesheets = Array.isArray(stylesheets) ? stylesheets : [stylesheets];
 
    function setupLink(stylesheetURL) {
        let options = {};
        if (Array.isArray(stylesheetURL)) {
            [stylesheetURL, options = {}] = stylesheetURL;
        }
        let { favicon = faviconDefault } = options;
        const {
            before = beforeDefault,
            after = afterDefault,
            canvas = canvasDefault,
            image = imageDefault
        } = options;
        function addLink() {
            if (before) {
                before.before(link);
            } else if (after) {
                after.after(link);
            } else {
                document.head.appendChild(link);
            }
        }
 
        const link = document.createElement('link');
        return new Promise((resolve, reject) => {
            let rej = reject;
            if (acceptErrors) {
                rej = typeof acceptErrors === 'function' ? error => {
                    acceptErrors({ error, stylesheetURL, options, resolve, reject });
                } : resolve;
            }
            if (stylesheetURL.endsWith('.css')) {
                favicon = false;
            } else if (stylesheetURL.endsWith('.ico')) {
                favicon = true;
            }
            if (favicon) {
                link.rel = 'shortcut icon';
                link.type = 'image/x-icon';
 
                if (image === false) {
                    link.href = stylesheetURL;
                    addLink();
                    resolve(link);
                    return;
                }
 
                const cnv = document.createElement('canvas');
                cnv.width = 16;
                cnv.height = 16;
                const context = cnv.getContext('2d');
                const img = document.createElement('img');
                img.addEventListener('error', error => {
                    reject(error);
                });
                img.addEventListener('load', () => {
                    context.drawImage(img, 0, 0);
                    link.href = canvas ? cnv.toDataURL('image/x-icon') : stylesheetURL;
                    addLink();
                    resolve(link);
                });
                img.src = stylesheetURL;
                return;
            }
            link.rel = 'stylesheet';
            link.type = 'text/css';
            link.href = stylesheetURL;
            addLink();
            link.addEventListener('error', error => {
                rej(error);
            });
            link.addEventListener('load', () => {
                resolve(link);
            });
        });
    }
 
    return Promise.all(stylesheets.map(setupLink));
}
 
export default loadStylesheets;