MediaWiki:Common.js: Difference between revisions
Jump to navigation
Jump to search
(removed js that is only used by this bot. It can now be found on the bot's userpages and can only be executed by the bot. It also doesn't get loaded by any other users than the bot) |
(Collapsible prototype tree with indentation guides) |
||
(84 intermediate revisions by 3 users 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. */ | ||
var apiUrl = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + "/api.php" | |||
/* Script in here will be executed when the page is "ready" */ | /* Script in here will be executed when the page is "ready" */ | ||
Line 9: | Line 11: | ||
if (document.getElementById("active-users")) { | if (document.getElementById("active-users")) { | ||
$.ajax({ | $.ajax({ | ||
url: | url: apiUrl, | ||
data: { | data: { | ||
format: 'json', | format: 'json', | ||
Line 28: | Line 30: | ||
} | } | ||
}; | }; | ||
/* | /* Collapsible list on [[Prototype definitions]] */ | ||
$(".prototype-tree li").each(function (index, element) { | |||
if ( $( element ).children("ul").length > 0 ) { | |||
$( element ).addClass("prototype-tree-parent"); | |||
}; | |||
}); | |||
$(".prototype-tree li.prototype-tree-parent").on("click", function(event) { | |||
// only collapse if I clicked a li or the direct child of a li that is not another list or a link | |||
if ( $( event.currentTarget ).children("ul").length > 0 && $( event.target ).get(0).tagName != "UL" && $( event.target ).get(0).tagName != "A" && ($( event.target ).hasClass("prototype-tree-parent") || $( event.target ).parent().hasClass("prototype-tree-parent")) ) { | |||
$( event.currentTarget ).children("ul")[0].classList.toggle("hidden"); | |||
$( event.currentTarget ).toggleClass("prototype-tree-parent-collapsed"); | |||
return false; // prevents further event bubbling | |||
} | |||
}); | |||
/* Evolution calc */ | |||
//values are in the form [evolution, weight] | |||
const biterSpawner = [ | |||
["Small Biter", [[0.0, 0.3], [0.6, 0.0]]], | |||
["Medium Biter", [[0.2, 0.0], [0.6, 0.3], [0.7, 0.1]]], | |||
["Big Biter", [[0.5, 0.0], [1.0, 0.4]]], | |||
["Behemoth Biter", [[0.9, 0.0], [1.0, 0.3]]] | |||
]; | |||
const spitterSpawner = [ | |||
["Small Biter", [[0.0, 0.3], [0.35, 0.0]]], | |||
["Small Spitter", [[0.25, 0.0], [0.5, 0.3], [0.7, 0.0]]], | |||
["Medium Spitter", [[0.4, 0.0], [0.7, 0.3], [0.9, 0.1]]], | |||
["Big Spitter", [[0.5, 0.0], [1.0, 0.4]]], | |||
["Behemoth Spitter", [[0.9, 0.0], [1.0, 0.3]]] | |||
]; | |||
//calculates the interpolated value | |||
function lerp(low, high, pos) { | |||
const s = high[0] - low[0]; | |||
const l = (pos - low[0]) / s; | |||
return (low[1] * (1-l)) + (high[1] * l); | |||
}; | |||
function | //gets the weight list | ||
function getValues(map, evo) { | |||
var result = {}; | |||
var sum = 0; | |||
map.forEach(function(data) { | |||
const list = data[1]; | |||
var low = list[0]; | |||
var high = list[list.length-1]; | |||
list.forEach(function(val) { | |||
if(val[0] <= evo && val[0] > low[0]) low = val; | |||
if(val[0] >= evo && val[0] < high[0]) high = val; | |||
}); | |||
var val = null; | |||
if(evo <= low[0]) val = low[1]; | |||
else if(evo >= high[0]) val = high[1]; | |||
else val = lerp(low, high, evo); | |||
sum += val; | |||
result[data[0]] = val; | |||
}); | |||
Object.keys(result).forEach(function(data, index) { | |||
result[data] = result[data] / sum; | |||
}); | }); | ||
return result; | |||
}; | |||
function calcEvo() { | |||
const evo = document.getElementById("evoInput").value; | |||
genTable(getValues(biterSpawner, evo), document.getElementById("evoOutputBiter"), "Biter's Nest"); | |||
genTable(getValues(spitterSpawner, evo), document.getElementById("evoOutputSpitter"), "Spitter's Nest"); | |||
}; | }; | ||
function | function percentile(value) { | ||
return | return (value*100).toFixed(2) + "%"; | ||
} | }; | ||
function genTable(data, tableElem, title) { | |||
var html = '<tr><th>'+title+'</th><th>Chance</th>'; | |||
Object.keys(data).forEach(function(value) { | |||
html += '<tr><td>'+value+'</td><td>'+percentile(data[value])+'</td>'; | |||
}); | |||
tableElem.innerHTML = html; | |||
}; | |||
window.onload = function() { | |||
var elem = document.getElementById("evoChecker"); | |||
if(elem != null) { | |||
elem.innerHTML = | |||
'Alternatively, enter an evolution factor below to see the chances.<br>' + | |||
'<input style="margin-bottom:10px" type="number" id="evoInput" min=0 max=1 step=0.01 placeholder="Evolution" onchange="calcEvo()"></input><br>' + | |||
'<table style="float:left;margin-right:10px" class="wikitable" id="evoOutputBiter"></table>' + | |||
'<table class="wikitable" id="evoOutputSpitter"></table>'; | |||
calcEvo(); | |||
} | |||
}; | |||
/* Template:Inventory tooltips */ | |||
var lastTouchTime = 0; | |||
document.addEventListener('touchstart', updateLastTouchTime, true); | |||
function updateLastTouchTime() { | |||
lastTouchTime = new Date(); | |||
} | } | ||
$(".tab-head").mousemove(function(e) { | |||
if (e.buttons > 0) return; | |||
if (new Date() - lastTouchTime < 500) return; | |||
var countCssRules = document.styleSheets[0].cssRules.length; | |||
var newRule = '.tab-head:hover:after{display: block; left: ' + (e.offsetX + 20) + 'px; top: ' + (e.offsetY + 20) + 'px;}'; | |||
document.styleSheets[0].insertRule(newRule, countCssRules); | |||
}); | |||
$(". | $(".tab .factorio-icon").mousemove(function(e) { | ||
$(". | if (e.buttons > 0) return; | ||
if (new Date() - lastTouchTime < 500) return; | |||
var countCssRules = document.styleSheets[0].cssRules.length; | |||
$(e.currentTarget).children("a").attr("title", ""); | |||
var text = $(e.currentTarget).children("a").children("img").attr("alt"); | |||
var newRule = '.tab .factorio-icon:hover:after{display: block; ' + "content: '" + text + "'}"; | |||
document.styleSheets[0].insertRule(newRule, countCssRules); | |||
}); | |||
/* Template:BlueprintString */ | |||
$(".bps-box").click(function(event) { | |||
var copyTarget = document.createElement("input"); | |||
copyTarget.setAttribute("value", $( event.target ).children("p").html()); | |||
document.body.appendChild(copyTarget); | |||
copyTarget.select(); | |||
document.execCommand("copy"); | |||
document.body.removeChild(copyTarget); | |||
}); | }); | ||
Line 91: | Line 169: | ||
$(".tab-head").removeClass("tab-head-active"); | $(".tab-head").removeClass("tab-head-active"); | ||
$(this).addClass("tab-head-active"); | $(this).addClass("tab-head-active"); | ||
$(".tab").hide(); | |||
$(".tab-1").show(); | $(".tab-1").show(); | ||
}); | }); | ||
Line 116: | Line 194: | ||
}); | }); | ||
/*** Language template ***/ | //*** Language template ***// | ||
if($(".languages-flags .flag").length == 0) { | if($(".languages-flags .flag").length == 0) { | ||
console.log("Not showing languages bar because there's no other language's version of this page."); | |||
$(".languages-container").hide(); | |||
} | } | ||
//Spoiler template | //Spoiler template | ||
$(".spoiler-container .button").click(function() { | $(".spoiler-container .button").click(function() { | ||
$(this).siblings(".text").toggle("slow"); | |||
}); | }); | ||
//* General/generic functions *// | |||
/* User is bot if userGroup.some(isBot) == true */ | |||
var userGroup = ""; | |||
function | function getUserGroup() { | ||
$.ajax({ | |||
url: apiUrl, | |||
data: { | |||
format: 'json', | |||
action: 'query', | |||
meta: 'userinfo', | |||
uiprop: 'groups', | |||
}, | |||
async: false, | |||
dataType: 'json', | |||
type: 'GET', | |||
success: function(data) { | |||
userGroup = data.query.userinfo.groups | |||
}, | |||
}); | |||
}; | }; | ||
function | function isBot(group) { | ||
return group == "bot"; | |||
} | |||
/* Get token of this session */ | |||
var globalToken; | |||
function getToken() { | |||
$.ajax({ | |||
url: apiUrl, | |||
data: { | |||
format: 'json', | |||
action: 'query', | |||
meta: 'tokens', | |||
bot: true | |||
}, | |||
async: false, | |||
dataType: 'json', | |||
type: 'POST', | |||
success: function( data ) { | |||
globalToken = data.query.tokens.csrftoken; | |||
}, | |||
error: function( xhr ) { | |||
console.log("Failed to get token."); | |||
} | |||
}); | |||
} | } | ||
function genericEditPage(title, content, summary) { | |||
$.ajax({ | |||
url: apiUrl, | |||
data: { | |||
format: 'json', | |||
action: 'edit', | |||
title: title, | |||
text: content, | |||
token: globalToken, | |||
summary: summary, | |||
bot: true, | |||
nocreate: true | |||
}, | |||
dataType: 'json', | |||
type: 'POST', | |||
success: function( data ) { | |||
console.log("Edited " + title); | |||
}, | |||
error: function( xhr ) { | |||
alert("Failed to edit " + title); | |||
} | |||
}); | |||
}; | |||
function createPage(pageTitle, content, summary) { | |||
$.ajax({ | |||
url: apiUrl, | |||
data: { | |||
format: 'json', | |||
action: 'edit', | |||
title: pageTitle, | |||
text: content, | |||
token: globalToken, | |||
summary: summary, | |||
bot: true | |||
}, | |||
async: false, | |||
dataType: 'json', | |||
type: 'POST', | |||
success: function( data ) { | |||
console.log("Created page: " + pageTitle); | |||
}, | |||
error: function( xhr ) { | |||
console.log("Failed to create page"); | |||
} | |||
}); | |||
} | } | ||
function getBacklinks(page) { | |||
var backlinks = []; | |||
$.ajax({ | |||
url: apiUrl, | |||
data: { | |||
format: 'json', | |||
action: 'query', | |||
list: 'backlinks', | |||
bltitle: page, | |||
bllimit: 1000, | |||
}, | |||
async: false, | |||
type: 'GET', | |||
success: function( data ) { | |||
backlinks = data.query.backlinks; | |||
}, | |||
error: function( xhr ) { | |||
alert( 'Error: Backlinks request failed.' ); | |||
} | |||
}); | |||
return backlinks; | |||
}; | |||
function getFileUsage(file) { | |||
var imageusage = []; | |||
$.ajax({ | |||
url: apiUrl, | |||
data: { | |||
format: 'json', | |||
action: 'query', | |||
list: 'imageusage', | |||
iutitle: file, | |||
iulimit: 1000 | |||
}, | |||
async: false, | |||
type: 'GET', | |||
success: function( data ) { | |||
imageusage = data.query.imageusage; | |||
}, | |||
error: function( xhr ) { | |||
alert( 'Error: Imageusage request failed.' ); | |||
} | |||
}); | |||
return imageusage; | |||
}; | |||
function performNullEdit(pageTitle, summary) { | function performNullEdit(pageTitle, summary) { | ||
$.ajax({ | $.ajax({ | ||
url: | url: apiUrl, | ||
data: { | data: { | ||
format: 'json', | format: 'json', | ||
Line 241: | Line 381: | ||
function purgeWhatLinksHere(pageTitle) { | function purgeWhatLinksHere(pageTitle) { | ||
$.ajax({ | $.ajax({ | ||
url: | url: apiUrl, | ||
data: { | data: { | ||
format: "json", | format: "json", | ||
Line 266: | Line 406: | ||
function purgePage(pageTitle) { | function purgePage(pageTitle) { | ||
$.ajax({ | $.ajax({ | ||
url: | url: apiUrl, | ||
data: { | data: { | ||
action: 'purge', | action: 'purge', | ||
Line 284: | Line 424: | ||
}); | }); | ||
} | } | ||
Latest revision as of 12:24, 20 February 2020
/* Any JavaScript here will be loaded for all users on every page load. */
var apiUrl = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + "/api.php"
/* Script in here will be executed when the page is "ready" */
$(document).ready(getNumberOfActiveUsers);
/* show correct number of active users on the main page */
function getNumberOfActiveUsers() {
if (document.getElementById("active-users")) {
$.ajax({
url: apiUrl,
data: {
format: 'json',
action: 'query',
list: 'allusers',
aulimit: 500,
auactiveusers: true
},
dataType: 'json',
type: 'GET',
success: function(data) {
document.getElementById("active-users").innerHTML = data.query.allusers.length.toString();
},
error: function(xhr) {
console.log( 'Error: Request failed.' );
}
});
}
};
/* Collapsible list on [[Prototype definitions]] */
$(".prototype-tree li").each(function (index, element) {
if ( $( element ).children("ul").length > 0 ) {
$( element ).addClass("prototype-tree-parent");
};
});
$(".prototype-tree li.prototype-tree-parent").on("click", function(event) {
// only collapse if I clicked a li or the direct child of a li that is not another list or a link
if ( $( event.currentTarget ).children("ul").length > 0 && $( event.target ).get(0).tagName != "UL" && $( event.target ).get(0).tagName != "A" && ($( event.target ).hasClass("prototype-tree-parent") || $( event.target ).parent().hasClass("prototype-tree-parent")) ) {
$( event.currentTarget ).children("ul")[0].classList.toggle("hidden");
$( event.currentTarget ).toggleClass("prototype-tree-parent-collapsed");
return false; // prevents further event bubbling
}
});
/* Evolution calc */
//values are in the form [evolution, weight]
const biterSpawner = [
["Small Biter", [[0.0, 0.3], [0.6, 0.0]]],
["Medium Biter", [[0.2, 0.0], [0.6, 0.3], [0.7, 0.1]]],
["Big Biter", [[0.5, 0.0], [1.0, 0.4]]],
["Behemoth Biter", [[0.9, 0.0], [1.0, 0.3]]]
];
const spitterSpawner = [
["Small Biter", [[0.0, 0.3], [0.35, 0.0]]],
["Small Spitter", [[0.25, 0.0], [0.5, 0.3], [0.7, 0.0]]],
["Medium Spitter", [[0.4, 0.0], [0.7, 0.3], [0.9, 0.1]]],
["Big Spitter", [[0.5, 0.0], [1.0, 0.4]]],
["Behemoth Spitter", [[0.9, 0.0], [1.0, 0.3]]]
];
//calculates the interpolated value
function lerp(low, high, pos) {
const s = high[0] - low[0];
const l = (pos - low[0]) / s;
return (low[1] * (1-l)) + (high[1] * l);
};
//gets the weight list
function getValues(map, evo) {
var result = {};
var sum = 0;
map.forEach(function(data) {
const list = data[1];
var low = list[0];
var high = list[list.length-1];
list.forEach(function(val) {
if(val[0] <= evo && val[0] > low[0]) low = val;
if(val[0] >= evo && val[0] < high[0]) high = val;
});
var val = null;
if(evo <= low[0]) val = low[1];
else if(evo >= high[0]) val = high[1];
else val = lerp(low, high, evo);
sum += val;
result[data[0]] = val;
});
Object.keys(result).forEach(function(data, index) {
result[data] = result[data] / sum;
});
return result;
};
function calcEvo() {
const evo = document.getElementById("evoInput").value;
genTable(getValues(biterSpawner, evo), document.getElementById("evoOutputBiter"), "Biter's Nest");
genTable(getValues(spitterSpawner, evo), document.getElementById("evoOutputSpitter"), "Spitter's Nest");
};
function percentile(value) {
return (value*100).toFixed(2) + "%";
};
function genTable(data, tableElem, title) {
var html = '<tr><th>'+title+'</th><th>Chance</th>';
Object.keys(data).forEach(function(value) {
html += '<tr><td>'+value+'</td><td>'+percentile(data[value])+'</td>';
});
tableElem.innerHTML = html;
};
window.onload = function() {
var elem = document.getElementById("evoChecker");
if(elem != null) {
elem.innerHTML =
'Alternatively, enter an evolution factor below to see the chances.<br>' +
'<input style="margin-bottom:10px" type="number" id="evoInput" min=0 max=1 step=0.01 placeholder="Evolution" onchange="calcEvo()"></input><br>' +
'<table style="float:left;margin-right:10px" class="wikitable" id="evoOutputBiter"></table>' +
'<table class="wikitable" id="evoOutputSpitter"></table>';
calcEvo();
}
};
/* Template:Inventory tooltips */
var lastTouchTime = 0;
document.addEventListener('touchstart', updateLastTouchTime, true);
function updateLastTouchTime() {
lastTouchTime = new Date();
}
$(".tab-head").mousemove(function(e) {
if (e.buttons > 0) return;
if (new Date() - lastTouchTime < 500) return;
var countCssRules = document.styleSheets[0].cssRules.length;
var newRule = '.tab-head:hover:after{display: block; left: ' + (e.offsetX + 20) + 'px; top: ' + (e.offsetY + 20) + 'px;}';
document.styleSheets[0].insertRule(newRule, countCssRules);
});
$(".tab .factorio-icon").mousemove(function(e) {
if (e.buttons > 0) return;
if (new Date() - lastTouchTime < 500) return;
var countCssRules = document.styleSheets[0].cssRules.length;
$(e.currentTarget).children("a").attr("title", "");
var text = $(e.currentTarget).children("a").children("img").attr("alt");
var newRule = '.tab .factorio-icon:hover:after{display: block; ' + "content: '" + text + "'}";
document.styleSheets[0].insertRule(newRule, countCssRules);
});
/* Template:BlueprintString */
$(".bps-box").click(function(event) {
var copyTarget = document.createElement("input");
copyTarget.setAttribute("value", $( event.target ).children("p").html());
document.body.appendChild(copyTarget);
copyTarget.select();
document.execCommand("copy");
document.body.removeChild(copyTarget);
});
/* Template:Inventory */
$(".tab-head-1").click(function() {
$(".tab-head").removeClass("tab-head-active");
$(this).addClass("tab-head-active");
$(".tab").hide();
$(".tab-1").show();
});
$(".tab-head-2").click(function() {
$(".tab-head").removeClass("tab-head-active");
$(this).addClass("tab-head-active");
$(".tab").hide();
$(".tab-2").show();
});
$(".tab-head-3").click(function() {
$(".tab-head").removeClass("tab-head-active");
$(this).addClass("tab-head-active");
$(".tab").hide();
$(".tab-3").show();
});
$(".tab-head-4").click(function() {
$(".tab-head").removeClass("tab-head-active");
$(this).addClass("tab-head-active");
$(".tab").hide();
$(".tab-4").show();
});
//*** Language template ***//
if($(".languages-flags .flag").length == 0) {
console.log("Not showing languages bar because there's no other language's version of this page.");
$(".languages-container").hide();
}
//Spoiler template
$(".spoiler-container .button").click(function() {
$(this).siblings(".text").toggle("slow");
});
//* General/generic functions *//
/* User is bot if userGroup.some(isBot) == true */
var userGroup = "";
function getUserGroup() {
$.ajax({
url: apiUrl,
data: {
format: 'json',
action: 'query',
meta: 'userinfo',
uiprop: 'groups',
},
async: false,
dataType: 'json',
type: 'GET',
success: function(data) {
userGroup = data.query.userinfo.groups
},
});
};
function isBot(group) {
return group == "bot";
}
/* Get token of this session */
var globalToken;
function getToken() {
$.ajax({
url: apiUrl,
data: {
format: 'json',
action: 'query',
meta: 'tokens',
bot: true
},
async: false,
dataType: 'json',
type: 'POST',
success: function( data ) {
globalToken = data.query.tokens.csrftoken;
},
error: function( xhr ) {
console.log("Failed to get token.");
}
});
}
function genericEditPage(title, content, summary) {
$.ajax({
url: apiUrl,
data: {
format: 'json',
action: 'edit',
title: title,
text: content,
token: globalToken,
summary: summary,
bot: true,
nocreate: true
},
dataType: 'json',
type: 'POST',
success: function( data ) {
console.log("Edited " + title);
},
error: function( xhr ) {
alert("Failed to edit " + title);
}
});
};
function createPage(pageTitle, content, summary) {
$.ajax({
url: apiUrl,
data: {
format: 'json',
action: 'edit',
title: pageTitle,
text: content,
token: globalToken,
summary: summary,
bot: true
},
async: false,
dataType: 'json',
type: 'POST',
success: function( data ) {
console.log("Created page: " + pageTitle);
},
error: function( xhr ) {
console.log("Failed to create page");
}
});
}
function getBacklinks(page) {
var backlinks = [];
$.ajax({
url: apiUrl,
data: {
format: 'json',
action: 'query',
list: 'backlinks',
bltitle: page,
bllimit: 1000,
},
async: false,
type: 'GET',
success: function( data ) {
backlinks = data.query.backlinks;
},
error: function( xhr ) {
alert( 'Error: Backlinks request failed.' );
}
});
return backlinks;
};
function getFileUsage(file) {
var imageusage = [];
$.ajax({
url: apiUrl,
data: {
format: 'json',
action: 'query',
list: 'imageusage',
iutitle: file,
iulimit: 1000
},
async: false,
type: 'GET',
success: function( data ) {
imageusage = data.query.imageusage;
},
error: function( xhr ) {
alert( 'Error: Imageusage request failed.' );
}
});
return imageusage;
};
function performNullEdit(pageTitle, summary) {
$.ajax({
url: apiUrl,
data: {
format: 'json',
action: 'edit',
title: pageTitle,
section: 0,
text: "",
token: globalToken,
summary: summary,
bot: true
},
async: false,
dataType: 'json',
type: 'POST',
success: function( data ) {
console.log("Performed null edit");
},
error: function( xhr ) {
console.log("Failed to perform null edit");
}
});
}
function purgeWhatLinksHere(pageTitle) {
$.ajax({
url: apiUrl,
data: {
format: "json",
action: 'query',
list: "backlinks",
bltitle: pageTitle,
bllimit: 500
},
async: true,
type: 'GET',
success: function( data ) {
console.log(data);
for (var i = 0; i < data.query.backlinks.length; i++) {
purgePage(data.query.backlinks[i].title);
}
},
error: function( xhr ) {
//alert( 'Error: Request failed.' );
console.log("Failed purging");
}
});
}
function purgePage(pageTitle) {
$.ajax({
url: apiUrl,
data: {
action: 'purge',
forcelinkupdate: true,
titles: pageTitle,
prop: "info"
},
async: true,
type: 'GET',
success: function( data ) {
console.log("purging " + pageTitle);
},
error: function( xhr ) {
//alert( 'Error: Request failed.' );
console.log("Failed purging");
}
});
}