MediaWiki:Gadget-markadmins.js: различия между версиями
Перейти к навигации
Перейти к поиску
Содержимое удалено Содержимое добавлено
Vlsergey (обсуждение | вклад) Для возможности редактирования не-инженерами |
Vlsergey (обсуждение | вклад) +ctype |
||
Строка 59: | Строка 59: | ||
$.get(mw.util.wikiScript(), { |
$.get(mw.util.wikiScript(), { |
||
title: 'Википедия:Gadget-markadmins.json', |
title: 'Википедия:Gadget-markadmins.json', |
||
action: 'raw' |
action: 'raw', |
||
ctype: 'application/json' |
|||
}).done(function (data) { |
}).done(function (data) { |
||
var ans = JSON.parse(data); |
var ans = JSON.parse(data); |
Версия от 19:48, 1 августа 2018
// rewritten by [[m:User:Hoo man]]; 2012-08-26, adapted by [[User:Obersachse]], optimized by [[User:Jack who built the house]]
(function () {
var userSet;
// Участники, у которых в подписи стоит только ссылка на обсуждение участника
var users_talkLinkOnly;
var userSetTips = {
'A' : 'администратор',
'B' : 'бюрократ',
'C' : 'проверяющий участников',
'E' : 'инженер',
'I' : 'подводящий итоги',
'O' : 'ревизор',
'K' : 'клерк',
'Ar': 'арбитр'
};
function addCSS(css) {
var styleElem = document.createElement('style');
styleElem.appendChild(document.createTextNode(css));
document.getElementsByTagName('head')[0].appendChild(styleElem);
}
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);
}
}
}
}
$.get(mw.util.wikiScript(), {
title: 'Википедия:Gadget-markadmins.json',
action: 'raw',
ctype: 'application/json'
}).done(function (data) {
var ans = JSON.parse(data);
userSet = ans.userSet;
users_talkLinkOnly = ans.users_talkLinkOnly;
$links.each(function (i, link) {
if (/[?#]/.test(link.href) && link.href.indexOf('redlink=1') === -1 ||
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) {
if ($.inArray(user, userSet[flag]) !== -1) {
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);
}());