MediaWiki:Gadget-markadmins.js

Материал из Викитеки — свободной библиотеки

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

  • 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.
// Список юзеров с флагами: [[MediaWiki:Gadget-markadmins.json]]
// скопировано с https://ru.wikipedia.org/wiki/MediaWiki:Gadget-markadmins.js
(function () {

/*
	Следующие данные следует заполнять в
	https://ru.wikipedia.org/wiki/MediaWiki:Gadget-markadmins.json:
	 • userSet — списки участников для каждого флага;
	 • users_talkLinkOnly — участники, у которых в подписи стоит только ссылка на обсуждение
	   участника.
 */

var userSetTips = {
	'A' : 'администраторы',
	'B' : 'бюрократы',
	'C' : 'проверяющие участников',
	'E' : 'инженеры',
	'F' : 'администраторы интерфейса',
	'I' : 'подводящие итоги',
	'O' : 'ревизоры',
	'K' : 'клерки',
	'T' : 'доступ к VRTS',
	'Ar': 'арбитры'
};

function trim(s) {
	return s.trim();
}

function processLink(link, userSet, userSetTips) {
	if (
		!link.parentNode ||
		(/[?#]/.test(link.href) && link.href.indexOf('redlink=1') === -1) ||
		(link.parentElement && link.parentElement.classList.contains('cancelLink'))
	) {
		return;
	}

	var matches = /^(?:Участни(?:к|ца)|User):(.+)|Обсуждение участни(?:ка|цы):(.+)/
		.exec(link.title);
	if (!matches) return;

	if (matches[2] && users_talkLinkOnly && users_talkLinkOnly.indexOf(matches[2]) !== -1) {
		if (
			link.parentNode.classList.contains('mw-usertoollinks') ||
			/обс/i.test(link.textContent)
		) {
			return;
		}
		matches[1] = matches[2];
	} else if (!matches[1]) {
		return;
	}

	var user;
	try {
		user = decodeURIComponent(matches[1]);
	} catch (e) {
		// Например, https://ru.wikipedia.org/wiki/Википедия:Запросы_к_администраторам/Архив/2020/09
		return;
	}
	if (link.href.indexOf('redlink=1') !== -1) {
		user = user.replace(/ \([^\)]+\)$/, '');
	}

	var flags = [];
	var tips = [];
	for (var flag in userSet) {
		if (userSet[flag].indexOf(user) !== -1 && userSetTips[flag]) {
			flags.push(flag);
			tips.push(userSetTips[flag]);
		}
	}
	if (!flags.length) return;

	var tipsString = ' (' + tips.join(', ') + ')';

	// Без jQuery здесь общее ускорение вдвое.
	var wrapper = document.createElement('span');
	wrapper.className = 'userflags-wrapper';
	wrapper.title = tipsString;
	wrapper.textContent = '(' + flags.join(',') + ')';

	link.parentNode.insertBefore(wrapper, link.nextSibling);
	link.title = link.title + tipsString;
}

function processLinks($content, userSet, userSetTips) {
	$content
		.find('a[title^="Участни"], a[title^="Обсуждение участни"], a[title^="User:"]')
		.each(function (i, link) {
			processLink(link, userSet, userSetTips);
		});
}

function markadmins($content, customUserSet, customUserSetTips) {
	if (!$content.length) return;

	if (customUserSet) {
		processLinks($content, customUserSet, customUserSetTips);
	} else {
		jsonRequest.done(function (res) {
			if (!res) return;

			var userSet = res.userSet;
			for (var flag in userSet) {
				userSet[flag] = userSet[flag].map(trim);
			}
			users_talkLinkOnly = res.users_talkLinkOnly;
			processLinks($content, userSet, userSetTips);
		});
	}
}

var jsonRequest = $.getJSON(mw.util.wikiScript(), {
	title: 'MediaWiki:Gadget-markadmins.json',
	action: 'raw'
});
var users_talkLinkOnly;
mw.hook('wikipage.content').add(markadmins);
mw.hook('global.userlinks').add(markadmins);

// Для https://ru.wikipedia.org/wiki/User:Dibot/pat.js
window.markadmins = markadmins;

}());