MediaWiki:Gadget-linkLanguageHeaders.js

From Linguifex
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
"use strict";

// {{documentation}}
// <nowiki>

(function linkLanguageHeadersGadget() {
	var CACHE_DURATION = 24 * 60 * 60; // 24 hours

	var ALLOWED_NAMESPACES = [
		0,      // main
		118     // Reconstruction
	];

	function categoryNameFromLanguageName(name) {
		return (name + " language").replace(/ Language language$/, " Language");
	}

	function getLanguageCodesByCanonicalName(callback, cacheDuration) {
		var KEY = "enwiktLanguageCanonicalNamesJson";
		var timeNow = new Date().getTime() * 1e-3;
		try {
			var cachedData = JSON.parse(localStorage.getItem(KEY));
			if (timeNow - cachedData.timestamp < cacheDuration) {
				callback(cachedData.data);
				return;
			}
		} catch (e) { }

		var request = new mw.Api().get({
			"action": "parse",
			"page": "Module:languages/canonical names.json",
			"prop": "wikitext",
			"formatversion": 2,
			"format": "json"
		});
		request.done(function(response) {
			var languageData = JSON.parse(response.parse.wikitext);
			callback(languageData);
			localStorage.setItem(KEY, JSON.stringify({
				timestamp: timeNow,
				data: languageData
			}));
		});
	}

	function linkLanguageHeaders(codeByCanonicalName) {
		var categoryPrefix = encodeURIComponent(mw.config.get("wgFormattedNamespaces")[14].replace(/ /g, "_")) + ":";
		$("#mw-content-text h2 .mw-headline, #mw-content-text .mw-heading2 h2").each(function() {
			var headline = $(this);
			var languageName = headline.text();
			var languageCode = codeByCanonicalName[languageName];
			if (languageCode) {
				var categoryName = categoryNameFromLanguageName(languageName);
				headline.html($("<a>", {
					text: languageName,
					title: languageName + " [" + languageCode + "]",
					href: mw.config.get("wgArticlePath").replace("$1", categoryPrefix + encodeURIComponent(categoryName.replace(/ /g, "_")))
				}));
			}
		});
	}

	mw.hook("wikipage.content").add(function($) {
		if (mw.config.get("wgAction") === "view" &&
				ALLOWED_NAMESPACES.indexOf(mw.config.get("wgNamespaceNumber")) >= 0) {
			getLanguageCodesByCanonicalName(function (codeByCanonicalName) {
				linkLanguageHeaders(codeByCanonicalName);
			}, CACHE_DURATION);
		}
	});
})();

// </nowiki>