Benutzer:PerfektesChaos/js/WikiSyntaxTextMod/usage/replace/link

WikiSyntaxTextModBenutzungErsetzungen → Links

Linkziel-Ersetzung

Benutzerdefinierte Linkziel-Ersetzungen wirken nicht auf geschützte Bereiche. Sie gelten ausschließlich für den jeweiligen Link-Typ; sind aber praktisch unabhängig vom syntaktischen Kontext.

Für Vorlagen-Ersetzungen gibt es ein eigenes Format. Innerhalb von Vorlageneinbindungen werden Linkziel-Ersetzungen zuerst ausgeführt.

Ansonsten werden als erstes die kompletten Vorlagen-Ersetzungen, dann die Linkziel-Ersetzungen und zum Schluss die Text-Ersetzungen vorgenommen.

Definition

Bearbeiten

In der js-Datei des Benutzers sind vor dem mw.loader.load Komponenten des Anwendungsobjekts zu definieren:

mw.libs.WikiSyntaxTextMod.config.mod.url = Weblink-Ersetzungsliste;
mw.libs.WikiSyntaxTextMod.config.mod.wikilink = Wikilink-Ersetzungsliste;

Ersetzungslisten-Format

Bearbeiten

Das einfache Format der Ersetzungslisten stellt dabei jeweils einen Bezug her zwischen dem Linkziel als Regulärer Ausdruck und einem Ersetzungsausdruck analog zur Text-Ersetzung:

[
[RegExp-1, Ersetzungstext-1],
[RegExp-2, Ersetzungstext-2],
… … …
[RegExp-n, Ersetzungstext-n]
]
  • Der (erste) Suchausdruck ist ein regulärer Ausdruck, der immer das vollständige Linkziel umfassen muss; soll nur ein Teil für die Suche verwendet werden, muss am Anfang oder Ende mit .* entsprechend aufgefüllt werden. Ein Zeilenumbruch kann in einem Linkziel nie vorkommen.
  • Redundante Leerzeichen können im gesuchten Text nie vorkommen; sie wurden vorher bereits entfernt.
  • Der Ersetzungsausdruck erlaubt Übernahme von Klammerausdrücken mit $1, $2 usw.

Die Groß- oder Kleinschreibung des Linkziels ist signifikant; fast alle betitelten Wikilinks wurden zuvor in Großschreibung überführt. Domain-Namen sind immer in Kleinbuchstaben im Text zu finden. Es findet auch immer eine globale Suche statt. Das flag ist beim Linkziel also unzulässig.

Demonstrationsbeispiel

Bearbeiten
mw.libs.WikiSyntaxTextMod.config.mod.wikilink = [
          ["Altdorf",
           "Neustadt"],
          ["Althaus \\(Politiker\\)",
           "Dieter Althaus"],
          ["(.+) \\(Dampfer\\)",
           "$1 (Schiff)"]
                                                ];
mw.libs.WikiSyntaxTextMod.config.mod.url = [
   ["(https?://)(www\\.)?example\\.com/?(newpath/.+)?",
    "$1relaunch.example.org/$3"]
                                           ];
  • Die erste Ersetzung trifft Wikilinks, die genau Altdorf oder auch altdorf heißen. Altdorf bei Nürnberg wird ignoriert. Diese Links werden aufgemotzt zu Neustadt. Alle anderen Vorkommen von „Altdorf“ im Text sind nicht betroffen.
  • Die zweite Ersetzung trifft Wikilinks, die auf genau das Klammerlemma zielen.
  • Die dritte Ersetzung ändert alle Klammerlemmata, die auf (Dampfer) enden, in ein gleiches Klammerlemma, bei dem aber (Schiff) in Klammern steht. Weil beim regulären Ausdruck in JavaScript einfache Klammern einen Klammerausdruck bedeuten, müssen \\ vorangestellt werden.
  • Die vierte Ersetzung berichtigt alle Verweise der alten Domäne example.com auf die neue Domäne relaunch.example.org – wobei die alte URL noch eine Schein-Subdomain www enthalten darf. Steht die Domain allein ohne Pfad, wird ein Schrägstrich angefügt. Weil beim regulären Ausdruck in JavaScript ein Punkt ein beliebiges Schriftzeichen bedeutet, sollte ihm zur Eindeutigkeit \\ vorangestellt werden.

Linkziele im Textzusammenhang

Bearbeiten

Statt des einfachen Ersetzungsausdrucks, der aus einem Array mit zwei Zeichenketten für Suchen und Ersetzen besteht, kann auch ein komplexerer Ausdruck benutzt werden. Er besteht aus einem Array mit zwei Arrays zu je drei Elementen:

Linkersetzung im Textzusammenhang
Bedeutung Prolog Linkziel Epilog
Suchen Regulärer Ausdruck
oder
false
Linkziel (alt)
Regulärer Ausdruck
Regulärer Ausdruck
oder
false
Ersetzen Ersetzungsausdruck
oder
false
Linkziel (neu)
Ersetzungsausdruck
oder
false
Ersetzungsausdruck
oder
false

Die Bedeutung von altem und neuem Linkziel ist identisch mit der einfachen Ersetzung. Prolog und Epilog wirken auf den unmittelbaren Nahbereich, nicht über Absätze oder geschützte Bereiche hinweg.

Der vorangestellte Prolog ist ein regulärer Ausdruck.

  • Wird bei der Suche false angegeben, so wird der Kontext hier ignoriert. Bei einem Wikilink muss dies auf \\[\\[ enden, ein geklammertes Weblink auf \\[.
  • Ungeklammerte Weblinks ließen sich daran erkennen, dass der Prolog nicht auf [ endet: [^[].
  • Ist der Wert zwar bei der Suche nicht false, wohl aber die Ersetzungs-Zeichenkette false, dann wird nichts ersetzt – ansonsten werden die beiden Zeichenketten ausgetauscht und müssen mit der entsprechenden Zahl von Klammern enden.

Der sich anschließende Epilog ist ein regulärer Ausdruck.

  • Wird bei der Suche false angegeben, so wird der Kontext hier ignoriert.
    • Bei einem offenen Wikilink muss dies mit ]] beginnen (oder besser als \\]\\] notiert),
    • ein „umgebogenes“ Wikilink mit \\|.
    • Ein geklammertes offenes Weblink muss mit ] beginnen (also besser \\]),
    • ein „umgebogenes“ Weblink mit einem Leerzeichen.

Die Regulären und Ersetzungsausdrücke können Klammerausdrücke und zugehöriges $1, $2 enthalten, die jeweils unabhängig von Ausdrücken im Prolog, Epilog oder Linkziel zählen.

Die Ersetzung findet insgesamt nur statt, wenn die Suchausdrücke für Prolog, Linkziel und Epilog gleichzeitig erfolgreich sind. Sind sowohl Prolog als auch Epilog false, ist die Aktion identisch mit der einfachen Link-Ersetzung. Natürlich sollte wenigstens einer der drei Ersetzungsausdrücke nicht false sein.

Sortierschlüssel von Kategorien werden so nicht erreicht.

Demonstrationsbeispiel

Bearbeiten
mw.libs.WikiSyntaxTextMod.config.mod.wikilink = [
             [  [false, "Altvater",           "\\|"],
                [false, "Altvater (Gebirge)", false]         ],

             [  [false, "Altvater",           "\\]\\]"],
                [false, "Altvater (Gebirge)", "|Altvater]]"] ]
                                                ];
mw.libs.WikiSyntaxTextMod.config.mod.url = [
             [  ["\\[", "http://example\\.com/?(.*)",   " BigBuck Ltd\\.(.*)\\]"],
                [false, "http://example.net/$1",        " LowBudget$1]"]  ]
                                           ];
  • Der erste Ausdruck Suchen/Ersetzen findet Wikilinks auf Altvater mit alternativem Linktext. Dieser wird unverändert belassen (false). Das Linkziel wird geändert.
  • Der zweite Ausdruck findet das gleiche Linkziel, jedoch als offenes Link. Hier wird das bisher sichtbare Linkziel als Linktext eingesetzt, die Darstellung bleibt somit unverändert. Das Linkziel wird geändert.
  • Der dritte Ausdruck findet betitelte Weblinks, lässt die eckige Klammer zu Beginn unberührt, ändert die URL (Domain in jedem Fall, Pfad wird ggf. übernommen), und ändert den Linktext wie angegeben. $1 bezieht sich jeweils auf den zugehörigen Klammerausdruck.

Spezielle Wiki-Seiten

Bearbeiten

„Dynamische“ Wiki-URL (per PHP-Query) liegen immer in protokoll-relativer Form vor, falls das angesprochene Projekt das erlaubt. Ansonsten nur in https oder nur in http, wenn bei bestimmten subdomains Einschränkungen bestehen. Sofern eine Umwandlung in das Wikilink-Format möglich war, liegt dies auch immer als Wikilink vor.

Wikilink-Ersetzungen werden auf alle identifizierten Fundstellen angewendet; auch als Datei-Einbindung, gallery (demnächst auch imagemap) und Vorlagen-Name.


Anwendungsbeispiele

Bearbeiten


In Artikeln, die sich mit Motherboards und Unix beschäftigen, sollen falsche Wikilinks berichtigt werden:

mw.libs.WikiSyntaxTextMod.config.mod.wikilink = [
[  [false, "DDR",              "]]"],
   [false, "Double Data Rate", "|DDR]]"] ],
[  [false, "SED",              "]]"],
   [false, "sed (Unix)",       "|sed]]"] ]
                                                ];

Falls man dabei auf einen Artikel über Robotron gerät, hat man die Möglichkeit, auf der DiffPage den Irrtum zu erkennen.

Die Komponente .config.mod.wikilink ist zu verwenden, weil Linkziele betroffen sind. Die Komponente .config.mod.plain würde diese nicht berühren.

Mehr: →Abkürzungen

Bildbeschreibung ergänzen

Bearbeiten

Bei Einbindung ohne miniatur usw. wird kein Bildtitel angezeigt. Trotzdem sollte hier in der Regel eine Bildbeschreibung in den Quelltext eingefügt werden: Wer aus welchen Gründen auch immer das Bild nicht sehen kann, bekommt diesen Alternativtext dargestellt.

Ausnahme: Ist der Bildinhalt bereits vollständig durch beigefügten Text erklärt, dann muss die Bildbeschreibung explizit weggelassen werden, die Einbindung also mit |]] enden.
Grund: Die redundante Information verwirrt und schadet mehr, als dass sie irgendwie helfen würde.
Beispiel: Bei Sportinformationen werden die nationalen Zugehörigkeiten gern optisch durch Flaggensymbole hervorgehoben; für Sehende sehr sinnvoll. Können die Grafiken nicht gesehen werden, muss auch die Beschreibung verschwinden, sonst wird unverständlicher aufgeschäumter Brei vorgelesen:
gold schweizer kreuz schweiz silber deutschlandflagge deutschland bronze union jack großbritannien

Ist die Bildgröße mit px definiert, handelt es sich oft um Logos und Symbole:

mw.libs.WikiSyntaxTextMod.config.mod.plain = [
      ["(\\|[1-9][0-9]+px)\\]\\]",
       "$1|<!-- Bildbeschreibung fehlt ** ID: 30 -->]]"]
                                             ];

fügt den Kommentar ein, der dann in der DiffPage auffallen sollte. Statt eines Kommentars kann auch schon der Text eingesetzt werden, wenn man ständig auf gleichartigen Seiten arbeitet. Handelt der ganze Artikel etwa von Firma XY, dann sollte die Bildbeschreibung nur kurz und knapp „Logo“ oder „Firmenlogo“ lauten – nicht etwa „Logo der Firma XY GmbH & Co KG in Seattle, Washington (USA)“.

mw.libs.WikiSyntaxTextMod.config.mod.wikilink = [
// Einfach nur Bild-ID reingesetzt??
[ [ false,  "(Datei:.+\\.(gif|jpg|ogg|png|svg))",  "\\]\\]" ],
  [ false,  "$1",  "|<!-- Bildbeschreibung fehlt ** ID: 30 -->]]" ]  ]
                                                ];

findet Bildeinbindungen, bei denen bisher nur der blanke Dateiname in den Artikel geklatscht wurde.

Bearbeiten

Die etwas lieblos blanko in den Artikel eingefügte URL führt zwar zu einer funktionierenden Darstellung, aber die mitunter sehr langen URL sind unschön. In einigen Themenkreisen werden unbetitelte ellenlange URL abgelehnt; andere Autoren sind besonders stolz darauf und verwahren sich strikt gegen „anonymisierte Weblinks“.

Ein erster Schritt zur Verbesserung ist:

   var RE_URL = "(https?://)(www\\.)?([^:/|]+)(:[0-9]+)?/?([^ }<>\n]*)";
   var Rp_URL = "$1$2$3$4/$5 $3";
   mw.libs.WikiSyntaxTextMod.config.mod.url = [
      [  ["\n\\* *",  RE_URL,  " *$"],
         ["\n* [",    Rp_URL,  "]"]  ],
      [  ["(<ref[^<>\n]*>) *",  RE_URL,  " *</ref>"],
         ["$1[",                Rp_URL,  "]</ref>"]  ]
                                              ];

Damit wird als Titel erstmal die Domain gezeigt, was im Rahmen von Einzelnachweisen oft schon ausreicht. Es gibt den Lesern einen ersten Anhaltspunkt, worum es sich bei dem Weblink handelt. Das uninformative www. wird nicht im Titel angezeigt und dieser auf die aussagekräftige Domain begrenzt. (In der URL ist die Subdomain www. jedoch mitunter zwingend erforderlich.)

Vor dem http soll nicht bereits eine eckige Klammer stehen.

Die Ausdrücke im Detail:

  • Zwei Hilfsvariable RE_URL und Rp_URL werden vorab definiert. Sie lassen sich dann übersichtlich in verschiedenen Ersetzungsausdrücken verwenden.
  • Expliziter Kontext vermeidet Fehlinterpretation:
    • \n\\* * ist ein Zeilenbeginn, dann ein Stern * als Aufzählungszeichen (mit \\ als Zeichen selbst und nicht in Sonderbedeutung) und möglicherweise Leerzeichen. Am Ende steht ein Zeilenende $; eine häufig vorzufindende Form im Abschnitt „Weblinks“.
    • <ref[^<>\n]*> ist das ref-tag (möglicherweise name= oder group= einschließend). Der Einzelnachweis besteht nur aus der URL und wird sofort durch </ref> beendet (Leerzeichen werden ignoriert). Beim Ersetzen ist $1 das öffnende <ref> mit Parametern, aber ohne Leerzeichen.
  • URL als Linkziel mit Klammerausdrücken: RE_URL
    1. Protokoll
      • s? nach dem http, falls vorhanden – schließt https:// ein
    2. Subdomain www. sofern vorhanden
    3. Domain (international, mit Umlauten und nicht-lateinisch)
      Alternativ: [-a-zA-Z.0-9]+ (englisch-klassisch, ohne Umlaute)
    4. port, sofern vorhanden
    5. path, sofern vorhanden
      Der Schrägstrich wird in jedem Fall an die Domain in der URL angehängt.
      • Der Pfad darf kein Leerzeichen, Zeilenumbruch oder potentielle Wikisyntax enthalten.
  • Ersetzungsausdruck spiegelt die Klammern wider: Rp_URL
    $1$2$3$4/$5 gibt die vollständige URL wieder.
    1. $1 – Schema einschließlich ://
    2. $2 – möglicherweise vorhandene Subdomain www.
    3. $3 – Domain einschließlich Subdomains, aber ohne www.
      Dies ist auch der angezeigte Titel.
    4. $4 – möglicher HTTP-Port
    5. $5 – Pfad, sofern vorhanden

Die Ausdrücke für den URL-RegExp und ihre Ersetzung wurden als wiederverwendbare Variablen RE_URL und Rp_URL formuliert.

Manuell kann dies dann ggf. ausgebaut werden, nachdem in der DiffPage auf die Veränderung aufmerksam gemacht wurde.

Etwas experimentierfeudiger ist:

mw.libs.WikiSyntaxTextMod.config.mod.url = [
      [  ["([^ =\n\x5B] *)",  RE_URL,  "( *[^ |}\n\x5D])"],
         ["$1[",              Rp_URL,  "]$1"]  ]
                                           ];

Hier wird mit den umschließenden Ausdrücken vermieden, dass es sich um den Parameter in einer Vorlageneinbindung handelt; in der Vorlagenprogrammierung wird möglicherweise die URL ebenfalls in Klammern eingeschlossen und mit einem Titel versehen.

  • Die Zeichenliste in eckigen Klammern beginnt jeweils mit ^ und bewirkt, dass diese Zeichen nicht vorhanden sein dürfen.
  • \x5B und \x5D sind Ersatzausdrücke für [ und ], die im regulären Ausdruck eine Sonderbedeutung haben. Bereits vorhandene eckige Klammern müssen noch nicht gleichzeitig zu Beginn und am Ende stehen und könnten zur Fehlinterpretation führen.
  • Ein Gleichheitszeichen oder Zeilenanfang \n zu Beginn lässt auf Vorlageneinbindung schließen.
  • Ein Pipe-Symbol, schließende geschweifte Klammer oder Zeilenwechsel am Ende lässt auf Vorlageneinbindung schließen.
  • Das Leerzeichen mit * lässt zwischen den Zeichen des Kontextes und der URL Leerzeichen zu. Sie bleiben hier erhalten.
  • Das $1 hier ist ein anderes als das $1 aus der URL. Umschließende Leerzeichen sollten aber mit WSTM.5 ohnehin entfernt worden sein.
Bearbeiten

checkwiki#79

In den meisten Fällen ist es sehr sinnvoll, ein Weblink mit einem beschreibenden Text zu versehen; nur selten ist die automatisch generierte Link-Nummer hilfreich.

Ein erster Ansatz ist das Einfügen des Domain-Namens, so dass der Leser des Artikels eine erste Vorstellung bekommt, welche Institution die Internet-Ressource anbietet:

mw.libs.WikiSyntaxTextMod.config.mod.url = [
      [  ["\\[",  RE_URL,  "\\]"],
         [false,  Rp_URL,  false]  ]
                                           ];

Damit wird als Titel erstmal die Domain gezeigt, was im Rahmen von Einzelnachweisen oft schon ausreicht. Es gibt den Lesern einen ersten Anhaltspunkt, worum es sich bei dem Weblink handelt.

Der Aufbau ist analog zum http-link ohne eckige Klammern; jedoch handelt es sich um eine URL, die unmittelbar in eckige Klammern eingeschlossen ist.

Manuell kann dies dann verfeinert werden, nachdem in der DiffPage auf diese Veränderung aufmerksam gemacht wurde.