MediaWiki:Gadget-markadmins.js: различия между версиями
Содержимое удалено Содержимое добавлено
Iniquity (обсуждение | вклад) грустно, но... |
Iniquity (обсуждение | вклад) забрал исходник с ru:w:MediaWiki:Gadget-markadmins.js |
||
Строка 1: | Строка 1: | ||
// rewritten by [[m:User:Hoo man]]; 2012-08-26, adapted by [[User:Obersachse]], optimized by [[User:Jack who built the house]] |
|||
/* |
|||
(function () { |
|||
Imported from the latest version of Gadget-markadmins.js from ru.wikipedia.org. |
|||
*/ |
|||
// Следующие две переменные следует заполнять в [[MediaWiki:Gadget-markadmins.json]] |
|||
//rewritten by [[m:User:Hoo man]]; 2012-08-26, adapted by [[user:Obersachse]] |
|||
mw.loader.using('mediawiki.util', function() { |
|||
// Списки участников для каждго флага |
|||
var userSet = { |
|||
var userSet; |
|||
'A' : ['Iniquity'], |
|||
'B' : [], |
|||
// Участники, у которых в подписи стоит только ссылка на обсуждение участника |
|||
'C' : [], |
|||
var users_talkLinkOnly; |
|||
'I' : [], |
|||
'O' : [], |
|||
var userSetTips = { |
|||
'K' : [], |
|||
'A' : 'администратор', |
|||
'Ar' : [] |
|||
'B' : 'бюрократ', |
|||
'C' : 'проверяющий участников', |
|||
'E' : 'инженер', |
|||
'F' : 'администратор интерфейса', |
|||
'I' : 'подводящий итоги', |
|||
'O' : 'ревизор', |
|||
'K' : 'клерк', |
|||
'T' : 'доступ к OTRS', |
|||
'Ar': 'арбитр' |
|||
}; |
|||
function addCSS(css) { |
|||
var styleElem = document.createElement('style'); |
|||
styleElem.appendChild(document.createTextNode(css)); |
|||
document.getElementsByTagName('head')[0].appendChild(styleElem); |
|||
} |
|||
function arrayTrim(a) { |
|||
var callback = function (s) { |
|||
return s.trim(); |
|||
}; |
}; |
||
return a.map(callback); |
|||
} |
|||
function markadmins($content) { |
|||
var userSetTip = { |
|||
if (!$content.length) return; |
|||
'A':'администратор', |
|||
runNum++; |
|||
'B':'бюрократ', |
|||
if (runNum === 1) { |
|||
'C':'проверяющий участников', |
|||
addCSS( |
|||
'I':'подводящий итоги', |
|||
'tt.userflags { color:#0645ad; }' + |
|||
'O':'ревизор', |
|||
'.userflags-wrapper { -moz-user-select:none; }' + |
|||
'K':'клерк', |
|||
'.userflags-none { display: none; }' |
|||
'Ar':'арбитр'}; |
|||
); |
|||
} |
|||
// Фильтрация по свойству title ускоряет общее выполнение, кроме оочень длинных страниц, |
|||
$(document).ready(function() { |
|||
// где два селектора накладны. |
|||
mw.util.addCSS('tt.userflags {color:#0645ad}'); |
|||
var $links = $content.find('a[title^="Участни"], a[title^="Обсуждение участни"]'); |
|||
mw.util.$content.find('a').each( function(i, lnk) { |
|||
if( /[?#]/.test(lnk.href) && lnk.href.indexOf('redlink=1') === -1 ) { |
|||
// Чтобы не гонять по второму кругу, если количество ссылок на странице не изменилось. |
|||
// А при третьем выполнении гонять надо, так как его могут запускать скрипты автоматического |
|||
// обновления СН и подобные, заменяющие текст страницы. |
|||
if (runNum === 2) { |
|||
if ($links.length === prevLinksCount) { |
|||
return; |
|||
} else { |
|||
if ($links.length > prevLinksCount) { |
|||
$links = $links.slice(prevLinksCount); |
|||
} else { |
|||
var msg = 'MediaWiki:Gadget-markadmins.js: Нестандартная ситуация: количество ссылок на втором проходе (' + $links.length + ') меньше, чем на первом (' + prevLinksCount + '). Снова обходим все ссылки.'; |
|||
if (console.info) { |
|||
console.info(msg); |
|||
} else { |
|||
console.log(msg); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
$.getJSON(mw.util.wikiScript(), { |
|||
title: 'MediaWiki:Gadget-markadmins.json', |
|||
action: 'raw' |
|||
}).done(function (ans) { |
|||
if(!ans) return; |
|||
userSet = ans.userSet; |
|||
users_talkLinkOnly = ans.users_talkLinkOnly; |
|||
$links.each(function (i, link) { |
|||
if (!link.parentNode || |
|||
(/[?#]/.test(link.href) && link.href.indexOf('redlink=1') === -1) || |
|||
(link.parentElement && link.parentElement.className === 'cancelLink') |
|||
) { |
|||
return; |
return; |
||
} |
} |
||
var mm, f, user, flags, tips; |
|||
var matches, user, flags = [], tips = [], flag; |
|||
mm = /^Участни(к|ца):(.*)/.exec(lnk.title); |
|||
matches = /^Участни(?:к|ца):(.+)|Обсуждение участни(?:ка|цы):(.+)/.exec(link.title); |
|||
if( !mm ) { |
|||
if (!matches) return; |
|||
if (matches[2] && users_talkLinkOnly.indexOf(matches[2]) !== -1) { |
|||
// Редкий кейс, можно использовать более затратные функции |
|||
if ($(link).parent().hasClass('mw-usertoollinks') || link.textContent.match(/обс/i)) return; |
|||
matches[1] = matches[2]; |
|||
} else if (!matches[1]) { |
|||
return; |
return; |
||
} |
} |
||
user = decodeURIComponent(mm[2]); |
|||
user = decodeURIComponent(matches[1]); |
|||
if (lnk.className.indexOf('new') !== -1) { |
|||
if (link.href.indexOf('redlink=1') !== -1) { |
|||
user = user.replace(/ \([^\)]+\)$/,''); |
|||
user = user.replace(/ \([^\)]+\)$/, ''); |
|||
} |
} |
||
flags = []; tips = []; |
|||
for( |
for (flag in userSet) { |
||
userSet[flag] = arrayTrim(userSet[flag]); |
|||
if (userSet[flag].indexOf(user) !== -1 && userSetTips[flag]) { |
|||
flags.push(f); |
|||
flags.push(flag); |
|||
tips.push(userSetTips[flag]); |
|||
} |
} |
||
} |
} |
||
if( |
if (!flags.length) { |
||
return; |
return; |
||
} |
} |
||
tips = ' (' + tips.join(', ') + ')'; |
|||
// Без jQuery здесь общее ускорение вдвое |
|||
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; |
|||
tips = ' ('+tips.join(', ')+')'; |
|||
} |
|||
var runNum = 0; |
|||
$(lnk) |
|||
var prevLinksCount; |
|||
.after('\u00A0', '<tt class=userflags title="'+tips+'">('+flags.join(',') + ')</tt>') |
|||
markadmins($('#mw-content-text')); // Ранняя пробежка во избежание поздних скачков текста на странице |
|||
.attr('title', $(lnk).attr('title') + tips); |
|||
mw.hook('wikipage.content').add(markadmins); |
|||
}()); |
|||
}); |
|||
}); |
Версия от 17:56, 3 декабря 2020
// rewritten by [[m:User:Hoo man]]; 2012-08-26, adapted by [[User:Obersachse]], optimized by [[User:Jack who built the house]]
(function () {
// Следующие две переменные следует заполнять в [[MediaWiki:Gadget-markadmins.json]]
// Списки участников для каждго флага
var userSet;
// Участники, у которых в подписи стоит только ссылка на обсуждение участника
var users_talkLinkOnly;
var userSetTips = {
'A' : 'администратор',
'B' : 'бюрократ',
'C' : 'проверяющий участников',
'E' : 'инженер',
'F' : 'администратор интерфейса',
'I' : 'подводящий итоги',
'O' : 'ревизор',
'K' : 'клерк',
'T' : 'доступ к OTRS',
'Ar': 'арбитр'
};
function addCSS(css) {
var styleElem = document.createElement('style');
styleElem.appendChild(document.createTextNode(css));
document.getElementsByTagName('head')[0].appendChild(styleElem);
}
function arrayTrim(a) {
var callback = function (s) {
return s.trim();
};
return a.map(callback);
}
function markadmins($content) {
if (!$content.length) return;
runNum++;
if (runNum === 1) {
addCSS(
'tt.userflags { color:#0645ad; }' +
'.userflags-wrapper { -moz-user-select:none; }' +
'.userflags-none { display: none; }'
);
}
// Фильтрация по свойству title ускоряет общее выполнение, кроме оочень длинных страниц,
// где два селектора накладны.
var $links = $content.find('a[title^="Участни"], a[title^="Обсуждение участни"]');
// Чтобы не гонять по второму кругу, если количество ссылок на странице не изменилось.
// А при третьем выполнении гонять надо, так как его могут запускать скрипты автоматического
// обновления СН и подобные, заменяющие текст страницы.
if (runNum === 2) {
if ($links.length === prevLinksCount) {
return;
} else {
if ($links.length > prevLinksCount) {
$links = $links.slice(prevLinksCount);
} else {
var msg = 'MediaWiki:Gadget-markadmins.js: Нестандартная ситуация: количество ссылок на втором проходе (' + $links.length + ') меньше, чем на первом (' + prevLinksCount + '). Снова обходим все ссылки.';
if (console.info) {
console.info(msg);
} else {
console.log(msg);
}
}
}
}
$.getJSON(mw.util.wikiScript(), {
title: 'MediaWiki:Gadget-markadmins.json',
action: 'raw'
}).done(function (ans) {
if(!ans) return;
userSet = ans.userSet;
users_talkLinkOnly = ans.users_talkLinkOnly;
$links.each(function (i, link) {
if (!link.parentNode ||
(/[?#]/.test(link.href) && link.href.indexOf('redlink=1') === -1) ||
(link.parentElement && link.parentElement.className === 'cancelLink')
) {
return;
}
var matches, user, flags = [], tips = [], flag;
matches = /^Участни(?:к|ца):(.+)|Обсуждение участни(?:ка|цы):(.+)/.exec(link.title);
if (!matches) return;
if (matches[2] && users_talkLinkOnly.indexOf(matches[2]) !== -1) {
// Редкий кейс, можно использовать более затратные функции
if ($(link).parent().hasClass('mw-usertoollinks') || link.textContent.match(/обс/i)) return;
matches[1] = matches[2];
} else if (!matches[1]) {
return;
}
user = decodeURIComponent(matches[1]);
if (link.href.indexOf('redlink=1') !== -1) {
user = user.replace(/ \([^\)]+\)$/, '');
}
for (flag in userSet) {
userSet[flag] = arrayTrim(userSet[flag]);
if (userSet[flag].indexOf(user) !== -1 && userSetTips[flag]) {
flags.push(flag);
tips.push(userSetTips[flag]);
}
}
if (!flags.length) {
return;
}
tips = ' (' + tips.join(', ') + ')';
// Без jQuery здесь общее ускорение вдвое
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);
}());