MediaWiki:Gadget-catfix.js

Từ điển mở Wiktionary

Chú ý: Sau khi lưu trang này, phải xóa bộ nhớ đệm (cache) của trình duyệt để những thay đổi hiện ra

  • Firefox / Safari: Nhấn giữ phím Shift trong khi nhấn Tải lại (Reload), hoặc nhấn tổ hợp Ctrl-F5 hay Ctrl-R (⌘R trên Mac)
  • Google Chrome: Nhấn tổ hợp Ctrl-Shift-R (⇧⌘R trên Mac)
  • Internet Explorer / Edge: Nhấn giữ phím Ctrl trong khi nhấn Làm tươi (Refresh), hoặc nhấn tổ hợp Ctrl-F5
  • Opera: Nhấn tổ hợp Ctrl-F5.
/*
 * 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 ["", "Talk", "Citations", "Reconstruction"].indexOf(namespaceName) != -1
			|| (namespaceName == "Appendix"
				&& 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.getMainText();
				
				if (!isEntry(namespaceName, pageName))
					return;
				
				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;
				
					// 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]]).
					this.hash = anchor;
				} else {
					if (["Talk", "Citations"].indexOf(namespaceName) !== -1) {
						textNodeToWrap = document.createTextNode(pageName);
						$(this).empty()
							.append(titleobj.getNamespacePrefix())
							.append(textNodeToWrap);
					} else if (["Reconstruction", "Appendix"].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);
			}
		});
});