|
|
Line 1: |
Line 1: |
| $( function () {
| | // 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]] |
| mw.loader.load( "//meta.wikioasis.org/w/index.php?title=User:Bosco/MarkRights.css&action=raw&ctype=text/css", "text/css" );
| | // For attribution: [[MediaWiki:Gadget-markadmins.js]] |
| | (function () { |
|
| |
|
| var rightsMap = new mw.Map();
| | var userSet; |
| var gRightsMap = new mw.Map();
| |
|
| |
|
| window.rightsMap = rightsMap; | | var userSetTips = { |
| | 'A' : 'administrator', |
| | 'B' : 'bureaucrat', |
| | 'CU': 'checkuser', |
| | 'IA': 'interface administrator', |
| | 'OS': 'oversight', |
| | 'Rb': 'rollback', |
| | 'S' : 'steward', |
| | 'SA': 'system administrator', |
| | 'TS': 'trust and safety', |
| | }; |
|
| |
|
| var $users; | | function addCSS(css) { |
| var users; | | var styleElem = document.createElement('style'); |
| | styleElem.appendChild(document.createTextNode(css)); |
| | document.getElementsByTagName('head')[0].appendChild(styleElem); |
| | } |
|
| |
|
| var queue1 = [];
| | function markadmins($content) { |
| var queue2 = [];
| | if (!$content.length) return; |
| var i = 0, n = 0;
| | runNum++; |
| var gi = 0;
| | if (runNum === 1) { |
| | | addCSS( |
| var api = new mw.Api();
| | 'tt.userflags { color:#0645ad; }' + |
| | | '.userflags-wrapper { -moz-user-select:none; }' + |
| var processGlobal = null;
| | '.userflags-none { display: none; }' |
| | | ); |
| 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() { | | var $links = $content.find('a[title^="User"], a[title^="Talk"]'); |
| $users.each( function ( _i, el ) {
| | |
| var username = getUsername( $( el ).attr( "href" ) );
| | if (runNum === 2) { |
| if ( username ) {
| | if ($links.length === prevLinksCount) { |
| // eslint-disable-next-line no-jquery/no-each-util
| | return; |
| $.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 { |
| user = []; | | if ($links.length > prevLinksCount) { |
| }
| | $links = $links.slice(prevLinksCount); |
| for ( var j = 0; j < user.length; j++ ) {
| | } else { |
| var u = user[ j ];
| | var msg = 'MediaWiki:Gadget-markadmins.js: Нестандартная ситуация: количество ссылок на втором проходе (' + $links.length + ') меньше, чем на первом (' + prevLinksCount + '). Снова обходим все ссылки.'; |
| if ( u.groups ) { | | if (console.info) { |
| u.groups = u.groups.filter( function ( group ) { | | console.info(msg); |
| return [ "*", "user", "steward" /* 意外? */ ].indexOf( group ) === -1; | | } else { |
| } ); | | console.log(msg); |
| rightsMap.set( u.name, u.groups );
| | } |
| } | | } |
| }
| |
|
| |
| n--;
| |
| if ( n <= 0 ) {
| |
| done();
| |
| } | | } |
| } | | } |
| function gProcess( data ) {
| |
| var user;
| |
|
| |
|
| if ( data.query && data.query.globaluserinfo ) {
| | new mw.Api().get({ |
| user = data.query.globaluserinfo;
| | action: 'query', |
| gRightsMap.set( user.name, user.groups || [] ); | | list: 'allusers', |
| | 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]] = []; |
| } | | } |
| | | |
| gi--; | | for (var i = 0; i < list.length; i++) { |
| if ( gi <= 0 ) { | | for (var j = 0; j < groups.length; j++) { |
| gDone();
| | if (list[i].groups.includes(groups[j])) { |
| }
| | 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 ) { | | |
| queue2.push( queue1 );
| | $links.each(function (i, link) { |
| n++;
| | if (!link.parentNode || |
| }
| | (/[?#]/.test(link.href) && link.href.indexOf('redlink=1') === -1) || |
| | | (link.parentElement && link.parentElement.className === 'cancelLink') |
| if ( queue2.length ) {
| | ) { |
| for ( var j = 0; j < queue2.length; j++ ) { | | return; |
| api.get( { | |
| format: "json",
| |
| action: "query",
| |
| list: "users",
| |
| usprop: "groups",
| |
| ususers: queue2[ j ].join( "|" )
| |
| } ).done( process ); | |
| } | | } |
| } else {
| | |
| done(); | | var matches, user, flags = [], tips = [], flag; |
| }
| | matches = /^User:(.+)|Talk:(.+)/.exec(link.title); |
| | | if (!matches) return; |
| if ( processGlobal === null ) {
| | if (matches[2]) { |
| api.get( { | | if ($(link).parent().hasClass('mw-usertoollinks') || link.textContent.match(/обс/i)) return; |
| format: "json",
| | matches[1] = matches[2]; |
| action: "query",
| | } else if (!matches[1]) { |
| 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 ) { | | |
| if ( gu === mw.config.get( "wgUserName" ) ) {
| | user = decodeURIComponent(matches[1]); |
| gi--;
| | if (link.href.indexOf('redlink=1') !== -1) { |
| continue;
| | user = user.replace(/ \([^\)]+\)$/, ''); |
| } else { | | } |
| api.get( { | | |
| format: "json",
| | for (flag in userSet) { |
| action: "query",
| | if (userSet[flag].indexOf(user) !== -1 && userSetTips[flag]) { |
| meta: "globaluserinfo",
| | flags.push(flag); |
| guiuser: gu,
| | tips.push(userSetTips[flag]); |
| 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; |
| | } |
| | |
| | var runNum = 0; |
| | var prevLinksCount; |
| | markadmins($('#mw-content-text')); |
| | mw.hook('wikipage.content').add(markadmins); |
|
| |
|
| 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>
| |