User:Chlod/Scripts/GlobalUserToolbox.js

// Global User Toolbox // Author: Chlod // Version: 1.0.0-REL

// Adds the template to all user pages and talk pages. // https://en.wikipedia.org/w/api.php?action=parse&format=json&text=%7B%7BUser%20toolbox%7C1%3DChlod%7D%7D&contentmodel=wikitext

// Unless you know what you are doing, do NOT modify this. // If you want to configure GUT, simply add a "gutOptions" variable before importing. const defaultGUTOptions = { "include_userpages": true, // pages in the "User" namespace "include_talkpages": true, // pages in the "User talk" namespace "include_subpages": true, // pages in the "User" namespace that are subpages (have a '/') "include_talksubpages": true, // pages in the "User talk" namespace that are subpages (have a '/') "insert_at_top": true, // insert the toolbox at the top "ignore_existing": true, // if there is already a user toolbox, don't add another };

const userPageRegex = /^User:[^\//]+$/gi; const userSubpageRegex = /^User:.+$/gi; const userTalkPageRegex = /^User(?:_|\s)talk:[^\//]+$/gi; const userTalkSubpageRegex = /^User(?:_|\s)talk:.+$/gi; const userPageBaseRegex = /^([^\\/\n]+)/gi;

if (gutOptions === undefined) // in case the user does not configure var gutOptions = defaultGUTOptions; // fill in unset keys of the user's config var gutKeys = Object.keys(gutOptions); for (var i in defaultGUTOptions) { if (!gutKeys.includes(i)) gutOptions[i] = defaultGUTOptions[i]; }

function parseParams(parameterObject) { var finalParams = ""; for (var i in parameterObject) { finalParams += `${i}=${encodeURIComponent(parameterObject[i])}&`; }	return finalParams.replace(/&+$/, ""); }

$(document).ready(function {	var pageName = mw.config.get("wgPageName");	if ( (gutOptions["include_userpages"] && userPageRegex.test(pageName)) || (gutOptions["include_talkpages"] && userTalkPageRegex.test(pageName)) || (gutOptions["include_subpages"] && userSubpageRegex.test(pageName)) || (gutOptions["include_talksubpages"] && userTalkSubpageRegex.test(pageName)) ) {		var user = userPageBaseRegex.exec(mw.config.get("wgTitle"));		if (user === null || user[0] === undefined)			return;		user = user[0]; // remap		if (gutOptions["ignore_existing"] && document.getElementById(`User_toolbox_for_${user}`) !== null)			return;		var url = "/w/api.php";		var params = parseParams({ action: "parse", format: "json", text: ``, contentmodel: "wikitext" });		var http = new XMLHttpRequest;

http.open("GET", `${url}?${params}`, true); http.onreadystatechange = => { if (http.readyState == 4 && http.status == 200) { var res = http.responseText; var parse; try { parse = JSON.parse(res); } catch (e) { /* ignored */ } if (parse === null || parse === undefined) { console.error("Error parsing API response."); return; }				if (parse["parse"] === undefined					|| parse["parse"]["text"] === undefined					|| parse["parse"]["text"]["*"] === undefined) { console.error("Oh, the humanity!\n\nGlobal User Toolbox could not verify the contents of the API response. Either an error has occurred, or the request has been tampered with. Maybe try refreshing?"); console.log(parse); return; } else { parse = parse["parse"] // remap }				var page_content = document.getElementById("mw-content-text"); page_content.insertAdjacentHTML(gutOptions["insert_at_top"] ? "afterbegin" : "beforeend",					`${parse["text"]["*"]} `); }		};		http.send(null); } });