Mediawiki:common.js

Вернуться

Строка 6: Строка 6:
         loading: false,
         loading: false,
         callbacks: [],
         callbacks: [],
        baseUrl: null,


         load: function (callback) {
         load: function (callback) {
Строка 20: Строка 21:
             var self = this;
             var self = this;
             var cdns = [
             var cdns = [
                 { base: "https://unpkg.com", popper: "/@popperjs/core@2/dist/umd/popper.min.js", tippy: "/tippy.js@6/dist/tippy-bundle.umd.min.js", css: "/tippy.js@6/dist/tippy.css" },
                 {
                 { base: "https://cdn.jsdelivr.net/npm", popper: "/@popperjs/core@2/dist/umd/popper.min.js", tippy: "/tippy.js@6/dist/tippy-bundle.umd.min.js", css: "/tippy.js@6/dist/tippy.css" }
                    base: "https://cdnjs.cloudflare.com/ajax/libs",
                    popper: "/popper.js/2.11.8/umd/popper.min.js",
                    tippy: "/tippy.js/6.3.7/tippy-bundle.umd.min.js",
                    css: "/tippy.js/6.3.7/tippy.css",
                },
                {
                    base: "https://unpkg.com",
                    popper: "/@popperjs/core@2/dist/umd/popper.min.js",
                    tippy: "/tippy.js@6/dist/tippy-bundle.umd.min.js",
                    css: "/tippy.js@6/dist/tippy.css",
                },
                 {
                    base: "https://cdn.jsdelivr.net/npm",
                    popper: "/@popperjs/core@2/dist/umd/popper.min.js",
                    tippy: "/tippy.js@6/dist/tippy-bundle.umd.min.js",
                    css: "/tippy.js@6/dist/tippy.css",
                },
             ];
             ];
            if (self.baseUrl) {
                var b = self.baseUrl.replace(/\/?$/, "/");
                cdns = [
                    {
                        base: b,
                        popper: "popper.min.js",
                        tippy: "tippy-bundle.umd.min.js",
                        css: "tippy.css",
                    },
                ];
            }
             var cdnIndex = 0;
             var cdnIndex = 0;


             var tryFallback = function (which) {
             var tryFallback = function (which) {
                 self.loading = false;
                 self.loading = false;
                console.error(
                    "[MediaWikiTooltips] Не удалось загрузить " + which + ". " +
                    "Возможные причины: CSP вики блокирует внешние скрипты, нет сети, или CDN недоступен."
                );
                 self.callbacks = [];
                 self.callbacks = [];
             };
             };
Строка 38: Строка 62:
                 self.loading = false;
                 self.loading = false;
                 self.callbacks.forEach(function (cb) {
                 self.callbacks.forEach(function (cb) {
                     try { cb(); } catch (e) { console.error("[MediaWikiTooltips] callback error:", e); }
                     try {
                        cb();
                    } catch (e) {
                        console.error("[MediaWikiTooltips] callback error:", e);
                    }
                 });
                 });
                 self.callbacks = [];
                 self.callbacks = [];
             };
             };
            function urlJoin(base, path) {
                return base.replace(/\/$/, "") + "/" + path.replace(/^\//, "");
            }


             function loadTippyAndCss() {
             function loadTippyAndCss() {
                 var cdn = cdns[cdnIndex];
                 var cdn = cdns[cdnIndex];
                 var tippyScript = document.createElement("script");
                 var tippyScript = document.createElement("script");
                 tippyScript.src = cdn.base + cdn.tippy;
                 tippyScript.src = urlJoin(cdn.base, cdn.tippy);
                 tippyScript.onerror = function () { tryFallback("Tippy.js"); };
                 tippyScript.onerror = function () {
                    if (cdnIndex + 1 < cdns.length) {
                        cdnIndex++;
                        console.warn(
                            "[MediaWikiTooltips] Повтор с CDN:",
                            cdns[cdnIndex].base,
                        );
                        loadPopper();
                    } else {
                        tryFallback("Tippy.js");
                    }
                };
                 tippyScript.onload = function () {
                 tippyScript.onload = function () {
                     if (!window.tippy) {
                     if (!window.tippy) {
                         tryFallback("Tippy.js (не в глобальной области)");
                         if (cdnIndex + 1 < cdns.length) {
                            cdnIndex++;
                            loadPopper();
                        } else {
                            tryFallback("Tippy.js (не в глобальной области)");
                        }
                         return;
                         return;
                     }
                     }
                     var tippyCSS = document.createElement("link");
                     var tippyCSS = document.createElement("link");
                     tippyCSS.rel = "stylesheet";
                     tippyCSS.rel = "stylesheet";
                     tippyCSS.href = cdn.base + cdn.css;
                     tippyCSS.href = urlJoin(cdn.base, cdn.css);
                     tippyCSS.onerror = function () { console.warn("[MediaWikiTooltips] Стили Tippy не загрузились."); };
                     tippyCSS.onerror = function () {
                        console.warn(
                            "[MediaWikiTooltips] Стили Tippy не загрузились.",
                        );
                    };
                     document.head.appendChild(tippyCSS);
                     document.head.appendChild(tippyCSS);
                     console.log("[MediaWikiTooltips] Tippy.js загружен с", cdn.base);
                     console.log(
                        "[MediaWikiTooltips] Tippy.js загружен с",
                        cdn.base,
                    );
                     runCallbacks();
                     runCallbacks();
                 };
                 };
Строка 67: Строка 122:
                 var cdn = cdns[cdnIndex];
                 var cdn = cdns[cdnIndex];
                 var popperScript = document.createElement("script");
                 var popperScript = document.createElement("script");
                 popperScript.src = cdn.base + cdn.popper;
                 popperScript.src = urlJoin(cdn.base, cdn.popper);
                 popperScript.onerror = function () {
                 popperScript.onerror = function () {
                     if (cdnIndex + 1 < cdns.length) {
                     if (cdnIndex + 1 < cdns.length) {
                         cdnIndex++;
                         cdnIndex++;
                         console.warn("[MediaWikiTooltips] Повтор с CDN:", cdns[cdnIndex].base);
                         console.warn(
                            "[MediaWikiTooltips] Повтор с CDN:",
                            cdns[cdnIndex].base,
                        );
                         loadPopper();
                         loadPopper();
                     } else {
                     } else {