MediaWiki:Gadget-markadmins.js: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Содержимое удалено Содержимое добавлено
ВП:ЗКА 31.07.17
− ЯцекJacek, итог по заявке участника на ВП:ЗСФ
Строка 7: Строка 7:
'C' : ['DR', 'OneLittleMouse', 'Q-bit array', 'Wulfson', 'Ле Лой'],
'C' : ['DR', 'OneLittleMouse', 'Q-bit array', 'Wulfson', 'Ле Лой'],
'E' : ['Facenapalm', 'Grain of sand', 'Iniquity', 'Jack who built the house', 'Saint Johann'],
'E' : ['Facenapalm', 'Grain of sand', 'Iniquity', 'Jack who built the house', 'Saint Johann'],
'I' : ['Alexander Roumega', 'Alexei Kopylov', 'AnimusVox', 'Apple-Coffee Well', 'Baccy', 'Carpodacus', 'Changall', 'Charmbook', 'Dimetr', 'Dmitry Rozhkov', 'Dogad75', 'Drakosh', 'Emaus', 'FlankerFF', 'Gamliel Fishkin', 'Good Will Hunting', 'Hercules63', 'Ignatus', 'Iluvatar', 'Jackie', 'Karachun', 'Krassotkin', 'Lingveno', 'Luterr', 'Max Guinness', 'Maxinvestigator', 'Meiræ', 'MisterXS', 'Neolexx', 'Oleg Yunakov', 'Oleksiy.golubov', 'Postoronniy-13', 'Qweedsa', 'Saint Johann', 'Scorpion-811', 'Vyacheslav84', 'Wanwa', 'Александр Русский', 'Викиенот', 'Дворецкий', 'Золоторёв Павел', 'НоуФрост', 'Обывало', 'Полиционер', 'Рулин', 'Уљар', 'Фил Вечеровский', 'ЯцекJacek'],
'I' : ['Alexander Roumega', 'Alexei Kopylov', 'AnimusVox', 'Apple-Coffee Well', 'Baccy', 'Carpodacus', 'Changall', 'Charmbook', 'Dimetr', 'Dmitry Rozhkov', 'Dogad75', 'Drakosh', 'Emaus', 'FlankerFF', 'Gamliel Fishkin', 'Good Will Hunting', 'Hercules63', 'Ignatus', 'Iluvatar', 'Jackie', 'Karachun', 'Krassotkin', 'Lingveno', 'Luterr', 'Max Guinness', 'Maxinvestigator', 'Meiræ', 'MisterXS', 'Neolexx', 'Oleg Yunakov', 'Oleksiy.golubov', 'Postoronniy-13', 'Qweedsa', 'Saint Johann', 'Scorpion-811', 'Vyacheslav84', 'Wanwa', 'Александр Русский', 'Викиенот', 'Дворецкий', 'Золоторёв Павел', 'НоуФрост', 'Обывало', 'Полиционер', 'Рулин', 'Уљар', 'Фил Вечеровский'],
'O' : ['Altes', 'DR', 'Vladimir Solovjev', 'Levg'],
'O' : ['Altes', 'DR', 'Vladimir Solovjev', 'Levg'],
'K' : ['Michgrig', 'Petrov Victor', 'Q-bit array', 'TenBaseT', 'Фил Вечеровский'],
'K' : ['Michgrig', 'Petrov Victor', 'Q-bit array', 'TenBaseT', 'Фил Вечеровский'],

Версия от 03:51, 12 августа 2017

// rewritten by [[m:User:Hoo man]]; 2012-08-26, adapted by [[User:Obersachse]], optimized by [[User:Jack who built the house]]
(function () {

var userSet = {
	'A' : ['91i79', 'A.Vajrapani', 'Abiyoyo', 'Alex Spade', 'Alma Pater', 'Altes', 'AndreyIGOSHEV', 'Andreykor', 'Be nt all', 'Bezik', 'Biathlon', 'Bilderling', 'Butko', 'Christian Valentine', 'CodeMonk', 'Convallaria majalis', 'Ctac', 'Deinocheirus', 'Dima st bk', 'Dinamik', 'Dmitry89', 'Dodonov', 'DonRumata', 'DR', 'Draa kul', 'Drbug', 'DZ', 'El-chupanebrej', 'Fedor Babkin', 'GAndy', 'Ghuron', 'Grebenkov', 'Infovarius', 'INSAR', 'Insider', 'JukoFF', 'Kalan', 'Melirius', 'Michgrig', 'Mihail Lavrov', 'Mitrius', 'NBS', 'Neon', 'Niklem', 'OneLittleMouse', 'Petrov Victor', 'Putnik', 'Q-bit array', 'Sealle', 'SerSem', 'Shakko', 'ShinePhantom', 'Sigwald', 'Tatewaki', 'TenBaseT', 'Testus', 'Track13', 'Victoria', 'Vlsergey', 'Volkov', 'Wanderer777', 'Well-Informed Optimist', 'WindEwriX', 'Wulfson', 'Zanka', 'АлександрВв', 'Андрей Романенко', 'Джекалоп', 'Йо Асакура', 'Ле Лой', 'Мастер теней', 'Тара-Амингу', 'Томасина'],
	'B' : ['Adavyd', 'Lazyhawk', 'Levg', 'Rubin16', 'Sir Shurf', 'Vladimir Solovjev'],
	'C' : ['DR', 'OneLittleMouse', 'Q-bit array', 'Wulfson', 'Ле Лой'],
	'E' : ['Facenapalm', 'Grain of sand', 'Iniquity', 'Jack who built the house', 'Saint Johann'],
	'I' : ['Alexander Roumega', 'Alexei Kopylov', 'AnimusVox', 'Apple-Coffee Well', 'Baccy', 'Carpodacus', 'Changall', 'Charmbook', 'Dimetr', 'Dmitry Rozhkov', 'Dogad75', 'Drakosh', 'Emaus', 'FlankerFF', 'Gamliel Fishkin', 'Good Will Hunting', 'Hercules63', 'Ignatus', 'Iluvatar', 'Jackie', 'Karachun', 'Krassotkin', 'Lingveno', 'Luterr', 'Max Guinness', 'Maxinvestigator', 'Meiræ', 'MisterXS', 'Neolexx', 'Oleg Yunakov', 'Oleksiy.golubov', 'Postoronniy-13', 'Qweedsa', 'Saint Johann', 'Scorpion-811', 'Vyacheslav84', 'Wanwa', 'Александр Русский', 'Викиенот', 'Дворецкий', 'Золоторёв Павел', 'НоуФрост', 'Обывало', 'Полиционер', 'Рулин', 'Уљар', 'Фил Вечеровский'],
	'O' : ['Altes', 'DR', 'Vladimir Solovjev', 'Levg'],
	'K' : ['Michgrig', 'Petrov Victor', 'Q-bit array', 'TenBaseT', 'Фил Вечеровский'],
	'Ar': ['Sir Shurf', 'AndyVolykhov', 'Alexei Kopylov', 'Mihail Lavrov', 'Акутагава', 'Biathlon', 'Zanka']
};

// Участники, у которых в подписи стоит только ссылка на обсуждение участника
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; }\
		');
	}

	// Фильтрация по свойству 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);
				}
			}
		}
	}

	$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).text().indexOf('обс') !== -1) 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);

}());