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
//Dokumentation unter [[Benutzer:Schnark/js/antispoof]] <nowiki>
/*global mw: true */
(function($, libs){
var antispoof = {
version: 1.4,
rot: '#FF8080',
grau: '#C0C0C0',
ugly: false, //hässliches Zeug um Rest der Seite abzudunklen?
count: 0, //Anzahl der verdächtigen Stellen
unsichtbar: '\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F\u00AD\u2000-\u2008\u200A-\u200D\u200F\u2028-\u202F\u205F-\u206F\u3000', //unsichtbare Zeichen außer TAB (kommt in Versionsunterschieden vor), LF, CR, SPACE, NBSP, THINSPACE, LRM (nur für Spezialseiten)
punkt: '\u0009\u000A\u000D\u0020-\u0040\u005B-\u0060\u007B-\u007E\u00A0-\u00AC\u00AE-\u00BF\u00D7\u00F7\u02B0-\u02FF\u2009\u2010-\u2027\u2030-\u205E\u2070\u2074-\u2079\u2080-\u2089\u2122\u2190-\u22FF', //Satz- und Leerzeichen, Zahlen, Abstandsbestimmung u. ä.
latein: '\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02AF\u1E00-\u1EFF\u2C60-\u2C7F\uA720-\uA7FF', //lateinische Buchstaben (ink. IPA)
griechisch: '\u0370-\u03FF\u1F00-\u1FFF', //griechische Buchstaben
kyrillisch: '\u0400-\u052F', //kyrillische Buchstaben
cjk: '\u2E80-\u2EFF\u3001-\u303F\u31C0-\u31EF\u3200-u4DBF\u4E00-\u9FFF\uF900-\uFAFF',
sonstiges: '\u0530-\u1DBF\u2071-\u2073\u207A-\u207F\u208A-\u20CF\u2100-\u2121\u2123-\u218F\u2300-\u24FF\u2C00-\u2C5F\u2C80-\u2E7F\u2F00-\u2FFF\u3040-\u31BF\u31F0-\u31FF\u4DC0-\u4DFF\uA000-\uA71F\uA800-\uD7FF\uFB00-\uFE1F\uFE30-\uFFEF', //Buchstaben aus anderen Alphabeten und sonstige Zeichen
kombinierend: '\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F', //kombinierende Zeichen
privat: '\uE000-\uF8FF', //privater Gebrauch
unerwuenscht: '\u0060\u00B4\u2010\u2011\u2012\u2015\u2043\u2155-\u218F\u2625-\u2629\u2670\u2671\u2716\u2719-\u271F\u2753-\u2763\u2768-\u2775\u2794-\u27BF\uFE50-\uFE6F\uFF00-\uFFFD', //aus irgendwelchen Gründen nicht erwünscht, aber oben nicht erfasst (komische Striche (Geviertstrich nur in NS 0), Darstellungsvarianten, Dingbats, etc.)
benennen: '\u0250-\u02AF\u2009\u2013\u2212\u2500', //nur mit Tooltip benennen (im ANR NBSP zusätzlich)
rtl: '\u0590-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF',
zwj_ok: '\u0590-\u109F',
regexp_unsichtbar: null, // /()((?:^|.)[unsichtbar](?:.|$))/g
regexp_privat: null, // /()([privat]+)/g
regexp_kombinierend: null, // /()([kombinierend].)/g
regexp_latein: null, // /([^latein punkt unsichtbar kombinierend])([latein]+)/g
regexp_griechisch: null, // /([^griechisch punkt unsichtbar kombinierend])([griechisch]+)/g
regexp_kyrillisch: null, // /([^kyrillisch punkt unsichtbar kombinierend])([kyrillisch]+)/g
regexp_sonstiges: null, // /([^sonstiges cjk punkt unsichtbar kombinierend])([sonstiges cjk]+)/g
regexp_unerwuenscht: null, // /()([unerwuenscht])/g
regexp_benennen: null, // /()([benennen])/g
regexp_rtl1: null, // /(^|[^rtl])RLM([rtl]|$)/
regexp_rtl2: null, // /(^|[rtl])LRM([^rtl]|$)/
regexp_zwj_ok: null, // /[zwj_ok][\u200C\u200D][zwj_ok]/
regexp_cjk: null, // /[cjk]IDSPACE[cjk]/
init: function() {
if (mw.config.get('wgNamespaceNumber') != -1) {
antispoof.unsichtbar += '\u200E';
}
if (mw.config.get('wgNamespaceNumber') === 0) {
antispoof.benennen += '\u00A0';
antispoof.unerwuenscht += '\u2014';
}
antispoof.regexp_unsichtbar = new RegExp ('()((?:^|.)[' + antispoof.unsichtbar + '](?:.|$))', 'g');
antispoof.regexp_privat = new RegExp ('()([' + antispoof.privat + ']+)', 'g');
antispoof.regexp_kombinierend = new RegExp ('()(.[' + antispoof.kombinierend + '])', 'g');
antispoof.regexp_latein = new RegExp ('([^' + antispoof.latein + antispoof.punkt + antispoof.unsichtbar + antispoof.kombinierend + '])([' +
antispoof.latein + ']+)', 'g');
antispoof.regexp_griechisch = new RegExp ('([^' + antispoof.griechisch + antispoof.punkt + antispoof.unsichtbar + antispoof.kombinierend + '])([' +
antispoof.griechisch + ']+)', 'g');
antispoof.regexp_kyrillisch = new RegExp ('([^' + antispoof.kyrillisch + antispoof.punkt + antispoof.unsichtbar + antispoof.kombinierend + '])([' +
antispoof.kyrillisch + ']+)', 'g');
antispoof.regexp_sonstiges = new RegExp ('([^' + antispoof.sonstiges + antispoof.cjk + antispoof.punkt + antispoof.unsichtbar + antispoof.kombinierend + '])([' +
antispoof.sonstiges + antispoof.cjk + ']+)', 'g');
antispoof.regexp_unerwuenscht = new RegExp ('()([' + antispoof.unerwuenscht + '])', 'g');
antispoof.regexp_benennen = new RegExp ('()([' + antispoof.benennen + '])', 'g');
antispoof.regexp_rtl1 = new RegExp ('(^|[^' + antispoof.rtl + '])\u200F([' + antispoof.rtl + ']|$)');
antispoof.regexp_rtl2 = new RegExp ('(^|[' + antispoof.rtl + '])\u200E([^' + antispoof.rtl + ']|$)');
antispoof.regexp_zwj_ok = new RegExp ('[' + antispoof.zwj_ok + '][\u200C\u200D][' + antispoof.zwj_ok + ']');
antispoof.regexp_cjk = new RegExp ('[' + antispoof.cjk ']\u3000[' + antispoof.cjk + ']');
$(antispoof.mark);
},
mark: function() {
antispoof.count = 0;
var todo = [
//regexp, hint, color, count
[antispoof.regexp_unsichtbar,
function (x) {
if (x.indexOf('\u00AD') != -1) return 'An dieser Stelle steht ein weiches Trennzeichen!';
if (x.indexOf('\u200B') != -1) return 'An dieser Stelle steht ein nullbreites Leerzeichen!';
if (x.indexOf('\u200C') != -1) return 'An dieser Stelle steht ein nullbreiter Nichtverbinder!';
if (x.indexOf('\u200D') != -1) return 'An dieser Stelle steht ein nullbreiter Verbinder!';
if (x.indexOf('\u200E') != -1) return 'An dieser Stelle steht ein Links-nach-rechts-Zeichen!';
if (x.indexOf('\u200F') != -1) return 'An dieser Stelle steht ein Rechts-nach-links-Zeichen!';
if (x.indexOf('\u3000') != -1) return 'An dieser Stelle steht ein ideografisches Leerzeichen!';
return 'Dieses unsichtbare Zeichen ist kein normales Leerzeichen!';},
function (x) {
if (x.match(antispoof.regexp_rtl1)) return antispoof.grau;
if (x.match(antispoof.regexp_rtl2)) return antispoof.grau;
if (x.match(antispoof.regexp_zwj_ok)) return antispoof.grau;
if (x.match(antispoof.regexp_cjk)) return antispoof.grau;
return antispoof.rot;},
true],
[antispoof.regexp_privat,
'Dieses Zeichen gehört Unicode-Block "Privater Gebrauch" und hat daher in einem Text normalerweise nichts verloren!',
antispoof.rot,
true],
[antispoof.regexp_unerwuenscht,
function (x) {
if (x.indexOf('\u2010') != -1) return 'Dies ist ein Unicode-Bindestrich!';
if (x.indexOf('\u2011') != -1) return 'Dies ist ein nicht-umbrechender Bindestrich!';
if (x.indexOf('\u2012') != -1) return 'Dies ist ein ziffernbreiter Bindestrich!';
if (x.indexOf('\u2014') != -1) return 'Dies ist ein Geviertstrich!';
if (x.indexOf('\u2015') != -1) return 'Dies ist ein horizontaler Strich!';
if (x.indexOf('\u2043') != -1) return 'Dies ist ein Aufzählungsstrich!';
return 'Dieses Zeichen ist normalerweise in Texten nicht erwünscht!';},
antispoof.rot,
true],
[antispoof.regexp_kombinierend,
'Dieses Zeichen ist aus zwei Zeichen zusammengesetzt, einem Akzent und einem Buchstaben!',
antispoof.grau,
false],
[antispoof.regexp_griechisch,
'Dieses Zeichen ist ein griechischer Buchstabe, anders als das vorhergehende!',
antispoof.rot,
true],
[antispoof.regexp_kyrillisch,
'Dieses Zeichen ist ein kyrillischer Buchstabe, anders als das vorhergehende!',
antispoof.rot,
true],
[antispoof.regexp_sonstiges,
'Dieses Zeichen ist ein Buchstabe aus einem sonstigen Alphabet, anders als das vorhergehende!',
antispoof.rot,
true],
[antispoof.regexp_latein,
'Dieses Zeichen ist ein lateinischer Buchstabe, anders als das vorhergehende!',
antispoof.rot,
true],
[antispoof.regexp_benennen,
function (x) {
if (x == '\u00A0') return 'nbsp';
if (x == '\u2009') return 'thinspace';
if (x == '\u2013') return 'Gedanken-/Bis-/etc. -strich';
if (x == '\u2212') return 'Minus';
if (x == '\u2500') return 'horizontale Linie';
if (x.search(/[\u0250-\u02AF]/) > -1) return 'IPA-Zeichen';
return '\\u' + x.charCodeAt(0).toString(16);},
antispoof.grau,
false]];
var done = function() {
if (antispoof.count > 0) {
$('#firstHeading').after('<span class="antispoof-count noprint">' + antispoof.count + ' verdächtige Stelle' + (antispoof.count == 1 ? '' : 'n') + ' gefunden!</span>');
if (antispoof.ugly) {
mw.util.addCSS('.antispoof-mark {z-index: 20; position: relative;}');
$(document.body).append('<div id="antispoof-overlay" style="position:absolute; top:0; left:0; z-index:10; width:100%; height:100%; background-color:#000; filter:alpha(opacity=60); opacity:0.60;"></div>');
$('#antispoof-overlay').hide();
$('.antispoof-count, #antispoof-overlay').click(function(){$('#antispoof-overlay').css('height', $(document).height()).toggle();});
}
}};
$.eachAsync(todo, {end: done, loop: function(i, data) {
var c = libs.highlight.highlight(data[0], data[1], data[2], 'antispoof-mark');
if (data[3]) antispoof.count += c;
}});
}
};
if (mw.config.get('debug')) window.antispoof = antispoof;
$(document).trigger('loadWikiScript', ['Benutzer:Schnark/js/antispoof.js', antispoof]);
mw.loader.using('jquery.async', antispoof.init);
})(jQuery, mw.libs);
//</nowiki>