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

BefehlFormWirkung
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 jede FOR, deren Quelle objects oder eine daraus zugewiesene Variable nennt: FOR obj IN objects, FOR obj IN objects.filter(…) und auch {#! gruppen = _.groupBy(objects, …) #} mit FOR 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.

Erkennung übersteuern

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:

WertBedeutung
templateAbschnittsverhalten der Vorlage (Vorgabe). Kopf- und Fußzeilen, Ränder und Umbrüche folgen der Vorlage
noneOhne zusätzlichen Umbruch zusammenführen
pagebreakNur reinen Seitenumbruch einfügen
section-continuousAbschnittsumbruch, fortlaufend auf derselben Seite
section-newpageAbschnittsumbruch, neue Seite
section-evenpageAbschnittsumbruch, nächste gerade Seite
section-oddpageAbschnittsumbruch, nächste ungerade Seite
zipNicht 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

ThemaVerhalten
await, asyncNicht möglich. Befehle laufen als synchrone Ausdrücke. img() arbeitet intern asynchron; Moliri wartet selbst darauf, in der Vorlage steht nur der einfache Aufruf
PfeilfunktionenFunktionieren und sind üblich: $f.filter(f => …), sort((a, b) => …)
NetzwerkKein Zugriff aus Befehlen. Alle Daten sind vorab geladen
null, undefinedRendern 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 BefehlBricht den Export ab. Der Dialog zeigt Bericht konnte nicht erstellt werden mit der Meldung
Unbekannte FelderKein Fehler. Die Prüfung warnt, beim Export lassen sie sich auf ein vorhandenes Feld umleiten. Ohne Zuordnung bleibt das Feld leer
GeltungsbereichHaupttext, Kopf- und Fußzeilen. Befehle in eingebetteten Objekten werden nicht ausgeführt
Große ExporteBei 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

\ en\ de