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.project_id}/o/${$o.object_id}`, 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 Moliri · Prüfung, Reiter Einstellungen, Auswahl Aufteilung 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 Einstellungen) drei Einstellungen als unsichtbaren Marker in der Vorlage: Als normaler Text (Steuerelemente auflösen), Aufteilung (Objekt-Modus) und Übergang zwischen Objekten (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.
Ausführung und Fehler
| Thema | Verhalten |
|---|---|
| Ausführung | Befehle laufen als synchrone Ausdrücke, ohne await und async. 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) => …) |
| Abschottung | Befehle laufen beim Export und bei der Prüfung in einem abgeschotteten Hintergrundprozess. Verfügbar sind die Hilfen und die Daten , die Moliri vorab lädt. Kein Netz (fetch, WebSocket, fremde Skripte nachladen), kein Speicher des Browsers (Anmeldung, localStorage, IndexedDB). Die Prüfung meldet einen solchen Aufruf als Fehler Nicht erlaubt: … |
| Laufzeit | Höchstens 60 Sekunden je Lauf, also je Dokument oder je Prüfung. Die Ladezeit der Bilder zählt nicht mit. Danach bricht Moliri den Export ab: Die Vorlage wurde nach 60 Sekunden abgebrochen: ihr Code lief zu lange (vielleicht eine Endlosschleife). |
null, undefined | Rendern als leerer Text, ohne Abbruch. Ein Zugriff auf undefined wirft dagegen einen Fehler, etwa liste[$i].text 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. Unter Feldzuordnung im Vorlagen-Editor oder beim Export lassen sie sich auf ein vorhandenes Feld umleiten, siehe Fehlende Felder je Projekt zuordnen . Ohne Zuordnung bleibt das Feld leer |
| Alte Namen | Feld- und Schlüsselnamen aus der Zeit vor der Umstellung auf englische Namen (p.projektname statt p.name) bleiben leer. Die Prüfung führt sie unter Hinweise, Umschreiben setzt die heutigen Namen ein |
| Geltungsbereich | Haupttext, Kopf- und Fußzeilen. Befehle gehören direkt in den Text, eingebettete Objekte bleiben, wie sie sind |
| 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