Template Engines − erweitert

Mit erweiterten »Template Engines« Texte prozessieren.

Template Engines − erweitert Joachim Christ


Dieser Artikel führt den Beitrag Template Engines inhaltlich fort.


Bei »Markdown« werden diese Auszeichnungen unterstützt. Die Auszeichnung von Verweisen und Bildern wurde geändert.

Die »Template Engine« ist ein Interpreter mit variabler Arithmetik. Es stehen zur Verfügung: Ganzzahl-Arithmetik, Bruch-Arithmetik und Gleitkomma-Arithmetik,

Die Engine benutzt diese Arithmetik mit deren Erweiterungen sowie diese Zeichenverarbeitung und deren Erweiterungen . Als Verallgemeinerung der Arithmetik werden komplexe Ausdrücke angeboten: Ausdrücke .

Sie erlaubt als zusammengesetzte Datenobjekte Alben , Felder und Strukturen .

Für Alben sind diese Album-Operationen definiert. Werden Alben ausgegeben, so entsprechen sie ungeordneten Aufzählungen.

Für Felder sind diese Feld-Operationen definiert. Werden Felder ausgegeben, so entsprechen sie geordneten Aufzählungen. Sind Elemente von Feldern wiederum Felder, so entstehen Gliederungen, also eingerückte Aufzählungen in Aufzählungen.

Werden Strukturen ausgegeben, so entstehen zwei-spaltige Tabellen. In der ersten Spalte stehen die Benennungen, in der zweiten deren zugeordneten Werte.

Sie kennt als Kontrollstrukturen neben den bisherigen Anweisungen diese weiteren Anweisungen .

Ist der Implizit-Modus aktiviert, so darf die Eingabe nur aus Ausdrücken oder Anweisungen der »Template-Engine« bestehen. Ein Ausdruck gilt dann implizit als in {{ und }} eingeschlossen und wird somit evaluiert. Ebenso brauchen Anweisungen nicht in {% und %} eingeschlossen zu werden. »Markdown« − sofern aktiviert − wird dann nur noch innerhalb von Zeichenketten erkannt.

Alben

  • Alben sind durch { und } eingeschlossene Listen von Elementen, die durch , getrennt werden. Ein Element kann eine Zahl, eine Zeichenkette oder ein zusammengesetztes Objekt sein. Ein Album entspricht in etwa einer Menge, jedoch können Elemente in einem Album mehrfach auftreten.

  • { } bezeichnet ein leeres Album.

  • Für Alben ist der Operator or als Vereinigung erlaubt. D.h., es verbleiben nur die Elemente im Ergebnis-Album, die entweder im ersten oder im zweiten oder in beiden Alben enthalten sind.

  • Der Operator and bildet die Schnittmenge zweier Alben. D.h., es verbleiben nur die Elemente im Ergebnis-Album, die sowohl im ersten als auch im zweiten Album enthalten sind.

  • Der Operator xor bildet die exklusive Vereinigung zweier Alben. D.h., es verbleiben nur die Elemente im Ergebnis-Album, die entweder im ersten oder im zweiten aber nicht in beiden Alben enthalten sind.

  • Der Infix-Operator in überprüft, ob der angegebene Wert im Album vorhanden ist: 11 in { 11, 12, 13 } = 1, 14 in { 11, 12, 13 } = 0.

  • Für Alben sind die Vergleiche == und != definiert.

  • Album-Operationen

  • count Anzahl der Elemente eines Albums: count { 11, 12, 13 } = 3.

  • pack Album, aus dem alle Elemente, die mehrfach auftreten, gelöscht sind.

  • sort Album, bei dem alle Elemente aufsteigend sortiert sind und nur einmalig auftreten (siehe pack).

  • fold Konvertiert ein Album, bei dem alle Elemente Zeichenketten sind, in eine Zeichenkette.

  • array Konvertiert ein Album in ein Feld.

  • Felder

  • Felder sind durch [ und ] eingeschlossene Listen von Elementen, die durch , getrennt werden. Ein Element kann eine Zahl, eine Zeichenkette oder ein zusammengesetztes Objekt sein.

  • [ ] bezeichnet ein leeres Feld.

  • Für Felder ist der Operator + als Konkatenation erlaubt. Damit können auch Elemente konkateniert werden: 12 + [ 13 ] = [ 12 ] + [ 13 ] = [ 12, 13 ], [ 13 ] + 14 = [ 13 ] + [ 14 ] = [ 13, 14 ].

  • Der Postfix-Operator @ selektiert ein Element des Feldes: [ 11, 12, 13 ] @ 2 = 12. Der Index »-1« selektiert das letzte Element.

  • Der Infix-Operator in überprüft, ob der angegebene Index im Feld vorhanden ist: 2 in [ 11, 12, 13 ] = 1. Der Index »-1« selektiert das letzte Element; 1 in a bzw. -1 in a ist damit Überprüfung auf eine nicht leere Liste.

  • Der Präfix-Operator length liefert die Anzahl der Elemente im Feld: length [ 11, 12, 13 ] = 3.

  • Für Felder sind die Vergleiche == und != definiert.

  • Eine Reihung .. erzeugt mehrere Feldelemente: [ 9, 11..13, 15 ] = [ 9, 11, 12, 13, 15 ].

  • Eine Indizierung : gibt den Index eines Feldelements vor: [ 11, 4: 14, 15 ] = [ 11, undefined, undefined, 14, 15 ]. Mit einer solchen Indizierung können schwach besetzte Felder erzeugt werden. Werden schwach besetzte Felder konkateniert, so werden die Indizes des zweiten Feldes um die Länge des ersten Feldes erhöht.

  • Hinweis: Eine Zeichenkette stellt einen Spezialfall eines Feldes dar. Jedoch weicht die Funktionalität des Operators in bei beiden ab.

    Feld-Operationen

  • length Länge eines Feldes, d.h., der Index des letzten Elementes.

  • count Anzahl der Elemente eines Feldes.

  • min Kleinstes Element eines Feldes.

  • max Größtes Element eines Feldes.

  • sum Summe aller Elemente eines Feldes.

  • prod Produkt aller Elemente eines Feldes.

  • avg Durchschnitt der Elemente eines Feldes, d.h., seine Summe geteilt durch die Anzahl der Elemente. Die Division erfolgt ganzzahlig.

  • pack Feld, das genau alle Elemente des Quellfeldes in der identischen Reihenfolge hat und jedes Element einen um eins größeren Index als sein Vorgänger besitzt.

  • sort Feld, das genau alle Elemente des Quellfeldes hat und dessen Elemente aufsteigend sortiert und verdichtet sind (siehe pack).

  • median Mittleres Element der Sortierung eines Feldes, d.h., das Element, für das jeder Vorgänger kleiner und jeder Nachfolger größer als es selbst ist. Hat das Quellfeld eine gerade Anzahl an Elementen, so wird der Durchschnitt der beiden mittleren Elemente geliefert. Die Division erfolgt ganzzahlig.

  • numeric Wahrheitswert, ob alle Elemente des Feldes numerisch sind.

  • fold Konvertiert ein Feld, bei dem alle Elemente Zeichenketten sind, in eine Zeichenkette.

  • album Konvertiert ein Feld in ein Album. Bei dieser Operation gehen die Indizes der Elemente verloren, ihre Reihenfolge bleibt jedoch erhalten.

  • Strukturen

  • Strukturen sind durch ( und ) eingeschlossene Listen von Elementen, die durch , getrennt werden. Jedes Element wird eindeutig benannt: ( 'zaehler': 12, 'nenner': 36 ). Ein Element kann eine Zahl, eine Zeichenkette oder ein zusammengesetztes Objekt sein.

  • Der Postfix-Operator @ selektiert ein Element der Struktur: ( 'zaehler': 12, 'nenner': 36 ) @ 'nenner' = 36.

  • Der Infix-Operator in überprüft, ob das bezeichnete Element in der Struktur vorhanden ist: 'nenner' in ( 'zaehler': 12, 'nenner': 36 ) = 1.

  • Der Präfix-Operator count liefert die Anzahl der Elemente in der Struktur: count ( 'zaehler': 12, 'nenner': 36 ) = 2.

  • Für Strukturen sind die Vergleiche == und != definiert. Sie testen, ob zwei Strukturen inhaltlich übereinstimmen.

  • Für Strukturen sind die Vergleiche @== und @!= definiert. Sie testen, ob zwei Strukturen strukturell übereinstimmen, also die identischen Benennungen umfassen.

  • Arithmetik


    Folgende arithmetische Operatoren und Operanden sind implementiert:

    • Arithmetische Operanden: Variable (mit Buchstaben oder $ beginnend).
    • Arithmetische Operanden: Ganze Zahlen (mit Vorzeichen).
    • Logische Operanden: true oder false.
    • Vorzeichen: + oder .
    • Klammerung von Ausdrücken: ( ).
    • Arithmetische Operatoren: +, , *, div (ganzzahlige Division), mod (Rest bei der ganzzahliger Division) oder pow (Potenz einer Zahl).
    • Vergleichs-Operatoren: ==, !=, <, <=, > oder >=. Vergleiche liefern true bzw. false.
    • Logische Operatoren: not (logisches Nicht), and (logisches Und), or (logisches Oder) oder xor (exklusives Oder).

    Arithmetik − Erweiterungen


    Folgende arithmetischen Operatoren sind zusätzlich implementiert:

    • length Länge einer Zahl: length -3477 = 5.
    • abs: Absolutbetrag einer Zahl.
    • sign Vorzeichen einer Zahl: -1, 0 oder 1.
    • sqr: Quadrat einer Zahl.
    • fib: Fibonacci-Zahl.
    • fac: Fakultät einer Zahl.

    Ausdrücke


    Folgende komplexen Ausdrücke sind implementiert:

    • Logische Verzweigung:
    • (
      <Bedingung> : <Ausdruck>,

      <Bedingung> : <Ausdruck>
      )
    • Beispiele:
      • ( a == 2: 12, true: 13 ): Einfaches Wenn-Dann-Sonst.
      • ( a == 2: 12, b == 3: 13, true: 14 ): Wenn-Dann-Kaskade.
    • Erläuterung:
      • Es werden solange die <Bedingungen> ausgewertet, bis sich die erste zu true ergibt; dann wird der dazugehörige Ausdruck gewählt und zum Ergebnis der logischen Verzweigung.

    Zeichenverarbeitung


    Folgende Operatoren und Operanden für Zeichenketten sind implementiert:

    • Operanden: Zeichenkette durch " oder ' begrenzt, kann durch \ geschützte Zeichen enthalten
    • Vorzeichen: + (Identität) oder - (Umkehrung - 'leipsieB')
    • Operatoren: + (Konkatenation 'Bei' + 'spiel')
    • Gemischte Operatoren: * (Zeichenketten-Vervielfältigung 'Beispiel' * 2)
    • Vergleiche: ==, !=, <, <=, > oder >=

    Zeichenverarbeitung − Erweiterungen


    Folgende Operatoren für Zeichenketten sind zusätzlich implementiert:

    • Der Postfix-Operator @ selektiert einen Buchstaben der Zeichenkette: "abc" @ 2 = 'b'. Der Index »-1« selektiert den letzten Buchstaben.
    • Der Infix-Operator in liefert die Position der ersten Zeichenkette in der zweiten: 'b' in "abc" = 2.
    • Der Präfix-Operator length liefert die Länge der Zeichenkette: length "abc" = 3.
    • Der Präfix-Operator unfold konvertiert eine Zeichenkette in ein Feld.

    Anweisungen


    Folgende Anweisungen sind implementiert:

    • {{ <Ausdruck> }}
      Auswertung und Ausgabe des angegebenen Ausdrucks. Zeichenketten werden ohne Anführungszeichen (" oder ') in die Ausgabe übernommen.
    • {# #}
      Kommentar.
    • {% assign <Name> = <Ausdruck> %}
      Zuweisung eines Werts an eine Variable. Eine Variable muss mit einem Buchstaben oder dem Zeichen $ beginnen und darf neben diesen auch Ziffern enthalten.
    • {% if <Ausdruck1> %}
      {% elseif <Ausdrucki> %}wiederholbar
      {% else %}optional
      {% endif %}
      Auswahl eines Textes anhand von Ausdrücken.

    Weitere Anweisungen


    Folgende weiteren Anweisungen sind implementiert:

    • {% assign <Name> @ <Ausdruck> %}
      Einfügen eines Ausdrucks in eine Album-Variable: {% assign L @ 'zeile' %}. Nur wenn der Wert nicht existiert, wird er aufgenommen.
    • {% assign <Name> @ <Index> = <Ausdruck> %}
      Zuweisung eines Werts an das indizierte Element einer Feld- oder Zeichenketten-Variable: {% assign a @ 2 = 49 %}. Der Index »-1« selektiert das letzte Element. Existiert dieses Element, so wird es überschrieben; existiert es nicht, so wird es aufgenommen. Mit einer solchen Zuweisung können schwach besetzte Felder erzeugt werden.
    • {% assign <Name> @ <Benennung> = <Ausdruck> %}
      Zuweisung eines Werts an ein benanntes Element einer Struktur-Variable: {% assign a @ 'i' = -1 %}. Existiert das benannte Element, so wird es überschrieben; existiert es nicht, so wird es aufgenommen.
    • {% delete <Name> %}
      Löschen einer Variable. Es erfolgt keine Fehlermeldung, wenn die Variable undefiniert sein sollte.
    • {% delete <Name> @ <Ausdruck> %}
      Löschen eines Ausdrucks aus einer Album-Variable: {% delete L @ 'zeile' %}. Es erfolgt keine Fehlermeldung, wenn der Wert nicht im Album vorhanden sein sollte.
    • {% delete <Name> @ <Index> %}
      Löschen des indizierten Elements einer Feld- oder Zeichenketten-Variable: {% delete a @ 2 %}. Der Index »-1« selektiert das letzte Element. Es erfolgt keine Fehlermeldung, wenn das Element nicht im Feld vorhanden sein sollte.
    • {% delete <Name> @ <Benennung> %}
      Löschen eines benannten Elements einer Struktur-Variable: {% delete a @ 'i' %}. Es erfolgt keine Fehlermeldung, wenn das Element nicht in der Struktur vorhanden sein sollte.
    • {% set <Set-Name> %}

      {% endset %}
      »Aufsammeln« von Text und Zuweisung dieses an eine Set-Variable. Dabei werden andere Kommandos ({%   %}) nicht ausgewertet.
    • {% include <Set-Name> %}
      Einfügen und Auswerten des Inhalts einer Set-Variable (siehe set) in den zu bearbeitenden Text.
    • {% for <Name> on <Ausdruck> %}

      {% endfor %}
      Iterative Abarbeitung des Schleifenkörpers für alle Komponenten eines strukturierten Objekts.
      • {% for x on { 'abc', 'def' } %} weist “x” nacheinander die Album-Komponenten 'abc' bzw. 'def' zu.
      • {% for y on [ 1, 4: 2, 3 ] %} weist “y” nacheinander die Werte 1, 2 bzw. 3 zu.
      • {% for z on ( 'zaehler': 12, 'nenner': 36 ) %} weist “z” nacheinander die Werte 12 bzw. 36 zu.

    Auszeichnungen

      
    **Fetter Text
    __Unterstrichener Text
    ~~Kursiver Text
    ^^Hochgestellter Text
    <sub></sub>Tiefgestellter Text
    <em></em>Hervorgehobener Text
      
    §Überschrift 1

    Überschrift 1

    §§Überschrift 2

    Überschrift 2

    §§§Überschrift 3

    Überschrift 3

      
    Aufzählung: 
    ° Liste
    ° Liste
    • Liste
    • Liste
    °. Reihenfolge
    °. Reihenfolge
    • Reihenfolge
    • Reihenfolge
      
    Verweis:
    <a Link>(Text)

    Text
     Link-Texte werden rekursiv behandelt.
      
    Bild:
    <img Bild>(Alternativtext)

    Alternativtext
     Alternativtexte werden rekursiv behandelt.
      
    Tabelle:
    + Kopf A + Kopf B +
    | A1 | B1 |
    | A2 | B2 |
    | A3 | B3 |

    Kopf AKopf B
    A1B1
    A2B2
    A3B3
      
    Aufhebung der Bedeutung: 
    \<Jedes Zeichen><Jedes Zeichen>
    \**
    \\\
    \""
    \''
      
    Zeichenketten: 
    ""Zeichenkette durch " begrenzt
    ''Zeichenkette durch ' begrenzt
      Zeichenketten verhindern die Markdown-Auswertung der darin enthaltenen Zeichen und können durch \ geschützte Zeichen enthalten Sie werden ohne Anführungszeichen in die Ausgabe übernommen.
      
    Kommentare: 
    <!‑‑‑‑>Kommentar
     Kommentare können rekursiv benutzt werden. Sie werden aus der Ausgabe entfernt.
      

    ↵

     

     

    Bitte geben Sie den zu bearbeitenden Quelltext ein und starten Sie die Verarbeitung durch Klicken des Icons '↵'. Der formatierte Text wird dann ausgegeben.

    Dieser Link dient zum Anzeigen des globalen Namenspeichers. Dieser Link dient zum Löschen des globalen Namenspeichers.

    Der zu bearbeitende Quelltext kann aus einer Datei/ mehreren Dateien hochgeladen werden.

    Voriger Beitrag Nächster Beitrag