Benutzer:PerfektesChaos/js/WikiSyntaxTextMod/tech

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

WikiSyntaxTextMod → Wirkungsweise

Technische Interna

Der nachstehende Abschnitt ist für Anwender wenig interessant und richtet sich an Programmierer.

Speicherung des Quellcodes[Bearbeiten | Quelltext bearbeiten]

Stammsitz der Module ist die englischsprachige Wikipedia als Unterseiten von: en:User:PerfektesChaos/js/WikiSyntaxTextMod

Das Skript ist in bislang dreizehn Module aufgespalten, die bis auf eines (das „Kopfmodul“) nicht-selbstständig sind. In den jeweiligen Projekten (zurzeit deutsch- und englischsprachige Wikipedia) steht allenfalls ein inhaltgleiches Kopfmodul. Der Quellcode ist sowohl in einer Version zum Ausführen wie auch in einer Entwicklerversion verfügbar: Tabelle der Module.

Entwicklerversionen und Anwenderversionen[Bearbeiten | Quelltext bearbeiten]

Der Quellcode ist in mehreren Versionen vorhanden, die durch einen Kennbuchstaben am Beginn des Skriptnamens unterschieden werden:

d = development, debug
menschenlesbare Quelle
für Anwender nicht empfohlene Mutterversion zur Weiterentwicklung
Versionsnummer ≤ 0
r = release, robust, reduced
stabiler, Dateigröße komprimiert; zum Einbinden
Die Versionsnummer jeder r-Version soll dabei größer sein als die der vorhergehenden (nicht notwendigerweise um 1 inkrementiert).
Ich bin bemüht, nicht zu vergessen, die wstm_Version jeweils heraufzusetzen. Zu jeder r-Version soll auch genau eine d-Version gehören mit   d = −r.

Mit Diff (von wikEd) lässt sich sehen, ob ich dabei trojanische Pferde in den Stall geschmuggelt habe.

Wenn das Kopfmodul in einer dieser Varianten geladen wurde, entstammen auch alle Untermodule der gleichen Variante.

Der menschenlesbare Quellcode (d) mit rund 27.000 Zeilen in über 250 wirksamen Funktionen hat knapp 1 MB; komprimiert (r) werden etwa 400 kB zu den Anwendern übertragen.

Versionsnummer herausfinden[Bearbeiten | Quelltext bearbeiten]

Wenn fraglich ist, welche Version ausgeführt wird, kann dies auf drei Arten herausgefunden werden:

  • In die Adressleiste des Browsers als URL oder an anderer geeigneter Stelle eingeben:
    javascript:WikiSyntaxTextMod_About()
Eine aufpoppende Messagebox zeigt die Versionsinformationen an.
Wenn keine Box erscheint, ist dies nicht definiert und deshalb das Kopfskript im Moment nicht geladen. Allerdings folgt auf die mit action=edit geänderte Seite die Diffpage mit action=submit – hier werden aber die Untermodule standardmäßig nicht geladen.
  • In einem JavaScript-Debugger kann die Eigenschaft .vsn des Anwendungs-Objekts gelesen werden.

Die Versionsinformation besteht aus der Versionsnummer des Kopfmoduls und, falls diese zur Bearbeitung geladen wurden, den Versionsnummern der Einzelmodule. Hinzu kommen Angaben zur Art der Module (Testversionen; debug oder komprimiert), und ob die Situation sich grundsätzlich zum Einsatz von WSTM eignet.

Kompatibilität[Bearbeiten | Quelltext bearbeiten]

Erforderlich:

  • JavaScript 1.5 (1999) RegExp non-capturing parenthese
  • Mediawiki 1.18 (2011) mit jQuery (1.4), wenn online.
    • Notfalls Mediawiki 1.17 mit winziger Ergänzung mw.libs={};

Die vorausgesetzten allgemeinen Standards sind also zehn Jahre alt, das Skript müsste damit unter jedem heutigen Browser laufen. Nur sind diese nicht immer standardkonform:

  • Um fehlende JS-Unterstützung im IE7 (Object.toSource) wurde ein workaround gebaut; mittlerweile abgelöst durch jQuery.isArray().
  • Ein ewiges Manko des IE bei String.substr(-1,1) wurde durch eigene Funktion umgangen.

Größtes Problem sind nicht-standardkonforme Interpretation von RE:

  • IE7 kam mit Interpretation des ^ im multiline-Text nicht klar; wikitext ist aber regelmäßig mehrzeilig. Workaround mittels \n (nicht Textanfang).

Das Skript wird mit den laufenden Firefox-Versionen erprobt; außerdem Opera (12) und Chrome. Dazu IE7 und I8.

Außerdem ist eine offline-Benutzung möglich (Lokale Umgebung, Bot, weder Browser noch Web):

  • MediaWiki wird nicht benötigt.
  • Der Projekt-Kontext kann über die API definiert werden.
  • Ein Skript nach Art eines Hauptprogramms kann WikiSyntaxTextMod-Module importieren und starten.

Aufteilung in Module[Bearbeiten | Quelltext bearbeiten]

Das Skript ist in dreizehn Module aufgespalten, die bis auf eines (das „Kopfmodul“) nicht-selbstständig sind.

Das relativ kleine Kopfmodul hat nur die Aufgabe, eine angemessene Situation für den Einsatz der Hauptaktivität zu erkennen, die Versionen der Untermodule zu verwalten und an Stelle eines veralteten Browser-Cache das Nachladen aktualisierter Versionen vom Server zu veranlassen.

Die eigentliche Textveränderung wird von den Untermodulen vorgenommen.

Die Aufteilung hatte folgende Gründe:

  • Zunehmende Größe des Quellskriptes machte die Bearbeitung unhandlich.
  • Ein Teil (Utilities) ist stabil, wird nur noch selten geändert, muss aber stets editiert, hochgeladen und von den Benutzern aktualisiert werden. Das belastet auch das Netzwerk stärker.
  • Zwei Bereiche sind häufiger zu verändern:
    1. Syntax-Teile bei möglicherweise problematischen Korrekturen, die verbessert zu gestalten sind, damit sie nicht unbemerkt den Wikitext schädigen. Hier ist eine schnelle Aktualisierung wichtig.
    2. Die Lokalisierung, um sich speziellen örtlichen Gegebenheiten anpassen zu können.

Mit der Abspaltung des Kopfmoduls konnte der Aktualisierungsmechanismus realisiert werden.

Die Untermodule haben folgende Kennbuchstaben:

M
Hauptprogramm-Funktionalität, die nicht im Kopfmodul benötigt wird.
  • Konfiguration
  • Seitenbearbeitung, Wiki-Page
  • Fehlermeldungen
L
Lokalisierung
  • Sprachspezifische Zeichenketten
  • Hooks
  • Sprach- und projektspezifische Funktionen
W
Spezifische Funktionen für Wikisyntax und Wikitext
C
Zeichencodes
E
Verschiedene Elemente
I
Dateieinbindung
H
Verlinkung
X
Tags (XML)
T
Vorlagen
O
Objektdefinitionen für eigenständige Objekte
U
Hilfsfunktionen, unabhängig von Wikisyntax und Wikitext
  • ISBN
  • verschiedene
S
Problemunabhängige Funktionen für Zeichenketten

Ablauf[Bearbeiten | Quelltext bearbeiten]

Zunächst wird nur das Kopfmodul geladen. Nur wenn eine Textveränderung gewünscht ist, werden die ausgelagerten Module nachgeladen. Um eine eindeutige Identifizierung im Browser-Cache zu erzwingen, wird als Schein-Parameter eine Schlüsselnummer angehängt. Diese ist

  • Die Revisionsnummer (curid) der letzten bekannten Version, falls sie aus dem Cookie ausgelesen werden konnte.
  • Das Tagesdatum im Format yymmdd, falls kein Cookie gefunden wurde.

Nachdem sofort das Laden und das Ausführen der Untermodule veranlasst wurde, wird später die aktuelle Liste der Versionsnummern geladen. Dabei erfolgt der Abruf vom Server und die Übertragung über das Netzwerk nur einmal je volle Stunde. Anschließend wird für den nächsten Durchgang der Cookie auf die Revisionsnummern gesetzt.

Damit ist die Aktualität der Module wie folgt gesichert:

  • Ohne Cookies maximal einen Kalendertag alt.
  • Mit Cookie eine maximal eine Stunde alte Version spätestens mit der zweiten Bearbeitung.

Im Gegenzug werden die Netzwerkbelastung beim Benutzer und der Abruf auf dem Server minimiert.

Das Aktualisieren der Versionsnummern lässt sich auch separat auslösen, etwa beim Login des Benutzers.

Cookie und sessionStorage[Bearbeiten | Quelltext bearbeiten]

Das Skript versucht, dauerhaft ein Cookie WikiSyntaxTextMod_rvIDs zu setzen, der die letzten bekannten Revisionsnummern speichert. Dieses Cookie kann jederzeit problemlos gelöscht werden.

Zur Anzeige gefundener Fehler wird versucht, in sessionStorage einen Item WikiSyntaxTextMod_errors kurzzeitig zwischenzuspeichern.

Codes und Stammseite[Bearbeiten | Quelltext bearbeiten]

Die Stammseite ist en:User:PerfektesChaos/js/WikiSyntaxTextMod mit:

Quellcode
  • /tech – Code zum Laden und zum Lesen durch Menschen und Debuggen
ResourceLoader
  • Modulnamen:
    • user:PerfektesChaos/WikiSyntaxTextMod (Kopfmodul) für mw:Extension:Gadgets
    • user:PerfektesChaos/WikiSyntaxTextMod/* (alle Untermodule zusammen mit Kopfmodul)
    • user:PerfektesChaos/WikiSyntaxTextMod/ + Kennbuchstabe (einzelnes Untermodul)
  • Dependencies: user, user.options, mediawiki.user, mediawiki.util, jquery.cookie
Namensräume
  • alle mit gerader Namensraum-Nummer
  • -1   (Gadgets)
Cookies
  • WikiSyntaxTextMod_errors (sessionStorage)
  • WikiSyntaxTextMod_rvIDs (localStorage; sonst Cookie für vier Wochen)
mw.libs WikiSyntaxTextMod