Benutzerin:Freddy2001/extratabs.js
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>