Einführung in FrameScript

(Übersetzung von »An Introduction to Writing Scripts« von Rick Quatro)

Mit FrameScript verhält es sich ähnlich wie mit FrameMaker: Die Lernkurve ist ziemlich steil, aber wenn Sie es einmal gelernt haben, dann ist das Programm ein echtes Arbeitstier. Als Einstieg eignet sich am Besten die Lektüre der ersten drei Kapitel der FrameScript Scriptwriter’s Reference. In der Quick Reference finden Sie eine schnelle Übersicht über die Syntax von FrameScript. Dieser Artikel behandelt die grundlegenden Verfahren zum Schreiben von Skripts, die Ihnen den Einstieg erleichtern sollen.

Doch bevor Sie mit dem Schreiben von Skripts beginnen, hier zunächst einige Begriffsdefinitionen. Jedes Skript, das in FrameScript erstellt wird, dient der Manipulation von FrameMaker-Objekten. Objekte sind Elemente wie Absätze, verankerte Rahmen und Seiten. Alle FrameMaker-Objekte haben jeweils charakteristische Eigenschaften. Ein Absatz hat z.B. die Eigenschaften FirstIndent und Color. Die meisten dieser Objekteigenschaften sind identisch mit den Eigenschaften, die Sie auch über die Benutzeroberfläche von FrameMaker aufrufen können (auch wenn sich die Namen oft unterscheiden). So können Sie beispielsweise die Eigenschaften eines Absatzes über das Dialogfeld Absatzgestaltung festlegen.

Beim Schreiben von Skripts geht es meistens darum, auf ein Objekt zuzugreifen und dessen Eigenschaften zu ändern. Im Folgenden wird dieses Verfahren anhand eines kurzen Skripts beschrieben.

Öffnen Sie ein neues Dokument im Hochformat und geben Sie den Text »Hallo Welt« in den ersten Absatz ein. Doppelklicken Sie auf das Wort »Hallo«, um dieses Wort zu markieren. Wählen Sie den Befehl FrameScript > Script Window, um das Fenster Edit Script zu öffnen. Geben Sie in diesem Fenster folgenden Text ein:

Set vText = TextSelection;
Display vText;

In der ersten Zeile wird eine Variable mit dem Namen vText initialisiert. In Programmiersprachen dient eine Variable als Platzhalter zum Speichern von Informationen. Sie können für eine Variable praktisch jeden beliebigen Namen verwenden, sofern es sich dabei nicht um einen FrameScript-Befehl oder den Namen eines FrameMaker-Objekts bzw. einer -Eigenschaft handelt. Ich beginne meine Variablennamen immer mit einem kleinen »v«. So kann ich sie von reservierten Wörtern unterscheiden und sehe auf den ersten Blick, dass es sich um eine Variable handelt. Mit dem Befehl Set und dem Gleichheitszeichen wird der Variablen vText der Wert TextSelection zugewiesen. TextSelection ist ein FrameMaker-Objekt, das für die aktuelle Textauswahl in einem Dokument steht.

Klicken Sie auf die Schaltfläche Run. Der FrameScript-Befehl Display blendet ein Meldungsfeld ein, in dem Sie den Wert von vText ablesen können.

FrameScript: Display TextRange

FrameScript: Display TextRange

Der Inhalt dieses Meldungsfelds mag Ihnen zu diesem Zeitpunkt nicht sehr nützlich erscheinen, aber Sie können darin erkennen, dass Sie ein TextRange-Objekt (Textbereich) anzeigen.

Bearbeiten Sie nun das Skript. Ändern Sie die erste Zeile folgendermaßen:

Set vText = TextSelection.Begin;

und klicken Sie auf Run.

FrameScript: Display TextLoc

FrameScript: Display TextLoc

Nun wird ein TextLoc-Objekt (Textposition) angezeigt. Ein TextRange-Objekt besteht aus zwei TextLoc-Objekten. Ein Objekt steht für den Anfang der Auswahl (Begin), das andere für das Ende der Auswahl (End).

Ändern Sie jetzt die erste Zeile in

Set vText = TextSelection.Begin.Object;

und klicken Sie auf Run.

FrameScript: Display Pgf Object

FrameScript: Display Pgf Object

Jetzt wird ein Paragraph-Objekt (Absatz) angezeigt. Dabei handelt es sich um den Absatz, der das TextLoc-Objekt beinhaltet, das wiederum Teil des aktuellen TextRange-Objekts (Textbereich) ist.

Diese Übung veranschaulicht ein weiteres wichtiges Konzept: FrameMaker-Objekte sind meist innerhalb anderer Objekte eingebettet. FrameScript verwendet eine »Punkt-Notation«, um die Objekthierarchie auszudrücken. Wenn Sie das gewünschte Objekt ermittelt haben, können Sie auf dessen Eigenschaften zugreifen. Ändern Sie die erste Zeile in

Set vText = TextSelection.Begin.Object.Properties;

und klicken Sie auf Run. Sie erhalten nun eine Liste mit den Eigenschaften des aktuellen Absatzes. Diese Liste ist wahrscheinlich zu lang, um auf Ihrem Bildschirm vollständig angezeigt werden zu können. Drücken Sie die Eingabetaste, um die Liste zu schließen.

Ändern Sie das Wort »Properties« in »Name« und klicken Sie auf Run. Das Absatzformat für den aktuellen Absatz wird angezeigt.

FrameScript: Display PgfFmt.Name

FrameScript: Display PgfFmt.Name

Ein nützliches Skript

Nun setzen Sie diese FrameScript-Theorie in die Tat um und schreiben ein nützliches Skript. Dieses Skript zeigt für jedes Absatzformat in Ihrem Dokument je ein Beispiel an. Für jedes Absatzformat in Ihrem Absatzformatekatalog wird je ein Absatz in das Dokument eingefügt. Der Absatz besteht jeweils aus dem Namen des Formats, und das entsprechende Format ist dem Absatz zugewiesen.

Klicken Sie im Skriptfenster auf New, um den Fensterinhalt zu löschen. Öffnen Sie ein neues Dokument im Hochformat. Zunächst benötigen Sie eine Liste der Absatzformate im Dokument. FrameScript verfügt über einen besonderen Mechanismus, um auf FrameMaker-Objektlisten zuzugreifen. Geben Sie im Skriptfenster folgenden Text ein:

Loop ForEach(PgfFmt) In(ActiveDoc) LoopVar(vPgfFmt)
EndLoop

Dieses Skript startet einfach eine Schleife durch die Liste der Absatzformat-Objekte (PgfFmt) im Dokument. Das ist schon alles. Klicken Sie auf Run, und scheinbar passiert nichts. Das Skript soll aber mit jedem Objekt in der Liste etwas tun. Verwenden Sie die Punkt-Notation, um auf die Eigenschaft Name jedes Absatzformats zuzugreifen.

Geben Sie im vorherigen Skript zusätzlich folgende Zeile vor der EndLoop-Anweisung ein:

Display vPgfFmt.Name;

und klicken Sie auf Run. Jetzt gibt das Skript eine Liste mit den Namen aller Absatzformate aus. Dies kann ein wenig langwierig sein, denn Sie müssen jeden Namen durch Klicken auf OK bestätigen. Ändern Sie das Wort »Display« in »Write Console«, und klicken Sie auf Run. Jetzt werden alle Namen hintereinanderweg in der FrameMaker-Konsole ausgegeben. Vergrößern Sie das Konsolenfenster auf Vollbildansicht, um die Liste einzusehen.

FrameMaker Konsole: Absatzformatnamen

FrameMaker Konsole: Absatzformatnamen

Schreiben von Skripten bedeutet Ausführung mehrerer Aufgaben, die miteinander verknüpft werden. Sie haben gelernt, wie Sie eine Liste von Absatzformaten erhalten können, doch nun müssen Sie diese Liste in Ihr Dokument laden. Sie benötigen für jedes Absatzformat im Dokument einen neuen Absatz. Einen neuen Absatz erstellen Sie mit dem Befehl New Pgf:

New Pgf NewVar(vPgf) PrevObject(vPrevObject);

Dieser Befehl erfordert ein PrevObject-Objekt (vorheriges Objekt). Mit anderen Worten: ein Objekt, nach dem der neue Absatz eingefügt werden soll. Ihr leeres Dokument enthält nur einen Absatz, also können Sie diesen zum PrevObject machen. Löschen Sie die Zeile, die mit »Write Console« beginnt, und fügen Sie folgende Zeilen zwischen die Loop– und EndLoop-Anweisungen ein:

Set vFlow = ActiveDoc.MainFlowInDoc;
Set vPrevObject = vFlow.LastTextFrameInFlow.LastPgf;
New Pgf NewVar(vPgf) PrevObject(vPrevObject);

und klicken Sie auf Run. Für jedes Absatzformat im Dokument wird ein neuer Absatz in das Dokument eingefügt. Die Absätze sind noch leer, also müssen Sie die Namen der Absatzformate einfügen. Geben Sie folgende Zeile unter der Zeile »New Pgf« ein:

New Text Object(vPgf) vPgfFmt.Name;

Der Befehl New Text erfordert eine Ausgabeposition für den Text. In diesem Fall gibt vPgf das Absatz-Objekt an, das Sie soeben mit dem Befehl New Pgf erstellt haben. Der eingefügte Text ist hierbei die Name-Eigenschaft des aktuellen vPgfFmt-Objekts. Löschen Sie die leeren Absätze aus dem Dokument und führen Sie das Skript aus. Sie erhalten eine Liste der Absatzformate im Dokument.

Bevor Sie mit der nächsten Aufgabe fortfahren – dem Zuweisen der korrekten Absatzformate zu jeder Zeile – sehen Sie sich zunächst das bisherige Skript an.

Loop ForEach(PgfFmt) In(ActiveDoc) LoopVar(vPgfFmt)
    Set vFlow = ActiveDoc.MainFlowInDoc;
    Set vPrevObject = vFlow.LastTextFrameInFlow.LastPgf;
    New Pgf NewVar(vPgf) PrevObject(vPrevObject);
    New Text Object(vPgf) vPgfFmt.Name;
EndLoop

Die erste und letzte Zeile stehen für eine Schleife durch die Liste der Absatzformate im Dokument. Jede Anweisung innerhalb der Schleife wird für jedes Absatzformat in der Liste wiederholt. Dies verdeutlicht die Rolle von Variablen beim Schreiben von Skripts. Der Variablenname vPgfFmt bleibt immer gleich, aber der zugewiesene Wert ändert sich während der Ausführung des Skripts. Dasselbe gilt für die Variable vPrevObject. Am Ende jedes Durchlaufs durch die Schleife wird die Variable auf den letzten Absatz (LastPgf) im letzten Textrahmen (LastTextFrameInFlow) des Haupttextflusses (MainFlowInDoc) im aktiven Dokument (ActiveDoc) positioniert. Um dies zu veranschaulichen, fügen Sie folgende Zeile nach der »Set vPrevObject«-Zeile ein:

Display vPrevObject.Text;

und klicken Sie auf Run. Sie sehen, dass der Variablen PrevObject immer der jeweils letzte Absatz zugewiesen wird. Löschen Sie diese Zeile, bevor Sie fortfahren.

Die dritte und letzte Aufgabe besteht darin, jedem Absatz die Eigenschaften des Absatzformats zuzuweisen, dessen Namen er enthält. Sie können sich sicher denken, dass diese Aufgabe innerhalb der Schleife erfolgen muss. Geben Sie zunächst folgende Zeile vor der EndLoop-Anweisung ein:

Set vPgf.Properties = vPgfFmt.Properties;

Diese Zeile weist dem neuen Absatz die Formateigenschaften des entsprechenden Absatzformats zu. Löschen Sie alle Absätze aus dem Dokument und führen Sie das Skript aus.

FrameMaker: Dokument mit formatierten Absätzen

FrameMaker: Dokument mit formatierten Absätzen

Bevor Sie das Skriptfenster schließen, speichern Sie Ihr Skript unter einem aussagekräftigen Namen. Ich wähle den Namen ShowAllParaFormats.fsl.

Loop ForEach(PgfFmt) In(ActiveDoc) LoopVar(vPgfFmt)
    Set vFlow = ActiveDoc.MainFlowInDoc;
    Set vPrevObject = vFlow.LastTextFrameInFlow.LastPgf;
    New Pgf NewVar(vPgf) PrevObject(vPrevObject);
    New Text Object(vPgf) vPgfFmt.Name;
    Set vPgf.Properties = vPgfFmt.Properties;
EndLoop

In der nächsten Lektion lernen Sie eine andere Form der Schleife und einige weitere FrameScript-Befehle kennen.

Januar 2009, Michael Müller-Hillebrand