Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Internet Explorer / Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
  • Opera: Нажмите Ctrl+F5.
// 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' : 'проверяющий участников',
        'I' : 'администратор интерфейса',
        'O' : 'ревизор',
};

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);
                                }
                        }
                }
        }

	$.getJSON(mw.util.wikiScript(), {
		title: 'MediaWiki:Gadget-markadmins.json',
		action: 'raw'
	}).done(function (ans) {
		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 && 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);

}());