Benutzer:PerfektesChaos/js/WikiSyntaxTextMod/usage/advanced

aus Wikipedia, der freien Enzyklopädie

WikiSyntaxTextModBenutzung → Fortgeschritten

Fortgeschrittene Optionen

Erweiterte Möglichkeiten bestehen, um das Skript interaktiv auszuführen.

Ferner gibt es eine API.

Anwendungsobjekt

Zuerst wäre die Grundstruktur für das Anwendungsobjekt einzurichten, damit einzelne Komponenten zugewiesen werden können:

mw.libs.WikiSyntaxTextMod  =  { config:  { format:  { },
                                           lang:    { },
                                           load:    { },
                                           mod:     { },
                                           page:    { },
                                           portlet: { },
                                           warn:    { } }  };

Danach stehen die Komponenten format, lang, load, mod, page, portlet und warn zur Verfügung und können auch detailliert belegt werden.

Beispiel:

mw.libs.WikiSyntaxTextMod.config.page.oldid  =  true;

Alternativ können Kenner der JavaScript-Syntax die einzelnen Werte auch gleich in der Objektdefinition zuweisen.

Bei modernen Browserversionen (seit 2011) ist es theoretisch vorstellbar, dass die Lade-Anweisung mw.loader.load() gleichzeitig und parallel zum aktuellen Skript wirksam wird. Dann könnte es zum gegenseitigen Überschreiben des Anwendungsobjekts und zum Datenverlust kommen. Deshalb sollte vorsorglich das mw.loader.load() erst nach vollständiger Ausstattung des Anwendungsobjekts erfolgen.

Globale Variablen

Bis Mitte 2012 wurden auch einfache globale Variablen var XYZ = true; eingesetzt. Dies wird zugunsten der einheitlichen Anwendung und überschaubarer Anzahl globaler Variablen in der Benutzerumgebung nicht mehr unterstützt.

Benutzerdefinierte Warnungen

Es lässt sich vor verdächtigen Elementen warnen.

Wenn das oben dargestellte Anwendungsobjekt zuvor vereinbart wurde, lässt sich vereinbaren:

mw.libs.WikiSyntaxTextMod.config.warn.url  =  [
                                              ];
mw.libs.WikiSyntaxTextMod.config.warn  =
   { attribute:  [ [ "class", "\\bprettytable\\b" ] ],
     entity:     [ "shy", "thinsp", "#8209" ],
     property:   [ "align", "bgcolor", "border", "clear", "compact", "height", "valign" ],
     tag:        [ "big", "blockquote", "center", "font", "h1", "samp", "u", "var" ],
     template:   { },
     url:        [ "\\btagesschau\\.de/",
                   "\\bard\\.de/"
                 ]
   };

Kommt ein externes Link vor, das in der URL irgendwo einen dieser Ausdrücke enthält, wird dies wie eine Fehlermeldung angezeigt.

Zurzeit ist nur attribute entity property tag url implementiert. Es ist geplant, das auch nach und nach zu implementieren für: builtin char plain template wikilink

Doppelte Parameter in Vorlageneinbindung

Dieser Fehler wird in der Regel nur durch eine intensivierte Analyse gefunden, wenn er sich nicht in einer Standardsituation zufällig herausstellt.

Betroffene Seiten sind auf Kategorie:Wikipedia:Seite mit mehrfachem Parameter in Vorlageneinbindung aufgelistet, sofern die Seite das bereits ausgelöst hatte.

Mit der nachstehenden Anweisung unter Beachtung der voranstehenden Deklarationen lässt sich die vertiefte Untersuchung einschalten, und einfache Fälle werden auch sofort bereinigt:

mw.libs.WikiSyntaxTextMod.config.warn.templateParamDup = true;

Formatierungsspezifikationen

Es lassen sich ab 2015 Details zur Formatierung von Elementen spezifizieren, wenn wie oben die Komponente format definiert wurde:

mw.libs.WikiSyntaxTextMod.config.format.galleryIndent  =  3;
Die einzelnen Zeilen innerhalb einer <gallery> sollen mindestens um die angegebene Zahl von Leerzeichen eingerückt werden (maximal 8).

Weitere Namensräume und/oder Seitentitel einbeziehen oder solche ausschließen

Standardmäßig wird das Skript nur im Artikel-Namensraum des Projektes automatisch aktiv.

Es lassen sich Seiten von der Bearbeitung durch das Skript ausschließen, und es lassen sich Namensräume einbeziehen.

Diskussions-Namensräume bleiben dabei stets ausgeschlossen und lassen sich auf diesem Weg weder versehentlich einbeziehen noch absichtlich erzwingen. Die .js und .css der Benutzer sind ebenfalls immer ausgenommen.

Die zu verfeinernden Syntaxkonstruktionen zielen vorrangig auf den Artikel-Namensraum ab. Beim Bearbeiten beispielsweise von Vorlagen, aber auch von Hilfetexten können beabsichtigte Konstrukte (so auch Beispiele für fehlerhafte Syntax) auftreten, die dann zwangsläufig ebenfalls richtiggestellt werden; sie müssten entsprechend formatiert werden (etwa mit <nowiki>).

Diskussions-artige Meinungsäußerungen anderer Benutzer sollte man nicht verändern. Die Wikipedia:Fragen zur Wikipedia muss also ggf. manuell ausgeschlossen werden, und viele andere Seiten aus dem Wikipedia-Namensraum enthalten ebenfalls Stellungnahmen, Meinungsbilder usw.

Es stehen zwei Steuerparameter für die automatische Ausführung zur Verfügung:

  1. .config.page.include
    Namensräume und Titel-RE einbeziehen
  2. .config.page.exclude
    Namensräume und Titel-RE ausschließen

Sie werden in dieser Reihenfolge betrachtet; die Ausschlusskriterien wirken also auch auf gerade eingeschlossene Seiten.

Format

Das Format ist für beide Parameter identisch:

  • Es ist ein Feld (Array) mit Ausdrücken (Zeichenkette), die auf den Titel der Seite angewendet werden.
  • Jede Zeichenkette wird als Regulärer Ausdruck interpretiert.
  • Beginnt die Zeichenkette mit ":", dann sichert man die voll qualifizierte Angabe eines Projekt-Namensraums.
    Der Beginn ist dann :DB:NS:
    Dabei ist DB das Projekt; für die deutschsprachige Wikipedia wäre es dewiki und commonswiki für Wikimedia Commons oder auch svwikisource.
    NS ist die (expandierte) Bezeichnung des Namensraums – also etwa Benutzer – in der Landessprache.
  • Groß- und Kleinschreibung werden soweit möglich ignoriert – mindestens im englischsprachigen A–Z der jeweiligen JavaScript-Einbindung des Browsers.

Beispiel

mw.libs.WikiSyntaxTextMod.config.page.include  =  [
          ":dewiki:Benutzer:PerfektesChaos/js/",
          ":dewiki:Benutzer:PerfektesChaos/test/.*richt",
          ":dewiki:Hilfe:",
          ":dewiki:Datei:",
          ":dewiki:Wikipedia:Spielwiese",
          "Vorlage:.+/(Doku|Meta)"
                                                  ];
mw.libs.WikiSyntaxTextMod.config.page.exclude  =  [
          ":dewiki:Wikipedia:Fragen zur Wikipedia",
          ":dewiki:Wikipedia:.*Redundanz/",
          ":dewiki:Wikipedia:.*Abstimmung",
          ":dewiki:Wikipedia:Umfrage",
          "Löschkandidaten",
          "Meinungsbild"
                                                  ];

bewirkt:

  • alle Unterseiten wie gerade diese hier werden einbezogen,
  • alle Unterseiten dieses Benutzers unter test, die die Zeichenkette richt enthalten, werden einbezogen,
  • der Namensraum Hilfe der deutschsprachigen Wikipedia wird einbezogen, außerdem die Spielwiese,
  • die Doku- und Meta-Unterseiten von Vorlagen werden einbezogen, die Vorlagen selbst aber nicht – da sie die Bestandteile der Wikisyntax erst noch kombinieren sollen, würde eine Syntaxpolitur früher oder später zu Bruch führen.
  • Die WP:FZW usw. werden ausdrücklich ausgeschlossen (deren Namensraum war aber ohnehin nicht einbezogen), so auch Diskussionen über Redundanz und jegliche „Abstimmung“.
  • Jede Seite in irgendeinem Namensraum, in deren Titel eines der Wörter „Löschkandidaten“ oder „Meinungsbild“ vorkommt, wird ausgeschlossen.

Frühere Artikelversionen einbeziehen

In den meisten Fällen soll nur an der aktuellen Artikelversion eine Modifizierung erfolgen. Enthält die URL der Seite also &oldid=, wird das Skript nicht aktiv.

Mit der Konfiguration

mw.libs.WikiSyntaxTextMod.config.page.oldid  =  true;

kann die (manuelle) Aktivierung auf spezifizierte Artikelversionen ausgedehnt werden. Ob &oldid= zufällig auch die aktuelle Version beschreibt, wird übrigens nicht geprüft.

Manueller Start

Schaltelement definieren

Wer ohnehin selbst definierte Schaltelemente verwendet, kann einen solchen Button mit dem Skript belegen.

Damit lassen sich Probleme bei der ständigen Bindung an zusätzliche Namensräume vermeiden und ein wiederholter Aufruf während der Bearbeitung im Bedarfsfall realisieren.

Dies würde in etwa folgendermaßen aussehen:

if (! mw.config.get("wgIsArticle")) {   // Keine Zeitvergeudung beim bloßen Gucken
   mw.loader.load("//de.wikipedia.org/w/index.php?title=Benutzer:mirselbst/meiKnopferl.js&action=raw&ctype=text/javascript");
}

Das eigene Benutzerskript mirselbst/meiKnopferl.js enthält die Vereinbarung der Knöpfe, darunter auch etwas wie

MeinObjekt.button_syntaxTM.action = WikiSyntaxTextMod_Run;

Dabei ist WikiSyntaxTextMod_Run eine Funktion, die für genau diese Aktion geeignet und vorgesehen ist.

WikiSyntaxTextMod_Run gibt den Wert void(0) zurück. Dies ist für bestimmte Aktionen wichtig.

Das eigene Skript mirselbst/meiKnopferl.js sollte unter Bedingungen moderner Browser dann auch die loader.load-Anweisung für WikiSyntaxTextMod enthalten, weil WSTM ansonsten möglicherweise bereits fertig ausgeführt worden ist, bevor meiKnopferl zum Zuge käme. Weil aber die Funktionsdefinition von WikiSyntaxTextMod_Run erst nach dem Laden von WikiSyntaxTextMod verfügbar ist, muss auf geeignete Weise das beendete Laden abgewartet werden. Es würde sich mw.hook() anbieten.

Automatischen Start unterdrücken

Wenn eine Möglichkeit zum manuellen Start gegeben ist, kann es sinnvoll sein, den automatischen Start durch das Laden zu verhindern, so dass das Skript zunächst nur geladen wird, ohne irgendeine Aktion auszuführen (auch ein Portlet-Link würde nicht ohne ausdrücklichen Wunsch generiert).

mw.libs.WikiSyntaxTextMod.config.load.inhibit  =  true;

verhindert die Textbearbeitung, die sonst beim Öffnen zum Bearbeiten (action=edit) erfolgt.

Hat man weder eine eigene manuelle Aktivierung noch API-Aufrufe, so kann das Skript nie tätig werden und das Laden wird sinnlos.

Diese Option ist dafür vorgesehen, dass Benutzer vollständig die Kontrolle über den Skriptablauf übernehmen.

Zusätzliche Seiten manuell bearbeiten

Standardmäßig unterliegt WikiSyntaxTextMod_Run denselben Freigaben und Einschränkungen wie beim automatischen Aufruf. Mit dem Steuerparameter

  • .config.page.support

lässt sich analog zu .config.page.include das zugelassene Spektrum für manuelle Auslösung erweitern. Das Format ist identisch. Die Ausschlussbedingungen .config.page.exclude haben weiterhin Vorrang.

Wiederholter Aufruf

Automatisch ausgeführt wird das Skript nur beim erstmaligen Öffnen eines Artikels zum Bearbeiten (action=edit).

Denkbar wäre es, sich selbst einen automatischen Aufruf zu schreiben, der dies während des Bearbeitungsvorgangs wiederholt – beim Anzeigen der Vorschau oder der Änderungen (action=submit). Dies könnte allerdings durch die umschichtig gezeigten Änderungsseiten ziemlich verwirrend sein.

Von einer automatischen Ausführung beim Speichern (action=save) ist abzuraten, da dann keine Eingriffsmöglichkeiten mehr bestehen.

Laden ohne Ausführung

Um Funktionen in selbstgeschriebenen Skripten nutzen zu können, muss das JS-Skript geladen werden.

Dabei würde normalerweise automatisch („AutoRun“) die Analyse des Inhaltes eines Editierfensters erfolgen. Um diesen automatischen Ablauf zu vermeiden, sollte dies zunächst wie folgt unterbunden werden:

  • .config.load.inhibit = true;

Danach kann mit mw.loader.load() das Skript geladen werden. Dieses enthält nur ein „Kopfmodul“ mit einigen wenigen Basisfunktionen zu Verwaltungszwecken.

Es gibt weitere Module, die die eigentlich am Wikitext arbeitenden Funktionen enthalten. Sie müssen nun erst abgefordert werden:

Dabei ist callback eine benutzerdefinierte Funktion, die nach Abschluss des Ladens aufgerufen wird und innerhalb der dann alle folgenden Aktivitäten stattfinden.

Skript-Aktualisierung

Die Variable .config.load.updater kann auf eine Zeichenkette mit Regulärem Ausdruck gesetzt werden, der bestimmte Seitentitel beschreibt. Sieht man sich dann eine derart vereinbarte Seite an, wird der Cookie aktualisiert, der im Browser-Cache Modulversionen unterscheidet.

Wenn man beim Einloggen regelmäßig auf eine bestimmte Seite kommt, kann man bereits vor der ersten Bearbeitung sicherstellen, dass der Cookie aktuelle Versionsnummern enthält. Genauso könnte dies an die Beobachtungsliste geknüpft werden:

mw.libs.WikiSyntaxTextMod.config.load.updater = "Beobachtungsliste";