MediaWiki:Gadget-Site.js: Difference between revisions

From Linguifex
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
var pageName = mw.config.get("wgPageName");
/* jshint undef: true */
var ns = mw.config.get("wgNamespaceNumber");
/* globals $, apiWrapper, mw, OO */
// <nowiki>
mw.loader.using("oojs-ui-core").then(() => {
"use strict";


/* ***** UpdateLanguageNameAndCode conditions ***** */
const api = new mw.Api({
var firstPara = document.querySelector(".mw-parser-output p:first-of-type");
timeout: 30 * 1000, // Dirty hack to hopefully get rid of timeout errors.
var titlePrefixes = [
});
"Module:languages/code_to_canonical_name",
"Module:languages/canonical_names",
"Module:etymology_languages/code_to_canonical_name",
"Module:etymology_languages/canonical_names",
"Module:families/code_to_canonical_name",
"Module:families/canonical_names",
"Module:scripts/code_to_canonical_name",
"Module:scripts/canonical_names",
"Module:Hani-sortkey/data/serialized"
];


if (firstPara) {
const updatePageWithTemplateExpansion = async (
for (var i = 0; i < titlePrefixes.length; i++) {
title,
if (pageName.indexOf(titlePrefixes[i]) === 0) {
template,
importScript("MediaWiki:UpdateLanguageNameAndCode.js");
summary,
break;
changeTemplateExpansion
) => {
await mw.loader.using("mediawiki.api");
try {
const data = await api.get({
action: "expandtemplates",
title,
text: template,
prop: "wikitext",
});
const expanded = data.expandtemplates.wikitext;
const editResponse = await api.edit(title, () => ({
text: changeTemplateExpansion
? changeTemplateExpansion(expanded)
: expanded,
summary,
}));
if (editResponse.nochange) {
mw.notify(`${title} was up-to-date already.`);
} else {
mw.notify(`Updated ${title}.`);
}
} catch (error) {
mw.notify("Failed to post!");
console.error(error);
}
}
}
};
}


/* ***** Google snippet hiding ***** */
const summary = "[[MediaWiki:UpdateLanguageNameAndCode.js|updated]]";
var hideElems = document.querySelectorAll(".mw-editsection, #toc, #catlinks");
for (var k = 0; k < hideElems.length; k++) {
var el = hideElems[k];
el.setAttribute("data-nosnippet", "");
if (navigator.userAgent.toLowerCase().indexOf("googlebot") !== -1) {
el.style.display = "none";
}
}


/* ***** Clean up "0 c" / "0 e" on category pages ***** */
const updateLanguageData = async (title, moduleFunction, moduleType) => {
var catElems = document.querySelectorAll(".CategoryTreeItem bdi + span");
await updatePageWithTemplateExpansion(
for (var m = 0; m < catElems.length; m++) {
title,
var t = catElems[m];
`{{#invoke:languages/print|${moduleFunction}|plain|${moduleType}}}`,
t.textContent = t.textContent.replace("0 c, ", "").replace(", 0 e", "");
summary
}
);
return updatePageWithTemplateExpansion(
`${title}.json`,
`{{#invoke:languages/print|${moduleFunction}|json|${moduleType}}}`,
summary
);
};
const updateButton = new OO.ui.ButtonWidget({
label: "Update language, etymology language, language family and script modules, and Hani-sortkey serialized data module",
flags: [
'primary',
'progressive'
]
});
updateButton.$element.attr("id", "update-module");


/* ***** new-section-redirect ***** */
updateButton.on("click", async () => {
var newSectionRedirect = document.querySelector("#new-section-redirect a");
updateButton.setDisabled(true);
var newSectionButton =
try {
document.querySelector("#ca-addsection a") ||
await Promise.all([
document.getElementById("ca-addsection"); // fallback for ":is()"
updateLanguageData(
"Module:languages/code to canonical name",
"code_to_name",
"language"
),
updateLanguageData(
"Module:languages/canonical names",
"name_to_code",
"language"
),
updateLanguageData(
"Module:etymology languages/code to canonical name",
"code_to_name",
"etymology"
),
updateLanguageData(
"Module:etymology languages/canonical names",
"name_to_code",
"etymology"
),
updateLanguageData(
"Module:families/code to canonical name",
"code_to_name",
"family"
),
updateLanguageData(
"Module:families/canonical names",
"name_to_code",
"family"
),
updateLanguageData(
"Module:scripts/code to canonical name",
"code_to_name",
"script"
),
updateLanguageData(
"Module:scripts/canonical names",
"name_to_code",
"script"
),
updatePageWithTemplateExpansion(
"Module:Hani-sortkey/data/serialized",
"{{#invoke:Hani-sortkey/data/serializer|main}}",
summary,
(expanded) => `return "${expanded}"`
),
]);
} catch (error) {
console.error(error);
} finally {
updateButton.setDisabled(false);
}
});


if (newSectionButton && newSectionRedirect) {
// Insert the button before the first paragraph in .mw-parser-output.
newSectionButton.href = newSectionRedirect.href;
$(".mw-parser-output p:first-of-type").before(updateButton.$element);
}
});
// </nowiki>

Revision as of 13:00, 21 April 2026

/* jshint undef: true */
/* globals $, apiWrapper, mw, OO */
// <nowiki>
mw.loader.using("oojs-ui-core").then(() => {
	"use strict";

	const api = new mw.Api({
		timeout: 30 * 1000, // Dirty hack to hopefully get rid of timeout errors.
	});

	const updatePageWithTemplateExpansion = async (
		title,
		template,
		summary,
		changeTemplateExpansion
	) => {
		await mw.loader.using("mediawiki.api");
		try {
			const data = await api.get({
				action: "expandtemplates",
				title,
				text: template,
				prop: "wikitext",
			});
			const expanded = data.expandtemplates.wikitext;
			const editResponse = await api.edit(title, () => ({
				text: changeTemplateExpansion
					? changeTemplateExpansion(expanded)
					: expanded,
				summary,
			}));
			if (editResponse.nochange) {
				mw.notify(`${title} was up-to-date already.`);
			} else {
				mw.notify(`Updated ${title}.`);
			}
		} catch (error) {
			mw.notify("Failed to post!");
			console.error(error);
		}
	};

	const summary = "[[MediaWiki:UpdateLanguageNameAndCode.js|updated]]";

	const updateLanguageData = async (title, moduleFunction, moduleType) => {
		await updatePageWithTemplateExpansion(
			title,
			`{{#invoke:languages/print|${moduleFunction}|plain|${moduleType}}}`,
			summary
		);
		return updatePageWithTemplateExpansion(
			`${title}.json`,
			`{{#invoke:languages/print|${moduleFunction}|json|${moduleType}}}`,
			summary
		);
	};
	
	const updateButton = new OO.ui.ButtonWidget({
		label: "Update language, etymology language, language family and script modules, and Hani-sortkey serialized data module",
		flags: [
			'primary',
			'progressive'
		]
	});
	updateButton.$element.attr("id", "update-module");

	updateButton.on("click", async () => {
		updateButton.setDisabled(true);
		try {
			await Promise.all([
				updateLanguageData(
					"Module:languages/code to canonical name",
					"code_to_name",
					"language"
				),
				updateLanguageData(
					"Module:languages/canonical names",
					"name_to_code",
					"language"
				),
				updateLanguageData(
					"Module:etymology languages/code to canonical name",
					"code_to_name",
					"etymology"
				),
				updateLanguageData(
					"Module:etymology languages/canonical names",
					"name_to_code",
					"etymology"
				),
				updateLanguageData(
					"Module:families/code to canonical name",
					"code_to_name",
					"family"
				),
				updateLanguageData(
					"Module:families/canonical names",
					"name_to_code",
					"family"
				),
				updateLanguageData(
					"Module:scripts/code to canonical name",
					"code_to_name",
					"script"
				),
				updateLanguageData(
					"Module:scripts/canonical names",
					"name_to_code",
					"script"
				),
				updatePageWithTemplateExpansion(
					"Module:Hani-sortkey/data/serialized",
					"{{#invoke:Hani-sortkey/data/serializer|main}}",
					summary,
					(expanded) => `return "${expanded}"`
				),
			]);
		} catch (error) {
			console.error(error);
		} finally {
			updateButton.setDisabled(false);
		}
	});

	// Insert the button before the first paragraph in .mw-parser-output.
	$(".mw-parser-output p:first-of-type").before(updateButton.$element);
});
// </nowiki>