Tip of the Day
Skill levels exceeding an activity's main skill requirement gives +1.25% extra Work efficiency for what you're doing, up to 20 levels.
MediaWiki:Common.js: Difference between revisions
From Walkscape Walkthrough
mNo edit summary Tag: Reverted |
mNo edit summary |
||
| (37 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
/* Any JavaScript here will be loaded for all users on every page load. */ | /* Any JavaScript here will be loaded for all users on every page load. */ | ||
/* VARIABLES ***********************************************************************************************************************/ | /* VARIABLES ***********************************************************************************************************************/ | ||
var currentPageUrl = window.location.href; | var currentPageUrl = window.location.href; | ||
var currentPageEditUrl = mw.util.getUrl( null, { action: 'edit' } ); | var currentPageEditUrl = mw.util.getUrl(null, { | ||
var currentPageName = mw.util.getUrl( null, null ).replace('/wiki/', ''); | action: 'edit' | ||
}); | |||
var currentPageName = mw.util.getUrl(null, null).replace('/wiki/', ''); | |||
var currentPageNamespaceID = mw.config.get('wgNamespaceNumber'); | var currentPageNamespaceID = mw.config.get('wgNamespaceNumber'); | ||
//variables needed after page load | //variables needed after page load | ||
var buttons, contents, allLinks; | var buttons, contents, allLinks; | ||
//variables needed for the infobutton | //variables needed for the infobutton | ||
var infobutton, infopanel; | var infobutton, infopanel; | ||
/* *********************************************************************************************************************************/ | /* *********************************************************************************************************************************/ | ||
// Matomo | // Matomo | ||
var _paq = window._paq = window._paq || []; | var _paq = window._paq = window._paq || []; | ||
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */ | /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ | ||
/* | /* | ||
_paq.push(['trackPageView']); | _paq.push(['trackPageView']); | ||
| Line 32: | Line 26: | ||
})(); | })(); | ||
*/ | */ | ||
/* sticky edit button */ | /* sticky edit button */ | ||
// display the button only if #mw-content is present, if we are not in the edit mode, and if we're not in the Special: or Community: namespace | // display the button only if #mw-content is present, if we are not in the edit mode, and if we're not in the Special: or Community: namespace | ||
/* | /* | ||
| Line 47: | Line 33: | ||
} | } | ||
*/ | */ | ||
///////////////////////////////////////// ADDING THE INFO BUTTON | ///////////////////////////////////////// ADDING THE INFO BUTTON | ||
var infotitle = currentPageName + '/doc'; | var infotitle = currentPageName + '/doc'; | ||
// add the info button ONLY when we use the edit mode now | |||
if (document.body.contains(document.getElementById("mw-content")) && (currentPageUrl.includes("action=edit") || currentPageUrl.includes("action=submit"))) { | |||
mw.loader.using('mediawiki.api', function() { | |||
var api = new mw.Api(); | |||
api.get({ | |||
action: "query", | |||
titles: [infotitle], | |||
}).then(function(ret) { | |||
$.each(ret.query.pages, function() { | |||
if (this.missing !== "") { | |||
pageExists(); | |||
} | |||
}); | |||
}); | |||
function pageExists() { | |||
api.get({ | |||
action: 'parse', | |||
page: infotitle, | |||
contentmodel: 'wikitext' | |||
}).done(function(data) { | |||
InsertInfoPanel(data.parse.text['*']); | |||
}); | |||
} | |||
}); | |||
function pageExists() { | |||
} ).done( function ( data ) { | |||
}); | |||
} | } | ||
function InsertInfoPanel( text ) | function InsertInfoPanel(text) { | ||
{ | |||
//check which namespace we're in and adapt the text to it | //check which namespace we're in and adapt the text to it | ||
var infopanelTitle = 'Page'; | var infopanelTitle = 'Page'; | ||
if (currentPageNamespaceID == 10) { //Template | if (currentPageNamespaceID == 10) { //Template | ||
infopanelTitle = 'Template'; | infopanelTitle = 'Template'; | ||
} | } else if (currentPageNamespaceID == 828) { //Module | ||
infopanelTitle = 'Module'; | infopanelTitle = 'Module'; | ||
} | } | ||
// insert the panel and button | // insert the panel and button | ||
document.getElementById("mw-content").insertAdjacentHTML('afterbegin', '<div id="custom-infobutton"></div><div id="custom-infopanel" style="display: none"><div id="custom-infopanel-title">' + infopanelTitle + ' Info</div><div id="custom-infopanel-content">' + text + '</div></div>'); | document.getElementById("mw-content").insertAdjacentHTML('afterbegin', '<div id="custom-infobutton"></div><div id="custom-infopanel" style="display: none"><div id="custom-infopanel-title">' + infopanelTitle + ' Info</div><div id="custom-infopanel-content">' + text + '</div></div>'); | ||
//set up containers | //set up containers | ||
infopanel = document.getElementById("custom-infopanel"); | infopanel = document.getElementById("custom-infopanel"); | ||
infobutton = document.getElementById("custom-infobutton"); | infobutton = document.getElementById("custom-infobutton"); | ||
//add an event listener to the button | //add an event listener to the button | ||
infobutton.addEventListener("click", infobuttonClicked); | infobutton.addEventListener("click", infobuttonClicked); | ||
} | } | ||
function infobuttonClicked() { | |||
if (infopanel.style.display == 'none') { | |||
function infobuttonClicked() | |||
{ | |||
if (infopanel.style.display == 'none') | |||
infopanel.style.display = 'block'; | infopanel.style.display = 'block'; | ||
} else { | |||
infopanel.style.display = 'none'; | |||
} | } | ||
else | } | ||
{ | /* rename the "DISCUSSION" talk page button to "DOCUMENTATION" */ | ||
//if there is such a button and we're in the Template: namespace | |||
if (document.body.contains(document.getElementById("ca-talk")) && currentPageNamespaceID == 10) { | |||
document.getElementById("ca-talk").innerHTML = '<svg class="cosmos-button-icon" width="28" height="28" viewBox="-2 -2 20 20"><path d="M 4 2 Q 4 0 6 0 L 14 0 Q 16 0 16 2 L 8 2 Q 8 0 6 0 Q 4 0 4 2 L 4 12 Q 4 14 2 14 Q 0 14 0 12 L 2 12 L 0 12 Q 0 14 2 14 L 12 14 Q 14 14 14 12 L 14 4"></path></svg><span class="cosmos-button-text">Documentation</span>'; | |||
} | |||
/* call specific functions when the page loads */ | |||
// old browsers or already loaded | |||
if (document.readyState != "loading") AfterPageLoad(); | |||
// modern browsers | |||
else if (document.addEventListener) document.addEventListener("DOMContentLoaded", AfterPageLoad); | |||
/* FUNCTIONS **********************************************************************************************************************/ | |||
function AfterPageLoad() { | |||
StartTabs(); | |||
} | |||
/* Tabs */ | |||
function StartTabs() { | |||
buttons = document.getElementsByClassName("tab-button"); | |||
contents = document.getElementsByClassName("tab-content"); | |||
if (buttons.length > 0) { | |||
clickfunction(buttons[0]); | |||
for (var i = 0; i < buttons.length; i++) { | |||
//console.log("Added Event Listener!"); | |||
buttons[i].addEventListener("click", clickfunction); | |||
} | |||
} | } | ||
} | } | ||
function clickfunction(thing) { | |||
if (thing.id == null) { | |||
thing = this; | |||
} | |||
//buttons | |||
for (var i = 0; i < buttons.length; i++) { | |||
if (buttons[i].id == thing.id) { | |||
buttons[i].classList.remove("tab-disabled"); | |||
buttons[i].classList.add("tab-active"); | |||
} else { | |||
buttons[i].classList.remove("tab-active"); | |||
buttons[i].classList.add("tab-disabled"); | |||
} | |||
} | |||
//contents | |||
for (var i = 0; i < contents.length; i++) { | |||
if (contents[i].id == thing.id) { | |||
contents[i].style.display = 'block' | |||
} else { | |||
contents[i].style.display = 'none' | |||
} | |||
} | |||
} | |||
var resizeScheduled = false; | |||
function scheduleRecalc(fn) { | |||
if (resizeScheduled) return; | |||
resizeScheduled = true; | |||
requestAnimationFrame(function () { | |||
resizeScheduled = false; | |||
fn(); | |||
}); | |||
} | |||
mw.hook('wikipage.content').add(function ($content) { | |||
$content.find('.tabberresize').each(function () { | |||
var $wrap = $(this); | |||
var wrapEl = this; | |||
var tabCount = $wrap.find('.tabber__tab').length; | |||
wrapEl.dataset.tabCount = String(tabCount); | |||
function setWidthImportant(px) { | |||
wrapEl.style.setProperty('width', px + 'px', 'important'); | |||
} | |||
function recalc() { | |||
if (window.matchMedia('(max-width: 850px)').matches) { | |||
wrapEl.style.removeProperty('width'); | |||
$wrap.css({ width: '100%', float: 'none', display: 'block' }); | |||
return; | |||
} | |||
$wrap.css({ | |||
float: 'right', | |||
display: 'inline-block', | |||
maxWidth: '100%' | |||
}); | |||
// 1) Widest tab label | |||
var maxTab = 0; | |||
$wrap.find('.tabber__tab').each(function () { | |||
maxTab = Math.max(maxTab, Math.ceil(this.offsetWidth)); | |||
}); | |||
if (!maxTab) maxTab = 90; | |||
wrapEl.style.setProperty('--tab-w', maxTab + 'px'); | |||
// 2) Widest article (prefer visible) | |||
var $section = $wrap.find('section.tabber__section').first(); | |||
var $articles = $section.find('article'); | |||
var $candidates = $articles.filter(':visible'); | |||
if (!$candidates.length) { | |||
if ( | $candidates = $articles.filter('[aria-hidden="false"]'); | ||
} | |||
} | if (!$candidates.length) { | ||
$candidates = $articles; | |||
} | |||
var maxArticleW = 0; | |||
$candidates.each(function () { | |||
maxArticleW = Math.max( | |||
maxArticleW, | |||
Math.ceil(Math.max(this.scrollWidth, this.offsetWidth)) | |||
); | |||
}); | |||
var target = Math.max(maxArticleW, maxTab * 3 + 12); | |||
setWidthImportant(target); | |||
} | |||
// Initial | |||
recalc(); | |||
// Window resize | |||
$(window).on('resize', function () { | |||
scheduleRecalc(recalc); | |||
}); | |||
/ | // React to tab changes / dynamic content | ||
if (window.ResizeObserver) { | |||
var ro = new ResizeObserver(recalc); | |||
$wrap.find('section.tabber__section article').each(function () { | |||
ro.observe(this); | |||
}); | |||
} | |||
}); | |||
}); | |||
// Pet Sprite Animation | |||
(function () { | |||
function initSprite(el) { | |||
if (el.dataset.spriteApplied === '1') return; | |||
var url = el.getAttribute('data-sprite'); | |||
if (!url) return; | |||
function | var img = new Image(); | ||
{ | img.onload = function () { | ||
var w = img.naturalWidth; | |||
var h = img.naturalHeight; | |||
if (!w || !h || w < h) return; | |||
/ | var frames = Math.floor(w / h); | ||
if (frames < 1) frames = 1; | |||
// Apply derived values | |||
el.style.backgroundImage = 'url("' + url.replace(/"/g, '\\"') + '")'; | |||
el.style.setProperty('--frame', h + 'px'); | |||
el.style.setProperty('--frames', frames); | |||
el.style.setProperty('--sheetW', w + 'px'); | |||
el.dataset.spriteApplied = '1'; | |||
}; | |||
img.src = url; | |||
} | } | ||
function applySprites(root) { | |||
(root || document).querySelectorAll('.ws-sprite[data-sprite]').forEach(initSprite); | |||
} | |||
// Initial load | |||
if (document.readyState === 'loading') { | |||
if ( | document.addEventListener('DOMContentLoaded', function () { applySprites(document); }); | ||
} else { | |||
applySprites(document); | |||
} | } | ||
// MediaWiki dynamic content hook | |||
if (window.mw && mw.hook) { | |||
mw.hook('wikipage.content').add(function ($content) { | |||
applySprites($content && $content[0] ? $content[0] : document); | |||
}); | }); | ||
} | } | ||
})(); | |||
Latest revision as of 05:52, 22 December 2025
/* Any JavaScript here will be loaded for all users on every page load. */
/* VARIABLES ***********************************************************************************************************************/
var currentPageUrl = window.location.href;
var currentPageEditUrl = mw.util.getUrl(null, {
action: 'edit'
});
var currentPageName = mw.util.getUrl(null, null).replace('/wiki/', '');
var currentPageNamespaceID = mw.config.get('wgNamespaceNumber');
//variables needed after page load
var buttons, contents, allLinks;
//variables needed for the infobutton
var infobutton, infopanel;
/* *********************************************************************************************************************************/
// Matomo
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/*
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://matomo.tools.walkscape.app/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '5']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
*/
/* sticky edit button */
// display the button only if #mw-content is present, if we are not in the edit mode, and if we're not in the Special: or Community: namespace
/*
if (document.body.contains(document.getElementById("mw-content")) && !currentPageUrl.includes("action=") && currentPageNamespaceID != -1 && currentPageNamespaceID != 3004) {
document.getElementById("mw-content").insertAdjacentHTML('afterbegin', '<a href="https://wiki-temp.walkscape.app/' + currentPageEditUrl + '"><div id="custom-editbutton"><svg width="40" height="40" viewBox="-12 -10 50 50"><path d="M 20 2 L 26 8 L 8 26 L 2 26 L 2 20 Z M 16 6 L 22 12"></path></svg></div></a>');
}
*/
///////////////////////////////////////// ADDING THE INFO BUTTON
var infotitle = currentPageName + '/doc';
// add the info button ONLY when we use the edit mode now
if (document.body.contains(document.getElementById("mw-content")) && (currentPageUrl.includes("action=edit") || currentPageUrl.includes("action=submit"))) {
mw.loader.using('mediawiki.api', function() {
var api = new mw.Api();
api.get({
action: "query",
titles: [infotitle],
}).then(function(ret) {
$.each(ret.query.pages, function() {
if (this.missing !== "") {
pageExists();
}
});
});
function pageExists() {
api.get({
action: 'parse',
page: infotitle,
contentmodel: 'wikitext'
}).done(function(data) {
InsertInfoPanel(data.parse.text['*']);
});
}
});
}
function InsertInfoPanel(text) {
//check which namespace we're in and adapt the text to it
var infopanelTitle = 'Page';
if (currentPageNamespaceID == 10) { //Template
infopanelTitle = 'Template';
} else if (currentPageNamespaceID == 828) { //Module
infopanelTitle = 'Module';
}
// insert the panel and button
document.getElementById("mw-content").insertAdjacentHTML('afterbegin', '<div id="custom-infobutton"></div><div id="custom-infopanel" style="display: none"><div id="custom-infopanel-title">' + infopanelTitle + ' Info</div><div id="custom-infopanel-content">' + text + '</div></div>');
//set up containers
infopanel = document.getElementById("custom-infopanel");
infobutton = document.getElementById("custom-infobutton");
//add an event listener to the button
infobutton.addEventListener("click", infobuttonClicked);
}
function infobuttonClicked() {
if (infopanel.style.display == 'none') {
infopanel.style.display = 'block';
} else {
infopanel.style.display = 'none';
}
}
/* rename the "DISCUSSION" talk page button to "DOCUMENTATION" */
//if there is such a button and we're in the Template: namespace
if (document.body.contains(document.getElementById("ca-talk")) && currentPageNamespaceID == 10) {
document.getElementById("ca-talk").innerHTML = '<svg class="cosmos-button-icon" width="28" height="28" viewBox="-2 -2 20 20"><path d="M 4 2 Q 4 0 6 0 L 14 0 Q 16 0 16 2 L 8 2 Q 8 0 6 0 Q 4 0 4 2 L 4 12 Q 4 14 2 14 Q 0 14 0 12 L 2 12 L 0 12 Q 0 14 2 14 L 12 14 Q 14 14 14 12 L 14 4"></path></svg><span class="cosmos-button-text">Documentation</span>';
}
/* call specific functions when the page loads */
// old browsers or already loaded
if (document.readyState != "loading") AfterPageLoad();
// modern browsers
else if (document.addEventListener) document.addEventListener("DOMContentLoaded", AfterPageLoad);
/* FUNCTIONS **********************************************************************************************************************/
function AfterPageLoad() {
StartTabs();
}
/* Tabs */
function StartTabs() {
buttons = document.getElementsByClassName("tab-button");
contents = document.getElementsByClassName("tab-content");
if (buttons.length > 0) {
clickfunction(buttons[0]);
for (var i = 0; i < buttons.length; i++) {
//console.log("Added Event Listener!");
buttons[i].addEventListener("click", clickfunction);
}
}
}
function clickfunction(thing) {
if (thing.id == null) {
thing = this;
}
//buttons
for (var i = 0; i < buttons.length; i++) {
if (buttons[i].id == thing.id) {
buttons[i].classList.remove("tab-disabled");
buttons[i].classList.add("tab-active");
} else {
buttons[i].classList.remove("tab-active");
buttons[i].classList.add("tab-disabled");
}
}
//contents
for (var i = 0; i < contents.length; i++) {
if (contents[i].id == thing.id) {
contents[i].style.display = 'block'
} else {
contents[i].style.display = 'none'
}
}
}
var resizeScheduled = false;
function scheduleRecalc(fn) {
if (resizeScheduled) return;
resizeScheduled = true;
requestAnimationFrame(function () {
resizeScheduled = false;
fn();
});
}
mw.hook('wikipage.content').add(function ($content) {
$content.find('.tabberresize').each(function () {
var $wrap = $(this);
var wrapEl = this;
var tabCount = $wrap.find('.tabber__tab').length;
wrapEl.dataset.tabCount = String(tabCount);
function setWidthImportant(px) {
wrapEl.style.setProperty('width', px + 'px', 'important');
}
function recalc() {
if (window.matchMedia('(max-width: 850px)').matches) {
wrapEl.style.removeProperty('width');
$wrap.css({ width: '100%', float: 'none', display: 'block' });
return;
}
$wrap.css({
float: 'right',
display: 'inline-block',
maxWidth: '100%'
});
// 1) Widest tab label
var maxTab = 0;
$wrap.find('.tabber__tab').each(function () {
maxTab = Math.max(maxTab, Math.ceil(this.offsetWidth));
});
if (!maxTab) maxTab = 90;
wrapEl.style.setProperty('--tab-w', maxTab + 'px');
// 2) Widest article (prefer visible)
var $section = $wrap.find('section.tabber__section').first();
var $articles = $section.find('article');
var $candidates = $articles.filter(':visible');
if (!$candidates.length) {
$candidates = $articles.filter('[aria-hidden="false"]');
}
if (!$candidates.length) {
$candidates = $articles;
}
var maxArticleW = 0;
$candidates.each(function () {
maxArticleW = Math.max(
maxArticleW,
Math.ceil(Math.max(this.scrollWidth, this.offsetWidth))
);
});
var target = Math.max(maxArticleW, maxTab * 3 + 12);
setWidthImportant(target);
}
// Initial
recalc();
// Window resize
$(window).on('resize', function () {
scheduleRecalc(recalc);
});
// React to tab changes / dynamic content
if (window.ResizeObserver) {
var ro = new ResizeObserver(recalc);
$wrap.find('section.tabber__section article').each(function () {
ro.observe(this);
});
}
});
});
// Pet Sprite Animation
(function () {
function initSprite(el) {
if (el.dataset.spriteApplied === '1') return;
var url = el.getAttribute('data-sprite');
if (!url) return;
var img = new Image();
img.onload = function () {
var w = img.naturalWidth;
var h = img.naturalHeight;
if (!w || !h || w < h) return;
var frames = Math.floor(w / h);
if (frames < 1) frames = 1;
// Apply derived values
el.style.backgroundImage = 'url("' + url.replace(/"/g, '\\"') + '")';
el.style.setProperty('--frame', h + 'px');
el.style.setProperty('--frames', frames);
el.style.setProperty('--sheetW', w + 'px');
el.dataset.spriteApplied = '1';
};
img.src = url;
}
function applySprites(root) {
(root || document).querySelectorAll('.ws-sprite[data-sprite]').forEach(initSprite);
}
// Initial load
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function () { applySprites(document); });
} else {
applySprites(document);
}
// MediaWiki dynamic content hook
if (window.mw && mw.hook) {
mw.hook('wikipage.content').add(function ($content) {
applySprites($content && $content[0] ? $content[0] : document);
});
}
})();
