MediaWiki:Gadget-catfix.js

Vikisözlük sitesinden
/*
 * dependencies: mediawiki.Title
 */

jQuery(function () {
	'use strict';
	
	var wrapper;
	
	// Apply only to pages in the Category namespace
	// containing an element with the id "catfix".
	// Set window.disableCatfix to true to prevent this script from running.
	if (!(!window.disableCatfix
	&& mw.config.get('wgNamespaceNumber') === 14
	&& (wrapper = document.getElementById("catfix"))))
		return;

	// Get the language name and script wrapper.
	var langName = wrapper.className.split("CATFIX-")[1];
	wrapper = wrapper.getElementsByTagName("*")[0] || document.createElement("span");
	
	var anchor = "";
	if (langName && langName.length > 0)
		anchor = langName;
	
	function isEntry(namespaceName, pageName) {
		// main, Talk, Citations, Reconstruction,
		// Appendix if it starts with language name and "/"
		return ["", "Tartışma", "Alıntılar", "YeniKurum"].indexOf(namespaceName) != -1
			|| (namespaceName == "Ek"
				&& pageName.slice(0, langName.length + 1) == langName + "/");
	}
	
	var formattedNamespaces = mw.config.get("wgFormattedNamespaces");
	
	function wrapNode(node, wrapper) {
		var parent = node.parentNode;
		wrapper.appendChild(node);
		parent.appendChild(wrapper);
	}
	
	// Process each link in the category listing.
	jQuery("#mw-pages > .mw-content-ltr li > a, #newest-and-oldest-pages tr li > a")
		.each(function () {
			try {
				var titleobj = new mw.Title(this.textContent || this.innerText);
				var namespaceName = formattedNamespaces[titleobj.getNamespaceId()];
				var pageName = titleobj.getNameText();
				
				if (!isEntry(namespaceName, pageName))
					return;
				
				// Add the anchor in mainspace, not Reconstruction or Appendix,
				// to match linking templates
				// ([[Wiktionary:Grease pit/2019/December#Template:catfix shouldn't add an anchor to Reconstruction pages]]).
				if (namespaceName === "")
					this.hash = anchor;
				
				var textNodeToWrap;
				// Choose the part of the link text to wrap
				// - in mainspace, the whole link
				// - in Talk and Citations, the part after the namespace prefix
				// - in Reconstruction and Appendix, the part after the
				//   namespace prefix and language name
				// Set window.catfixReconstructedAsterisk to true
				// to replace "Reconstruction:langname/" with "*".
				if (namespaceName === "") {
					textNodeToWrap = this;
				} else {
					if (["Tartışma", "Alıntılar"].indexOf(namespaceName) !== -1) {
						textNodeToWrap = document.createTextNode(pageName);
						$(this).empty()
							.append(titleobj.getNamespacePrefix())
							.append(textNodeToWrap);
					} else if (["YeniKurum", "Ek"].indexOf(namespaceName) !== -1) {
						var split = pageName.split("/", 2);
						if (split.length !== 2) {
							throw new TypeError("Malformed title: " + pageName);
						}
						var langPrefix = split[0];
						var prefix = window.catfixReconstructedAsterisk
							? "" : titleobj.getNamespacePrefix() + langPrefix + "/";
						textNodeToWrap = document.createTextNode(
							(window.catfixReconstructedAsterisk ? "*" : "")
							+ split[1]);
						$(this).empty()
							.append(prefix)
							.append(textNodeToWrap);
						
					}
				}
				
				wrapNode(textNodeToWrap, wrapper.cloneNode(false));
			} catch (e) {
				console.error(e);
			}
		});
});