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

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
грустно, но...
забрал исходник с 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( f in userSet ) {
for (flag in userSet) {
if($.inArray( user, userSet[f] ) !== -1 ){
userSet[flag] = arrayTrim(userSet[flag]);
if (userSet[flag].indexOf(user) !== -1 && userSetTips[flag]) {
flags.push(f);
tips.push(userSetTip[f]);
flags.push(flag);
tips.push(userSetTips[flag]);
}
}
}
}
if( !flags.length ) {
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);

}());