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; | ||
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 | 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 | 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 | 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 { | ||