मेडियाविकि:Gadget-markAdmins.js

मैथिली विकिपिडियासँ, एक मुक्त विश्वकोश

टिप्पणी: संरक्षणक बाद, अहाँक परिवर्तन देखबा लेल अपन ब्राउजरक उपस्मृतिक हटबए पडत। फायरफक्स/ सफारी: सिफ्टके दाबि रिलोड, वा Ctrl-F5 वा Ctrl-R (म्याकपर ⌘-R) गुगल क्रोम: Ctrl-Shift-R दाबी(म्याकपर ⌘-Shift-R) इन्टरनेट एक्सप्लोरर: Refresh क्लिक करि Ctrl दाबि, वा Ctrl-F5 दाबी ओपेरा: Menu → Settings पर जाए (म्याकपर Opera → Preferences) आ ओकर बाद Privacy & security → Clear browsing data → Cached images and files

/**
 *  Flag administrators and special user group members with a letter
 *  in parenthesis behind links that go into their user namespace.
 *  E.g. Didym -> Didym (A)
 *  
 *  @rev 1 (2014-11-21)
 *  @author Euku, 2005
 *  @author PDD
 *  @author Littl
 *  @author Guandalug
 *  @author Didym, 2014
 *  @author Rillke <https://blog.rillke.com>, 2014
 */
 
// <nowiki>
 
// List the global variables for jsHint-Validation. Please make sure that it passes http://jshint.com/
/*global jQuery:false, mediaWiki:false*/
 
// Each of the following varibles can be configured in your monobook.js/vector.js/common.js.
(function( mw, jQuery ) {
	'use strict';

	var markAdmins = mw.libs.markAdmins = {
		spans: [],
		config: {},
		defaults: {
			groups: {
				sysop: {
					label: 'A',
					legacyName: 'admins',
					legacyLabelId: 'atxt',
					enabled: true
				},
				oversight: {
					label: 'OS',
					legacyName: 'oversight',
					legacyLabelId: 'oversighttxt',
					enabled: true
				},
				checkuser: {
					label: 'CU',
					legacyName: 'checkuser',
					legacyLabelId: 'checkusertxt',
					enabled: true
				},
				bureaucrat: {
					label: 'B',
					legacyName: 'bureaucrat',
					legacyLabelId: 'bureautxt',
					enabled: true
				},
				steward: {
					label: 'S',
					legacyName: 'steward',
					legacyLabelId: 'stewtxt'
				},
				'OTRS-member': {
					label: 'P',
					legacyName: 'otrs',
					legacyLabelId: 'otrstxt'
				},
				'meta-OTRS-member': {
					label: 'GP',
					legacyName: 'otrs',
					legacyLabelId: 'otrstxt'
				},
				'Image-reviewer': {
					label: 'L',
					legacyName: 'imagereviewers',
					legacyLabelId: 'imgreviewertxt'
				}
			},
			runOn: ['Special', 'User', 'User_talk', 'Project', 'File', 'Help'],
			runOnHistory: true,
			runOnTalk: true,
			runOnDiff: true
		},
		init: function ( users ) {
			markAdmins.users = users;

			// Wait for user configuration through their .js
			// Not adding as a gadget dependency because user .js
			// is sometimes invalid and fails loading and
			// gadget dependencies do not offer failed/error
			// options
			mw.loader.using( 'user', markAdmins.mergeConfig, markAdmins.mergeConfig );
		},
		mergeConfig: function () {
			// Merge new configuration
			var optionsConfig = mw.user.options.get( 'markAdminCfg' );
			var cfg = $.extend(
				true,
				markAdmins.config,
				markAdmins.defaults,
				window.markAdminCfg,
				optionsConfig ? JSON.parse( optionsConfig ) : {}
			);

			// Merge legacy config (may be removed in future)
			$.each( cfg.groups, function( groupName, groupConfig ) {
				// Display settings
				var enabled = window['mark' + groupConfig.legacyName];
				if ( enabled !== undefined ) groupConfig.enabled = !!enabled;

				// Label
				var label = window['mark' + groupConfig.legacyLabelId];
				if ( label !== undefined ) groupConfig.label = label;
			} );
			cfg.markSubpages = !!window.marksubpages;
			cfg.dontmarkmyself = !!window.dontMarkMyself;

			// Hook-up content loading
			mw.hook( 'wikipage.content' ).add( markAdmins.addLabels );
		},
		addLabels: function ( $content ) {
			if ( !markAdmins.fullPageProcessed ) {
				$content = $(document);
				markAdmins.fullPageProcessed = true;
			}
			// Right, the configuration evaluation is here
			// It might be possible to use Ajax for page
			// navigation in future.
			var cannonicalNS    = mw.config.get( 'wgCanonicalNamespace' ),
				cannonicalSNSN   = mw.config.get( 'wgCanonicalSpecialPageName' ),
				isSubpageListing = !!({ 'Prefixindex': 1, 'Allpages': 1 })[cannonicalSNSN],
				isHistory        = mw.config.get( 'wgAction' ) === 'history',
				isTalk           = mw.config.get( 'wgNamespaceNumber' ) % 2 === 1,
				isDiff           = !!mw.util.getParamValue( 'diff' ),
				anchors          = $content[0].getElementsByTagName( 'A' ),
				anchorsLen       = anchors.length,
				reUserpage       = /\/wiki\/User([ _]talk)?:(.+)/,
				cfg              = markAdmins.config,
				nsCondition      = $.inArray( cannonicalNS, cfg.runOn ) !== -1,
				enabledGroups    = {},
				marker           = {},
				i, a, m, userpage, user, previousUser, href,
				isMainUserpageLink, isUsertalkLink, userGroups;

			// Namespace run conditions
			if ( !( nsCondition
				|| isHistory && cfg.runOnHistory
				|| isTalk && cfg.runOnTalk
				|| isDiff && cfg.runOnDiff ) ) return;

			// Filter enabled groups
			// Do it here and not later on each anchor
			$.each( cfg.groups, function( groupName, groupConfig ) {
				if ( groupConfig.enabled ) enabledGroups[groupName] = groupConfig;
			} );

			for ( i = 0; i < anchorsLen; ++i, marker = [] ) {
				a = anchors[i];

				// Extract link
				href = a.getAttribute( 'href' );
				if ( !href ) continue;

				// Extract user page ( /wiki/User_talk:Foo/subpage -> Foo/subpage )
				m = href.match( reUserpage );
				if ( !m || !m[2] ) continue;
				userpage = m[2];

				// Extract user
				user = userpage.replace( /[\/\#].*/, '' );

				isMainUserpageLink = ( user === userpage );
				isUsertalkLink     = !!m[1];

				// Polish user name
				user = decodeURIComponent( user ).replace( /_/g, ' ' );

				// Two consecutive links to the same user?
				if ( previousUser === user && isUsertalkLink ) continue;

				if ( marker[user] === undefined ) {
					// User groups of selected user
					marker[user] = '';
					userGroups = markAdmins.users[user];
					if ( !userGroups ) continue;

					$.each( userGroups, function( i, groupName ) {
						var groupConfig = enabledGroups[groupName];
						if ( !groupConfig ) return;

						// String concatenation is oftentimes faster in modern browsers 
						// than using Arrays and joining them finally
						if ( marker[user] === '' ) {
							marker[user] = groupConfig.label;
						} else {
							marker[user] += '/' + groupConfig.label;
						}
					} );
				}
				// Are there markers at all?
				if ( !marker[user] ) continue;

				// Does the link go to the main user page or, if linking subpages is enabled,
				// is it not a page that is just listing subpages?
				if ( !( isMainUserpageLink || cfg.markSubpages && !isSubpageListing ) ) continue;

				if ( cfg.dontMarkMyself && user === mw.config.get( 'wgUserName' ) ) continue;

				markAdmins.markUser( marker[user], a );

				// Required for consecutive user link check
				previousUser = user;
			}
		},
		markUser: function ( marks, a ) {
			var span = document.createElement( 'span' ),
				spanText = document.createTextNode( '\u00A0(' + marks + ')' );

			span.className = 'adminMark';

			span.appendChild( spanText );
			a.appendChild( span );
			markAdmins.spans.push( span );
		},
		destroy: function () {
			$.each( markAdmins.spans, function( i, span ) {
				$( span ).remove();
			} );
		},
		reInit: function () {
			markAdmins.destroy();
			markAdmins.mergeConfig();
		}
	};
	mw.hook( 'userjs.script-loaded.markadmins' ).add( markAdmins.init );
}( mediaWiki, jQuery ));