Mudanças entre as edições de "Widget:Item"
Ir para navegação
Ir para pesquisar
m |
m |
||
| Linha 294: | Linha 294: | ||
var BURST_WINDOW_MS = 15000; | var BURST_WINDOW_MS = 15000; | ||
var BURST_MAX = 18; | var BURST_MAX = 18; | ||
var UNTRUSTED_MAX = | var UNTRUSTED_MAX = 3; | ||
function isStaffUser() { | function isStaffUser() { | ||
| Linha 374: | Linha 372: | ||
} | } | ||
function | function whenMwReady() { | ||
return new Promise(function (resolve) { | |||
if (window.mw && mw.Api) { | |||
resolve(); | |||
return; | |||
} | |||
if (window.mw && mw.loader) { | |||
mw.loader.using("mediawiki.api").then(resolve, resolve); | |||
} | return; | ||
} | |||
resolve(); | |||
}); | |||
} | } | ||
function getApiUrl() { | function getApiUrl() { | ||
| Linha 425: | Linha 400: | ||
var safeKey = String(key).replace(/\|/g, "").replace(/\}/g, "").replace(/\{/g, ""); | var safeKey = String(key).replace(/\|/g, "").replace(/\}/g, "").replace(/\{/g, ""); | ||
var safeLang = String(lang || "pt-br").replace(/\|/g, ""); | var safeLang = String(lang || "pt-br").replace(/\|/g, ""); | ||
if (/^\d+$/.test(safeKey)) { | |||
return "{{#invoke:Item|tooltip|" + safeKey + "|lang=" + safeLang + "}}"; | |||
} | |||
return "{{#invoke:Item|tooltip|key=" + safeKey + "|lang=" + safeLang + "}}"; | return "{{#invoke:Item|tooltip|key=" + safeKey + "|lang=" + safeLang + "}}"; | ||
} | } | ||
function fetchParse(wikitext) { | function fetchParse(wikitext) { | ||
if (window.mw && mw.Api) { | return whenMwReady().then(function () { | ||
if (window.mw && mw.Api) { | |||
return new mw.Api().post({ | |||
action: "parse", | |||
text: wikitext, | |||
contentmodel: "wikitext", | |||
disablelimitreport: true | |||
}).then(function (data) { | |||
return data.parse.text["*"]; | |||
}); | |||
} | |||
var body = new URLSearchParams(); | |||
body.set("action", "parse"); | |||
body.set("format", "json"); | |||
body.set("text", wikitext); | |||
body.set("contentmodel", "wikitext"); | |||
body.set("disablelimitreport", "1"); | |||
return fetch(getApiUrl(), { | |||
method: "POST", | |||
credentials: "same-origin", | |||
headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" }, | |||
body: body.toString() | |||
}) | |||
.then(function (res) { return res.json(); }) | |||
.then(function (data) { | |||
if (data.error) throw new Error(data.error.info || "API parse failed"); | |||
return data.parse.text["*"]; | |||
}); | |||
}); | |||
} | } | ||
| Linha 529: | Linha 509: | ||
} | } | ||
function | function showLegacyTooltip(wrapper) { | ||
var tip = wrapper.querySelector(".item-tooltip"); | |||
if (!tip) return; | |||
activeWrapper = wrapper; | |||
activeTip = tip; | |||
document.body.appendChild(tip); | |||
positionTooltip(tip, wrapper); | |||
} | |||
function showLazyTooltip(wrapper) { | |||
if (defenseTripped) return; | if (defenseTripped) return; | ||
var key = wrapper.getAttribute("data-item-key"); | var key = wrapper.getAttribute("data-item-key"); | ||
| Linha 548: | Linha 535: | ||
wrapper.classList.remove("item-tooltip-loading"); | wrapper.classList.remove("item-tooltip-loading"); | ||
if (!html || !html.trim()) return; | if (!html || !html.trim()) { | ||
console.warn("[Widget:Item] tooltip vazia para key=" + key); | |||
return; | |||
} | |||
var tmp = document.createElement("div"); | var tmp = document.createElement("div"); | ||
tmp.innerHTML = html.trim(); | tmp.innerHTML = html.trim(); | ||
var tip = tmp.querySelector(".item-tooltip") || tmp.firstElementChild; | var tip = tmp.querySelector(".item-tooltip") || tmp.firstElementChild; | ||
if (!tip) return; | if (!tip) { | ||
console.warn("[Widget:Item] HTML sem .item-tooltip para key=" + key, html.substring(0, 200)); | |||
return; | |||
} | |||
activeTip = tip; | activeTip = tip; | ||
document.body.appendChild(tip); | document.body.appendChild(tip); | ||
positionTooltip(tip, wrapper); | positionTooltip(tip, wrapper); | ||
}).catch(function () { | }).catch(function (err) { | ||
console.warn("[Widget:Item] fetch tooltip falhou key=" + key, err); | |||
if (gen === tooltipGen && activeWrapper === wrapper) { | if (gen === tooltipGen && activeWrapper === wrapper) { | ||
wrapper.classList.remove("item-tooltip-loading"); | wrapper.classList.remove("item-tooltip-loading"); | ||
| Linha 564: | Linha 558: | ||
} | } | ||
}); | }); | ||
} | |||
function showTooltip(wrapper) { | |||
if (wrapper === activeWrapper && activeTip) return; | |||
hideTooltip(); | |||
if (wrapper.querySelector(".item-tooltip")) { | |||
showLegacyTooltip(wrapper); | |||
return; | |||
} | |||
if (wrapper.classList.contains("item-has-tooltip") && wrapper.getAttribute("data-item-key")) { | |||
showLazyTooltip(wrapper); | |||
} | |||
} | } | ||
| Linha 571: | Linha 578: | ||
return; | return; | ||
} | } | ||
var wrapper = e.target.closest ? e.target.closest(".item-wrapper | var wrapper = e.target.closest ? e.target.closest(".item-wrapper") : null; | ||
if (wrapper | if (!wrapper || wrapper === activeWrapper) return; | ||
if (wrapper.querySelector(".item-tooltip") || | |||
(wrapper.classList.contains("item-has-tooltip") && wrapper.getAttribute("data-item-key"))) { | |||
showTooltip(wrapper); | showTooltip(wrapper); | ||
} | } | ||