Benutzerin:Freddy2001/extratabs.js

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
//Kopie von [[Benutzer:Schnark/js/extratabs.js]], gekürzt.
//Dokumentation unter [[Benutzer:Schnark/js/extratabs]] <nowiki>
/*global mediaWiki*/
(function ($, mw) {
"use strict";
var data = {

//Variablen
action: '', //Aktion
script: '', //URL zum Skript
labs: 'https://tools.wmflabs.org/',
user: '', //Benutzername
realPage: { //tatsächliche Seite
	page: '', //Titel mit Namensraum (Unterstriche)
	title: '', //Titel ohne Namensraum (Leerzeichen)
	href: '', //URL
	ns: 0, //Namensraum (Nummer)
	id: '' //ID der Seite / kanonischer Spezialseitenname
},
relevantPage: { //evt. abweichend Seite, auf die sich aktuelle Spezialseite bezieht
	page: '',
	title: '',
	user: '', //Benutzername (falls sich Seite auf einen Benutzer bezieht)
	ns: 0,
	id: ''
},
project: {
	server: '', //Hostname
	lang: '', //Sprachecode des Projekts oder commons/meta
	project: '', //Typ des Projekts (wikipedia, wikibooks, ..., wikimedia/wikidata/mediawiki)
	projectShort: '', //Typ des Projekts (wiki, wikibooks, ...), dbname ist lang + projectShort
	dbname: '', //Datenbankname (ohne _p)
	special: false //Spezialwiki: Commons, Meta, Wikidata, Mediawiki
},
lang: {
	user: '',
	userFallback: '',
	site: '',
	page: '',
	model: ''
}
},
/*jshint camelcase: false*/
//jscs:disable requireCamelCaseOrUpperCaseIdentifiers

//entfernt, in der Hoffnung, dass es irgendwann Ersatz gibt:

//familiar: http://toolserver.org/~cyroxx/familiar/familiar.php
//gallery: https://tools.wmflabs.org/wikisense/Gallery.php
//geburtstag: http://toolserver.org/~luxo/Geburtstag.php
//orphanimages: https://tools.wmflabs.org/wikisense/OrphanImages.php
//reverselanglinks: http://toolserver.org/~merl/reverselanglinks/query.php
//smallwikisrc: http://toolserver.org/smallwikisrc/rcs
//untaggedimages: https://tools.wmflabs.org/wikisense/UntaggedImages.php
//userpages: http://toolserver.org/~merl/UserPages/Changes/
//userregfinder: http://toolserver.org/userregfinder/finder

copyvios = function () {
	return {
		url: data.labs + 'copyvios',
		param: {lang: data.project.lang, project: data.project.project, title: data.relevantPage.page},
		example: 'article',
		name: {de: 'URV-Test', en: 'Copyvio test'},
		tooltip: {de: 'Prüft, ob die Seite eine Urheberrechtsverletzung aus dem Internet sein könnte',
			en: 'Test whether this page could be a copyright violation from the internet'}
	};
},

filters = {
	disabled: function () {
		return false;
	},

	action: function (a) {
		return data.action === a;
	},
	action_edit: function () {
		return data.action === 'edit' || data.action === 'submit';
	},

	special: function (s) {
		return data.realPage.ns === -1 &&
			(s === undefined || data.realPage.id.toString().toLowerCase() === s);
	},
	special_booksources: function () {
		return data.realPage.id.toString().toLowerCase() === 'booksources' && !!data.relevantPage.id;
	},
	special_contributions: function () {
		return data.realPage.id.toString().toLowerCase() === 'contributions' && !!data.relevantPage.user;
	},
	special_upload: function () {
		return data.realPage.id.toString().toLowerCase() === 'upload' ||
			data.realPage.id.toString().toLowerCase() === 'uploadwizard';
	},

	ns: function (ns) {
		return String(data.relevantPage.ns) === ns;
	},
	ns_special: function () {
		return data.relevantPage.ns === -1;
	},
	ns_main: function () {
		return data.relevantPage.ns === 0 || data.relevantPage.ns === 1;
	},
	ns_user: function () {
		return data.relevantPage.ns === 2 || data.relevantPage.ns === 3;
	},
	ns_project: function () {
		return data.relevantPage.ns === 4 || data.relevantPage.ns === 5;
	},
	ns_file: function () {
		return data.relevantPage.ns === 6 || data.relevantPage.ns === 7;
	},
	ns_mediawiki: function () {
		return data.relevantPage.ns === 8 || data.relevantPage.ns === 9;
	},
	ns_template: function () {
		return data.relevantPage.ns === 10 || data.relevantPage.ns === 11;
	},
	ns_help: function () {
		return data.relevantPage.ns === 12 || data.relevantPage.ns === 13;
	},
	ns_category: function () {
		return data.relevantPage.ns === 14 || data.relevantPage.ns === 15;
	},
	ns_portal: function () {
		return data.relevantPage.ns === 100 || data.relevantPage.ns === 101;
	},
	ns_talk: function () {
		return data.relevantPage.ns % 2 === 1;
	},

	is_user: function () {
		return !!data.relevantPage.user;
	},
	is_ip: function () {
		return mw.util.isIPAddress(data.relevantPage.user);
	}
},

config = [
	['ns_0', 'copyvios', 'p-tb'],
	
],


hasOwn = Object.prototype.hasOwnProperty;

/*jshint camelcase: true*/
//jscs:enable requireCamelCaseOrUpperCaseIdentifiers

function initvars () {
	data.action = mw.config.get('wgAction');
	data.script = mw.config.get('wgServer') + mw.config.get('wgScript');
	data.user = mw.config.get('wgUserName');
	data.realPage = {
		page: mw.config.get('wgPageName'),
		title: mw.config.get('wgTitle'),
		href: location.href,
		ns: mw.config.get('wgNamespaceNumber'),
		id: mw.config.get('wgCanonicalSpecialPageName') || mw.config.get('wgArticleId')
	};
	data.relevantPage.page = mw.config.get('wgRelevantPageName');
	data.relevantPage.user = mw.config.get('wgRelevantUserName', '');
	data.relevantPage.id = mw.config.get('wgRelevantArticleId') || data.realPage.id;
	if (data.relevantPage.page.indexOf(':') === -1) {
		data.relevantPage.ns = 0;
	} else {
		data.relevantPage.ns = mw.config.get('wgNamespaceIds')[
			data.relevantPage.page.replace(/:.*/, '').toLowerCase()
		] || 0;
	}
	data.relevantPage.title = data.relevantPage.page.replace(/_/g, ' ');
	if (data.relevantPage.ns !== 0) {
		data.relevantPage.title = data.relevantPage.title.replace(/.*?:/, '');
	}
	if (data.realPage.id === 'Booksources') {
		data.relevantPage.id = (
			(data.realPage.title.indexOf('/') > -1 ? data.realPage.title.replace(/.*\//, '') : '') ||
				mw.util.getParamValue('isbn') ||
				''
			).toUpperCase().replace(/[^0-9X]/g, '');
	}
	data.project.server = location.hostname;
	data.project.dbname = mw.config.get('wgDBname');
	var match = (/^(.*)(wiki(?:books|news|quote|source|versity|voyage)?|wiktionary)$/).exec(data.project.dbname);
	if (match) {
		data.project.lang = match[1].replace(/_/g, '-');
		data.project.projectShort = match[2];
	} else { //sollte nicht passieren
		mw.log.warn('Unerkannter Datenbankname: ' + data.project.dbname);
		data.project.lang = data.project.dbname.replace(/wik.+$/, '').replace(/_/g, '-');
		data.project.projectShort = data.project.dbname.replace(/^.+wik/, 'wik');
	}
	data.project.project = data.project.projectShort;
	if (data.project.project === 'wiki') {
		switch (data.project.lang) {
		case 'commons':
		case 'meta':
			data.project.project = 'wikimedia';
			data.project.special = true;
			break;
		case 'mediawiki':
		case 'wikidata':
			data.project.project = data.project.lang;
			data.project.lang = 'en';
			data.project.special = true;
			break;
		default:
			data.project.project = 'wikipedia';
		}
	}
	data.lang = {
		user: mw.config.get('wgUserLanguage'),
		site: mw.config.get('wgContentLanguage'),
		page: mw.config.get('wgPageContentLanguage') || mw.config.get('wgContentLanguage'),
		model: mw.config.get('wgPageContentModel', 'wikitext')
	};
	if (data.lang.site === 'simple') {
		data.lang.site = 'en';
	}
	if (data.lang.page === 'simple') {
		data.lang.page = 'en';
	}
	if (data.lang.user.indexOf('de-') === 0) {
		data.lang.userFallback = 'de'; //de-AT etc.
	} else {
		data.lang.userFallback = data.lang.user;
	}
}

//Hilfsfunktionen
function addPortlet (target, data) {
	if (data.only === false || data.disabled) {
		return false;
	}
	var url = data.param ? getUrl(data.url, data.param) : data.url,
		name = getTranslation(data.name),
		tooltip = getTranslation(data.tooltip),
		portlet = mw.util.addPortletLink(target, url, name, 'ca-' + name.replace(/[^a-zA-Z0-9]/g, '-'), tooltip);
	if (data.selection) {
		$(portlet).mouseenter(updateWithSelection);
	}
	if (data.onclick) {
		$(portlet).click(data.onclick);
	}
	return true;
}

function check (cond) {
	var not = false, ret = false, fun, par;
	if (cond === '') {
		return true;
	}
	if (cond.indexOf('!') === 0) {
		not = true;
		cond = cond.slice(1);
	}
	if ($.isFunction(filters[cond])) {
		ret = filters[cond]();
	} else {
		fun = cond.replace(/_.*$/, '');
		par = cond.replace(/^[^_]*_/, '');
		if ($.isFunction(filters[fun])) {
			ret = filters[fun](par);
		}
	}
	return not ? !ret : ret;
}
function checkAll (cond) {
	if (typeof cond === 'string') {
		return check(cond);
	}
	for (var i = 0; i < cond.length; i++) {
		if (!check(cond[i])) {
			return false;
		}
	}
	return true;
}

function addTool (tool) {
	var i, t;
	if (checkAll(tool[0])) {
		t = $.isArray(tool[1]) ? tool[1] : [tool[1]];
		for (i = 0; i < t.length; i++) {
			if ($.isFunction(tools[t[i]]) && addPortlet(tool[2] || 'p-cactions', tools[t[i]]())) {
				return true;
			}
		}
	}
	return false;
}
function addTools () {
	for (var i = 0; i < config.length; i++) {
		addTool(config[i]);
	}
	fixArtikelStatistik();
}

function fixArtikelStatistik () {
	//ich will den zusätzlichen Eintrag aus [[Benutzer:Schnark/js/artikel-statistik.js]] ganz am Ende
	var $li = $('#ca-schnark-articleStat');
	if ($li.length === 1 && !$li.is(':last-child')) {
		$li.parent().append($li);
	}
}

//bestimmt die beste Sprache für den Benutzer aus einer Liste
function chooseUserLang (from) {
	var all = [
		data.lang.user,
		data.lang.userFallback
	].concat(mw.language.getFallbackLanguageChain()), i;
	for (i = 0; i < all.length; i++) {
		if ($.inArray(all[i], from) !== -1) {
			return all[i];
		}
	}
	return from[0];
}

function getTranslation (l10n) {
	var i, chain = mw.language.getFallbackLanguageChain();
	for (i = 0; i < chain.length; i++) {
		if (hasOwn.call(l10n, chain[i])) {
			return l10n[chain[i]];
		}
	}
	return l10n.en || '???';
}

function getUrl (path, query) {
	return path + '?' + $.param(query).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29')
		.replace(/\*/g, '%2A').replace(/~/g, '%7E').replace(/%3A/g, ':').replace(/%2F/g, '/');
}

function updateWithSelection () {
	/*jshint validthis: true*///Event-Handler
	var $a = $(this), href;
	if (!$a.is('a')) {
		$a = $a.find('a:first');
	}
	href = $a.attr('href') || '';
	if (/^(?:https?:)?\/\//.test(href)) {
		//\= statt =, um JSHint glücklich zu machen
		$a.attr('href', href.replace(/\=[^=]*$/, function () {
			return '=' + encodeURIComponent(getSelection()); //Funktion, nötig falls markierter Text $ enthält
		}));
	}
	return;
}

function getSelection () {
	var selectedText = '';
	if (window.getSelection) {
		selectedText = window.getSelection();
	} else if (document.getSelection) {
		selectedText = document.getSelection();
	} else if (document.selection && document.selection.createRange) {
		selectedText = document.selection.createRange().text || '';
	}
	if (!selectedText && document.activeElement && document.activeElement.selectionEnd) {
		selectedText = document.activeElement.value.slice(document.activeElement.selectionStart,
			document.activeElement.selectionEnd);
	}
	return selectedText;
}

function getExample (tool) {
	var name = mw.html.element('code', {}, tool), example, orig, result;
	if (!$.isFunction(tools[tool])) {
		return name + ' nicht vorhanden';
	}
	example = examples[tools[tool]().example];
	if (!example) {
		return name + ' ohne Beispiel';
	}
	orig = $.extend(true, {}, data);
	$.extend(true, data, example);
	tool = tools[tool]();
	if (tool.only === false) {
		result = name + ' nicht anwendbar';
	} else {
		result = tool.param ? getUrl(tool.url, tool.param) : tool.url;
		if (tool.selection) {
			result += example.selection;
		}
		result = mw.html.element('a', {href: result}, new mw.html.Raw(name));
		if (tool.disabled) {
			result += ' deaktiviert: ' + tool.disabled;
		}
	}
	data = orig;
	return result;
}

function getExamples () {
	var tool, list = [];
	for (tool in tools) {
		if (hasOwn.call(tools, tool)) {
			list.push('<li>' + getExample(tool) + '</li>');
		}
	}
	return '<ul>' + list.join('') + '</ul>';
}

function maintain () {
	var allDefinedTools = [], allToolsNeedingMaint = [], allUsedTools = [],
		allMissingTools = [], allUnusedTools = [], name, tool, i, msg;

	function format (list, text) {
		if (list.length === 0) {
			return '';
		}
		return text + ':\n* ' + list.join('\n* ') + '\n';
	}

	for (name in tools) {
		if (hasOwn.call(tools, name)) {
			allDefinedTools.push(name);
			tool = tools[name]();
			if (tool.disabled) {
				allToolsNeedingMaint.push(name + ' (' + tool.disabled + ')');
			}
		}
	}
	for (i = 0; i < config.length; i++) {
		if ($.isArray(config[i][1])) {
			allUsedTools = allUsedTools.concat(config[i][1]);
		} else {
			allUsedTools.push(config[i][1]);
		}
	}
	for (i = 0; i < allDefinedTools.length; i++) {
		if ($.inArray(allDefinedTools[i], allUsedTools) === -1) {
			allUnusedTools.push(allDefinedTools[i]);
		}
	}
	for (i = 0; i < allUsedTools.length; i++) {
		if ($.inArray(allUsedTools[i], allDefinedTools) === -1) {
			allMissingTools.push(allUsedTools[i]);
		}
	}

	msg = [
		format(allToolsNeedingMaint, 'Tools, die Wartung benötigen'),
		format(allMissingTools, 'Fehlende Tools'),
		format(allUnusedTools, 'Unbenutzte Tools')
	].join('\n');
	window.alert(msg);
	return msg;
}

function add (tool, cond, place) {
	var entry = [cond || '', tool];
	if (place) {
		entry.push(place);
	}
	config.push(entry);
}

function doForTool (tool, func) {
	var i, j;
	for (i = 0; i < config.length; i++) {
		if ($.isArray(config[i][1])) {
			j =  $.inArray(tool, config[i][1]);
			if (j > -1) {
				func(i, j);
			}
		} else {
			if (config[i][1] === tool) {
				func(i);
			}
		}
	}
}

function enable (tool) {
	doForTool(tool, function (i) {
		if ($.isArray(config[i][0])) {
			if (config[i][0][0] === 'disabled') {
				config[i][0].shift();
			}
		} else {
			if (config[i][0] === 'disabled') {
				config[i][0] = '';
			}
		}
	});
}

function remove (tool) {
	doForTool(tool, function (i, j) {
		if (j !== undefined) {
			config[i][1][j] = '';
		} else {
			config[i][1] = '';
		}
	});
}

function replace (tool1, tool2) {
	doForTool(tool1, function (i, j) {
		if (j !== undefined) {
			config[i][1].unshift(tool2);
		} else {
			config[i][1] = [tool2, config[i][1]];
		}
	});
}

function defineTool (name, tool) {
	tools[name] = tool;
}

function setLang (lang) {
	data.lang.userFallback = lang;
}

mw.loader.using('mediawiki.util', function () {
	initvars();

	var o = {
		add: add, enable: enable, remove: remove, replace: replace,
		defineTool: defineTool, setLang: setLang,
		maintain: maintain, getExamples: getExamples
	};
	mw.log.deprecate(o, 'lang', data.lang, 'Nutze stattdessen extratabs.setLang("sprache")');
	mw.log.deprecate(o, 'tools', tools, 'Nutze stattdessen extratabs.defineTool("name", tool)');
	mw.log.deprecate(o, 'config', config,
		'Nutze stattdessen extratabs.add("name"), .enable("name"), .remove("name") oder .replace("name1", "mame2")');

	mw.hook('userjs.load-script.extratabs').fire(o);

	mw.loader.using('mediawiki.language', function () {
		$(addTools);
	});
});

})(jQuery, mediaWiki);
//</nowiki>