Wikiup:Archiv/Vorlagen/TitelFormat/core

aus Wikipedia, der freien Enzyklopädie
< Wikiup:Archiv
Dies ist die aktuelle Version dieser Seite, zuletzt bearbeitet am 4. September 2016 um 15:03 Uhr durch imported>PerfektesChaos(310926) (lf).
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)


Diese Vorlage ist Untervorlage für Vorlage:TitelFormat und nur von dieser zu benutzen oder von geübten Vorlagenprogrammierern unter Beachtung der Vorgaben in TitelFormat direkt einzusetzen.

Sie erledigt die Hauptarbeit für diese. Die Konstruktion als Untervorlage ist aus zwei Gründen notwendig:

Statt Untervorlagen wird nur auf die Parserfunktion padleft zurückgegriffen, um die Expansionsgröße nicht zu sprengen. Außer sich selbst wird von /core keinerlei externe Vorlage benutzt.

Credits to en:Category:String manipulation templates.

Parameter

Die Parameter-Systematik gilt für alle Untervorlagen der Familie /core und ihre Variationen.

T
Titel
Weil mehrfach durch Vorlagen durchgereicht, ohne führende oder schließende Leerzeichen.
Zunächst der darzustellende Titel; danach ggf. auch Pseudo-Titel
Pflichtparameter
L
Länge von T
Länge aller Pseudo-Titel X
Pflichtparameter
M
Modus operandi – nachfolgende Zeichen, bereits abgearbeitet
> Erster Aufruf, von Vorlage:TitelFormat aus.
In diesem Fall sind die Parameter K,P,X überflüssig.
+ Analysiere letztes Zeichen
] Analysiere vorletztes Zeichen; vor einzelner eckigen Klammer
' Analysiere vorletztes Zeichen; vor einzelnem Apostroph
2' Analysiere vorvorletztes Zeichen; vor Doppel-Apostroph
K
Beendigung mit '' kommt noch in Frage
''   – ja
nichts – nein
P
Beendigung mit . kommt noch in Frage
.   – ja
nichts – nein
X
Pseudo-Titel
Titel T, bei dem das letzte Zeichen und vor diesem stehende Leerzeichen entfernt wurden, dafür aber am Anfang ein bzw. mehrere & vorgeschaltet wurden.
Im Modus M=> nicht erforderlich.

Ergebnis

Das Resultat von /core ist:

  • ''   – wenn auf Satzzeichen endend
  • nichts – wenn auf Satzzeichen'' endend
  • .   – wenn auf '' endend
  • ''.   – sonst

Programmierung

Effizienz

Maßnahmen zur Effizienzsteigerung bei der Abarbeitung sind:

  • Die aufwendige Längenermittlung Str len erfolgt nur einmal in Vorlage:TitelFormat.
  • Str ≥ len etc. kann vermieden werden; durch die interne Logik ist die Längenbedingung immer erfüllt.
  • Es werden aus Str index nur wenige spezifische Zeichen benötigt (dafür allerdings Unicode); ansonsten ist gleichgültig, welches die letzten Zeichen des Titels sind.
  • Arithmetische Ausdrücke {{#expr:len-1}} werden nicht benutzt.
  • Str left wird durch padleft ersetzt.
  • Der mit padleft gebildete „Pseudo-Titel“ wird jeweils nur ein Mal gebildet, aber mehrfach in den folgenden switch-cases eingefügt.

Eine weitere Optimierung wäre möglich, wenn es eine Funktion right(T,n) geben würde. Sowohl padleft wie auch padright ermöglichen aber nur ein left(T,n) – ansonsten könnte man grundsätzlich mit einem String fester Länge arbeiten, also den letzten 10 oder ohne Rekursion 4 Zeichen und nur diese analysieren (von links aufgefüllt). Die Länge L könnte dann durch diese Konstante ersetzt werden, die Berechnung der Länge wäre vermeidbar, die size wäre jeweils geringer. – Str right ist aber äußerst rechenintensiv, ruft auch nur Str len auf, beschränkt den Zeichensatz und vervielfacht den Aufwand.

Rekursion

Eigentlich war es so gedacht, eine einzige /core rekursiv einzubinden. Wegen „Vorlagenschleife“ ist dies jedoch zurzeit nicht möglich. Sollte diese Beschränkung einmal aufgehoben werden, kann auf die Selbstrekursion zurückgegriffen werden.

Die Programmierung lautet (zwangsläufig nicht ausgetestet):

{{#switch: {{{M}}}
  | >={{TitelFormat/core |T={{{T}}}|L={{{L}}}|M=+|K=''|P=.|X={{padleft:|{{{L}}}|&{{{T}}}}}}}
  | +={{#switch: &{{{T}}}
        | {{{X}}}!
        | {{{X}}}?
        | {{{X}}}…
        | {{{X}}}!
        | {{{X}}}.
        | {{{X}}}?
        | {{{X}}}. = {{{K|}}}
        | {{{X}}}' = {{TitelFormat/core |T={{{X}}}|L={{{L}}}|M='|K={{{K|}}}|P={{{P|}}}
                                        |X={{padleft:|{{{L}}}|&{{{X}}}}}}}
        | {{{X}}}] = {{TitelFormat/core |T={{{X}}}|L={{{L}}}|M=]|K={{{K|}}}|P={{{P|}}}
                                        |X={{padleft:|{{{L}}}|&{{{X}}}}}}}
        | {{{X}}}»
        | {{{X}}}«
        | {{{X}}}›
        | {{{X}}}‹
        | {{{X}}}‘
        | {{{X}}}’
        | {{{X}}}”
        | {{{X}}}“
        | {{{X}}}"
        | {{{X}}}" = {{TitelFormat/core |T={{{T}}}|L={{{L}}}|M=+|K={{{K|}}}|P={{{P|}}}
                                        |X={{padleft:|{{{L}}}|&{{{T}}}}}}}
        | #default = {{{K|}}}{{{P|}}}
        }}
  | ]={{#ifeq: &{{{T}}} | {{{X}}}]
        | {{TitelFormat/core |T={{{X}}}|L={{{L}}}|M=+|K={{{K|}}}|P={{{P|}}}
                             |X={{padleft:|{{{L}}}|&{{{X}}}}}}}
        | {{TitelFormat/core |T={{{T}}}|L={{{L}}}|M=+|K={{{K|}}}|P={{{P|}}}
                             |X={{padleft:|{{{L}}}|&{{{T}}}}}}}
        }}
  | '={{#ifeq: &{{{T}}} | {{{X}}}'
        | {{TitelFormat/core |T={{{X}}}|L={{{L}}}|M=2'|K={{{K|}}}|P={{{P|}}}
                             |X={{padleft:|{{{L}}}|&{{{X}}}}}}}
        | {{TitelFormat/core |T={{{T}}}|L={{{L}}}|M=+|K={{{K|}}}|P={{{P|}}}
                             |X={{padleft:|{{{L}}}|&{{{T}}}}}}}
        }}
  | 2'={{#ifeq: &{{{T}}} | {{{X}}}'
         | {{TitelFormat/core |T={{{T}}}|L={{{L}}}|M=+|K={{{K|}}}|P={{{P|}}}
                              |X={{padleft:|{{{L}}}|&{{{T}}}}}}}
         | {{TitelFormat/core |T={{{X}}}|L={{{L}}}|M=+|P={{{P|}}}
                              |X={{padleft:|{{{L}}}|&{{{X}}}}}}}
         }}
  }}

Die rekursive Analyse des Titel-Endes findet alle Kombinationen aus Verlinkung, Anführungszeichen, Satzzeichen und Kursiv-Syntax.

Erläuterungen:

  1. In Vorlage:TitelFormat erfolgt einmalig die aufwendige Längenermittlung L=Str len. Das ist ihre wesentliche Aufgabe.
  2. M=> hat nur die Aufgabe, den Wert von L zweimal zu benutzen.
  3. M=+ analysiert das aktuell letzte Zeichen.
    • Ist es ein Satzzeichen, ist der Kursiv-Abschluss '' das Resultat, falls K noch gesetzt ist.
    • Ist es ein Sonderfall wie Anführungszeichen oder eckige Klammer, wird das Zeichen verworfen und rekursiv analysiert.
    • Ist es wie in den meisten Fällen ein sonstiges Zeichen (etwa ein Buchstabe), wird ''. zum Ergebnis, falls K und P noch gesetzt sind. Die Analyse wird abgebrochen.
  4. Die anderen Modi behandeln die Sonderfälle.
  5. K und P werden innerhalb der Rekursion zurückgesetzt, wenn dies geboten ist.

Die Auffindung einer Rekursion ist nicht auf Selbstrekursion beschränkt; Umdribbeln per Doppelpass über /core+ funktioniert leider nicht.

Zyklische Zeichenersetzung

  • Der Pseudo-Titel X wird gebildet, indem nach und nach schließende Zeichen zur Analyse entfernt werden und dafür durch führende & ersetzt werden. Der Parameter behält dadurch seine Länge; die arithmetische Dekrementierung der Länge L und die Handhabung entarteter Zeichenketten wird vermieden.
  • Wird ein einzelnes Leerzeichen als aktuell vorletztes Zeichen angetroffen, wird es gemäß den Regeln von padleft mit einem & aufgefüllt. Das entspricht einem Nicht-Satzzeichen und führt zum Abbruch der Analyse.
  • Steht hingegen vor dem letzten Zeichen mehrfacher Whitespace, würde dies möglicherweise auch durch die ersten Zeichen des Titels ausgeglichen werden. Das ist aber unproblematisch, weil dies allenfalls zum Fehlen des abschließenden Punktes führen würde, wenn der Titel gleichzeitig mit Ausrufezeichen oder Fragezeichen beginnen würde. Dieser „Schaden“ ist hinnehmbar.
  • Der Pseudo-Titel wird nur innerhalb der Untervorlage benutzt und dringt nicht nach außen.

Nicht-rekursive Aushilfslösung

Eine leicht reduzierte Funktionalität lässt sich einstweilen erreichen, wenn die einzelnen Modi in verschiedene Untervorlagen aufgespalten werden. Sehr komplexe Formen des ursprünglichen Titels werden nicht mehr richtig erkannt; dann steht halt mal ein Punkt zuviel dahinter.

core

  • Funktion: Wert von L zweimal benutzen
  • Parameter: T L
{{TitelFormat/core1 |T={{{T}}}|L={{{L}}} |X={{padleft:|{{{L}}}|&{{{T}}}}}}}

Entspricht M=> bei der Rekursion.

core1

  • Funktion: Analyse des letzten Zeichens des Original-Titels
  • Parameter: T L X
{{#switch: &{{{T}}}
  | {{{X}}}!
  | {{{X}}}?
  | {{{X}}}…
  | {{{X}}}!
  | {{{X}}}.
  | {{{X}}}?
  | {{{X}}}. = ''
  | {{{X}}}' = {{TitelFormat/core2 |T={{{X}}}|L={{{L}}}|M='
                                   |X={{padleft:|{{{L}}}|&{{{X}}}}}}}
  | {{{X}}}] = {{TitelFormat/core2 |T={{{X}}}|L={{{L}}}|M=]
                                   |X={{padleft:|{{{L}}}|&{{{X}}}}}}}
  | {{{X}}}»
  | {{{X}}}«
  | {{{X}}}›
  | {{{X}}}‹
  | {{{X}}}‘
  | {{{X}}}’
  | {{{X}}}”
  | {{{X}}}“
  | {{{X}}}"
  | {{{X}}}" = {{TitelFormat/core2 |T={{{X}}}|L={{{L}}}|M=+
                                   |X={{padleft:|{{{L}}}|&{{{X}}}}}}}
  | #default = ''.
  }}

Entspricht M=+ bei der Rekursion.

core2

  • Funktion: Analyse des vorletzten Zeichens des Original-Titels – wenn etwa ein Anführungszeichen oder eine eckige Klammer folgt
  • Parameter: T L M X
{{#switch: &{{{T}}}
  | {{{X}}}!
  | {{{X}}}?
  | {{{X}}}…
  | {{{X}}}!
  | {{{X}}}.
  | {{{X}}}?
  | {{{X}}}. = ''
  | {{{X}}}' = {{#ifeq: {{{M}}} | '
                 | .
                 | {{TitelFormat/core3 |T={{{X}}}|L={{{L}}}
                                       |X={{padleft:|{{{L}}}|&{{{X}}}}}}}
                 }}
  | {{{X}}}] = {{#ifeq: {{{M}}} | ]
                 | {{TitelFormat/core3 |T={{{X}}}|L={{{L}}}
                                       |X={{padleft:|{{{L}}}|&{{{X}}}}}}}
                 | ''.
                 }}
  | #default = {{#ifeq: {{{M}}} | '
                 | .''
                 | ''.}}
  }}

Entspricht den Modi + ] ' bei der Rekursion.

core3

  • Funktion: Analyse des vorvorletzten Zeichens des Original-Titels – wenn etwa zwei Apostroph oder zwei eckige Klammern folgen
  • Parameter: T X
{{#switch: &{{{T}}}
  | {{{X}}}!
  | {{{X}}}?
  | {{{X}}}…
  | {{{X}}}!
  | {{{X}}}.
  | {{{X}}}?
  | {{{X}}}. = ''
  | #default = ''.
  }}

Untauglicher Ansatz

Die nachfolgende Programmierung für Vorlage:TitelFormat hat erhebliche Nachteile:

  • Endet der Titel 1 auf ein Zeichen, das nicht in ISO 8859-15 enthalten ist, ergibt sich aus Str index nur eine hässliche Fehlermeldung. (obsoletes Verhalten, {{Str index}} unterstützt beliebige Zeichen)
  • Die aufwendige Längenermittlung Str len erfolgt ggf. zweimal.
  • Komplexere Situationen werden nicht erkannt.
''{{{1}}}{{#switch: {{Str index|{{{1}}}}|{{Str len|{{{1}}}}}}}
           | .
           | !
           | ?
           | !
           | .
           | ? = ''
           | "
           | »
           | «
           | ›
           | ‹
           | ‘
           | ”
           | “
           | "
           | ] = {{#switch: {{Str index|{{{1}}}}|{{#expr:{{Str len|{{{1}}}}}-1}}}}
                   | !
                   | ?
                   | . = ''
                   | #default = ''.
                 }}
           | #default = ''.
           }}