User:Bosco/MarkRights.js: Difference between revisions

From Test Wiki
Jump to navigation Jump to search
Content deleted Content added
mNo edit summary
 
mNo edit summary
 
(One intermediate revision by the same user not shown)
Line 3: Line 3:
//from [[User:暁月凛奈/MarkRightsGlobal.js]]
//from [[User:暁月凛奈/MarkRightsGlobal.js]]
$( function () {
$( function () {
mw.loader.load( "//testwiki.wiki/w/index.php?title=User:Bosco/MarkRights.css&action=raw&ctype=text/css", "text/css" );
mw.loader.load( "//testwiki.wiki/index.php?title=User:Bosco/MarkRights.css&action=raw&ctype=text/css", "text/css" );


var rightsMap = new mw.Map();
var rightsMap = new mw.Map();
Line 88: Line 88:
} else {
} else {
user = [];
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 );
}
}
}



Latest revision as of 04:14, 30 March 2025

//<syntaxhighlight lang="javascript">
//MarkRights.js
//from [[User:暁月凛奈/MarkRightsGlobal.js]]
$( function () {
	mw.loader.load( "//testwiki.wiki/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 = [];
		}

		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>