Benutzer:Schnark/js/antispoof.js

Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 16. Februar 2011 um 10:41 Uhr durch Schnark (Diskussion | Beiträge) (Entferne Legacy-Code, benötigt nun MW 1.17 / Markierung wird nun asynchron durchgeführt, vielleicht verbessert das die Performance). Sie kann sich erheblich von der aktuellen Version unterscheiden.

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>

var antispoof = {
version: 1.0,
rot: '#FF8080',
grau: '#C0C0C0',

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', //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\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)
sonstiges: '\u0530-\u1DBF\u2071-\u2073\u207A-\u207F\u208A-\u20CF\u2100-\u218F\u2300-\u2C5F\u2C80-\uA71F\uA800-\uD7FF\uF900-\uFE1F\uFE30-\uFFEF', //Buchstaben aus anderen Alphabeten und sonstige Zeichen
griechisch: '\u0370-\u03FF\u1F00-\u1FFF', //griechische Buchstaben
kyrillisch: '\u0400-\u052F', //kyrillische Buchstaben
kombinierend: '\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F', //kombinierende Zeichen
privat: '\uE000-\uF8FF', //privater Gebrauch
unerwuenscht: '\u2010\u2011\u2012\u2015\u2043\u2155-\u218F\u2625-\u2629\u2670\u2671\u2716\u2719-\u271F\u2757-\u275E\u2762\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 (auf Nicht-Spezialseiten 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 punkt unsichtbar kombinierend])([sonstiges]+)/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]/

init: function() {
with (antispoof) {
if (mw.config.get('wgNamespaceNumber') != -1) {
   unsichtbar += '\u200E';
   benennen += '\u00A0'; }
if (mw.config.get('wgNamespaceNumber') == 0) unerwuenscht += '\u2014';
regexp_unsichtbar = new RegExp ('()((?:^|.)[' + unsichtbar + '](?:.|$))', 'g');
regexp_privat = new RegExp ('()([' + privat + ']+)', 'g');
regexp_kombinierend = new RegExp ('()(.[' + kombinierend + '])', 'g');
regexp_latein = new RegExp ('([^' + latein + punkt + unsichtbar + kombinierend + '])([' + latein + ']+)', 'g');
regexp_griechisch = new RegExp ('([^' + griechisch + punkt + unsichtbar + kombinierend + '])([' + griechisch + ']+)', 'g');
regexp_kyrillisch = new RegExp ('([^' + kyrillisch + punkt + unsichtbar + kombinierend + '])([' + kyrillisch + ']+)', 'g');
regexp_sonstiges = new RegExp ('([^' + sonstiges + punkt + unsichtbar + kombinierend + '])([' + sonstiges + ']+)', 'g');
regexp_unerwuenscht = new RegExp ('()([' + unerwuenscht + '])', 'g');
regexp_benennen = new RegExp ('()([' + benennen + '])', 'g');

regexp_rtl1 = new RegExp ('(^|[^' + rtl + '])\u200F([' + rtl + ']|$)');
regexp_rtl2 = new RegExp ('(^|[' + rtl + '])\u200E([^' + rtl + ']|$)');
regexp_zwj_ok = new RegExp ('[' + zwj_ok + '][\u200C\u200D][' + zwj_ok + ']');

$(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!';
    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;
    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>');
                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 = highlight.highlight(data[0], data[1], data[2], 'antispoof-mark');
      if (data[3]) antispoof.count += c; 
}});
}
};

if (typeof jsmodules != 'undefined') jsmodules.after('[[Benutzer:Schnark/js/antispoof.js]]');
mw.loader.using('jquery.async', antispoof.init);

//</nowiki>