Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.
m =
Tags: Replaced Reverted
mNo edit summary
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
// rewritten by [[m:User:Hoo man]]; 2012-08-26, adapted by [[User:Obersachse]], optimized by [[User:Jack who built the house]], adapted by [[User:Zippybonzo]]
$( function () {
// For attribution: [[MediaWiki:Gadget-markadmins.js]]
mw.loader.load( "//meta.wikioasis.org/index.php?title=User:Bosco/MarkRights.css&action=raw&ctype=text/css", "text/css" );
(function () {


var userSet;
var rightsMap = new mw.Map();
var gRightsMap = new mw.Map();


var userSetTips = {
window.rightsMap = rightsMap;
'A' : 'administrator',
'B' : 'bureaucrat',
'CU': 'checkuser',
'IA': 'interface administrator',
'OS': 'oversight',
'Rb': 'rollback',
'S' : 'steward',
'SA': 'system administrator',
'TS': 'trust and safety',
};


function addCSS(css) {
var $users;
var styleElem = document.createElement('style');
var users;
styleElem.appendChild(document.createTextNode(css));
document.getElementsByTagName('head')[0].appendChild(styleElem);
}


function markadmins($content) {
var queue1 = [];
if (!$content.length) return;
var queue2 = [];
runNum++;
var i = 0, n = 0;
if (runNum === 1) {
var gi = 0;
addCSS(
 
'tt.userflags { color:#0645ad; }' +
var api = new mw.Api();
'.userflags-wrapper { -moz-user-select:none; }' +
 
'.userflags-none { display: none; }'
var processGlobal = null;
);
 
function getUsername( href ) {
var url = new URL( href, window.location.href );
var username = url.searchParams.has( "title" ) ? url.searchParams.get( "title" ) : null;
if ( username !== null ) {
return url.searchParams.get( "title" ).replace( "User:", "" ).replace( /_/g, " " );
}
/* 如有无法使用的语言版本,将本地化后的User添加至下方 */
username = url.pathname.match(/\/wiki\/User:(.+?)$/) //en,simple,zh
|| url.pathname.match(/\/wiki\/Gumagamit:(.+?)$/) //ceb
|| url.pathname.match(/\/wiki\/Användare:(.+?)$/) //sv
|| url.pathname.match(/\/wiki\/Benutzer:(.+?)$/) //de male
|| url.pathname.match(/\/wiki\/Benutzerin:(.+?)$/) //de female
|| url.pathname.match(/\/wiki\/Utilisateur:(.+?)$/) //fr
|| url.pathname.match(/\/wiki\/Gebruiker:(.+?)$/) //nl
|| url.pathname.match(/\/wiki\/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:(.+?)$/) //ru
|| url.pathname.match(/\/wiki\/Usuario:(.+?)$/) //es male
|| url.pathname.match(/\/wiki\/Usuaria:(.+?)$/) //es female
|| url.pathname.match(/\/wiki\/Utente:(.+?)$/) //it
|| url.pathname.match(/\/wiki\/Wikipedysta:(.+?)$/) //pl
|| url.pathname.match(/\/wiki\/%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85:(.+?)$/) //ar,arz
|| url.pathname.match(/\/wiki\/Gumaramit:(.+?)$/) //war
|| url.pathname.match(/\/wiki\/Utilizator:(.+?)$/) //ro
|| url.pathname.match(/\/wiki\/Th%C3%A0nh_vi%C3%AAn:(.+?)$/) //vi
|| url.pathname.match(/\/wiki\/%E5%88%A9%E7%94%A8%E8%80%85:(.+?)$/) //ja
|| url.pathname.match(/\/wiki\/Usu%C3%A1rio:(.+?)$/) //pt male
|| url.pathname.match(/\/wiki\/Usu%C3%A1ria:(.+?)$/) //pt female
|| url.pathname.match(/\/wiki\/%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D1%82%D1%83%D0%B2%D0%B0%D1%87:(.+?)$/) //uk
|| url.pathname.match(/\/wiki\/%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1:(.+?)$/) //fa
|| url.pathname.match(/\/wiki\/%EC%82%AC%EC%9A%A9%EC%9E%90:(.+?)$/) //ko
|| url.pathname.match(/\/wiki\/%E7%94%A8%E6%88%B6:(.+?)$/); //zh-classical
 
if ( username ) {
return decodeURIComponent( username[ 1 ].replace( /_/g, " " ) );
}
return null;
}
}
 
var $links = $content.find('a[title^="User"], a[title^="Talk"]');
function done() {
$users.each( function ( _i, el ) {
if (runNum === 2) {
var username = getUsername( $( el ).attr( "href" ) );
if ($links.length === prevLinksCount) {
if ( username ) {
return;
// eslint-disable-next-line no-jquery/no-each-util
$.each( rightsMap.get( username ) || [], function ( _gi, group ) {
$( el ).append( "<sup class=\"markrights markrights-" + group + "\"></sup>" );
} );
}
} );
}
function gDone() {
$users.each( function ( _i, el ) {
var username = getUsername( $( el ).attr( "href" ) );
if ( username ) {
// eslint-disable-next-line no-jquery/no-each-util
$.each( gRightsMap.get( username ) || [], function ( _gi, group ) {
$( el ).append( "<sup class=\"markrights markrights-global markrights-" + group + "\"></sup>" );
} );
}
} );
}
 
function process( data ) {
var user;
if ( data.query && data.query.users ) {
user = data.query.users;
} else {
} else {
if ($links.length > prevLinksCount) {
user = [];
$links = $links.slice(prevLinksCount);
}
} else {
for ( var j = 0; j < user.length; j++ ) {
var msg = 'MediaWiki:Gadget-markadmins.js: Нестандартная ситуация: количество ссылок на втором проходе (' + $links.length + ') меньше, чем на первом (' + prevLinksCount + '). Снова обходим все ссылки.';
var u = user[ j ];
if (console.info) {
if ( u.groups ) {
console.info(msg);
u.groups = u.groups.filter( function ( group ) {
} else {
return [ "*", "user", "steward" /* 意外? */ ].indexOf( group ) === -1;
console.log(msg);
} );
}
rightsMap.set( u.name, u.groups );
}
}
}
n--;
if ( n <= 0 ) {
done();
}
}
}
}
function gProcess( data ) {
var user;


new mw.Api().get({
if ( data.query && data.query.globaluserinfo ) {
action: 'query',
user = data.query.globaluserinfo;
list: 'allusers',
gRightsMap.set( user.name, user.groups || [] );
augroup: 'sysop|bureaucrat|checkuser|interface-admin|suppress|rollback|steward|sysadmin|trustandsafety',
auprop: 'groups',
aulimit: 500,
format: 'json',
formatversion: 2
}).done(function(ans) {
var list = ans.query.allusers,
groups = ['sysop', 'bureaucrat', 'checkuser', 'interface-admin', 'suppress', 'rollback', 'steward', 'sysadmin', 'trustandsafety'],
key = ['A', 'B', 'CU', 'IA', 'OS', 'Rb', 'S', 'SA', 'TS'],
userSet = {};
for (var i = 0; i < key.length; i++) {
userSet[key[i]] = [];
}
}
 
for (var i = 0; i < list.length; i++) {
gi--;
for (var j = 0; j < groups.length; j++) {
if ( gi <= 0 ) {
if (list[i].groups.includes(groups[j])) {
gDone();
userSet[key[j]].push(list[i].name);
}
}
}
 
function markUG() {
// eslint-disable-next-line no-jquery/no-global-selector
$users = $( "a.mw-userlink:not(.mw-anonuserlink)" );
users = {};
$users.each( function ( index, link ) {
users[ link.textContent ] = true;
} );
 
queue1 = [];
queue2 = [];
i = 0;
n = 0;
for ( var user in users ) {
if ( rightsMap.exists( user ) ) {
delete users[ user ];
continue;
}
queue1.push( user );
gi++;
i++;
if ( i === 50 ) {
queue2.push( queue1 );
queue1 = [];
n++;
i = 0;
}
}
}
}
if ( queue1.length > 0 ) {
$links.each(function (i, link) {
queue2.push( queue1 );
if (!link.parentNode ||
n++;
(/[?#]/.test(link.href) && link.href.indexOf('redlink=1') === -1) ||
}
(link.parentElement && link.parentElement.className === 'cancelLink')
 
) {
if ( queue2.length ) {
return;
for ( var j = 0; j < queue2.length; j++ ) {
api.get( {
format: "json",
action: "query",
list: "users",
usprop: "groups",
ususers: queue2[ j ].join( "|" )
} ).done( process );
}
}
} else {
var matches, user, flags = [], tips = [], flag;
done();
matches = /^User:(.+)|Talk:(.+)/.exec(link.title);
}
if (!matches) return;
 
if (matches[2]) {
if ( processGlobal === null ) {
if ($(link).parent().hasClass('mw-usertoollinks') || link.textContent.match(/обс/i)) return;
api.get( {
matches[1] = matches[2];
format: "json",
} else if (!matches[1]) {
action: "query",
meta: "globaluserinfo"
} ).done( function ( data ) {
 
if ( data.query && data.query.globaluserinfo ) {
processGlobal = true;
window.globalRightsMap = gRightsMap;
 
gi++;
gProcess( data );
 
if ( gi ) {
for ( var gu in users ) {
if ( gu === mw.config.get( "wgUserName" ) ) {
gi--;
continue;
} else {
api.get( {
format: "json",
action: "query",
meta: "globaluserinfo",
guiuser: gu,
guiprop: "groups"
} ).done( gProcess );
}
}
}
} else {
processGlobal = false;
}
} );
} else if ( processGlobal ) {
if ( !gi ) {
gDone();
return;
return;
}
}
for ( var gu in users ) {
user = decodeURIComponent(matches[1]);
if ( gu === mw.config.get( "wgUserName" ) ) {
if (link.href.indexOf('redlink=1') !== -1) {
gi--;
user = user.replace(/ \([^\)]+\)$/, '');
continue;
}
} else {
api.get( {
for (flag in userSet) {
format: "json",
if (userSet[flag].indexOf(user) !== -1 && userSetTips[flag]) {
action: "query",
flags.push(flag);
meta: "globaluserinfo",
tips.push(userSetTips[flag]);
guiuser: gu,
guiprop: "groups"
} ).done( gProcess );
}
}
}
}
if (!flags.length) return;
}
};
tips = ' (' + tips.join(', ') + ')';
var spanElem = document.createElement('span');
spanElem.className = 'userflags-wrapper';
var nbspElem = document.createTextNode('\u00A0');
var ttElem = document.createElement('tt');
ttElem.className = 'userflags';
ttElem.title = tips;
var flagsElem = document.createTextNode('(' + flags.join(',') + ')');
ttElem.appendChild(flagsElem);
spanElem.appendChild(nbspElem);
spanElem.appendChild(ttElem);
link.parentNode.insertBefore(spanElem, link.nextSibling);
link.title = link.title + tips;
});
});


prevLinksCount = $links.length;
if ( mw.config.get( "wgDiffNewId" ) || mw.config.get( "wgDiffOldId" ) ) {
}
// 啟用「互動式瀏覽歷史」,切換差異時重新標記
 
mw.hook( "wikipage.diff" ).add( function () { // Reload alongside the revision slider
var runNum = 0;
markUG();
var prevLinksCount;
} );
markadmins($('#mw-content-text')); 
} else if ( [ "Recentchanges", "Recentchangeslinked", "Watchlist" ].indexOf( mw.config.get( "wgCanonicalSpecialPageName" ) ) !== -1 ) {
mw.hook('wikipage.content').add(markadmins);
// 近期/相關變更更新時重新標記
 
mw.hook( "wikipage.content" ).add( function ( element ) {
}());
if ( element.hasClass( "mw-changeslist" ) ) {
markUG();
}
} );
markUG();
} else {
markUG();
}
} );
//</syntaxhighlight>

Latest revision as of 03:36, 30 March 2025

$( function () {
	mw.loader.load( "//meta.wikioasis.org/index.php?title=User:Bosco/MarkRights.css&action=raw&ctype=text/css", "text/css" );

	var rightsMap = new mw.Map();
	var gRightsMap = new mw.Map();

	window.rightsMap = rightsMap;

	var $users;
	var users;

	var queue1 = [];
	var queue2 = [];
	var i = 0, n = 0;
	var gi = 0;

	var api = new mw.Api();

	var processGlobal = null;

	function getUsername( href ) {
		var url = new URL( href, window.location.href );
		var username = url.searchParams.has( "title" ) ? url.searchParams.get( "title" ) : null;
		if ( username !== null ) {
			return url.searchParams.get( "title" ).replace( "User:", "" ).replace( /_/g, " " );
		}
		/* 如有无法使用的语言版本,将本地化后的User添加至下方 */
		username = url.pathname.match(/\/wiki\/User:(.+?)$/) //en,simple,zh
			|| url.pathname.match(/\/wiki\/Gumagamit:(.+?)$/) //ceb
			|| url.pathname.match(/\/wiki\/Användare:(.+?)$/) //sv
			|| url.pathname.match(/\/wiki\/Benutzer:(.+?)$/) //de male
			|| url.pathname.match(/\/wiki\/Benutzerin:(.+?)$/) //de female
			|| url.pathname.match(/\/wiki\/Utilisateur:(.+?)$/) //fr
			|| url.pathname.match(/\/wiki\/Gebruiker:(.+?)$/) //nl
			|| url.pathname.match(/\/wiki\/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:(.+?)$/) //ru
			|| url.pathname.match(/\/wiki\/Usuario:(.+?)$/) //es male
			|| url.pathname.match(/\/wiki\/Usuaria:(.+?)$/) //es female
			|| url.pathname.match(/\/wiki\/Utente:(.+?)$/) //it
			|| url.pathname.match(/\/wiki\/Wikipedysta:(.+?)$/) //pl
			|| url.pathname.match(/\/wiki\/%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85:(.+?)$/) //ar,arz
			|| url.pathname.match(/\/wiki\/Gumaramit:(.+?)$/) //war
			|| url.pathname.match(/\/wiki\/Utilizator:(.+?)$/) //ro
			|| url.pathname.match(/\/wiki\/Th%C3%A0nh_vi%C3%AAn:(.+?)$/) //vi
			|| url.pathname.match(/\/wiki\/%E5%88%A9%E7%94%A8%E8%80%85:(.+?)$/) //ja
			|| url.pathname.match(/\/wiki\/Usu%C3%A1rio:(.+?)$/) //pt male
			|| url.pathname.match(/\/wiki\/Usu%C3%A1ria:(.+?)$/) //pt female
			|| url.pathname.match(/\/wiki\/%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D1%82%D1%83%D0%B2%D0%B0%D1%87:(.+?)$/) //uk
			|| url.pathname.match(/\/wiki\/%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1:(.+?)$/) //fa
			|| url.pathname.match(/\/wiki\/%EC%82%AC%EC%9A%A9%EC%9E%90:(.+?)$/) //ko
			|| url.pathname.match(/\/wiki\/%E7%94%A8%E6%88%B6:(.+?)$/); //zh-classical

		if ( username ) {
			return decodeURIComponent( username[ 1 ].replace( /_/g, " " ) );
		}
		return null;
	}

	function done() {
		$users.each( function ( _i, el ) {
			var username = getUsername( $( el ).attr( "href" ) );
			if ( username ) {
				// eslint-disable-next-line no-jquery/no-each-util
				$.each( rightsMap.get( username ) || [], function ( _gi, group ) {
					$( el ).append( "<sup class=\"markrights markrights-" + group + "\"></sup>" );
				} );
			}
		} );
	}
	function gDone() {
		$users.each( function ( _i, el ) {
			var username = getUsername( $( el ).attr( "href" ) );
			if ( username ) {
				// eslint-disable-next-line no-jquery/no-each-util
				$.each( gRightsMap.get( username ) || [], function ( _gi, group ) {
					$( el ).append( "<sup class=\"markrights markrights-global markrights-" + group + "\"></sup>" );
				} );
			}
		} );
	}

	function process( data ) {
		var user;
		if ( data.query && data.query.users ) {
			user = data.query.users;
		} else {
			user = [];
		}
		for ( var j = 0; j < user.length; j++ ) {
			var u = user[ j ];
			if ( u.groups ) {
				u.groups = u.groups.filter( function ( group ) {
					return [ "*", "user", "steward" /* 意外? */ ].indexOf( group ) === -1;
				} );
				rightsMap.set( u.name, u.groups );
			}
		}

		n--;
		if ( n <= 0 ) {
			done();
		}
	}
	function gProcess( data ) {
		var user;

		if ( data.query && data.query.globaluserinfo ) {
			user = data.query.globaluserinfo;
			gRightsMap.set( user.name, user.groups || [] );
		}

		gi--;
		if ( gi <= 0 ) {
			gDone();
		}
	}

	function markUG() {
		// eslint-disable-next-line no-jquery/no-global-selector
		$users = $( "a.mw-userlink:not(.mw-anonuserlink)" );
		users = {};
		$users.each( function ( index, link ) {
			users[ link.textContent ] = true;
		} );

		queue1 = [];
		queue2 = [];
		i = 0;
		n = 0;
		for ( var user in users ) {
			if ( rightsMap.exists( user ) ) {
				delete users[ user ];
				continue;
			}
			queue1.push( user );
			gi++;
			i++;
			if ( i === 50 ) {
				queue2.push( queue1 );
				queue1 = [];
				n++;
				i = 0;
			}
		}
		if ( queue1.length > 0 ) {
			queue2.push( queue1 );
			n++;
		}

		if ( queue2.length ) {
			for ( var j = 0; j < queue2.length; j++ ) {
				api.get( {
					format: "json",
					action: "query",
					list: "users",
					usprop: "groups",
					ususers: queue2[ j ].join( "|" )
				} ).done( process );
			}
		} else {
			done();
		}

		if ( processGlobal === null ) {
			api.get( {
				format: "json",
				action: "query",
				meta: "globaluserinfo"
			} ).done( function ( data ) {

				if ( data.query && data.query.globaluserinfo ) {
					processGlobal = true;
					
					window.globalRightsMap = gRightsMap;

					gi++;
					gProcess( data );

					if ( gi ) {
						for ( var gu in users ) {
							if ( gu === mw.config.get( "wgUserName" ) ) {
								gi--;
								continue;
							} else {
								api.get( {
									format: "json",
									action: "query",
									meta: "globaluserinfo",
									guiuser: gu,
									guiprop: "groups"
								} ).done( gProcess );
							}
						}
					}
				} else {
					processGlobal = false;
				}
			} );
		} else if ( processGlobal ) {
			if ( !gi ) {
				gDone();
				return;
			}
			for ( var gu in users ) {
				if ( gu === mw.config.get( "wgUserName" ) ) {
					gi--;
					continue;
				} else {
					api.get( {
						format: "json",
						action: "query",
						meta: "globaluserinfo",
						guiuser: gu,
						guiprop: "groups"
					} ).done( gProcess );
				}
			}
		}
	};

	if ( mw.config.get( "wgDiffNewId" ) || mw.config.get( "wgDiffOldId" ) ) {
		// 啟用「互動式瀏覽歷史」,切換差異時重新標記
		mw.hook( "wikipage.diff" ).add( function () { // Reload alongside the revision slider
			markUG();
		} );
	} else if ( [ "Recentchanges", "Recentchangeslinked", "Watchlist" ].indexOf( mw.config.get( "wgCanonicalSpecialPageName" ) ) !== -1 ) {
		// 近期/相關變更更新時重新標記
		mw.hook( "wikipage.content" ).add( function ( element ) {
			if ( element.hasClass( "mw-changeslist" ) ) {
				markUG();
			}
		} );
		markUG();
	} else {
		markUG();
	}
} );
//</syntaxhighlight>
Cookies help us deliver our services. By using our services, you agree to our use of cookies.