मेडियाविकि: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 ));