User:Ericliu1912/MarkRights.js
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/*
*
* 修改自
* https://zh.wikipedia.org/w/index.php?title=MediaWiki:Gadget-MarkRights.js
* 在近期變更 、監視清單、頁面歷史等地標示使用者權限
*
*/
$( function () {
mw.loader.load( "//meta.wikimedia.org/w/index.php?title=User:Ericliu1912/global.css&action=raw&ctype=text/css", "text/css" );
/**
* @type {mw.Map<Record<string, string[]>>}
*/
var rightsMap = new mw.Map();
/**
* @type {mw.Map<Record<string, string[]>>}
*/
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, " " );
}
username = url.pathname.match( /\/User:(.+?)$/ );
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();
}
} );