Hilfe:Substitution

Substitution ist der Austausch eines momentan im bearbeiteten Wikitext vorhandenen Elements durch einen anderen Wikitext während der Abspeicherung dieser Version.

Es gibt zwei Techniken, die hierzu in der Lage sind:

Im Inhalt enzyklopädischer Artikel wird keine Substitution erwartet.[1] Diese gehört eher in Diskussionen sowie in projektorganisatorische Aktivitäten.

ZweckBearbeiten

Substitution wird mit den folgenden Absichten eingesetzt:

  • „Schnappschuss“ eines momentanen Zustands im dynamischen Prozess
    • Insbsondere ein aktueller Zeitstempel oder das abspeichernde Benutzerkonto sollen festgehalten werden.
    • Für Diskussionsbeiträge wird dies über die Signatur geleistet.
    • Auch verschiedene tagesaktuelle Antragsprozeduren benötigen den heutigen Stichtag.
  • Einfrieren eines über die Zeiten veränderlichen Textes.
    • Der Inhalt der Vorlage:Hallo hätte seit 2003 niemals angepasst werden dürfen.
    • Damit wäre die Erstfassung unveränderlich geworden, oder für jede neue Textfassung hätte eine neue Vorlage angelegt werden müssen, oder in Begrüßungen von 2003 würden erstaunliche hellseherische Gaben offenbart.
  • Grundsätzlich dürfen wesentliche bedeutungstragende Inhalte niemals durch eine veränderliche Vorlage dargestellt werden, wenn eine Mitteilung durch ein Benutzerkonto signiert wurde. Deshalb sind derartige Texte immer zu substituieren, damit spätestens bei der Abspeicherung deutlich wird, genau welche Textfassung soeben signiert wurde. Diese ist dann inhaltlich auch nicht mehr zu verändern.
  • Für Empfänger einer Mitteilung sieht es ggf. verständlicher aus, wenn sie einen vollständigen gewöhnlichen Wikitext übermittelt bekommen, als ein kurzes kryptisches noch unbekanntes Syntaxkonstrukt.
  • Nach Substitution eines Vorlagentextes ist diese Vorlage nicht mehr eingebunden.
    • Andernfalls müsste jede Vorlage auf ewige Zeiten unter genau diesem Namen mit unveränderlicher Wirkung im Projekt gehalten werden, dürfte auch nicht umbenannt oder verändert programmiert werden.
    • Wenn zukünftig keine zentrale Aktualisierung der Inhalte mehr beabsichtigt ist, was für einen zu einem Zeitpunkt abgegebenen Diskussionsbeitrag auch nicht notwendig ist, dann kann die Kopplung an die zentrale Vorlagenprogrammierung gelöst werden.
  • In enzyklopädischen Artikeln sind Berechnungen unerwünscht, etwa die Konvertierung einer konstanten Angabe mit Maßeinheit in eine andere Maßeinheit. Dies kann ein für alle Mal umgerechnet und dauerhaft in die gewünschte andere Formatierung gebracht werden. Dazu kann eine geeignete Umrechnung substituierend eingebunden werden.
  • Ohne praktische Bedeutung ist der Umstand, dass die Server minimal entlastet würden, etwa von einem einzelnen konstanten Berechnungsergebnis.
    • Wenn tatsächlich konstante Werte ihren endgültigen Stand erreicht hätten, mag dies einmal finalisiert werden.
    • Umgekehrt leidet die Nachvollziehbarkeit im Code.
    • Ob nun an einer Stelle {{subst:#expr:2*pi}} oder {{#expr:2*pi}} macht für die Generierung einer Seitendarstellung nicht den dramatischen Unterschied. Nach Substitution verbliebe 6.2831853071796 und ist nicht unbedingt übersichtlicher.

Anwendung bei der SeitenbearbeitungBearbeiten

Grundsätzlich sollten nur solche Vorlagen substituiert werden, die dafür ausdrücklich freigegeben sind. Andernfalls könnten größere Mengen kryptischer Syntax in die Zielseite eingebracht werden, die an dieser Stelle auch nicht erforderlich sind. Es können sich auch Vorlagen aktiv gegen ihre Substituierung wehren.

QuelltextbearbeitungBearbeiten

  • Tilden ~~~~ zwecks Signatur können schlicht über die Tastatur oder über die in diversen Werkzeugleisten verfügbaren Bedienelemente eingefügt werden.
  • Bei Vorlagen und Parserfunktionen ist ganz einfach vor der normalen Einbindung {{Hallo}} die Zeichenkette subst: oder ers: (inklusive Doppelpunkt) dem Namen voranzustellen: {{subst:Hallo}}
    • Parameter sind wie üblich anzugeben: {{subst:Hallo|1=eigene Begrüßung ~~~~}}
    • In der Vorlagendokumentation gibt es ggf. Kopiervorlagen, die diese Syntax bereits enthalten.
    • Das Resultat sollte in der Vorschau geprüft werden.
    • Die allermeisten Parserfunktionen eignen sich für eine Substitution.

VisualEditorBearbeiten

Mit dem VisualEditor gibt es zwei Möglichkeiten:

  • Tilden ~~~~ zwecks Signatur können in bestimmten Namensräumen mittels eines Menüfeldes eingefügt werden. Allerdings eignet der VisualEditor sich nicht für Diskussionsseiten. Dass dort diese Syntax auftritt bleibt jedoch verborgen.
  • Beim Einfügen einer Vorlage gibt es zurzeit kein besonderes Ankreuzfeld oder dergleichen, das die Substitution auslösen würde. Vielmehr muss die Zeichenkette subst: oder ers: (inklusive Doppelpunkt) vor dem Namen der Vorlage in das Formularfeld eingegeben werden.

ProgrammierungBearbeiten

Die Erstellung einer substituierbaren Vorlage bedarf fortgeschrittener Erfahrung in der Vorlagenprogrammierung und ausführlicher Erprobung nach jeder Änderung.

Substitution mit subst und safesubstBearbeiten

Beide Funktionen werden als Präfix zu einer Vorlage oder Funktion verwendet und dienen dazu, dass der entsprechende Vorlagen- oder Funktionsaufruf durch dessen Inhalt ersetzt (substituiert) wird. Beide Funktionen verhalten sich weitgehend identisch, außer dass bei einer nichtsubstituierenden Verwendung der komplette Ausdruck {{subst:…}} ungeparst bleibt, während der Ausdruck {{safesubst:…}} so behandelt wird, als wäre das safesubst:-Präfix nicht vorhanden.

Die Ersetzung geschieht dabei nicht rekursiv, d. h., in einer Vorlage verwendete Vorlagen- oder Funktionsaufrufe werden so übernommen, wie sie sind, anstatt wiederum aufgelöst zu werden.

Achtung: Innerhalb der in <ref> eingeschlossenen Bereiche wird nicht substituiert.

Als Beispiel diene die Vorlage:GeradeOderUngerade mit dem Inhalt {{#ifexpr:{{{1}}} mod 2|ungerade|gerade}}. Beim Abspeichern des Seiteninhalts Die Zahl 7 ist {{subst:GeradeOderUngerade|7}}. würde dieser durch Die Zahl 7 ist {{#ifexpr:7 mod 2|ungerade|gerade}}. ersetzt werden. Wie man sieht, werden die Parameter mit ihren Eingabewerten belegt (d. h. hier {{{1}}}); aber nur die Vorlage selbst wird direkt durch ihren Inhalt ersetzt, nicht dagegen die enthaltenen Ausdrücke.

Rekursive SubstitutionBearbeiten

Für eine weitergehende – d. h. rekursive – Substitution müssen die enthaltenen Vorlagen oder Parserfunktionen ebenfalls explizit substituiert werden. Dabei kann der Inhalt des Beispiels aber nicht einfach in {{subst:#ifexpr:{{{1}}} mod 2|ungerade|gerade}} abgeändert werden, da schon beim Abspeichern unmittelbar die Substitution ausgeführt werden würde. Weil der Parameter 1 noch unbelegt ist, gibt der Parser einen Fehler zurück, da der gesamte Ausdruck nicht auswertbar ist, und diese Fehlermeldung würde wegen der Substitution als Vorlageninhalt abgespeichert.

Zum Erreichen einer rekursiven Substitution muss also verhindert werden, dass diese schon beim Abspeichern angewendet wird. Dafür gibt es zwei Möglichkeiten:

  • <includeonly>safesubst:</includeonly>
  • {{{|safesubst:}}}

Für beide Fälle kann auch subst verwendet werden. safesubst ist hier jedoch vorzuziehen, da sich subst unterschiedlich verhält, je nachdem, ob die entsprechende Seite (hier Vorlage:GeradeOderUngerade) substituierend (d. h. {{subst:GeradeOderUngerade|…}}) oder nichtsubstituierend (d. h. {{GeradeOderUngerade|…}}) verwendet wird.

Wenn im gegebenen Beispiel Vorlage:GeradeOderUngerade der Inhalt nach {{{{{|safesubst:}}}#ifexpr:{{{1}}} mod 2|ungerade|gerade}} geändert wird, würde bei einer Substitution der Vorlage der Seiteninhalt durch das gewünschte Die Zahl 7 ist ungerade. ersetzt werden. Um eine Vorlage demnach vollständig rekursiv substituieren zu können, d. h., das Ergebnis wäre Wikitext ohne Vorlagen- oder Funktionsaufrufe, müsste <includeonly>subst:</includeonly> oder {{{|safesubst:}}} für alle darin verwendeten Aufrufe von Funktionen und Vorlagen rekursiv gesetzt werden.

Anmerkung: Einige Funktionen können sich sehr unterschiedlich verhalten, z. B. nicht substituierbar sein. Daher ist ein Test vorher immer anzuraten. Zu weiteren Tipps und Tricks gibt es eine englischsprachige Hilfeseite sowie auf Deutsch mw:Help:Extension:ParserFunctions/de#Substituieren.

Warnung: Die Ergebnisse substituierter Funktionen sind undefiniert, wenn der Code von äußereren Bedingungen abhängt (etwa #ifexist); es muss sämtlicher variabler Code im zu berechnenden Ausdruck substituiert werden.

ZeitpunkteBearbeiten

  • Zuerst erfolgen alle Substitutionen, und der fertige Wikitext wird hergestellt.
  • Danach wird dieser Text in die Warteschlange der Datenbank zur Abspeicherung eingereiht.
  • Danach wird der Text abgespeichert und gleichzeitig der Zeitstempel der Datenbank vergeben.
  • Je nach Auslastung des Servers kann dies mehrere Sekunden dauern, zumindest oft Zehntelsekunden.
  • Erfolgte der Mausklick zur Abspeicherung einige Sekunden vor Mitternacht, dann die Einreihung in die Warteschlange zur endgültigen Substitution, dann die regelmäßig mehrere Sekunden benötigende Expansion durch Auflösung von Vorlagen und damit die Generierung des abzuspeichernden Textes, dann können die substituierten Zeitstempel im Seitentext ein anderes Datum tragen als der Zeitstempel der Datenbank um 00:00 Uhr.
  • Bei Abstimmungen usw. sollte also besser nicht die allerletzte Minute abgewartet werden. Wer den ersten Artikel eines neuen Jahres anlegt, ist ein Wettlauf mit den anderen, die die gleiche Idee hatten und vielleicht zehn oder fünf Sekunden vor Mitternacht den Mausklick gesetzt hatten.

AnmerkungenBearbeiten

  1. Eine Ausnahme wäre vorstellbar, wenn für die Umrechnung einer Größenangabe in die hiesige Maßeinheit eine Konversionsvorlage verwendet wird. Diese sollen jedoch nicht dauerhaft in Artikeln eingebunden werden und diese verkomplizieren.