Word-Vorlagen
Vorlagen-Syntax
Eine Moliri-Vorlage ist eine gewöhnliche Word-Datei (.docx), in deren Text Befehle der Form {# … #} stehen.
Moliri liest den literalen Text des Dokuments (Fließtext, Tabellenzellen, Kopf- und Fußzeilen) und führt jeden Befehl als JavaScript-Ausdruck aus. Ob der Befehl in einem Steuerelement steht, wie es der Vorlagen-Editor anlegt, oder als einfacher Text, spielt dafür keine Rolle.
Die Befehle
| Befehl | Form | Wirkung |
|---|---|---|
| INS | {# Ausdruck #} oder {# INS Ausdruck #} | Ergebnis als Text einfügen. Der nackte Ausdruck ist die Kurzform |
| EXEC | {#! Code #} oder {# EXEC Code #} | Code ausführen, nichts einfügen. Hier zugewiesene Variablen sind in allen folgenden Befehlen sichtbar |
| FOR / END-FOR | {# FOR x IN liste #} … {# END-FOR x #} | Inhalt je Listenelement wiederholen |
| IF / END-IF | {# IF bedingung #} … {# END-IF #} | Inhalt nur bei wahrer Bedingung |
| IMAGE | {# IMAGE img(datei, { width: 6 }) #} | Bild einfügen |
| LINK | {# LINK ({ url: `…`, label: `…` }) #} | Klickbaren Verweis einfügen; ohne label steht die Adresse da |
| HTML | {# HTML `<b>fett</b>` #} | HTML-Fragment einbetten; Word setzt es beim Öffnen um |
| ALIAS | {# ALIAS name Befehlstext #}, Aufruf {#*name#} | Abkürzung für einen kompletten Befehl |
Innerhalb eines Befehls gilt JavaScript-Syntax. Zeichenketten in Backticks und Template-Literale
(`${…}`) funktionieren.
{#$o[`RegNr`] ?? ``#} {#! FLOAT_FORMAT = { "mask": "Number", "scale": "2", "thousandsSeparator": " ", "radix": "," }#} {# IMAGE img(eingang[$i], { width: 16 }) #} {# LINK ({ url: `https://beispiel.moliri.app/p/${p.projektID}/o/${$o.objektID}`, label: `Objekt öffnen` }) #}
Die Regel für Schleifenvariablen
Die häufigste Fehlerquelle. Innerhalb einer FOR-Schleife heißt die Laufvariable mit $ davor:
{# FOR file IN $f #} {# IMAGE img($file, { width: 6 }) #} ← richtig: $file {# IMAGE img(file, { width: 6 }) #} ← falsch: file ist undefiniert {# END-FOR file #}
Das gilt für jede Schleife: FOR obj IN objects ergibt $obj, FOR i IN _.range(0, n) ergibt $i.
Zusätzlich steht in jeder Schleife $idx bereit, der Index der innersten Schleife, beginnend bei 0.
Eine laufende Nummer ist damit {#$idx + 1#}.
In einer Tabelle stehen FOR und END-FOR in eigenen Zeilen, FOR über der Datenzeile und END-FOR darunter. Dann wiederholt sich die Datenzeile für jedes Element. So entstehen Objektlisten als Tabelle, siehe Rezepte . Stehen beide in der ersten und letzten Zelle derselben Zeile,
wiederholt die eingebaute Engine nur die Zellen, nicht die Zeile.
Backticks statt Anführungszeichen
Word ersetzt gerade Anführungszeichen gern durch typografische. Moliri gleicht das beim Export aus, und auch die Felderkennung versteht typografische Anführungszeichen. Backticks sind trotzdem die bessere Wahl. Die verändert Word nie, und sie erlauben zugleich Template-Literale.
Einfache Ausgabe
{#$o[`RegNr`] ?? ``#}
$o ist das aktuelle Objekt, der Feldname steht in eckigen Klammern. Der leere Rückfall nach ?? sorgt
dafür, dass ein Feld ohne Wert leer bleibt und keine Folgefehler auslöst.
Bedingung
{# IF $o[`Inventarstatus`] === `Dauerleihgabe` #} Dauerleihgabe {# END-IF #}
Schleife über Objekte
{# FOR obj IN objects #} {# $obj[`RegNr`] ?? `` #} {# $obj[`Originaltitel`] ?? `` #} {# END-FOR obj #}
Felderkennung und Nachladen
Moliri lädt für den Export nur die Felder, die die Vorlage verwendet. Erkannt wird jeder Feldname, der in
eckigen Klammern und Anführungszeichen steht: $o[`Feld`], $obj[`Feld`] in Schleifen und auch o[`Feld`] in einer Gruppierungsfunktion. Bei Schlüsseln ohne $o oder Laufvariable davor zählen nur
Namen, die einem Feld des Projekts entsprechen.
Nicht erkannt wird ein Feldname, der anders in den Befehl kommt, etwa als berechneter Schlüssel oder als
Zeichenkette in _.groupBy(objects, `Leihgeber`). Ein solches Feld lässt sich in einer nie
ausgeführten Bedingung sichtbar machen:
{# IF false #} {# INS $o[`Leihgeber`] ?? `` #} {# END-IF #}
Dateien lädt Moliri nur, wenn die Vorlage $f oder files erwähnt. Reine Datenvorlagen bleiben
dadurch schnell.
Ein Dokument oder eines je Objekt
Moliri erkennt den Modus an den Befehlen:
- Schleife über die Objekte, ein Dokument. Sobald eine
FOR-Schleife über die Objektmenge läuft, wird die Vorlage genau einmal mit allen Objekten gerendert. Erkannt wird jedeFOR, deren Quelleobjectsoder eine daraus zugewiesene Variable nennt:FOR obj IN objects,FOR obj IN objects.filter(…)und auch{#! gruppen = _.groupBy(objects, …) #}mitFOR key IN Object.keys(gruppen). Datei- und Indexschleifen (FOR file IN $f,FOR i IN _.range(…)) zählen nicht. - Sonst ein Dokument je Objekt, anschließend zusammengeführt oder als ZIP gepackt.
objects ohne Schleife ändert den Modus nicht. {#objects.length#} in einer Vorlage je Objekt gibt die
Gesamtzahl aus und bleibt eine Vorlage je Objekt.
Liegt die Erkennung daneben, lässt sich der Modus im Vorlagen-Editor festlegen: rechtes Panel, Reiter Ausgabe, Auswahl Objekt-Modus mit Automatisch, Ein Dokument mit allen Objekten und Ein Dokument je Objekt. Der Exportdialog zeigt dann „manuell festgelegt“.
Abschnittsverhalten beim Zusammenführen
Bei einem Dokument je Objekt bestimmt das Abschnittsverhalten, wie die Einzeldokumente verbunden werden:
| Wert | Bedeutung |
|---|---|
template | Abschnittsverhalten der Vorlage (Vorgabe). Kopf- und Fußzeilen, Ränder und Umbrüche folgen der Vorlage |
none | Ohne zusätzlichen Umbruch zusammenführen |
pagebreak | Nur reinen Seitenumbruch einfügen |
section-continuous | Abschnittsumbruch, fortlaufend auf derselben Seite |
section-newpage | Abschnittsumbruch, neue Seite |
section-evenpage | Abschnittsumbruch, nächste gerade Seite |
section-oddpage | Abschnittsumbruch, nächste ungerade Seite |
zip | Nicht zusammenführen, als ZIP packen. Eine Datei je Objekt |
Die Werte sind stabil und werden nicht umbenannt. Der Name der Ausgabedatei ist <Vorlagenname>_<JJJJ-MM-TT>.docx bzw. .zip.
Einstellungen reisen im Dokument
Der Vorlagen-Editor speichert im rechten Panel (Reiter Ausgabe) drei Einstellungen als unsichtbaren Marker in der Vorlage: Steuerelemente auflösen, Objekt-Modus und Abschnittsverhalten. Beim Export liest Moliri den Marker. Die Vorlage bringt ihre Voreinstellungen also mit, egal wer sie verwendet.
Fehlt der Marker, etwa bei einer in Word geschriebenen Vorlage, gilt: Steuerelemente werden zu Klartext
aufgelöst, der Modus wird erkannt, das Abschnittsverhalten ist template. Im Exportdialog lassen sich
Zusammenführung und Steuerelemente unter Erweiterte Einstellungen für einen Lauf übersteuern.
Grenzen
| Thema | Verhalten |
|---|---|
await, async | Nicht möglich. Befehle laufen als synchrone Ausdrücke. img() arbeitet intern asynchron; Moliri wartet selbst darauf, in der Vorlage steht nur der einfache Aufruf |
| Pfeilfunktionen | Funktionieren und sind üblich: $f.filter(f => …), sort((a, b) => …) |
| Netzwerk | Kein Zugriff aus Befehlen. Alle Daten sind vorab geladen |
null, undefined | Rendern als leerer Text, ohne Abbruch. Ein Zugriff auf undefined wirft dagegen einen Fehler, etwa liste[$i].dateiText bei zu kurzer Liste. Deshalb ?? und ?. |
| Fehler im Befehl | Bricht den Export ab. Der Dialog zeigt Bericht konnte nicht erstellt werden mit der Meldung |
| Unbekannte Felder | Kein Fehler. Die Prüfung warnt, beim Export lassen sie sich auf ein vorhandenes Feld umleiten. Ohne Zuordnung bleibt das Feld leer |
| Geltungsbereich | Haupttext, Kopf- und Fußzeilen. Befehle in eingebetteten Objekten werden nicht ausgeführt |
| Große Exporte | Bei einem Dokument je Objekt rendern mehrere Prozesse im Browser parallel. Eine Vorlage mit Schleife über alle Objekte rendert in einem Durchgang |
Die Prüfung im Vorlagen-Editor findet dieselben Fehler vor dem Export. Nicht geschlossene FOR- und IF-Blöcke und unlesbare Vorlagen meldet sie immer, JavaScript-Fehler prüft sie mit echten Beispieldaten.
Weiterlesen
- Vorlagen-Variablen : welche Daten verfügbar sind
- Vorlagen-Funktionen : die zehn Hilfen
- Rezepte : kopierbare Muster
- Word-Berichte : der Export