User:Moonpulsar/common.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.

This JavaScript is executed for Moonpulsar on every page load.


/**
 * Keep code in MediaWiki:Common.js to a minimum as it is unconditionally
 * loaded for all users on every wiki page. If possible create a gadget that is
 * enabled by default instead of adding it here (since gadgets are fully
 * optimized ResourceLoader modules with possibility to add dependencies etc.)
 *
 * Since Common.js isn't a gadget, there is no place to declare its
 * dependencies, so we have to lazy load them with mw.loader.using on demand and
 * then execute the rest in the callback. In most cases these dependencies will
 * be loaded (or loading) already and the callback will not be delayed. In case a
 * dependency hasn't arrived yet it'll make sure those are loaded before this.
 */
'use strict';
// [[Category:Wiktionary scripts]] <nowiki>
/*jshint shadow:true, undef:true, latedef:true, unused:true, es3:true */
/*global window, jQuery, mw, importScript, importStylesheet, $ */


/** [[WT:PREFS]] v2.0 **/
try {
	mw.loader.load('https://en.wikipedia.org/w/index.php?title=User:BrandonXLF/QuickEdit.js&action=raw&ctype=text/javascript');
	(function() {

		var prefs;
		try {
			prefs = window.localStorage.getItem('AGprefs');
		} catch (e) {
			prefs = jQuery.cookie('AGprefs');
		}

		prefs = prefs && JSON.parse(prefs);

		if (mw.config.get('wgUserGroups').indexOf('autoconfirmed') !== -1)
			return;

		if (mw.config.get('wgUserGroups').indexOf('user') === -1) {
			// XXX: [[Wiktionary:Preferences/V2]] is just a temporary page

			mw.loader.using(['mediawiki.util'], function() {
				mw.util.addPortletLink('p-personal', mw.util.getUrl('Wiktionary:Preferences/V2'),
					'Preferences', 'pt-agprefs', 'Personalise Wiktionary (settings are kept per-browser).', '',
					document.getElementById('pt-createaccount'));
			});

			if ((mw.config.get('wgAction') === 'view') && (mw.config.get('wgPageName') === 'Wiktionary:Preferences/V2')) {
				mw.loader.load('ext.gadget.AGprefs'); // [[MediaWiki:Gadget-AGprefs.js]]
			}
		}

		if (!prefs)
			return;

		mw.loader.state('the_pope_is_an_atheist_woman_alien', 'missing');
		for (var key in prefs.modules) {
			if (prefs.modules[key]) {
				mw.loader.load([key]);
			} else {
				// unavoidable race condition. to prevent it, every enabled-by-default gadget should have "site" as a dependency
				if (mw.loader.getState(key) !== 'ready') {
					mw.loader.moduleRegistry[key].dependencies.push('the_pope_is_an_atheist_woman_alien');
					mw.loader.state(key, 'missing');
				} else {
					// XXX
					mw.log.warn(key + " could not be disabled; make sure it has 'site' declared as a dependency");
				}
			}
		}

		for (var key in prefs.sheets) {
			importStylesheet('MediaWiki:Gadget-' + key);
		}

		for (var key in prefs.scripts) {
			importScript('MediaWiki:Gadget-' + key);
		}

		if (mw.config.get('wgUserGroups').indexOf('user') !== -1)
			mw.loader.using([ 'mediawiki.api'], function() {
				var changes = [];
				for (var key in prefs.gadgets)
					changes.push('gadget-' + key + '=' + (prefs.gadgets[key] ? '1' : '0'));

				new mw.Api().postWithToken('options', {
					action: 'options',
					change: changes.join('|')
				}).then(function() {
					jQuery.cookie('AGprefs', null);
					try {
						window.localStorage.removeItem('AGprefs');
					} catch (e) { /* */ }
					mw.notify(
						jQuery('<b>Your <a href="/wiki/Wiktionary:Preferences/V2">per-browser preferences</a> have been migrated</b><br/><br/>' +
							'From now on, you should use your <a href="/wiki/Special:Preferences">user preferences page</a>. ' +
							'Preferences will no longer apply after you log out.')
					);
				});
			});

	})();
} catch (e) {
	mw.log.warn(e);
}

mw.loader.using('mediawiki.util').done(function() {
	/** &withmodule= query parameter **/
	if (mw.util.getParamValue('withmodule'))
		mw.loader.load(mw.util.getParamValue('withmodule').split(','));

	/** &preloadtext= and &preloadminor= **/
	if (mw.config.get('wgAction') === 'edit')
		jQuery(document).ready(function() {
			var wpTextbox1 = document.getElementById('wpTextbox1');
			var wpMinoredit = document.getElementById('wpMinoredit');
			if (!wpTextbox1)
				return;

			var preloadtext = mw.util.getParamValue('preloadtext');
			var preloadminor = mw.util.getParamValue('preloadminor');

			if (preloadtext && !wpTextbox1.value)
				wpTextbox1.value = preloadtext;
			if ((preloadminor !== null) && wpMinoredit)
				wpMinoredit.checked = !/^(0|false|no|)$/i.test(preloadminor);
		});

	/** Monthly subpages; see [[Template:discussion recent months|discussion recent months]] **/
	/*  See also: [[Special:AbuseFilter/43]]  */
	if (/^Wiktionary:(Beer_parlour|Grease_pit|Tea_room|Etymology_scriptorium|Information_desk)$/.test(mw.config.get('wgPageName')))
		jQuery(document).ready(function() {
			var nNSR = document.getElementById('new-section-redirect').getElementsByTagName('a')[0];
			var caAddSection = document.getElementById('ca-addsection');
			if (!caAddSection) {
				caAddSection = mw.util.addPortletLink(mw.config.get('skin') === 'vector' ? 'p-views' : 'p-cactions',
					nNSR.href, '+', 'ca-addsection', "Start a new section", '+', document.getElementById('ca-history')
				);
			} else {
				caAddSection.getElementsByTagName('a')[0].href = nNSR.href;
			}
		});
});

if (mw.config.get("wgTitle").indexOf("by language") != -1)
$("a.CategoryTreeLabelCategory").text(
	function(index, content) {
		return content.replace(
			/^Requests for (?:verification|deletion|cleanup) in (.+) entries$/,
			"$1"
		);
	}
);

// removes "0 c" for categories that do not have subcategories
$(".CategoryTreeEmptyBullet + a + span")
	.html(
		function(index, content) {
			return content.replace(
				"0 c, ",
				""
			);
		}
	);

// [[User:Yair_rand/FindTrans.js]]
if (mw.config.get('wgPageName') === 'Special:Search') {
	mw.loader.load('/w/index.php?title=User:Yair_rand/FindTrans.js&action=raw&ctype=text/javascript');
}

// == "Did you mean" auto redirect ==
/**
 * This will redirect in 3 seconds if a link enclosed in id="did-you-mean"
 * is found, and add the text "Auto-redirected from X" under the top header
 * if a rdfrom is passed in the get parameters.
 * Pages with wynn ([[ƿ]]) will be redirected immediately.
**/

$.when(mw.loader.using(["user", "mediawiki.util"]), $.ready).done(function(){
	if (window.disableAutoRedirect) return;
	
	var rdFromValue = mw.util.getParamValue("rdfrom");
	if (rdFromValue) {
		$('#siteSub').after(
			$('<div>').attr("id", 'contentSub')
				.append(document.createTextNode("(Auto-redirected from "))
				.append($('<a>', {
					href: mw.util.getUrl(rdFromValue, {redirect:"no"}),
					addClass: 'new'
				}).text(rdFromValue))
				.append(document.createTextNode(")")));
	} else {
		// Redirect as quickly as possible from [[ƿ]] title to [[w]] title.
		var pageTitle = mw.config.get("wgTitle");
		var isWynnTitle = /ƿ/i.test(pageTitle);
		var didYouMean = $('#did-you-mean a').html();
		var target = didYouMean ? didYouMean
			: isWynnTitle ? $('#go-to-search-page a').html()
			: null;
		var timeout = isWynnTitle ? 0 : 3000;
		window.setTimeout(function () {	
			var canRedirect = mw.util.getParamValue("redirect") != "no";
			var action = mw.config.get("wgAction");
			
			if (target && target !== pageTitle && canRedirect &&
				(jQuery.cookie('WiktionaryDisableAutoRedirect') != 'true') &&
				(action == "view" || (isWynnTitle && action == "edit")) &&
				mw.config.get('wgArticleId') === 0 &&
				mw.config.get('wgNamespaceNumber') === 0 &&
				!/Redirected from/.test(jQuery('#contentSub').html())
			) {
				window.location = mw.util.getUrl(target, { rdfrom: pageTitle });
			}
		}, timeout);
	}
});

/* ==Page specific extensions== */
/* ===[[Wiktionary:Main Page]]=== */
mw.loader.using("mediawiki.util", function(){
	// Hide the title and "Redirected from" (maybe we should keep the redirected from so's people update their bookmarks ;)
	// Broken in IE!
	if (mw.config.get('wgIsMainPage') && !(mw.config.get('wgAction') === 'view' || mw.config.get('wgAction') === 'submit')) {
		mw.util.addCSS('.firstHeading { display: block !important; }');
		mw.util.addCSS('#contentSub { display: inline !important; }');
	}
	
	if (mw.config.get('wgIsMainPage')) {
		$(function(){
			mw.util.addPortletLink('p-lang', '//meta.wikimedia.org/wiki/Wiktionary#List_of_Wiktionaries',
				'Complete list', 'interwiki-completelist', 'Complete list of Wiktionaries');
		});
	}
});

/* ===Custom search engines=== */
if (mw.config.get('wgPageName') === 'Help:Tips_and_tricks') {
	importScript('MediaWiki:CustomSearch.js');
}

/* == [[WT:FEED]] == */
// used to be [[User:Conrad.Irwin/feedback.js]]
$.when(mw.loader.using("mediawiki.util"), $.ready).done(function(){
	var fb_comment_url = mw.util.getUrl('Wiktionary:Feedback', {
		'action': 'edit',
		'section': 'new',
		'preload': 'Wiktionary:Feedback/preload',
		'editintro': 'Wiktionary:Feedback/intro',
		'preloadtitle': '[[:' + mw.config.get('wgPageName') + ']]',
	});

	var fb_comment = "If you have time, leave us a note.";
	
	$('<a>').attr('href', fb_comment_url).text(fb_comment)
	.appendTo($('<p>').css('font-size', '80%')).parent()
	.appendTo($('<div>').addClass("body")).parent().before($('<h3>Feedback</h3>'))
	.appendTo($('<div>').addClass("portal expanded").attr("id", "p-feedback")).parent()
	.appendTo($('#mw-panel'));
});


/* == Toggle functionality only failed test == */
// all tests for module testcases
$(function () {
	$("table.unit-tests th.unit-tests-img-corner").on("click", function () {
		$(this).closest("table.unit-tests").toggleClass("unit-tests-hide-passing");
	});
});

// Text after → on history pages is plain wikitext but on the page it is expanded. Fixing only [[Template:temp]]
// Also update it in change summaries
$(function () {
	if (/\.7B\.7Btemp\.7C(.*?)\.7D\.7D/.test(location.href)) {
		window.location = location.href.replace(/\.7B\.7Btemp.7C/g, ".7B.7B");
	}
	
	if (mw.config.get('wgAction') !== 'edit')
		return;
	if (!/[?&]section=\d/.test(location.href))
		return;
	var wpSummary = document.getElementById('wpSummary');
	if (!wpSummary)
		return;
	if (wpSummary.value.substr(0, 3) !== '/* ')
		return;
	if (wpSummary.value.substr(wpSummary.value.length - 4) !== ' */ ')
		return;
	wpSummary.value = wpSummary.value.replace(/\{\{temp(late)?\|/g, '{{');
});

// Various fixes for the trees generated by [[Module:family tree]].
$(function () {
	// Show the top toggle.
	$('.familytree-toptoggle').css('display', '');
	
	// Initialize the text of the toggles.
	$('.familytree').get().forEach(function (tree) {
		var isCollapsed = tree.classList.contains('mw-collapsed');
		var toggles = $(tree).find('.familytree-toggle');
		if (toggles[0]) {
			var customToggleClass = Array.prototype.filter.call(toggles[0].classList, function (className) {
				return className.indexOf('mw-customtoggle') === 0;
			})[0];
			if (customToggleClass) {
				var toggledElement = $('#' + customToggleClass.replace('mw-customtoggle', 'mw-customcollapsible'));
				if (toggledElement) {
					toggles.html(toggledElement.data(isCollapsed ? 'expandtext' : 'collapsetext'));
				}
			}
		}
	});
	
	// Change the text in the custom toggles generated by [[Module:family tree]]
	// when they are clicked.
	$('.mw-collapsible').on('beforeExpand.mw-collapsible beforeCollapse.mw-collapsible',
    function (event) {
        if (this.id.indexOf('mw-customcollapsible') === 0) {
            var toggle = $('.' + this.id.replace('mw-customcollapsible', 'mw-customtoggle'));
            if (event.type === 'beforeExpand') {
                toggle.html(this.dataset.collapsetext);
            } else { // beforeCollapse
                toggle.html(this.dataset.expandtext);
            }
            event.stopPropagation();
        }
    });
});

/* == RFC, RFD, RFV category lists == */
// Replaces full category name in [[WT:RFC]], [[WT:RFD]], [[WT:RFV]]
// with name of language:
// Category:Requests for cleanup in English entries → English
$('.tagged-rfcs, .tagged-rfds, .tagged-rfvs').find('.CategoryTreeItem a').html(
	function (i, content) {
		return content.replace(/^Requests for (?:cleanup|deletion|verification) in (.+?) entries$/, '$1');
	});

/* == Make it easy to update language name-to-code and code-to-name data modules == */
// This regex will always match.
if (['Module:languages/code_to_canonical_name', 'Module:languages/canonical_names']
.indexOf(mw.config.get('wgPageName').match(/^[^\/]*(?:\/[^\/]+)?/)[0]) !== -1)
	importScript('MediaWiki:UpdateLanguageNameAndCode.js');

/* == WikiHiero kludge == */
$('table.mw-hiero-outer').first().each(function() {
	importScript('MediaWiki:WikiHieroTempFix.js');
});

// </nowiki>
// The rest of the scripts are at [[MediaWiki:Gadget-legacy.js]].
// Most of them should be converted into gadgets as time and resources allow.