MediaWiki:Gadget-categoryTreeLanguageNames.js

From Wiktionary, the free dictionary
Jump to navigation Jump to search

Note: You may have to bypass your browser’s cache to see the changes. In addition, after saving a sitewide CSS file such as MediaWiki:Common.css, it will take 5-10 minutes before the changes take effect, even if you clear your cache.

  • Mozilla / Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Command-R on a Macintosh);
  • Konqueror and Chrome: click Reload or press F5;
  • Opera: clear the cache in Tools → Preferences;
  • Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5.

See also: Special:Gadgets.


"use strict";

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

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

	var ALLOWED_NAMESPACES = [
		0,      // main
		14,     // Category
		100,    // Appendix
		118     // Reconstruction
	];

	var CATEGORY_PREFIX = mw.config.get("wgFormattedNamespaces")[14] + ":";

	function getLanguageCodeToCanonicalName(callback, cacheDuration) {
		var KEY = "enwiktLanguageCodeToCanonicalNameJson";
		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/code to canonical name.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 addCategoryTreeLanguageName(codeToCanonicalName, element, doNotTagLanguageCode) {
		// not a category link/name
		if (element.href.indexOf(CATEGORY_PREFIX) < 0)
			return;

		var firstTextNode = Array.prototype.find.call(element.childNodes, function(node) {
			return node.nodeType === 3;
		});
		if (!firstTextNode)
			return;

		var categoryName = firstTextNode.textContent;
		var parseCategoryTreeName = categoryName.match(/^([a-z-]+):(.+)/);
		if (!parseCategoryTreeName)
			return;

		var languageCode = parseCategoryTreeName[1];
		var subcategoryName = parseCategoryTreeName[2];
		var canonicalName = codeToCanonicalName[languageCode];
		if (!canonicalName)
			return;

		if (element.title === categoryName || element.title === CATEGORY_PREFIX + categoryName)
			element.title += " [" + canonicalName + ": " + subcategoryName + "]";

		if (languageCode !== doNotTagLanguageCode)
			element.appendChild($('<span></span>').addClass("wikt-category-tree-language-name").text(" [" + canonicalName + "]")[0]);
	}

	mw.hook("wikipage.content").add(function() {
		if (mw.config.get("wgAction") === "view" &&
				ALLOWED_NAMESPACES.indexOf(mw.config.get("wgNamespaceNumber")) >= 0) {

			mw.util.addCSS(`
				.wikt-category-tree-language-name {
					font-size: 85%;
				}
				`);

			var thisLanguageCode = null;
			if (mw.config.get("wgNamespaceNumber") === 14) {
				var categoryName = mw.config.get("wgTitle");
				var parseCategoryTreeName = categoryName.match(/^([a-z-]+):(.+)/);
				if (parseCategoryTreeName)
					thisLanguageCode = parseCategoryTreeName[1];
			}

			getLanguageCodeToCanonicalName(function (codeToCanonicalName) {
				$('#catlinks ul > li a').each(function () {
					addCategoryTreeLanguageName(codeToCanonicalName, this, thisLanguageCode);
				});
				if (mw.config.get("wgNamespaceNumber") === 14) {
					$('#mw-subcategories a').each(function () {
						addCategoryTreeLanguageName(codeToCanonicalName, this, thisLanguageCode);
					});
				}
			}, CACHE_DURATION);
		}
	});
})();

// </nowiki>