Benutzer:TMg/autoFormatter.js/Navigation
Dieses Benutzerskript blendet eine „Auto-Format“-Schaltfläche () in der Werkzeugleiste über dem Bearbeitungsfenster ein, die rund 200 typische Wikifizierungs-Fehler automatisch korrigiert.
Verwendung
Folgende Zeilen entweder in die eigene common.js (zur lokalen Verwendung nur in der deutschsprachigen Wikipedia) oder die eigene global.js im Meta-Wiki (zur globalen Verwendung in allen Wikimedia-Wikis) kopieren:
// [[User:TMg/autoFormatter.js]]
mw.loader.load( '//de.wikipedia.org/w/index.php?title=Benutzer:TMg/autoFormatter.js&action=raw&ctype=text/javascript' );
Ergänzend empfehle ich mein cleanDiff-Skript.
Verwendung in anderen Wikis
In anderen Sprachen
Die Beschriftung bzw. der Tooltip der „Auto-Format“-Schaltfläche kann lokalisiert werden:
var autoFormatterButtonLabel = 'Auto-Format';
In Nicht-Wikimedia-Wikis
In externen Wikis, die Links zu Wikimedia-Wikis in der Kurzschreibweise [[:de:Wikipedia]]
nicht unterstützen, können die entsprechenden Formatierungen abgeschaltet werden:
var autoFormatWikimediaLinks = false;
Lokalisierung von Schlüsselwörtern
Zum Abschalten der Lokalisierung von thumb
, DEFAULTSORT
usw. die folgende Zeile in die eigene common.js kopieren:
var autoFormatLocalisation = false;
Aufdecken von Linkzielen
Potentiell irreführend verschleierte Links wie [[Berlin|Berliner Fernsehturm]]
wandelt das Skript in [[Berlin]]er Fernsehturm
um. Diese Funktion kann deaktiviert werden:
var autoFormatMaskedLinks = false;
Links wie [[Berlin|Berlins]]
, deren Kurzform [[Berlin]]s
den selben anklickbaren Text erzeugt, werden unabhängig von dieser Option immer umgewandelt.
Ausschreiben von Jahreszahlenbereichen
In der deutschsprachigen Wikipedia schreibt das Skript verkürzte Jahreszahlenbereiche wie „2001–02“ automatisch aus. Diese Funktion kann ab- oder in anderen Wikis mit true
eingeschaltet werden:
var autoFormatShortYearRanges = false;
Entfernung von Redundanzen aus Infoboxen
Das Skript entfernt Namensparameter aus einigen häufig verwendeten Infoboxen, wenn der Parameter leer ist oder lediglich das Lemma des Artikels wiederholt und das dem Standardverhalten der Infobox entspricht. Das vermeidet Redundanzen und reduziert Fehlerquellen. Die Liste der Vorlagen mit jeweils einem zu entfernenden Parameter kann wie folgt in der eigenen common.js angepasst werden:
var redundantTemplateParameters = [
'Infobox Musikalbum|Titel',
'Infobox Unternehmen|Name'
];
Die Funktion lässt sich auch ganz abschalten:
var redundantTemplateParameters = [];
Vorlagenformatierung
Auf Wunsch bringt das Skript selbstgewählte Infoboxen und andere Vorlagen in eine einheitliche Form, benennt Parameter um oder entfernt sie. Dazu muss ein Abschnitt ähnlich wie der folgende in der eigenen common.js angelegt werden:
var autoFormatTemplates = [
{ name: 'Infobox Gemeinde in Deutschland',
format: '|_________________ = _\n'
},
{ name: 'Infobox Landkreis',
format: '|__________________ = _\n',
parameters: {
'Bürgermeister': 'Landrat',
'Direktionsbezirk': false
}
}
];
Innerhalb des Formats geben Unterstriche (_
) und ggf. Doppelkreuze (#
) Position, Minimal- und Maximallänge für Parametername und Wert an. Alle anderen Zeichen, Leerzeichen und Zeilenumbrüche (\n
) werden so übernommen, wie im Format angegeben. Leerzeichen am Zeilenende werden entfernt; mit trim: false,
lässt sich das für einzelne Vorlagen abschalten. Optional können veraltete Vorlagenparameter umbenannt oder mit false
ganz entfernt werden.
Beispiele:
format: '|_=_'
- Einzeiliges Format (inline) ohne Leerzeichen, das heißt aus
{{Internetquelle | url=… | titel=… }}
wird{{Internetquelle|url=…|titel=…}}
. format: '|_ = _\n'
- Mehrzeiliges Format mit Leerzeichen, jedoch ohne Ausrichtung der Gleichheitszeichen untereinander.
format: '|__________ = _\n'
- Mehrzeiliges Infobox-Format mit Ausrichtung der Gleichheitszeichen untereinander.
format: ' | __________########## = _\n'
|
: Der senkrechte Strich, mit dem jede Infoboxzeile beginnt, soll um ein Leerzeichen eingerückt und mit einem weiteren vom Parameternamen abgesetzt werden.__________
: Kurze Parameternamen sollen mit Leerzeichen auf mindestens diese Länge gebracht werden.##########
: Bereits vorhandene tiefere Einrückungen sollen beibehalten bzw. auf diese Maximallänge verkürzt werden.=
: Das Gleichheitszeichen soll immer mit Leerzeichen abgesetzt werden, unabhängig von einer eventuellen Einrückung._
: Platzhalter für den Wert. Die Festlegung von Minimal- und Maximallänge ist ebenfalls möglich, jedoch unüblich.\n
: Zeilenumbruch.
Benutzerdefinierte Ersetzungen
Wahlweise kann das Skript auch typische Rechtschreibfehler korrigieren. Dazu muss ein Abschnitt ähnlich wie der folgende in die eigene common.js kopiert werden.
var autoFormatReplacements = [
[ 'daß', 'dass' ],
[ 'e.V.', 'e. V.' ],
[ 'u.a.', 'u. a.' ],
[ 'z.B.', 'z. B.' ]
];
Die Liste kann beliebig erweitert und Abkürzungen auch ausgeschrieben werden. Die Schreibweise mit Leerzeichen ist inbegriffen, dazu sind keine gesonderten Einträge nötig. Groß-/Kleinschreibung ist signifikant. Reguläre Ausdrücke werden in dieser vereinfachten Schreibweise nicht verarbeitet. Als Ausnahmen sind Zeichenauswahl sowie Platzhalter für Zahlen (\\d
) und Wörter (\\w
) erlaubt.
Beispiele:
[ 'ca.', 'etwa' ],
- Ersetzt alle Vorkommen von „ca.“ durch „etwa“. Wortgrenzen werden in dieser Schreibweise automatisch beachtet, „Bianca.“ bleibt also unangetastet.
[ '[cz]ir[ck]a', 'zirka' ],
- Ersetzt „circa“, „cirka“ und „zirca“ durch „zirka“.
[ 'z.B.', 'z. B.' ],
- Fügt ein geschütztes Leerzeichen in die Abkürzung ein. Punkte bewirken in dieser Schreibweise automatisch, dass auch Abkürzungen mit normalen, ungeschützten Leerzeichen erkannt werden.
[ 'Abs.\\d', 'Abs. \\d' ],
- Fügt zwischen „Abs.“ und einer darauf folgenden Zahl (
\\d
steht für digit) ein geschütztes Leerzeichen ein. Die Zahl wird durch Wiederholen des Platzhalters\\d
in die Ersetzung hinüber gerettet. [ '\\w\'\\w', '\\w’\\w' ],
- Setzt in Wörter (
\\w
) wie „O’Brian“ den typografisch korrekten Apostroph ein. [ '<!--\\w', '<!-- \\w' ], [ '\\w-->', '\\w -->' ],
- Fügt Leerzeichen in
<!-- Kommentare -->
ein, die mit einem Wort beginnen und enden.
Erweiterte benutzerdefinierte Ersetzungen
Die Schreibweise (technisch: ein zweidimensionales Array) erlaubt auch die Verwendung eigener regulärer Ausdrücke und sogar Ersetzungsfunktionen.
Häufig gebrauchte Elemente:
[ /und/, 'sowie' ],
- Ersetzt nur das erste Vorkommen der Buchstabenfolge „und“ durch „sowie“. Wortgrenzen werden in dieser Schreibweise nicht automatisch beachtet.
[ /und/g, 'sowie' ],
- Ersetzt alle (
g
steht für „global“) Vorkommen der Buchstabenfolge „und“ durch „sowie“. [ /\bund\b/g, 'sowie' ],
- Ersetzt nur noch ganze Wörter (
\b
steht für boundary, „Wortgrenze“), nicht mehr Teile anderer Wörter wie z. B. in „rund“. Das ist gleichbedeutend mit der einfachen Schreibweise[ 'und', 'sowie' ],
. [ /([ ,])und([ ,])/g, '$1sowie$2' ],
- Führt die Ersetzung nur noch durch, wenn davor und dahinter ganz bestimmte Zeichen stehen, in diesem Fall Leerzeichen oder Kommas. Die in runde Klammern gefassten Fundstellen werden per
$1
und$2
in die Ersetzung hinüber gerettet. [ /([^\w-])und([^\w-])/g, '$1sowie$2' ],
- Führt die Ersetzung nur noch durch, wenn davor und dahinter ganz bestimmte Zeichen nicht stehen, in diesem Fall Wortzeichen (
\w
) oder Bindestriche. [ /([ ,])und(?=[ ,])/g, '$1sowie' ],
- Folgen mögliche Fundstellen direkt aufeinander, z. B. in „und und“, wird möglicherweise nur das erste Vorkommen ersetzt. Der positive Look-ahead
(?=…)
(oder(?!…)
für einen negativen) verbraucht die gefundenen Zeichen nicht, so dass das Leerzeichen hinter dem ersten „und“ für den Beginn der nächsten Fundstelle zur Verfügung steht. Vorsicht: Die Look-behinds(?<=…)
und(?<!…)
existieren in JavaScript nicht.
Praxisbeispiele
Leerzeichen vor Einzelnachweisen immer entfernen, nicht nur am Satzende. Vorsicht: Keine Zeilenumbrüche entfernen, da das in <references>…</references>
vorkommt.
[
/ +<ref\b/g,
'<ref'
],
Fügt immer ein Leerzeichen hinter den Aufzählungszeichen *
und #
am Zeilenanfang ein.
[
/(\n[*#]+) *([^\s*#:;])/g,
'$1 $2'
],
Kürzt mehrfache Leerzeichen im Text auf jeweils eins, ohne dabei Tabellen und Vorlagen zu zerstören.
[
/([^\s=|] ) +(?=[^\s=|])/g,
'$1'
],
Bringt <!-- Kommentare -->
in eine einheitliche Form mit höchstens zwei Bindestrichen und Leerzeichen.
[
/<!--+ *(?=[^\s-])([^>]*[^\s-]) *--+>/g,
'<!-- $1 -->'
],
Fügt geschützte Leerzeichen in Daten wie „31. Juli“ ein. Vorsicht: Es ist umstritten, ob das durchgängig erfolgen soll.
[
/([\s(]\d+\.) (?=Januar|Februar|März|April|Mai|Ju[nl]i|August|(?:Sept|Nov|Dez)ember|Oktober)\b/g,
'$1 '
],
Automatik gemäß Hilfe:Kategorien #8. Regel: Ziffern am Lemma-Anfang.
[
/(\{\{SORTIERUNG:|\[\[Kategorie:[^\n[\]|]*\|)(?:#:+)?0*(\d+(?:\.\d{3})*)(?!\d)/g,
function( $0, $1, $2 ) {
return $1 + '#' + $2.replace( /\d\D*/g, ':' ) + $2.replace( /\D+/g, '' );
}
],
Was tut das Skript?
Das Skript wird nur tätig, wenn man auf die Schaltfläche klickt.
Einheitliche Schreibweisen
- Die Namensräume
Datei:
,Kategorie:
undVorlage:
, Bildparameter sowie die Schlüsselwörter{{SORTIERUNG}}
und#WEITERLEITUNG
werden vereinheitlicht (Referenz). - Die Schreibweise zahlreicher Vorlagen wird vereinheitlicht und Weiterleitungen aufgelöst.
- Die CSS-Klasse
wikitable
wird vereinheitlicht (Referenz). <ref>
und<references />
werden vereinheitlicht (Referenz).- Verschiedene Schreibweisen für die Überschrift „Weblinks“ werden vereinheitlicht (Referenz).
- Umlaute und Sonderzeichen in Sortierschlüsseln werden ersetzt und überflüssige Sortierschlüssel entfernt (Referenz).
- Benutzerdefinierte Ersetzungen ermöglichen die Korrektur von „daß“ → „dass“ (Referenz), „z.B.“ →
z. B.
(Referenz) und vielem mehr, dies muss jedoch von jedem Benutzer selbst festgelegt werden.
Typografie
- "Zollzeichen" werden durch typografische „Anführungszeichen“ ersetzt (Referenz).
- Gedankenstriche - wie hier – werden durch typografische ersetzt (Referenz).
- ISBNs werden regelkonform formatiert.
- Datumsangaben werden einheitlich in die Form „1. Januar 1980“ gebracht (Referenz).
- Seiten- und Jahreszahlenbereiche werden einheitlich in die Form „S. 1–2“ und „1980–1982“ gebracht (Referenz).
- In Zeiträumen mit Tag und Monat wird der Strich durch „bis“ ersetzt (Referenz).
Links
- Mehrfach verlinkte Jahreszahlen werden entlinkt (Referenz).
- Kopierte Weblinks und Anker werden umgewandelt, z. B.
[http://de.wikipedia.org/wiki/ß#Gro.C3.9Fschreibweise]
→[[ß#Großschreibweise]]
. [[Link|Link]]
wird auf[[Link]]
gekürzt.[[Link|Die]]s
wird zu[[Link|Dies]]
, weil es im Quelltext besser lesbar ist.[[Link|Links mit Anhängseln]]
werden zu[[Link]]s mit Anhängseln
, weil sonst das Linkziel unnötig verschleiert wird (Referenz).
Leerräume
- Vor häufigen Maßeinheiten wie mm/cm/km, kg, kHz/MHz/GHz, kB/MB/GB sowie KiB/MiB/GiB werden geschützte (vor % normale) Leerzeichen eingesetzt (Referenz).
- In „§ 103“ und ähnlich werden geschützte Leerzeichen eingesetzt (Referenz).
== Überschriften ==
erhalten zur besseren Lesbarkeit immer Leerzeichen, geschützte Leerzeichen werden entfernt.- Unterstriche und geschützte Leerzeichen in Dateinamen werden durch Leerzeichen ersetzt.
- Geschützte Leerzeichen werden einheitlich in die Form
gebracht. - Manuelle Zeilenumbrüche werden einheitlich in die Form
<br />
gebracht (Referenz). - Mehrfache Leerzeilen werden auf einzelne reduziert.
- Mehrere Kategorien in einer Zeile werden untereinander gesetzt.
- Überflüssige Zeilenumbrüche und Leerräume am Textanfang und Zeilenende werden entfernt.
Neuheiten und Versionsgeschichte
→ Ausführliches Änderungsprotokoll
- 2018–2022
-
- Zahlreiche Fehlerbehebungen u. a. für die bessere Unterstützung nicht-deutschsprachiger Wikis; Details siehe Versionsgeschichte.
- 24. Februar 2017
- 23. Juni 2016
-
- Neu: Galerien werden gesäubert.
- Neu: Österreich- und schweizbezogen wird beachtet.
- Neu: Mehr Säuberungen in der Zusammenfassungszeile.
- Behoben: Commons-Kategorienamen werden wie Dateinamen vor typografischen Änderungen geschützt.
- 2. Juni 2015
-
- Geändert: Leerzeichen am Ende nicht ausgefüllter Vorlagenparameter werden nicht mehr entfernt.
- 16. Januar 2014
-
- Neu: Zwei neue Konfigurationsschalter für verdeckte Linkziele und Jahreszahlenbereiche.
- Neu: Dateiinformationen wie „(PDF; 1,2 MB)“ in eine einheitliche Form bringen.
- Neu: Fehlendes Leerzeichen in „1.Januar“ einfügen.
- Neu: Auch individuelle Sortierschlüssel in Kategoriezeilen normieren.
- 15. Dezember 2013
-
- Neu: Sortierschlüssel in Kategoriezeilen zugunsten von SORTIERUNG verwerfen.
- Neu: ISBN in der Schreibweise „ISBN 13:“ erkennen.
- Geändert: ISBN nur noch nach bestimmten Zeichen säubern.
- Geändert: Jahreszahlenbereiche in Links gar nicht mehr ausschreiben.
- 7. Dezember 2013
-
- Behoben: In „1 January 2013 – 2 January 2013“ kein „to“ mehr einsetzen.
- Entfernt: Kein Trimmen am Textende mehr.
- 1. Dezember 2013
-
- Neu: Hochgestellte 2 und 3 bei gängigen Maßeinheiten in Unicode-Zeichen umwandeln.
- Neu: Bindestriche am Ende von Links entlinken.
- Behoben: In Galerien Dateinamen ohne Präfix schützen.
- 19. August 2013
-
- Neu: Viele Regeln für die englischsprachige Wikipedia tauglich gemacht.
- Neu: Endlich mit WikEd kompatibel gemacht.
- Neu: Viele neue Regeln zur Säuberung von HTML-Elementen in eindeutigen Fällen, vor allem
<font>
. - Neu: Die meisten als HTML-Entitäten kodierte Sonderzeichen werden dekodiert.
- Neu: Mehr Bildeinbindungs-Schlüsselwörter lokalisieren (Referenz), nicht jedoch CSS-Schlüsselwörter (Referenz).
- Neu: Unnötige Sortierschlüssel auch aus individuellen Kategorie-Zeilen entfernen.
- 24. Mai 2013
-
- Neu: In eindeutigen Fällen Leerzeilen zwischen Einzelnachweise, Navigationsleisten und Kategorien setzen.
- Geändert: Wesentlich mehr Zeichen in Sortierschlüssel normalisieren.
- Geändert: Die Erkennung von Maßeinheiten ist strenger bei Bis-Strichen, Minus und Komma.
- 8. April 2013
-
- Neu: Zusätzliche Säuberungen und Verfeinerungen der Säuberungen rund um
<ref>
. - Neu: ISBNs werden auch innerhalb von Vorlagen gesäubert.
- Neu: Einige häufig benutzte Filmvorlagen werden von redundanten Titelangaben befreit.
- Geändert: Das Ausschreiben des missverständlichen deutschen Datumsformats (z. B. 1.2.2013) ist wesentlich robuster.
- Neu: Zusätzliche Säuberungen und Verfeinerungen der Säuberungen rund um
- 18. Februar 2013
-
- Neu: Zahlreiche weitere Vorlagen werden vereinheitlicht, unter anderem alle Sprachvorlagen nach dem Schema Vorlage:enS.
- Neu: Kategorien erhalten immer einen großen Anfangsbuchstaben (Referenz).
- Neu: In Vorlage:Zitat und Vorlage:" werden doppelte Anführungszeichen durch einfache ersetzt.
- Neu: Mit Kommas ,,simulierte" Anführungszeichen werden gesäubert.
- Geändert: Drei Punkte werden an zahlreichen weiteren Stellen durch typografische Auslassungspunkte ersetzt.
- Geändert: Interlanguage-Links werden besser vor ungewollten Änderungen geschützt.
- 19. Januar 2013
-
- Neu:
{{SORTIERUNG:…}}
wird entfernt, wenn sie abgesehen von der Groß-/Kleinschreibung identisch zum Lemma ist (Referenz). - Neu: Unterstriche und
%
-Kodierungen werden aus allen Links entfernt, nicht mehr nur aus#Anker
-Links. - Neu: In Seitenzahlenbereiche werden typografische Bis-Striche eingesetzt.
- Neu: Experimentelle Option zur Säuberung von Vorlagen anhand benutzerdefinierter Formatstrings.
- Neu: Die Vorlage:Personendaten wird in eine einheitliche Form gebracht (Vorbelegung für die ansonsten benutzerdefinierbaren Vorlagenformatierungen).
- Geändert: Statt
miniatur
wird jetztmini
verwendet, vorhandeneminiatur
bleiben aber unangetastet (Referenz).
- Neu:
- 10. Dezember 2012
-
- Neu: Ist Text markiert, wird nur dieser gesäubert.
- Neu: Wikilinks in der Zusammenfassungszeile werden gesäubert.
- Neu: Die Lokalisierung von Schlüsselwörtern lässt sich abschalten.
- Neu: Benutzerdefinierten Ersetzungen sind wesentlich flexibler, erlauben Platzhalter für Wörter und reguläre Ausdrücke.
- Neu: Mathematische Ausdrücke, Dateinamen in Vorlagen und Quelltextabschnitte werden vor ungewollten Änderungen geschützt.
- 13. September 2012
-
- Behoben: Englische Anführungszeichen werden nicht mehr durch deutsche ersetzt.
- 6. August 2012
-
- Neu: ISBN-Formatierung für englische Bücher.
- 3. August 2012
-
- Behoben: Es wurden nicht alle aktuell vergebenen ISBN-Verlagsnummern beachtet.
- Geändert: Redundante Namensparameter werden aus wesentlich mehr häufig verwendeten Infoboxen entfernt.
- 3. November 2011
-
- Neu: Verschiedene Schreibweisen für das geschützte Leerzeichen (
) werden vereinheitlicht. - Behoben: Vor allem bei langen Artikeln arbeitet das Skript spürbar schneller.
- Neu: Verschiedene Schreibweisen für das geschützte Leerzeichen (
- 9. September 2011
-
- Neu: Der Platzhalter
\\d
für Zahlen erlaubt benutzerdefinierten Ersetzungen wie z. B.Nr.1
→Nr. 1
.
- Neu: Der Platzhalter
- 25. Juli 2011
-
- Neu: In „§ 103“ und ähnlich werden geschützte Leerzeichen eingesetzt.
- 24. Juni 2011
-
- Geändert: Bindestriche zwischen Zahlen (z. B. in
<math>3 - 2</math>
) werden nicht mehr in Gedankenstriche umgewandelt.
- Geändert: Bindestriche zwischen Zahlen (z. B. in
- 17. Mai 2011
-
- Geändert: Mehrdeutige Jahreszahlenbereiche „2000-01“ bis „2000-12“ (kann auch für den Monat stehen) werden nicht mehr ersetzt.
- 11. März 2011
-
- Neu: ISBNs werden in eine einheitliche Form gebracht.
- Behoben: Weblinks und Anker werden zuverlässiger in lesbare Wikilinks umgewandelt.
- 10. März 2011
-
- Neu: In Sortierschlüsseln wird die Groß/Kleinschreibung korrigiert und Umlaute ersetzt.
- Behoben: Dateinamen werden jetzt auch in Galerien ohne Beschreibungen gesäubert und vor ungewollten Änderungen geschützt.
- 17. Januar 2011
-
- Neu: Benutzerdefinierte Ersetzungen.
- Entfernt: „Daß“ und Abkürzungen werden standardmäßig gar nicht mehr ersetzt. Es werden auch keine geschützten Leerzeichen mehr eingesetzt.
- Entfernt: Die jetzt benutzerdefinierten Ersetzungen sind nicht mehr auf den Artikelnamensraum beschränkt.
- 14. Dezember 2010
-
- Neu: Der Bildparameter
upright
wird durchhochkant
ersetzt.
- Neu: Der Bildparameter
- 12. November 2010
- 7. Oktober 2010
-
- Neu: Weblinks mit falscher Syntax werden repariert.
- Neu: Weblinks auf Wikipedia-Sprachversionen werden in Wikilinks umgewandelt.
- Neu: Häufige Textbausteine für Schwesterprojekte werden normalisiert.
- Neu: Auch vor den Maßeinheiten kg und KiB/MiB/GiB werden geschützte Leerzeichen eingesetzt.
- Geändert: Nur noch Maßeinheiten mit korrekter Groß/Kleinschreibung werden beachtet. Einzige Ausnahme ist kB/KB, da beides häufig vorkommt.
- Entfernt: Die Maßeinheit dm wird nicht mehr beachtet, da sie zu selten vorkommt.
- 29. September 2010
-
- Neu: Kopierte Anker-Links (z. B.
[[ß#Gro.C3.9Fschreibweise]]
) werden dekodiert. - Behoben: Doppelstriche (häufig vor Signaturen) werden nicht mehr in Gedankenstriche umgewandelt.
- Neu: Kopierte Anker-Links (z. B.
- 21. September 2010
-
- Neu: Zum Lemma redundante Namens- oder Titelangaben werden aus verschiedenen häufig genutzten Infoboxen entfernt; das reduziert mögliche Fehlerquellen.
- Teilweise behoben: Dateinamen in Galerien ohne Beschreibungen wurden nicht erkannt.
- Behoben:
<br style="…" />
wurde nicht erkannt. - Geändert:
prettytable
wird nur noch innerhalb vonclass="…"
ersetzt.
- 22. August 2010
-
- Neu: Unterstriche in Dateinamen werden durch Leerzeichen ersetzt, auch in Galerien.
- Behoben: In Dateinamen wurden häufig Gedankenstriche, Daten und ähnliches ersetzt.
- 14. Januar 2010
-
- Neu: In Bildern werden
thumb
,right
undleft
eingedeutscht. - Neu: Kombinationen wie
miniatur|rechts
werden gekürzt, da Miniaturen immer rechts sind. - Neu: In
attribut = "…"
werden die Leerzeichen entfernt, da sonst die Anführungszeichen ersetzt wurden.
- Neu: In Bildern werden
- 22. Dezember 2009
-
- Neu: Geschützte Leerzeichen in Überschriften werden ersetzt, da Anker sonst nicht funktionieren.
- 21. Dezember 2009
-
- Neu: Bis-Striche zwischen Daten in Langform (zum Beispiel in „7. Dezember 1850–14. Januar 1851“) werden durch „bis“ ersetzt.
- 10. Oktober 2008
-
- Neu: Jede Kategorie wird in eine eigene Zeile umgebrochen.
- 14. März 2008
-
- Entfernt: Keine Leerzeile vor Überschriften erzwingen, es gibt zu viele Sonderfälle.
- 5. März 2008
-
- Neu: Hilfe zur Umstellung der alten „Infobox Ort in Deutschland“ nach „Gemeinde“.
- 12. Januar 2008
-
- Geändert: Prozentwerte brauchen kein geschütztes Leerzeichen mehr, da die MediaWiki-Software es einsetzt.
- 27. Oktober 2006
-
- Neu: Erste Version, teilweise basierend auf Benutzer:BLueFiSH.as/JS/markup.js. Hauptgrund und die mir persönlich wichtigste Regel war die Ersetzung von Anführungszeichen.
Weiterentwicklung
Ziele (nach Wichtigkeit):
- Die Korrekturen dürfen möglichst keine neuen Fehler erzeugen.
- Der Benutzer soll von zeitraubenden Routinearbeiten befreit werden.
- Der Versionsvergleich soll möglichst übersichtlich bleiben.
- Es sollten nur möglichst konsensfähige Korrekturen vorgenommen werden.
- Kontrolle und Verantwortung sollen stets beim Benutzer bleiben.
Bekannte Probleme:
- Firefox’ Regex-Engine ist extrem anfällig für catastrophic backtracking.
- Internet Explorer bis Version 8 löscht Zeilenumbrüche am Beginn und Ende von Markierungen.
Siehe auch
- Wikipedia:WikiProjekt Syntaxkorrektur
- meta:Wikificator
- Benutzer:PerfektesChaos/js/WikiSyntaxTextMod
- Benutzer:Jowereit/Typografie ersetzt Anführungszeichen und Gedankenstriche während der Eingabe, wie von Word gewohnt.
- Benutzer:Schnark/js/edithelper erlaubt die Eingabe zusammengesetzter Zeichen mittels einer Compose-Taste.
- Benutzer:Schnark/js/veAutocorrect führt typografische Autokorrekturen im Visual Editor durch.
- Benutzer:CamelBot#mediawiki-syntax
- Benutzer:Codeispoetry/Benutzerscripte#regengine.js (seit 2011 ungepflegt)
- en:Wikipedia:AutoEd (seit 2009 ungepflegt)
- pl:MediaWiki:Gadget-sk.js
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
/**
* Blendet eine „Auto-Format“-Funktion in der Werkzeugleiste ein, die viele typische Wikifizierungs-Fehler
* automatisch korrigiert. Eine ausführliche Beschreibung ist auf der Diskussionsseite zu finden.
* (<nowiki> zur Umgehung von [[bugzilla:8761]].)
*/
( function( $, mw ) {
if ( typeof $ !== 'function' || typeof mw !== 'object'
|| ( mw.config.get( 'wgAction' ) !== 'edit' && mw.config.get( 'wgAction' ) !== 'submit' )
) {
return;
}
if ( !mw.libs ) {
mw.libs = {};
}
mw.libs.autoFormatter = {
click: function( a ) {
var e = document.forms['editform'].elements,
textbox = e['wpTextbox1'],
summary = e['wpSummary'];
if ( !textbox ) {
return false;
}
if ( window.wikEd && window.wikEd.useWikEd ) {
wikEd.UpdateTextarea();
}
if ( !a || !a.nodeType || a.rel === 'autoFormatter' ) {
$( a && a.nodeType ? a : '[rel=autoFormatter]' ).css( {
backgroundColor: '',
opacity: ''
} );
}
this.clickedElement = a;
this.isAll = false;
this.isDisambiguation = /\{\{\s*[Bb]egriffsklärung\s*[|}]/.test( textbox.value );
this.lang = mw.config.get( 'wgContentLanguage' );
this.localisation = typeof window.autoFormatLocalisation === 'undefined' ||
window.autoFormatLocalisation === true ? this.lang : window.autoFormatLocalisation;
this.cleanElement( textbox );
summary.value = this.cleanInternalLinks( summary.value );
if ( window.wikEd && window.wikEd.useWikEd ) {
wikEd.UpdateFrame();
}
return false;
},
isChanged: function( oldValue, newValue ) {
/* Entfernte Leerräume am Textende zählen nie als Änderung */
oldValue = oldValue.replace( /\s+$/, '' );
newValue = newValue.replace( /\s+$/, '' );
/* Entfernte Leerräume am Zeilenende nicht als Änderung anzeigen, aber trotzdem ersetzen */
var changed = oldValue.replace( /[\r ]+\n/g, '\n' ) !== newValue.replace( /[\r ]+\n/g, '\n' );
var a = this.clickedElement;
if ( !a || !a.nodeType || a.rel === 'autoFormatter' ) {
$( a && a.nodeType ? a : '[rel=autoFormatter]' ).css( {
backgroundColor: changed ? '#DEF740' : '',
borderRadius: changed ? '3px' : '',
opacity: changed ? '' : '.4'
} );
} else if ( a && a.style ) {
a.style.color = changed ? 'green' : 'silver';
}
/* Normalisierte Zeilenumbrüche nie als Änderung werten, das vermeidet Flackern */
return changed || oldValue.replace( /\r+$/gm, '' ) !== newValue;
},
cleanElement: function( e ) {
var t;
e.focus();
if ( typeof e.selectionStart === 'number' ) {
var scroll = e.scrollTop,
s1 = e.selectionStart,
s2 = e.selectionEnd;
if ( s2 > s1 && ( s1 > 0 || s2 < e.value.length ) ) {
t = this.cleanText( e.value.substring( s1, s2 ) );
if ( t === false ) {
return;
}
var newValue = e.value.substr( 0, s1 ) + t + e.value.substr( s2 );
e.value = newValue;
/* Fix for Opera */
s2 = s1 + t.length + ( e.value.length - newValue.length );
} else if ( !this.cleanAll( e ) ) {
return;
}
e.selectionStart = s1;
e.selectionEnd = s2;
e.scrollTop = scroll;
} else if ( typeof document.selection === 'object' ) {
var range = document.selection.createRange();
if ( range.text.length ) {
t = this.cleanText( range.text );
if ( t !== false ) {
range.text = t;
}
} else {
this.cleanAll( e );
}
} else {
this.cleanAll( e );
}
},
cleanAll: function( e ) {
this.isAll = true;
var t = this.cleanText( e.value );
if ( t !== false ) {
e.value = t.replace( /^\s*\n/, '' );
}
return t !== false;
},
cleanText: function( t ) {
var oldValue = t;
/* Steuerzeichen, undefinierte Unicode-Nummern und BOM entfernen */
t = t.replace( /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF]+/g, '' );
/* Protect single spaces at the end of empty template parameters to minify diffs */
t = t.replace( /^( *\|[^=|]*= )$/gm, '$1{{dts}}' );
t = t.replace(
/[\t\r \xA0\xAD\u1680\u180E\u2000-\u200D\u2028\u2029\u202F\u205F\u2060\u3000]+\n/g,
'\n'
);
/* Unsichtbares weiches Trennzeichen sichtbar machen, egal wo */
t = t.replace( /(?:\xAD|&#*(?:shy|x0*AD\b|0*173\b);?)+/gi, '­' );
/* ZERO WIDTH SPACE nur im Lateinischen entfernen */
t = t.replace( /([\x00-\u024F])\u200B+(?=[\x00-\u024F])/g, '$1' );
/* LRM ist wirkungslos, wenn es neben einem LR-Zeichen steht */
t = t.replace( /\u200E+(?=[A-Z\]ªµºÀ-ÖØ-öø-\u02B8])/gi, '' );
t = t.replace( /([A-ZªµºÀ-ÖØ-öø-\u02B8])\u200E+/gi, '$1' );
t = t.replace( /\u200E+/g, '‎' );
t = this.backupNowikis( t );
t = this.cleanCharacterEntities( t );
t = this.backupFilenames( t );
t = this.cleanHeadlines( t );
/* Einheitliche Schreibweisen für Schlüsselwörter incl. Leerzeichenausgleich */
t = t.replace(
/\{\{\s*(SEITENTITEL|DISPLAYTITLE):\s*/gi,
this.localisation === 'de' ? '{{SEITENTITEL:' : this.localisation
? '{{DISPLAYTITLE:'
: '{{$1:'
);
t = t.replace(
/#(WEITERLEITUNG|REDIRECT)[\s:=]*\[+\s*([^[\]|]*[^\s[\]|])(?:\s*\|[^[\]]*)?\]+/gi,
this.localisation === 'de' ? '#WEITERLEITUNG [[$2]]' : this.localisation
? '#REDIRECT [[$2]]'
: '#$1 [[$2]]'
);
t = t.replace(
/\[\[ *([CK]ategor[iy]e?)\s*:\s*([^[\]|]*[^\s[\]|])\s*(?=[\]|])/gi,
this.localisation === 'de' ? '[[Kategorie:$2' : this.localisation
? '[[Category:$2'
: '[[$1:$2'
);
t = this.cleanThumbnails( t );
t = this.cleanReferences( t );
t = this.cleanTags( t );
t = this.cleanExternalLinks( t );
t = this.cleanWikimediaLinks( t );
t = this.cleanInternalLinks( t );
t = this.cleanTemplates( t );
t = t.replace(
/\bclass\s*=\s*(?:(") *([ \w-]*? ?))?(?: *\bprettytable\b)+/g,
'class=$1$2wikitable'
);
/* Unnötige Leerzeichen bei HTML-Attributen, wichtig vor den Anführungszeichen */
while ( /[!<|][ \w"-;=?[\]]*\b *= +"/i.test( t ) ) {
t = t.replace( /([!<|][ \w"-;=?[\]]*)\b *= +"/gi, '$1="' );
}
/* Ersten Interlanguage-Link suchen; 9 wegen [[zh-classical:…]] */
var i = t.search( /^\[\[ *[a-z]{2,3}(?:-[a-z-]{2,9})? *:/m ),
slice;
if ( i > 0 ) {
i = Math.max( i, t.indexOf( '<references', i ) );
slice = t.slice( i );
t = t.slice( 0, i );
}
t = this.cleanTypography( t );
t = this.cleanDates( t );
if ( slice ) {
t += slice;
}
t = this.cleanDuplicateLinks( t );
t = this.cleanUnits( t );
t = this.cleanNonBreakingSpaces( t );
t = this.cleanISBNs( t );
t = this.cleanCategories( t );
t = this.cleanNewlines( t );
t = this.cleanRedundantTemplateParameters( t );
t = this.cleanTemplatesByRules( t );
t = this.executeUserReplacements( t );
t = this.restoreFilenames( t );
t = this.restoreNowikis( t );
var changed = this.isChanged( oldValue, t );
if ( changed ) {
mw.hook( 'AutoFormatterDoneWithChange' ).fire();
}
return changed ? t : false;
},
cleanCharacterEntities: function( t ) {
var entities = {
/* Unicodeblock Basis-Lateinisch (U+0000 bis U+007F) */
'grave': '`',
/* Unicodeblock Lateinisch-1, Ergänzung (U+0080 bis U+00FF) */
'cent': '¢', 'pound': '£', 'yen': '¥', 'sect': '§', 'laquo': '«', 'deg': '°',
'plusmn': '±', 'pm': '±', 'sup2': '²', 'sup3': '³', 'acute': '´', 'centerdot': '·',
'middot': '·', 'raquo': '»', 'frac14': '¼', 'frac12': '½', 'half': '½',
'frac34': '¾', 'Auml': 'Ä', 'Ouml': 'Ö', 'times': '×', 'Uuml': 'Ü', 'szlig': 'ß',
'auml': 'ä', 'ouml': 'ö', 'div': '÷', 'divide': '÷', 'uuml': 'ü',
/* Unicodeblock Allgemeine Interpunktion (U+2000 bis U+206F) */
'ndash': '–', 'mdash': '—', 'lsquo': '‘', 'rsquo': '’', 'rsquor': '’',
'lsquor': '‚', 'sbquo': '‚', 'ldquo': '“', 'rdquo': '”', 'rdquor': '”',
'bdquo': '„', 'ldquor': '„', 'dagger': '†', 'Dagger': '‡', 'ddagger': '‡',
'bull': '•', 'bullet': '•', 'hellip': '…', 'mldr': '…', 'permil': '‰', 'prime': '′',
'Prime': '″', 'lsaquo': '‹', 'rsaquo': '›',
/* Unicodeblock Währungszeichen (U+20A0 bis U+20CF) */
'euro': '€',
/* Unicodeblock Pfeile (U+2190 bis U+21FF) */
'rarr': '→', 'harr': '↔',
/* Unicodeblock Mathematische Operatoren (U+2200 bis U+22FF) */
'minus': '−', 'infin': '∞', 'ap': '≈', 'approx': '≈', 'asymp': '≈', 'ne': '≠',
'le': '≤', 'leq': '≤', 'ge': '≥', 'geq': '≥'
};
/* Limit to U+FFFF because of compatibility reasons, keep 𐀏 intact */
t = t.replace(
/&#*(x([\dA-F]{2,})|(\d{3,})|[a-z]{2,9}\d{0,2}\b)(?![\dA-F=]);?/gi,
function( $0, $1, $2, $3 ) {
if ( $2 ) {
$3 = parseInt( $2, 16 );
}
/* Don't decode spaces and control characters */
if ( $3 > 160 && $3 < 8191
|| $3 > 8207 && $3 < 8232
|| $3 > 8239 && $3 < 8287
|| $3 > 8303 && $3 < 55296
) {
return String.fromCharCode( $3 );
}
return entities[$1] || entities[$1.toLowerCase()] || $0;
}
);
t = t.replace( / +&#*(?:amp|x0*26|0*38);? +/gi, ' & ' );
/* Geschützte Leerzeichen einheitlich als " ", vereinfacht viele folgende Suchmuster */
return t.replace( /&#*(?:nbsp|x0*A0\b|0*160\b);?/gi, ' ' );
},
cleanTags: function( t ) {
t = t.replace( /(<\/?s)trike\b/gi, '$1' );
t = t.replace(
/<sub\s*(>[^<>]*<)\s*(?:su[bp]\s*[.\/\\]+|[.\/\\]+\s*su[bp])\s*>/gi,
'<sub$1/sub>'
);
t = t.replace(
/<sup\s*(>[^<>]*<)\s*(?:su[bp]\s*[.\/\\]+|[.\/\\]+\s*su[bp])\s*>/gi,
'<sup$1/sup>'
);
/* Drop default font attributes */
t = t.replace(
/(<font\b[^<>]*?)\s+fa\w+(?:[\s"',=]*(?:Arial|Helvetica(?:\W?N\w*)?|sans\W?serif)\b)+[\s"';]*(?=\s\w+\s*=|>)/gi,
'$1'
);
t = t.replace(
/(<font\b[^<>]*?)\s+size[\s"',=]*(?:-1\b|2\b|100\b[ ,.]*\d*%|1(?:\.0*)?em\b)["';]*/gi,
'$1'
);
/* Remove tags with no content and no attributes */
t = t.replace(
/<(\w+)\s*(\s\w[^<\/>]*)?>\s*<\/\1\b[^<>]*>/gi,
function( $0, $1, $2 ) {
if ( ( $2 && /^ref/i.test( $1 ) ) || /^[bh]r$/i.test( $1 ) ) {
return '<' + $1.toLowerCase() + ( $2 || '' ) + ' />';
}
return $2 && /\bclear:/i.test( $2 ) ? $0 : '';
}
);
/* Remove inline elements with no attributes */
while ( /<(font|span)\s*>\s*(?:<(?!\1)|[^<])*?\s*<\/\1[^<>]*>/i.test( t ) ) {
t = t.replace( /<(font|span)\s*>\s*((?:<(?!\1)|[^<])*?)\s*<\/\1[^<>]*>/gi, '$2' );
}
t = t.replace(
/<font\s+color[\s"',=]*(#[\dA-F]{3,6}|[a-z]{3,20})[\s"';]*>((?:<(?!font)|[^<])*?)<\/font[^<>]*>/gi,
'<span style="color:$1;">$2<\/span>'
);
t = t.replace(
/<font\s+size[\s"',=]*(?:-[2-9]|[01])[\s"';]*>((?:<(?!font)|[^<])*?)<\/font[^<>]*>/gi,
'<small>$1<\/small>'
);
t = t.replace(
/<font\s+size[\s"',=]*(?:[+-]0|3)[\s"';]*>((?:<(?!font)|[^<])*?)<\/font[^<>]*>/gi,
'<span style="font-size:larger;">$1<\/span>'
);
/* Merge nested inline tags */
t = t.replace(
/<(abbr|cite|mark|q|s|small|u)\s*><(font|span)\s+style\s*=\s*["']?([^\n"<>]*?);?["']?\s*>([^<>]*)<\/\2\s*>\s*(?=<\/\1\s*>)/gi,
'<$1 style="$3;">$4'
);
t = t.replace(
/(<span\b[^<>]*?)\s+style\s*=\s*["']?([^\n"<>]*?);?["']?\s*><span\s+style\s*=\s*["']?([^\n"<>]*?);?["']?\s*>([^<>]*)<\/span\s*>\s*(?=<\/span\s*>)/gi,
'$1 style="$2; $3;">$4'
);
/* Verschiedenste Formen von HTML-Zeilenumbrüchen durch einheitliche ersetzen */
t = t.replace( /<(?:[\s\/\\]*br\b)+\s*(\s\w[^<>]*?)?[\s.\/\\]*>/gi, '<br$1 />' );
/* Unnötige HTML-Zeilenumbrüche entfernen, wenn sowieso ein Absatz folgt */
t = t.replace( / *<br \/>(?=\n[\n#*:;])/gi, '' );
t = t.replace(
/<(ref|small|su[bp])\b\s*(\s\w[^<>]*?)?\s*><small\s*>([^<>]*)<\/small\s*><\/\1\s*>/gi,
'<$1$2>$3<\/$1>'
);
t = t.replace(
/<small\s*><(ref|small|su[bp])\b\s*(\s\w[^<>]*?)?\s*?( ?\/|>[^<>]*<\/\1)\s*><\/small\s*>/gi,
'<$1$2$3>'
);
/* Drop old navigation bar wrapper, see [[Template:NaviBlock]] */
return t.replace(
/<div\s+class[^<>\w]*BoxenVerschmelzen[^<>\w]*>\s*(\{\{[^#:<>{}]*\}\})\s*<\/div>/gi,
'$1'
);
},
cleanHeadlines: function( t ) {
/* Fettung zumindest kompletter Überschriften ist unerwünscht */
t = t.replace( /^(=+) *'''([^\n']+)''' *(?==+$)/gm, '$1 $2 ' );
/* Repariert kaputte Überschriften, entfernt Doppelpunkte, setzt Leerzeichen */
t = t.replace( /^(=+) *(.*[^\s=:]) *:? *\1$/gm, '$1 $2 $1' );
/* Normalize "External links" headlines, use "Weblinks" in German */
return t.replace(
/^== *(?:Externer?|External)?(?: |\s)*(?:Weblinks?|Links?|Webseiten?|Websites?) *=+/gim,
this.lang === 'de' ? '== Weblinks ==' : '== External links =='
);
},
cleanThumbnails: function( t ) {
if ( this.localisation === 'de' ) {
/* Unnötiges "rechts" kürzen */
t = t.replace(
/(\[\[Datei:[^\n[\]]*[^\s[\]|])\s*\|+\s*(?:(?:mini|miniatur|thumb)\s*\|+\s*r(?:echts|ight)|r(?:echts|ight)\s*\|+\s*(?:mini|miniatur|thumb))\s*\|+\s*/gi,
'$1|thumb|'
);
/* Set the order to "thumb|upright" if one isn't localized */
t = t.replace(
/(\[\[Datei:[^\n[\]]*[^\s[\]|])\s*\|+\s*(?:upright([\s=_\d.]*)\|+\s*(?:mini|miniatur|thumb)|(?:hochkan|uprigh)t([\s=_\d.]*)\|+\s*thumb)\s*\|+\s*/gi,
'$1|mini|hochkant$2$3|'
);
t = t.replace(
/(\[\[Datei:[^\n[\]]*[^\s[\]|])\s*\|+\s*(?:mini|thumb)\s*\|+\s*/gi,
'$1|mini|'
);
t = t.replace(
/(\[\[Datei:[^\n[\]]*[^\s[\]|])\s*\|+\s*r(?:echts|ight)\s*\|+\s*/gi,
'$1|rechts|'
);
/* Änderung von "miniatur" in "mini" nur zusammen mit anderen Änderungen */
t = t.replace(
/(\[\[Datei:[^\n[\]]*[^\s[\]|])\s*\|+\s*(?:((?:left|none|cent[er]+|[en]*framed?|frameless|upright)\s*\|+)\s*miniatur|miniatur\s*(\|+\s*(?:left|none|cent[er]+|[en]*framed?|frameless|upright)))\s*\|+\s*/gi,
'$1|$2mini$3|'
);
t = t.replace(
/(\[\[Datei:[^\n[\]]*[^\s[\]|])\s*\|+\s*l(?:inks|eft)\s*\|+\s*/gi,
'$1|links|'
);
t = t.replace(
/(\[\[Datei:[^\n[\]]*[^\s[\]|])\s*\|+\s*(?:oh|no)ne\s*\|+\s*/gi,
'$1|ohne|'
);
t = t.replace(
/(\[\[Datei:[^\n[\]]*[^\s[\]|])\s*\|+\s*(?:zentriert|cent[er]+)\s*\|+\s*/gi,
'$1|zentriert|'
);
t = t.replace(
/(\[\[Datei:[^\n[\]]*[^\s[\]|])\s*\|+\s*(?:gerahmt|[en]*framed?)\s*\|+\s*/gi,
'$1|gerahmt|'
);
t = t.replace(
/(\[\[Datei:[^\n[\]]*[^\s[\]|])\s*\|+\s*(?:rahmenlo|frameles)s\s*\|+\s*/gi,
'$1|rahmenlos|'
);
t = t.replace(
/(\[\[Datei:[^\n[\]]*[^\s[\]|])\s*\|+\s*(?:hochkan|uprigh)t[\s=_]*([\d.]*)\s*\|+\s*/gi,
function( $0, $1, $2 ) { return $1 + '|hochkant' + ( $2 ? '=' + $2 : '' ) + '|'; }
);
}
/* vertical-align values from the CSS standard */
t = t.replace(
/(\[\[(?:Datei|File):[^\n[\]]*[^\s[\]|])\s*\|+\s*(?:grundlinie|baseline)\s*\|+\s*/gi,
'$1|baseline|'
);
t = t.replace(
/(\[\[(?:Datei|File):[^\n[\]]*[^\s[\]|])\s*\|+\s*(?:tief(?:gestellt)?|sub)\s*\|+\s*/gi,
'$1|sub|'
);
t = t.replace(
/(\[\[(?:Datei|File):[^\n[\]]*[^\s[\]|])\s*\|+\s*(?:hoch(?:gestellt)?|sup|super)\s*\|+\s*/gi,
'$1|super|'
);
t = t.replace(
/(\[\[(?:Datei|File):[^\n[\]]*[^\s[\]|])\s*\|+\s*(?:oben|top)\s*\|+\s*/gi,
'$1|top|'
);
t = t.replace(
/(\[\[(?:Datei|File):[^\n[\]]*[^\s[\]|])\s*\|+\s*text-(?:oben|top)\s*\|+\s*/gi,
'$1|text-top|'
);
t = t.replace(
/(\[\[(?:Datei|File):[^\n[\]]*[^\s[\]|])\s*\|+\s*mi(?:tt|ddl)e\s*\|+\s*/gi,
'$1|middle|'
);
t = t.replace(
/(\[\[(?:Datei|File):[^\n[\]]*[^\s[\]|])\s*\|+\s*(?:unten|bottom)\s*\|+\s*/gi,
'$1|bottom|'
);
return t.replace(
/(\[\[(?:Datei|File):[^\n[\]]*[^\s[\]|])\s*\|+\s*text-(?:unten|bottom)\s*\|+\s*/gi,
'$1|text-bottom|'
);
},
cleanExternalLinks: function( t ) {
t = t.replace( /\b(?:http(s?)(?::+\/*|\/\/+:*)\b)+/gi, 'http$1://' );
/* Doppelte eckige Klammern um Weblinks vereinfachen */
t = t.replace( /\[+ *(https?:\/\/[^\n[\]]*?) *\]+/gi, '[$1]' );
/* Weblinks mit senkrechtem Strich reparieren */
t = t.replace( /(\[https?:\/\/[^\s[\]|]*?) *\| *(?=[^\s=[\]|]+\])/gi, '$1 ' );
/* Schrägstriche am Ende einfacher Domains ergänzen */
t = t.replace( /(\[https?:\/\/\w[\w.-]*\w\.\w+) +/gi, '$1/ ' );
/* Domains klein schreiben, egal ob beschriftet oder nicht */
t = t.replace( /\bhttps?:\/\/\b[0-9a-z.-]*[A-Z][\w.-]*/g, function( $0 ) {
return $0.toLowerCase();
} );
/* Verbliebene projektinterne Weblinks protokollrelativ machen */
return t.replace( /\[ *https?:\/+(?=[a-z-]+\.wikipedia\.org\b)/gi, '[//' );
},
cleanWikimediaLinks: function( t ) {
if ( typeof window.autoFormatWikimediaLinks !== 'undefined'
&& !window.autoFormatWikimediaLinks
) {
return t;
}
var wiki = mw.config.get( 'wgDBname' ).replace( /wiki$/i, '' ),
ns = mw.config.get( 'wgFormattedNamespaces' )[-1];
/* Permanente Weblinks in Spezialseiten-Syntax umwandeln */
var permaLinkReplace = function( $0, $1, $2, $3, $4 ) {
/* Auf Alternative ausweichen, wenn zwischen ID und Anker noch Parameter stehen */
var m = /^(\d*([^#]*))(.*)$/.exec( $3 );
return m && m[2] ? '[{{fullurl:' +
( $1 === wiki ? '' : $1 + ':' ) + ( $2 || ':' ).replace( /_/g, ' ' ) + '|oldid=' + m[1] + '}}' + m[3] +
( typeof $4 === 'string' ? ' ' + $4 : '' ) + ']' :
'[[:' + $1 + ':' +
( $1 === wiki ? ns : 'Special' ) + ':Permanent' +
( $1 === 'de' ? 'er ' : '' ) + 'Link/' + $3 +
( typeof $4 === 'string' ? '|' + $4 : '' ) + ']]';
};
/* Weblinks auf Sprachversionen (auch auf die eigene) in Wikilinks umwandeln */
var interWikiReplace = function( $0, $1, $2, $3 ) {
/* Auf Alternative ausweichen, wenn Parameter enthalten wind */
var m = /^([^?]*)\?([^#]*)(.*)$/.exec( $2 );
try {
return m ? '[{{fullurl:' +
( $1 === wiki ? '' : $1 + ':' ) +
decodeURIComponent( m[1] ).replace( /_/g, ' ' ) + '|' + m[2] + '}}' + m[3] +
( typeof $3 === 'string' ? ' ' + $3 : '' ) + ']' :
'[[:' + $1 + ':' + $2.replace( /_/g, ' ' ) +
( typeof $3 === 'string' ? '|' + $3 : '' ) + ']]';
} catch ( ex ) {
return $0;
}
};
/* Schreibweise [[Weblink#Anker mit Leerzeichen|Beschriftung]] reparieren */
t = t.replace(
/\[+ *(?:https?:)?\/\/([a-z-]+)\.wikipedia\.org\/w\/[\w.]*\?(?:title=([^\s&[\]|]*)&)?oldid=([^\n?[\]|]+?) *\|+ *([^\n[\]|]*?) *\]+/gi,
permaLinkReplace
);
t = t.replace(
/\[+ *(?:https?:)?\/\/([a-z-]+)\.wikipedia\.org\/wiki\/([^\n[\]|]*?) *\|+ *([^\n[\]|]*?) *\]+/gi,
interWikiReplace
);
/* Schreibweise [Weblink#Anker Beschriftung] umwandeln */
t = t.replace(
/\[+ *(?:https?:)?\/\/([a-z-]+)\.wikipedia\.org\/w\/[\w.]*\?(?:title=([^\s&[\]|]*)&)?oldid=([^\s?[\]|]+) +([^\n[\]|]+?) *\]+/gi,
permaLinkReplace
);
t = t.replace(
/\[+ *(?:https?:)?\/\/([a-z-]+)\.wikipedia\.org\/wiki\/([^\s[\]|]*) +([^\n[\]|]+?) *\]+/gi,
interWikiReplace
);
/* Schreibweise [Weblink#Anker] umwandeln */
t = t.replace(
/\[+ *(?:https?:)?\/\/([a-z-]+)\.wikipedia\.org\/w\/[\w.]*\?(?:title=([^\s&[\]|]*)&)?oldid=([^\s?[\]|]+) *\]+/gi,
permaLinkReplace
);
t = t.replace(
/\[+ *(?:https?:)?\/\/([a-z-]+)\.wikipedia\.org\/wiki\/([^\s[\]|]*) *\]+/gi,
interWikiReplace
);
/* Verbliebene projektinterne Weblinks ohne eckige Klammern ebenfalls umwandeln */
t = t.replace(
/(?:https?:)?\/\/([a-z-]+)\.wikipedia\.org\/w\/[\w.]*\?(?:title=([^\s&[\]|]*)&)?oldid=([^\s?<>[\]{|}]*[^\s!"),.:;<>?[\\\]{|}])(?=[\s!),.:;<]|$)/gim,
permaLinkReplace
);
return t.replace(
/(?:https?:)?\/\/([a-z-]+)\.wikipedia\.org\/wiki\/([^\s<>[\]{|}]*[^\s!"),.:;<>?[\\\]{|}])(?=[\s!),.:;<]|$)/gim,
interWikiReplace
);
},
cleanInternalLinks: function( t ) {
var wiki = mw.config.get( 'wgDBname' ).replace( /wiki$/i, '' ),
ns = mw.config.get( 'wgFormattedNamespaces' )[-1];
/* Unnötig gewordene Vorlage in Spezialseiten-Syntax umwandeln */
t = t.replace(
/\{\{\s*Permalink\s*\|[^{|}]*\|\s*(\d+(?: ?#[^{|}]*?)?)\s*(?:(\|)\s*([^{|}]*?))?\s*\}\}/gi,
'[[' + ns + ':Permanent' + ( wiki === 'de' ? 'er ' : '' ) + 'Link/$1$2$3]]'
);
/* Ausgewählte {{fullurl:…|…}} kompakter formulieren */
t = t.replace(
/\{\{\s*fullurl:\s*([^\n{|}]+)\|\s*(?:diff=prev&oldid=(\d+)|oldid=(\d+)&diff=prev)\s*\}\}/gi,
'{{fullurl:$1|diff=$2$3}}'
);
/* Wikilinks mit unnötigem Präfix ":w:de:", "w:de:" oder ":de:" vereinfachen */
t = t.replace(
new RegExp(
'\\[\\[ *(?::? *w *)?: *' + wiki
+ ' *: *(((?:Bild|Datei|File|Image|[CK]ategor[iy]e?) *:)?[^\\n[\\]]*\\S) *\\]\\]',
'gi'
),
function( $0, $1, $2 ) {
return '[[' + ( $2 ? ':' : '' ) + $1 + ']]';
}
);
/* Anker in internen Links dekodieren */
t = t.replace(
/(\[\[[^\n#[\]{|]*#)([^\n#[\]|]+)(?=\|?[^\n#[\]|}]*\]\])/g,
function( $0, $1, $2 ) {
try {
/* Kodierung einiger Zeichen beibehalten (%25, %5B, %5D, %7B-%7D) */
return $1 + decodeURIComponent( $2.replace( /\.(?=[289A-E][\dA-F]|[357][B-F]|40|60)/g, '%' ) ).
replace( /[%[\]{|}]/g, function( $0 ) {
return '%' + $0.charCodeAt( 0 ).toString( 16 ).toUpperCase();
} );
} catch ( ex ) {
return $0;
}
}
);
/* Sonstige kodierte Linkziele dekodieren */
t = t.replace(
/\[\[([^\n#%[\]{|}]*%[2-9A-E][^\n#[\]{|}]*)(?=#?[^\n[\]{|}]*\|?[^\n[\]{|}]*\]\])/gi,
function( $0, $1 ) {
try {
/* Kodierung einiger Zeichen beibehalten (%25, %3C, %3E, %5B, %5D, %7B-%7D) */
return '[[' + decodeURIComponent( $1 ).replace( /[%<>[\]{|}]/g, function( $0 ) {
return '%' + $0.charCodeAt( 0 ).toString( 16 ).toUpperCase();
} );
} catch ( ex ) {
return $0;
}
}
);
/* Verbliebene Unterstriche aus Links entfernen */
t = t.replace(
/\[\[[^\n[\]_{|}]+_[^\n[\]{|}]+(?=\|?[^\n[\]{|}]*\]\])/g,
function( $0 ) {
return $0.replace( /_/g, ' ' );
}
);
/* [[Link|Dash-]] wird zu [[Link|Dash]]- und [[Link|Die]]s zu [[Link|Dies]], weil besser lesbar;
MediaWiki akzeptiert hier wirklich nur Kleinbuchstaben, ä, ö, ü und ß */
t = t.replace(
/\[\[ *([^\n[\]|]+?) *(\|[^\n[\]|]+?)(?:(-+)\]\](?![\s,])|\]\]([a-zßäöü]*))/g,
'[[$1$2$4]]$3'
);
t = t.replace( /(^|[^'])\[\[([^\n:[\]|]+)\|('{2,5})\2\3]\](?!')/g, '$1$3[[$2]]$3' );
/* [[Link|Link]]s werden zu [[Link]]s weil kürzer und besser lesbar */
return t.replace(
typeof window.autoFormatMaskedLinks === 'undefined' || window.autoFormatMaskedLinks
? /\[\[([^\n:[\]|]+)\|\1([^\n[\]|]*)\]\]/g
: /\[\[([^\n:[\]|]+)\|\1([a-zßäöü]* *)\]\]/g,
'[[$1]]$2'
);
},
cleanDuplicateLinks: function( t ) {
/* Remove links from dates that start with a year (e.g. ISO) */
t = t.replace(
/\[+([12]\d{3}\W+(?:3[01]|[12]\d|0?[1-9])\W+(?:3[01]|[12]\d|0?[1-9]))\]+/g,
'$1'
);
/* Never link dates and years in Persondata templates */
var re = /\{\{\s*P(erson(?:endaten|data)\b[^{}]*\|\s*(?:GEBURTSD|STERBED|DATE)[\s\w]*=[^\n=[\]{|}]*)\[+([^\n=[\]{|}]+)\]+/i;
while ( re.test( t ) ) {
t = t.replace( re, '{{P$1$2' );
}
if ( /\[\[[CK]ategor[iy]e?:(?:Tag|Days of the year)[|\]]|\{\{(?:Artikel Jahr|Year nav)\s*[|}]/i.test( t ) ) {
return t;
}
/* Exclude files and infoboxes from the start of the article */
var m = /^(?:\s*\[\[\w+:(?:\[\[[^\n\]]*\]\]|[^\n\]])*\]\])*(?:\s*\{\{(?:\{\{[^}]*\}\}|[^}])*\}\})+/.exec( t ),
start = m ? m[0].length : 0,
found = [],
a = [];
/* Unlink years that are linked more than one time */
re = /\[\[ *([12]\d{3}) *\]\]/g;
/* Jeweils ersten Fund eines Jahres merken, danach entlinken */
while ( m = re.exec( t ) ) {
if ( m.index >= start ) {
found[m[1]] ? a.push( m ) : found[m[1]] = true;
}
}
var r = '',
p = 0;
for ( var i = 0; i < a.length; i++ ) {
r += t.slice( p, a[i].index ) + a[i][1];
p = a[i].index + a[i][0].length;
}
return p ? r + t.slice( p ) : t;
},
cleanDates: function( t ) {
var months = mw.config.get( 'wgMonthNames' ) || ['', 'Januar', 'Februar', 'März', 'April',
'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
/* Add missing space between day and month */
t = t.replace( new RegExp( '([\\s!\'(>|„](?:3[01]|[12]\\d|0?[1-9])\\.?)(?=(?:' +
months.slice( 1 ).join( '|' ) + ')\\b)', 'g' ), '$1 ' );
/* No non-breaking space between month and year */
t = t.replace( new RegExp( '(\\b(?:3[01]|[12]\\d|0?[1-9])\\.?(?:[\\s\\xA0]| )+(?:' +
months.slice( 1 ).join( '|' ) + '))(?:\xA0| )(?=[12]\\d{3}\\b)', 'g' ), '$1 ' );
/* Missverständliches deutsches Datumsformat durch Langform ersetzen */
var separator = this.lang === 'en' ? ' ' : '. ';
t = t.replace(
/([\s'(>„])(3[01]|[12]\d|0?[1-9])\. *(1[012]|0?[1-9])\. *(?=[12]\d{3}[!,.:;?]?[\s')<\]“])/g,
function( $0, $1, $2, $3 ) {
return $1 + ( $2 | 0 ) + separator + months[$3 | 0] + ' ';
}
);
/* Unspaced dashes in "1850–14 January" are bad style in German and English */
separator = this.lang === 'de' ? ' bis ' : ' – ';
t = t.replace(
/(\b +[12]\d{3}'*) *[–—−-] *('*(?:3[01]|[12]\d|0?[1-9])\.?) *([A-S][a-zä]{2,}\b)/g,
function( $0, $1, $2, $3 ) {
for ( var i = months.length; --i; ) {
if ( $3 === months[i] ) {
return $1 + separator + $2 + ' ' + $3;
}
}
return $0;
}
);
/* Bis-Striche in 4-stellige Jahreszahlenbereiche einsetzen */
t = t.replace(
/([\s!'(>|„])(?:\[\[ *([12]\d{3}) *\]\]|([12]\d{3})) *[–—-] *(?:\[\[ *([12]\d{3}) *\]\]|([12]\d{3}))(?=[!,.:;?]?[\s!')\/<\]|}“])/g,
function( $0, $1, $2, $3, $4, $5 ) {
return ( $2 || $3 ) < ( $4 || $5 ) ? $1 + ( $2 || $3 ) + '–' + ( $4 || $5 ) : $0;
}
);
/* Bis-Striche in 2-stellige Jahreszahlenbereiche einsetzen */
t = t.replace(
/([\s!'(>|„][12]\d(\d\d)) *[—-] *(?=(1[3-9]|[2-9]\d)[!,.:;?]?(?:[\s!')\/<\]|“]|$)|\?)/g,
function( $0, $1, $2, $3 ) {
return !$3 || $2 < $3 ? $1 + '–' : $0;
}
);
/* "1980 – 90" becomes "1980–1990" in the German Wikipedia, "1980–90" otherwise */
var full = typeof window.autoFormatShortYearRanges !== 'undefined'
? window.autoFormatShortYearRanges : this.lang === 'de';
t = t.replace(
/([\s!'(>|„]([12]\d)(\d\d)) *– *(?!(?:3[01]|[12]\d|0[1-9])\.? [A-S][a-zä]{2,}\b)(?=(\d\d)[!,.:;?]?(?:[\s!')\/<|“]|$))/g,
function( $0, $1, $2, $3, $4 ) {
return $3 < $4 ? $1 + '–' + ( full ? $2 : '' ) : $0;
}
);
/* ISSNs aber ohne Bis-Striche, wichtig nach den Jahreszahlen */
return t.replace( /(IS\wN\W*\d+)–(?=\d)/g, '$1-' );
},
cleanTypography: function( t ) {
var de = this.lang === 'de';
/* Double quotes */
if ( de ) {
t = t.replace(
/(^|[\s!#'(*+\/:;>[|-])(?:"|,,)(?!\s)([^\n"“”„]*[^\s"“”„])"(?=[\s!'),.\/:;<?\]}-]|$)/g,
'$1„$2“'
);
}
t = t.replace(
/\{\{\s*((?:Zitat|")\s*\|\s*(?:(?:1|Text)\s*=)?[^={|}]*)/gi,
function( $0, $1 ) {
return '{{' + $1.replace( /„([^\n‘‚“”„]+)“/g, '‚$1‘' );
}
);
/* Auslassungspunkte */
t = t.replace( /(^|[ '(>[|„])\.\.\.(?=[ '),<?\]}“]|$)/gm, '$1…' );
t = t.replace( /[,;](?:[ \xA0]| )*†(?: | )*(?=[\w[])/gi, '; † ' );
t = t.replace(
/\( *([\d,.]*\d(?: | )*[KMk]i?B)(?:ytes?)?([,;]) *([A-Z]{3,4}(?:\W+Datei)?) *\)/g,
'($3$2 $1)'
);
t = t.replace(
/\( *([A-Z]{3,4}(?:\W+Datei)?)([,;]) *([\d,.]*\d)(?: | )*([KMk]i?B)(?:ytes?)? *\)/g,
function( $0, $1, $2, $3, $4 ) {
$3 = $3.replace( de ? /\b\.(?=\d{3}\b)/g : /\b,(?=\d{3}\b)/g, '' );
$3 = $3.replace( /^(\d*),(?=\d*$)/, '$1.' );
$3 = ( $4.charAt() === 'M' ? Math.round( $3 * 10 ) / 10 : Math.round( $3 ) ) || $3;
return '(' + $1 + ( de ? ( '; ' + $3 ).replace( /\./, ',' ) : $2 + ' ' + $3 )
+ ' ' + $4 + ')';
}
);
/* Bis-Striche bei Seitenzahlen */
t = t.replace( /\b(Sp?\.|Seiten?|Spalten?) *(\d+) *[–—−-] *(?=\d+(?:[\s!),.\/:;<?\]|}“]|$))/g, '$1 $2–' );
/* English Wikipedia also uses en dashes */
return t.replace( /([\w'\)>\]\xC0-\u024F“]) +-(,?) +(?=[\w'\(\[\xC0-\u024F„])/g, '$1 –$2 ' );
},
cleanUnits: function( t ) {
/* Prozentwerte erhalten seit Mitte 2007 automatisch ein geschütztes Leerzeichen */
t = t.replace( /(\S)(?:\xA0| )(?=%)/gi, '$1 ' );
if ( this.lang === 'de' ) {
t = t.replace( /([\s'(*+\/;„][\u2212-]?\d+(?:[,–]\d+)?)(?=%[\s!'),.\/:<?\]|“])/gi, '$1 ' );
t = t.replace( /((?:\d|\b)[cmk]?m) *<[Ss][Uu][Pp]\s*>\s*([23²³])\s*<\/[Ss][Uu]\w\s*>(?!\/)/g,
function( $0, $1, $2 ) {
return $1 + ( { '2': '²', '3': '³' }[$2] || $2 );
}
);
}
/* Maßeinheiten immer mit Leerzeichen */
return t.replace(
/([ '(*+:;„][\u2212-]?\d+(?:[,–]\d+)?) ?(k[Bgm]|Ki?B|k?Hz|[MGT](?:i?B|Hz)|cm|ha|m[lm]|[gm€¥])(?=[²³]?[ !'),.\/:;<?“])/g,
'$1 $2'
);
},
cleanNonBreakingSpaces: function( t ) {
/* Paragraf, Abs. und Satz mit geschützten Leerzeichen */
t = t.replace(
/§(?: *| )(\d\w* +A[bsatz.]+)(?: *| )(\d+ +S[atz.]+) *(?=\d)/gi,
'§ $1 $2 '
);
t = t.replace( /§(?: *| )(\d\w* +A[bsatz.]+) *(?=\d)/gi, '§ $1 ' );
t = t.replace( /§ *(?=\d)/gi, '§ ' );
/* No non-breaking spaces in headlines */
return t.replace( /^=.* .*=$/gim, function( $0 ) {
return $0.replace( /(?: |\s)+/gi, ' ' );
} );
},
cleanISBNs: function( t ) {
/* ISBNs mit Bindestrichen gliedern */
return t.replace(
/(^|[\s#'(*>|])(?:(ISBN\d?\s*=\s*)|ISBN(?:-?1[03]\b| *1[03]:)?:?\s*)(9-?7-?[89]-?)?([013][\d\u2010-\u2012\u2212-]{8,}[\dX]\b)/gim,
function( $0, $1, $2, $3, $4 ) {
return $1 + ( $2 || 'ISBN ' ) + ( $3 || '' ).replace( /^9\D*7\D*(\d)\D*/, '97$1-' ) + $4.
/* Remove all dashes */
replace( /[^\dX]+/gi, '' ).
/* Group 0 for English books */
replace( /^0([01]\d)(\d{6})\B/, '0$1-$2-' ).
replace( /^0([2-6]\d\d)(\d{5})\B/, '0$1-$2-' ).
replace( /^0(7\d{3}|8[0-4]\d\d)(\d{4})\B/, '0$1-$2-' ).
replace( /^0(8[5-9]\d{3})(\d{3})\B/, '0$1-$2-' ).
replace( /^0(9[0-4]\d{4})(\d\d)\B/, '0$1-$2-' ).
replace( /^0(9[5-9]\d{5})(\d)\B/, '0$1-$2-' ).
/* Group 1 for English books */
replace( /^1(0\d)(\d{6})\B/, '1$1-$2-' ).
replace( /^1([1-3]\d\d)(\d{5})\B/, '1$1-$2-' ).
replace( /^1(4\d{3}|5[0-4]\d\d)(\d{4})\B/, '1$1-$2-' ).
replace( /^1(5[5-9]\d{3}|[67]\d{4}|8[0-5]\d{3}|86[0-8]\d\d|869[0-7]\d)(\d{3})\B/, '1$1-$2-' ).
replace( /^1(869[89]\d\d|8[7-9]\d{4}|9[0-8]\d{4}|99[0-8]\d{3})(\d\d)\B/, '1$1-$2-' ).
replace( /^1(999\d{4})(\d)\B/, '1$1-$2-' ).
/* Group 3 for German books */
replace( /^3(0[0-24-9]|1\d)(\d{6})\B/, '3$1-$2-' ).
replace( /^3(03[0-3]|[2-6]\d\d)(\d{5})\B/, '3$1-$2-' ).
replace( /^3(03[4-6]\d|7\d{3}|8[0-4]\d\d)(\d{4})\B/, '3$1-$2-' ).
replace( /^3(03[7-9]\d\d|8[5-9]\d{3}|95[4-9]\d\d|9[69]\d{3})(\d{3})\B/, '3$1-$2-' ).
replace( /^3(9[0-4]\d{4})(\d\d)\B/, '3$1-$2-' ).
replace( /^3(95[0-3]\d{4}|9[78]\d{5})(\d)\B/, '3$1-$2-' ).
/* Add missing dash after group */
replace( /^([0-57]|6\d\d|8\d|9[0-4]|9[5-8]\d|99[0-8]\d|999\d\d)\B/, '$1-' );
}
);
},
cleanReferences: function( t ) {
t = t.replace(
/<\s*references\s*(\s\b[^<>]*?)?\s*(?:\/|>\s*<\s*\/\s*references)\s*>/gi,
'<references$1 />'
);
t = t.replace( /<\s*references\s*(\s\b[^<\/>]*?)?\s*>/gi, '<references$1>' );
t = t.replace( /<\s*\/\s*references\s*>/gi, '<\/references>' );
if ( this.isAll ) {
var re = /(<references[^<\/>]*)>/g,
m;
while ( m = re.exec( t ) ) {
if ( t.indexOf( '<\/references>', m.index ) < 0 ) {
t = t.slice( 0, m.index ) + m[1] + ' />' + t.slice( m.index + m[0].length );
}
}
}
t = t.replace( /<\s*ref\s*(\s\b[^<>]*?)\s*(?:\/|>\s*<\s*\/\s*ref)\s*>/gi, '<ref$1 />' );
/* Zeilenumbrüche in Einzelnachweisen nur oben im Artikel entfernen */
var i = t.indexOf( '<references' ),
slice;
if ( i > 0 ) {
slice = t.slice( i );
slice = slice.replace( /<\s*ref\s*(\s\b[^<\/>]*?)?\s*>[\t ]*/gi, '<ref$1>' );
slice = slice.replace( /(?:(\n[\t ]*)|[\t ]*)<\s*\/\s*ref\s*>/gi, '$1<\/ref>' );
t = t.slice( 0, i );
}
t = t.replace( /<\s*ref\s*(\s\b[^<\/>]*?)?\s*>\s*/gi, '<ref$1>' );
t = t.replace( /\s*<\s*\/\s*ref\s*>/gi, '<\/ref>' );
if ( slice ) {
t += slice;
}
/* Leerzeichen zwischen Satzende und <ref> oder zwei <ref> entfernen */
t = t.replace( /([!,.;?]|<ref\b[^<>]*(?:\/|>[^<>]*<\/ref)>) +(?=<ref[ >])/gi, '$1' );
/* Zwei gleiche Satzzeichen vor und nach einem <ref> auf eins kürzen */
return t.replace( /([!,.:;?])(<ref\b[^<>]*(?:\/|>[^<>]*<\/ref)>)\1/gi, '$1$2' );
},
cleanCategories: function( t ) {
t = t.replace( /\{\{\s*(SORTIERUNG|DEFAULT ?\w*SORT\w*)\s*[:|][\s\xA0]*/gi,
this.localisation === 'de' ? '{{SORTIERUNG:' : this.localisation ? '{{DEFAULTSORT:' : '{{$1:' );
/* Match every character thats in one of the two replacement maps or should be deleted */
var re = /["&'\-\/?`¡-¥©-´·-ſǍ-\u01ED\u01F8-\u021B\u02B0-\u036FΆ-ώ\u0400-Ј\u040D-ј\u045DўҐ-ғҚқҢңҮ-ұҺһ\u04D0-\u04D7\u1E00-ỹ\u2010-•′″‹›−ff-st]/g;
/* Unicodeblock Lateinisch-1, Ergänzung (U+0080 bis U+00FF) */
var trSet1 = '"/?¡¢£¤¥©ª«¬®°±²³·¹º»¿ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõö÷øùúûüýÿ';
var trSet2 = ' cL YCa R 23 1o AAAAAACEEEEIIIIDNOOOOOxOUUUUYaaaaaaceeeeiiiidnooooo ouuuuyy';
/* Unicodeblock Lateinisch, erweitert-A (U+0100 bis U+017F) */
trSet1 += 'ĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŔŕŖŗŘř';
trSet2 += 'AaAaAaCcCcCcCcDdDdEeEeEeEeEeGgGgGgGgHhHhIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnnNnOoOoOoRrRrRr';
trSet1 += 'ŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſ';
trSet2 += 'SsSsSsSsTtTtTtUuUuUuUuUuUuWwYyYZzZzZzs';
/* Unicodeblock Lateinisch, erweitert-B (U+0180 bis U+024F) */
trSet1 += 'ǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟǠǡǤǥǦǧǨǩǪǫǬǭǸǹǺǻǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘșȚț';
trSet2 += 'AaIiOoUuUuUuUuUueAaAaGgGgKkOoOoNnAaOoAaAaEeEeIiIiOoOoRrRrUuUuSsTt';
/* Unicodeblock Kyrillisch (U+0400 bis U+04FF) */
trSet1 += '\u0400ІЈ\u040DЎАБВГДЕЗИЙКЛМНОПРСТУФЦЪЫЭабвгдезийклмнопрстуфцъыэ\u0450іј\u045DўҐґҚқҮүҰұҺһӐӑӒӓӖӗ';
trSet2 += 'EIJIUABWGDESIJKLMNOPRSTUFZAYEabwgdesijklmnoprstufzayeeijiuGgQqUuUuHhAaAaEe';
/* Unicodeblock Lateinisch, weiterer Zusatz (U+1E00 bis U+1EFF) */
trSet1 += 'ḀḁḂḃḄḅḆḇḈḉḊḋḌḍḎḏḐḑḒḓḔḕḖḗḘḙḚḛḜḝḞḟḠḡḢḣḤḥḦḧḨḩḪḫḬḭḮḯḰḱḲḳḴḵḶḷḸḹḺḻḼḽḾḿṀṁṂṃṄṅṆṇṈṉṊṋṌṍṎṏṐṑṒṓṔṕṖṗ';
trSet2 += 'AaBbBbBbCcDdDdDdDdDdEeEeEeEeEeFfGgHhHhHhHhHhIiIiKkKkKkLlLlLlLlMmMmMmNnNnNnNnOoOoOoOoPpPp';
trSet1 += 'ṘṙṚṛṜṝṞṟṠṡṢṣṤṥṦṧṨṩṪṫṬṭṮṯṰṱṲṳṴṵṶṷṸṹṺṻṼṽṾṿẀẁẂẃẄẅẆẇẈẉẊẋẌẍẎẏẐẑẒẓẔẕẖẗẘẙẚẛ\u1E9C\u1E9D\u1E9F';
trSet2 += 'RrRrRrRrSsSsSsSsSsTtTtTtTtUuUuUuUuUuVvVvWwWwWwWwWwXxXxYyZzZzZzhtwyasssd';
trSet1 += 'ẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮữỰựỲỳỴỵỶỷỸỹ';
trSet2 += 'AaAaAaAaAaAaAaAaAaAaAaAaEeEeEeEeEeEeEeEeIiIiOoOoOoOoOoOoOoOoOoOoOoOoUuUuUuUuUuUuUuYyYyYyYy';
/* Unicodeblock Allgemeine Interpunktion (U+2000 bis U+206F) */
trSet1 += '\u2012—―\u2016‗‘‚\u201B“”„\u201F†‡•′″‹›−';
trSet2 += ' ';
var trMap = {
'&': 'und', '¼': '14', '½': '12', '¾': '34',
'Æ': 'Ae', 'Þ': 'Th', '\u1E9E': 'SS', 'ß': 'ss', 'æ': 'ae', 'þ': 'th', 'IJ': 'Ij',
'ij': 'ij', 'Œ': 'Oe', 'œ': 'oe', 'Ǣ': 'Ae', 'ǣ': 'ae', 'Ǽ': 'Ae', 'ǽ': 'ae',
/* Unicodeblock Griechisch und Koptisch (U+0370 bis U+03FF) */
'Ά': 'Alpha', 'Έ': 'Epsilon', 'Ή': 'Eta', 'Ί': 'Iota', 'Ό': 'Omikron',
'Ύ': 'Ypsilon', 'Ώ': 'Omega', 'ΐ': 'iota', 'Α': 'Alpha', 'Β': 'Beta', 'Γ': 'Gamma',
'Δ': 'Delta', 'Ε': 'Epsilon', 'Ζ': 'Zeta', 'Η': 'Eta', 'Θ': 'Theta', 'Ι': 'Iota',
'Κ': 'Kappa', 'Λ': 'Lambda', 'Μ': 'My', 'Ν': 'Ny', 'Ξ': 'Xi', 'Ο': 'Omikron',
'Π': 'Pi', 'Ρ': 'Rho', 'Σ': 'Sigma', 'Τ': 'Tau', 'Υ': 'Ypsilon', 'Φ': 'Phi',
'Χ': 'Chi', 'Ψ': 'Psi', 'Ω': 'Omega', 'Ϊ': 'Iota', 'Ϋ': 'Ypsilon', 'ά': 'alpha',
'έ': 'epsilon', 'ή': 'eta', 'ί': 'iota', 'ΰ': 'ypsilon', 'α': 'alpha', 'β': 'beta',
'γ': 'gamma', 'δ': 'delta', 'ε': 'epsilon', 'ζ': 'zeta', 'η': 'eta', 'θ': 'theta',
'ι': 'iota', 'κ': 'kappa', 'λ': 'lambda', 'μ': 'my', 'ν': 'ny', 'ξ': 'xi',
'ο': 'omikron', 'π': 'pi', 'ρ': 'rho', 'ς': 'sigma', 'σ': 'sigma', 'τ': 'tau',
'υ': 'ypsilon', 'φ': 'phi', 'χ': 'chi', 'ψ': 'psi', 'ω': 'omega', 'ϊ': 'iota',
'ϋ': 'ypsilon', 'ό': 'omikron', 'ύ': 'ypsilon', 'ώ': 'omega',
/* Unicodeblock Kyrillisch (U+0400 bis U+04FF) */
'Ё': 'Jo', 'Ђ': 'Dje', 'Ѓ': 'Gje', 'Є': 'Je', 'Ѕ': 'Dze', 'Ї': 'Ji', 'Џ': 'Dsche',
'Ж': 'Sch', 'Х': 'Ch', 'Ч': 'Tsch', 'Ш': 'Sch', 'Щ': 'Schtsch', 'Ю': 'Ju',
'Я': 'Ja', 'ж': 'sch', 'х': 'ch', 'ч': 'tsch', 'ш': 'sch', 'щ': 'schtsch',
'ю': 'ju', 'я': 'ja', 'ё': 'jo', 'ђ': 'dje', 'ѓ': 'gje', 'є': 'je', 'ѕ': 'dze',
'ї': 'ji', 'Ғ': 'Gh', 'ғ': 'gh', 'Ң': 'Ng', 'ң': 'ng', 'Ӕ': 'Ae', 'ӕ': 'ae',
/* Unicodeblock Alphabetische Präsentationsformen (U+FB00 bis U+FB4F) */
'ff': 'ff', 'fi': 'fi', 'fl': 'fl', 'ffi': 'ffi', 'ffl': 'ffl', 'ſt': 'st', 'st': 'st'
};
trSet1 += this.lang === 'de' ? "–" : "'-–";
trSet2 += this.lang === 'de' ? " " : "'--";
var trReplace = function( $0, $1, $2 ) {
return $1 + $2.replace( /&#?\w+;/g, ' ' ).replace( re,function( $0 ) {
/* Some characters are replaced with the empty charAt(-1) on purpose */
return trMap[$0] || trSet2.charAt( trSet1.indexOf( $0 ) );
} ).replace( /(\S) +(?= |$)/g, '$1' ).replace( /(\S)# */g, '$1 #' );
};
t = t.replace( /(\{\{(?:SORTIERUNG|DEFAULT\w*SORT\w*):)([^\n{}]+)(?=\}\})/g, trReplace );
t = t.replace( /(\[\[[CK]ategor[iy]e?:[^\n[\]|]+\|)([^\n[\]|]+)(?=\]\])/g, trReplace );
/* Groß-/Kleinschreibung wird seit dem 8. März 2011 ignoriert */
var title = mw.RegExp.escape( mw.config.get( 'wgTitle' ) );
t = t.replace( new RegExp( '\\{\\{(?:SORTIERUNG|DEFAULT\\w*SORT\\w*):\\s*' + title + '\\}\\}\\s*', 'gi' ), '' );
var m = /\{\{(?:SORTIERUNG|DEFAULT\w*SORT\w*):([^\n{}]*)/.exec( t );
t = t.replace( new RegExp( '(\\[\\[[CK]ategor[iy]e?:[^[\\]|]*)\\|'
+ ( m && mw.RegExp.escape( m[1] ) || title ) + '\\s*(?=\\]\\])', 'gi' ), '$1' );
return t.replace(
/(\[\[[CK]ategor[iy]e?:)([a-z])/g,
function( $0, $1, $2 ) {
return $1 + $2.toUpperCase();
}
);
},
cleanNewlines: function( t ) {
/* Mehrfache Leerzeilen auf einzelne reduzieren */
t = t.replace( this.isDisambiguation ? /\n{3,}(?=\n)/g : /\n{3,}/g, '\n\n' );
/* Keine Leerzeile vor einzeiligen <references /> */
t = t.replace( /(==\n)\n+(?=<references[^\n<>]*\/>\n\n)/gi, '$1' );
/* Leerzeile nach Einzelnachweisen */
t = t.replace(
/(<\/?references[^\n<>]*>)\s*(?=\{\{Navi(?:gationsleiste |Block)|\{\{SORTIERUNG:|\{\{DEFAULT\w*SORT\w*:|\[\[[CK]ategor[iy]e?:)/gi,
'$1\n\n'
);
/* Leerzeile zwischen Listen/bestimten Vorlagen und Kategorienblock */
t = t.replace(
/(\{\{(?:Begriffsklärung|Coordinate|Navi(?:gationsleiste |Block)|Normdaten)[^{}]*\}\}|^\* *[h[{][^\n]*)\s*(?=\{\{SORTIERUNG:|\{\{DEFAULT\w*SORT\w*:|\[\[[CK]ategor[iy]e?:)/gim,
'$1\n\n'
);
/* Split categories into separate lines (don't make this a look-ahead, it's slow!) */
t = t.replace( /([^\s>-]) *(\[\[[CK]ategor[iy]e?:[^\n[\]]*\]\])/gi, '$1\n$2' );
t = t.replace( /(\[\[[CK]ategor[iy]e?:[^\n[\]]*\]\]) *(?![\s<-]|$)/gi, '$1\n' );
t = t.replace(
/(\[\[[CK]ategor[iy]e?:[^\n[\]]*\]\]\n) *(?!\[\[[CK]ategor[iy]e?:|[\s<-]|$)/gi,
'$1\n'
);
/* Keine Leerzeile zwischen SORTIERUNG und Kategorie */
t = t.replace(
/(\{\{(?:SORTIERUNG|DEFAULT\w*SORT\w*):[^\n{}]*\}\})\s*(?=\[\[[CK]ategor[iy]e?:)/gi,
'$1\n'
);
/* Two empty lines in front of English stub templates */
return t.replace(
/(\[\[[CK]ategor[iy]e?:[^\n[\]]*\]\])\s*(?=\{\{[\w-]+-stub\b)/gi,
'$1\n\n\n'
);
},
cleanTemplates: function( t ) {
var de = this.lang === 'de';
t = t.replace( /\{\{\s*:?\s*(?:Vorlage|Template)\s*:\s*/gi, '{{' );
/* Unterstriche aus allen Vorlagennamen entfernen */
t = t.replace(
/(?:^|[^{])\{\{[ 0-9a-z\xC0-\u024F-]*_[ \w\xC0-\u024F-]*/gi,
function( $0 ) {
return $0.replace( /_+$/, '' ).replace( /[ _]+/g, ' ' ).replace( /\{ +/, '{' );
}
);
/* Drop empty templates */
t = t.replace(
/\{\{(?:Datum|e?dtsx?|Format(?:Date\d*|Num\w*|Zahl\w*)|Literatur|nts|Sort(?:Date\d*|Key\w*))[\s|]*\}\}(?!\})/gi,
''
);
/* Wirkungslose Leerzeilen aus Vorlagen entfernen */
while ( /^\{\{(?:<(?:br|file>)[^>]*>|[^<>{}])*\n\n+ *[|}]/m.test( t ) ) {
t = t.replace( /^(\{\{(?:<(?:br|file>)[^>]*>|[^<>{}])*\n)\n+(?= *[|}])/gm, '$1' );
}
/* Use a {{Commons category|…}} template instead of {{Commons|Category:…}} */
t = t.replace( /\{\{\s*Commons *(?:cat|category)?\s*\|\s*[CK]ategor[iy]e?\s*:\s*/gi,
de ? '{{Commonscat|' : '{{Commons category|' );
/* Projektweit einheitliche Schreibweisen für häufig verwendete Vorlagen */
t = t.replace(
/\{\{\s*(-|Br|Breakafterimages|Clr)[\s|]*(?=\}\})/gi,
de ? '{{Absatz' : '{{$1'
);
t = t.replace(
/\{\{\s*(?:Absatz|(Clear)(?:[ |]*(?:all|both))?)[\s|]*(?=\}\})/gi,
de ? '{{Absatz' : function( $0, $1 ) { return '{{' + ( $1 || 'Clear' ); }
);
t = t.replace(
/\{\{\s*(?:Artikel über lebende Pe\w*|BLP)[\s|]*(?=\}\})/gi,
de ? '{{Artikel über lebende Person' : '{{BLP'
);
t = t.replace(
/\{\{\s*(?:Belege|Quellen?)(?: *fehlen)?(?:[\s|]*(?=\}\})| *(?=\s*\|))/gi,
'{{Belege fehlen'
);
t = t.replace( /\{\{\s*(?:Benutzer(?:in)?|IP|User|Vandale)\s*\|\s*/gi,
de ? '{{Benutzer|' : '{{User|' );
t = t.replace( /\{\{\s*Commons(?:[\s|]*(?=\}\})|\s*(\|)\s*)/gi, '{{Commons$1' );
t = t.replace( /\{\{\s*Commons *cat(?:egory)?(?:[\s|]*(?=\}\})|\s*(\|)\s*)/gi,
de ? '{{Commonscat$1' : '{{Commons category$1' );
t = t.replace( /\{\{\s*Dieser *Artikel\s*\|\s*/gi, '{{Dieser Artikel|' );
t = t.replace( /\{\{\s*DOI\s*\|\s*/gi, '{{DOI|' );
t = t.replace( /\{\{\s*dts(x?)\s*\|\s*/gi, '{{dts$1|' );
t = t.replace( /\{\{\s*Erledigt[\s|~]*\}\}/gi, '{{Erledigt|~~\~~}}' );
t = t.replace(
/\{\{\s*(?:Gefallen|Fallen|Verlust|Verschlechtert|Decrease|Down|Loss)[\s|]*(?=\}\})/gi,
de ? '{{Gefallen' : '{{decrease'
);
t = t.replace(
/\{\{\s*(?:Gestiegen|Steigen|Gewinn|Profit|Verbessert|Increase|Gain)[\s|]*(?=\}\})/gi,
de ? '{{Gestiegen' : '{{increase'
);
t = t.replace(
/\{\{\s*(?:Hauptartikel|Hauptseite|Main|Main *articles?|See *main)\s*\|\s*/gi,
de ? '{{Hauptartikel|' : '{{Main|'
);
t = t.replace( /\{\{\s*IMDb\s*\|\s*(\w+)\s*/gi, '{{IMDb|$1' );
t = t.replace( /\{\{\s*(?:Internetquelle|Weblink)(?=\s*\|)/gi, '{{Internetquelle' );
t = t.replace(
/\{\{\s*(?:In *TeX *konvertieren|TeX)(?:[\s|]*(?=\}\})|\s*(\|)\s*)/gi,
'{{In TeX konvertieren$1'
);
t = t.replace( /\{\{\s*lang\s*\|\s*/gi, '{{lang|' );
t = t.replace( /\{\{\s*Link *([FG]A)\s*\|\s*/gi, '{{Link $1|' );
t = t.replace( /\{\{\s*nts\s*\|\s*/gi, '{{nts|' );
t = t.replace( /\{\{\s*(?:Nur *Liste|Liste)(?:[\s|]*(?=\}\})| *(?=\s*\|))/gi, '{{Nur Liste' );
t = t.replace( /\{\{\s*Okina[\s|]*\}\}/gi, '\u02BB' );
t = t.replace( /\{\{\s*Rotten *Tomatoes\s*\|\s*/gi, '{{Rotten Tomatoes|' );
t = t.replace(
/\{\{\s*S(?:iehe *auch|ee[ -]*also)\s*\|\s*/gi,
de ? '{{Siehe auch|' : '{{See also|'
);
t = t.replace(
/\{\{\s*(?:SortDate|Datesort)\d*\s*\|\s*/gi,
de ? '{{SortDate|' : '{{dts|'
);
t = t.replace(
/\{\{\s*SortKey(Name)?\s*\|\s*/gi,
de ? '{{SortKey$1|' : function( $0, $1 ) { return $1 ? '{{sortname|' : '{{sort|'; }
);
t = t.replace(
/\{\{\s*(?:(?:Toter|Bad|Broken|Dead)[ -]*Link|404|Dead|DL)[\s|]*(?=[|}])/gi,
de ? '{{Toter Link' : '{{dead link'
);
t = t.replace(
/\{\{\s*(u)nsign?(?:iert|ed)?\s*\|\s*/gi,
de ? '{{$1nsigniert|' : '{{$1nsigned|'
);
t = t.replace(
/\{\{\s*(?:Unverändert|Stabil|Steady|Nochange|Unchanged)[\s|]*(?=\}\})/gi,
de ? '{{Unverändert' : '{{steady'
);
t = t.replace(
/\{\{\s*(?:Vorlage|Tl?1?|Temp|Template(?: *link)?)\s*\|\s*/gi,
de ? '{{Vorlage|' : '{{tl|'
);
t = t.replace(
/\{\{\s*Wik(ibooks|inews|iquote|isource|ivoyage|tionary)[\s|]*(?=[|}])/gi,
'{{Wik$1'
);
/* Einheitliche Kleinschreibung für Sprachvorlagen wie {{enS|…}} */
t = t.replace(
/\{\{\s*([A-Za-z])([a-z]+S)(?:[\s|]*(?=\}\})|\s*(\|)\s*)/g,
function( $0, $1, $2, $3 ) {
return '{{' + $1.toLowerCase() + $2 + ( $3 || '' );
}
);
t = t.replace(
/\{\{\s*IMDb *([a-z])(\w+)\s*\|\s*/gi,
function( $0, $1, $2 ) {
return '{{IMDb ' + ( de ? $1.toUpperCase() : $1.toLowerCase() ) + $2 + '|';
}
);
t = t.replace( /\(\{\{\s*B\s*((?:\|[^\n{|}]*){2,4})\}\}\)/gi, '{{Bibel$1}}' );
/* Remove navigation bar wrapper if it contains a single navigation bar only */
t = t.replace( /\{\{\s*NaviBlock\s*\|[\s|]*([^\n<>{|}]+)[\s|]*(?=\}\})/gi, '{{$1' );
t = t.replace(
/\{\{\s*(NaviBlock[^<>{}]*?)(?:[\s|]-*)*(?=\}\})/gi,
function( $0, $1 ) {
return '{{' + $1.replace( /\s*\|(?:-*[\s|])*/g, '\n|' ) + '\n';
}
);
t = t.replace( /\{\{\s*Normdaten\s*\|\s*PND\s*=\s*/g, '{{Normdaten|TYP=p|GND=' );
t = t.replace( /\{\{\s*WBA\s*\|\s*/gi, '{{Waybackarchiv|' );
t = t.replace(
/\[ *\{\{\s*Wayback\w*\s*\|\s*url\s*=\s*[^\s\d{|}]*(\d{1,14})\/(\w+:[^\s{|}]*)[^{}]*\}\}\s+([^[\]|]*)\]/gi,
'{{Webarchiv | url=$2 | wayback=$1 | text=$3}}'
);
return t.replace( /(\|\s*(?:Breit|Läng)engrad\s*=\s*[\d.\/]*?)\/[\/0]*(?=[\n|}])/g, '$1' );
},
cleanRedundantTemplateParameters: function( t ) {
var parameters = window.redundantTemplateParameters || [
'(?:IMDb(?: Name| Titel)?|OFDb|Rotten Tomatoes)|2',
'Infobox (?:Arcade|Computer- und Videospiel|Musikalbum)|Titel',
'Infobox (?:Band|Burg|Chemikalie|Eishockeyspieler|Flughafen|Flugzeug|Gemeinde in ' +
'(?:Deutschland|Österreich)|Gemeindeverband in Deutschland|Landkreis|Ort in den ' +
'(?:Niederlanden|Vereinigten Staaten)|Schiff|Schutzgebiet|Software|Stadion|Unternehmen)|Name',
'Infobox (?:Berg|Fluss|Insel|See)|NAME',
'Infobox Fußballspieler|kurzname',
'Infobox Gemeinde in Italien|nomeComune',
'Infobox Nationalpark|title',
'Infobox Ort in der Schweiz|NAME_ORT',
'Infobox Ort in (?:Polen|Tschechien)|Ort',
'Infobox Ortsteil einer Gemeinde(?: in Deutschland)?|Ortsteil',
'Infobox PKW-Modell|Modell',
'Infobox Publikation|titel'];
var title = '\\s*(?:' +
mw.RegExp.escape( mw.config.get( 'wgTitle' ) ).replace( /\s+/g, '\\s+' ) +
'|\\{+\\w*\\}+)?\\s*';
for ( var i = parameters.length; i--; ) {
var m = /^(.+)\|(\d+)$/.exec( parameters[i] );
var re = m ? m[1] + '\\s*(?:\\|[^{|}]*){' + ( m[2] - 1 ) + '})\\|' + title + '(?=\\}\\})' :
parameters[i].replace( /[\s_]+/g, '[\\s_]+' ).replace( /\|(?=[^|]*$)/, '\\s*(?:\\|[^{}]*)?)\\|\\s*' ) +
'\\s*=' + title + '(?=\\||\\}\\})';
t = t.replace( new RegExp( '(\\{\\{\\s*' + re, 'g' ), '$1' );
}
return t;
},
cleanTemplatesByRules: function( t ) {
var rules = window.autoFormatTemplates || [{ name: 'Personendaten', format: '|_=_\n' }];
for ( var rule in rules ) {
if ( !rules[rule] || !rules[rule].name ) {
continue;
}
rule = rules[rule];
/* Format muss minimalst |_=_ lauten */
if ( !rule.format ) {
rule.format = '';
}
if ( rule.format.indexOf( '|' ) < 0 ) {
rule.format = '|' + rule.format;
}
if ( rule.format.indexOf( '_' ) < 0 ) {
rule.format = rule.format.replace( '|', '|_' );
}
if ( rule.format.indexOf( '=' ) < 0 ) {
rule.format += '=';
}
if ( rule.format.match( /_+/g ).length < 2 ) {
rule.format += '_';
}
var re = new RegExp( '\\{\\{[\\s\\xA0]*' + rule.name.replace( /[\s_]+/g, '[\\s_]+' )
+ '(\\s*<![^>|}]*>)?[\\s\\xA0]*\\|', 'gi' ),
m,
a = [];
while ( m = re.exec( t ) ) {
a.push( m );
}
for ( var i = a.length; i--; ) {
t = this.cleanTemplateByRule( t, rule, a[i].index + 2, a[i][1] );
}
}
return t;
},
cleanTemplateByRule: function( t, rule, start, comment ) {
var parameters,
p = '',
pos = start - 1,
nesting = { '[': 0, '{': 0 };
while ( ++pos < t.length ) {
var c = t.charAt( pos );
if ( c === '[' || c === '{' ) {
nesting[c]++;
} else if ( c === ']' && nesting['[']-- <= 0 ) {
return t;
} else if ( c === '}' && nesting['{']-- <= 0 ) {
/* Parsing hatte nach den öffnenden {{ begonnen, also vor den schließenden }} aufhören */
if ( t.charAt( pos + 1 ) !== '}' ) {
return t;
}
if ( parameters ) {
parameters.push( p );
}
break;
} else if ( c === '|' && nesting['['] <= 0 && nesting['{'] <= 0 ) {
if ( parameters ) {
parameters.push( p );
} else {
parameters = [];
}
p = '';
}
p += c;
}
if ( pos >= t.length || nesting['['] > 0 ) {
return t;
}
var m = /((_+)#*)( *)[^_]*((_+)#*)( *)/.exec( rule.format );
var kMax = m ? m[1].length : 0,
kMin = m ? m[2].length : 0,
kFix = m ? m[3].length : 0,
vMax = m ? m[4].length : 0,
vMin = m && m[5].length > 1 ? m[5].length : 0,
vFix = m ? m[6].length : 0;
var result = rule.name + ( comment || '' ) + ( /\n$/.test( rule.format ) ? '\n' : '' );
for ( var f, i = 0; parameters && i < parameters.length; i++ ) {
p = parameters[i];
if ( !( m = /^\s*\|[\s\xA0]*(([^=|]*?) *)[\s\xA0]*=[\t \xA0]*([\s\S]*? *)\s*$/.exec( p ) ) ) {
/* Leere unbenannte Parameter verwerfen, wenn ein benannter folgt */
if ( !/^\s*\|-*\s*$/.test( p ) || ( parameters[i + 1] && parameters[i + 1].indexOf( '=' ) < 1 ) ) {
result += p;
}
continue;
}
p = rule.parameters && typeof rule.parameters[m[2]] !== 'undefined' ? rule.parameters[m[2]] : m[1];
/* Parameter verwerfen, die in den Regeln mit false oder ähnlich markiert sind */
if ( !p ) {
continue;
}
for ( f = 0; ( f < kFix || kMax && p.length > kMax ) && /\s$/.test( p ); f++ ) {
p = p.slice( 0, -1 );
}
for ( f = 0; ( f < vFix || vMax && m[3].length > vMax ) && /\s$/.test( m[3] ); f++ ) {
m[3] = m[3].slice( 0, -1 );
}
while ( p.length < kMin ) {
p += ' ';
}
while ( m[3].length < vMin ) {
m[3] += ' ';
}
result += rule.format.replace( /_+#*([^_]*)_+#*/, p.replace( /\$/g, '$$$$' ) + '$1' +
m[3].replace( /\$/g, '$$$$' ) );
}
if ( rule.format.indexOf( '\n' ) >= 0 ) {
if ( typeof rule.trim === 'undefined' || rule.trim ) {
result = result.replace( /[\t\r ]+$/gm, '' );
}
/* Schließendes }} immer auf eine eigene Zeile, wenn irgendein Umbruch im Spiel ist */
result = result.replace( /\n+\s*$/, '' ) + '\n';
}
return t.slice( 0, start ) + result + t.slice( pos );
},
executeUserReplacements: function( t ) {
var from,
replacements = window.autoFormatReplacements || {};
for ( from in replacements ) {
var to = replacements[from];
/* Wenn die Ersetzungen kein assoziatives Objekt sondern ein 2-dimensionales Array sind */
if ( typeof to === 'object' && to.length > 1 ) {
from = to[0];
to = to[1];
}
/* If the search pattern is a regular expression already, 'function' is for older Chrome */
if ( typeof from === 'object' || typeof from === 'function' ) {
t = t.replace( from, to );
continue;
}
/* Leere Suchmuster sicherheitshalber nicht zulassen */
if ( /^\s*$/.test( from ) || typeof to !== 'string' ) {
continue;
}
/* Die meisten Regex-Zeichen maskieren, außer Zeichenklassen */
from = from.replace( /([$()*+.?^{|}])/g, '\\$1' );
to = to.replace( /\$/g, '$$$$' );
/* Wortgrenzen beachten */
from = from.replace( /^(?=\w|\\d)/, '\\b' ).replace( /(\w)$/, '$1\\b' );
var a = [];
for ( var re = /\\[dw]/g, m, i = 1; m = re.exec( from ); a.push( m ) ) {
to = to.replace( m[0], '$' + i++ );
}
for ( i = a.length; i--; ) {
from = from.slice( 0, a[i].index ) + ( a[i][0] === '\\d' ? '(\\d+)' :
'([A-Za-z\xB5\xC0-\xD6\xD8-\xF6\xF8-\u024F]+)' ) +
from.slice( a[i].index + 2 );
}
/* Look-ahead verwenden, wenn ein Platzhalter in Suchmuster und Ersatz am Ende steht */
if ( /\+\)\\b$/.test( from ) && new RegExp( '\\$' + a.length + '$' ).test( to ) ) {
from = from.replace( /([^()]+)\)\\b$/, '?=$1\\b)' );
to = to.replace( /\$\d+$/, '' );
}
/* Allow optional spaces after dots in the search pattern */
from = from.replace( /\\\.(?=[(\w\xC0-\u024F])/g, '\\.(?:[ \xA0]| )*' );
t = t.replace( new RegExp( from, 'g' ), to );
}
return t;
},
backupNowikis: function( t ) {
this.nowikis = [];
var re = /<(nowiki|includeonly|syntaxhighlight|source|html|pre|code|score|timeline|hiero|math)\b(?!\s*\/>)[\s\S]*?<\/\1\s*>/gi;
var m;
while ( m = re.exec( t ) ) {
delete m.input;
this.nowikis.push( m );
}
for ( var i = this.nowikis.length; i--; ) {
var placeholder = '<nowiki>' + i + '<\/nowiki>';
t = t.slice( 0, this.nowikis[i].index ) + placeholder +
t.slice( this.nowikis[i].index + this.nowikis[i][0].length );
if ( /^<\w+\s*>\s*<\/\w+\s*>$/.test( this.nowikis[i][0] ) ) {
this.nowikis[i][0] = /^no/i.test( this.nowikis[i][1] ) ? '<nowiki />' : '';
} else if ( /^s[oy]/i.test( this.nowikis[i][1] ) ) {
this.nowikis[i][0] = this.nowikis[i][0].replace( /^(<)\w+|\w+\s*(?=>$)/g, '$1syntaxhighlight' );
}
this.nowikis[i][1] = placeholder;
delete this.nowikis[i].index;
}
return t;
},
restoreNowikis: function( t ) {
for ( var i = 0, len = this.nowikis.length, index = 0; i < len; i++ ) {
index = t.indexOf( this.nowikis[i][1], index );
if ( index >= 0 ) {
t = t.slice( 0, index ) + this.nowikis[i][0] +
t.slice( index + this.nowikis[i][1].length );
}
}
delete this.nowikis;
return t;
},
backupFilenames: function( t ) {
/* Dateinamen retten incl. Vereinheitlichung als "Datei:" */
this.files = [];
var ns = mw.config.get( 'wgFormattedNamespaces' )[6],
ext = mw.config.get( 'wgFileExtensions' ) || ['png', 'gif', 'jpg', 'jpeg', 'tiff',
'tif', 'xcf', 'pdf', 'mid', 'ogg', 'ogv', 'svg', 'djvu', 'oga', 'flac', 'wav', 'webm'];
/* Match <gallery> lines, [[File:Thumbnails]] and {{Template|Parameters.jpg}} */
var m,
re = new RegExp(
'(^ *|\\[\\[:?)\\s*(' + ns + '|Bild|File|Image) *: *([^\\n[\\]|]*?) *(?=[\\n\\]|])|'
+ '(^ *|\\|\\n?(?:[^=[\\]{|}]*=)? *)\\s*([^\\n/[\\]{|}]*\\.(?:'
+ ext.join( '|' ) + '))(?= *[\\n|}])',
'gim'
);
while ( m = re.exec( t ) ) {
var o = ( m[5] ? m[4] : m[1] ).length;
m.index += o;
m.l = m[0].length - o;
/* Multiple underscores and spaces never have a meaning in filenames */
m[3] = ( m[5] || m[3] ).replace( /(?:[ _\xA0]|%20|%5F|%C2%A0| )+/gi, ' ' );
this.files.push( m );
}
var r = '',
p = 0;
for ( var i = 0; i < this.files.length; i++ ) {
this.files[i][0] = '<file>' + i + '<\/file>';
/* Einheitliche Schreibweise und Leerzeichenausgleich */
r += t.slice( p, this.files[i].index )
+ ( this.files[i][2] ? ( this.localisation ? ns : this.files[i][2] ) + ':' : '' )
+ this.files[i][0];
p = this.files[i].index + this.files[i].l;
}
return p ? r + t.slice( p ) : t;
},
restoreFilenames: function( t ) {
/* Gerettete Dateinamen wieder einsetzen */
var r = '',
p = 0;
for ( var index, i = 0; i < this.files.length; i++ ) {
if ( ( index = t.indexOf( this.files[i][0], p ) ) < 0 ) {
continue;
}
r += t.slice( p, index ) + this.files[i][3];
p = index + this.files[i][0].length;
delete this.files[i];
}
if ( p ) {
t = r + t.slice( p );
}
/* Fehlschläge nochmal versuchen, passiert bspw. bei umsortierten Galeriezeilen */
for ( i = this.files.length; i--; ) {
if ( this.files[i] ) {
t = t.replace( this.files[i][0], this.files[i][3] );
}
}
delete this.files;
return t;
}
};
if ( mw.user.options.get( 'usebetatoolbar' ) ) {
mw.loader.using( 'ext.wikiEditor.toolbar', function() {
$( document ).ready( function() {
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'main',
'group': 'format',
'tools': {
'autoFormatter': {
'label': 'Auto-Format',
'type': 'button',
'icon': '/media/wikipedia/commons/thumb/2/2c/Broom_icon.svg/22px-Broom_icon.svg.png',
'action': {
'type': 'callback',
'execute': function() { return mw.libs.autoFormatter.click( this ); }
}
}
}
} );
} );
} );
} else if ( mw.user.options.get( 'showtoolbar' ) ) {
mw.loader.using( 'mediawiki.action.edit', function() {
mw.toolbar.addButton( '/media/wikipedia/commons/2/2e/Button_broom.png',
'Auto-Format', '', '', '', 'mw-customeditbutton-autoFormatter' );
$( document ).ready( function() {
$( '#mw-customeditbutton-autoFormatter' ).click(
function() { return mw.libs.autoFormatter.click( this ); }
);
} );
} );
} else {
$( document ).ready( function() {
/* Notfalls als Link unter dem Bearbeitungsfenster */
var b = $( '.editButtons' ),
c = b.children().last();
( c.is( 'span' ) ? c : b ).append( $( '.mw-editButtons-pipe-separator', b ).first().clone() );
var a = $( '<a href="#">Auto-Format<\/a>' );
a.click( function() { return mw.libs.autoFormatter.click( this ); } );
b.append( a );
} );
}
} )( jQuery, mediaWiki );