Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

User:Bosco/MarkRights.js: Difference between revisions

From WikiOasis Meta
mNo edit summary
Tag: Reverted
mNo edit summary
 
(One intermediate revision 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]] & [[User:Bosco]]
$( 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',
'AP' : 'autopatrolled',
'B' : 'bureaucrat',
'C' : 'confirmed',
'CU': 'checkuser',
'IA': 'interface administrator',
'IPBE' : 'IP block exempt',
'OS': 'suppress',
'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|autopatrolled|bureaucrat|confirmed|checkuser|interface-admin|ipblock-exempt|suppress|rollback|steward|sysadmin|trustandsafety',
auprop: 'groups',
aulimit: 500,
format: 'json',
formatversion: 2
}).done(function(ans) {
var list = ans.query.allusers,
groups = ['sysop', 'autopatrolled', 'bureaucrat', 'confirmed', 'checkuser', 'ipblock-exempt', 'interface-admin', 'suppress', 'rollback', 'steward', 'sysadmin', 'trustandsafety'],
key = ['A', 'AP', 'B', 'C', 'CU', 'IA', 'IPBE', '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>
Cookies help us deliver our services. By using our services, you agree to our use of cookies.