FrameScript / ElmScript 5.2R1p235

Der Sprung von p231 auf p235 (September 2009) ist nur durch einige Bugfixes gekennzeichnet, nach meiner Kenntnis nur in den Teilen, die für die Programmierung von Struktur-Clients zuständig sind. In den Release Notes ist keine Beschreibung zu finden.

Bitweise Operatoren

Wussten Sie, dass FrameScript über bitweise Operatoren verfügt und auch komfortable Möglichkeiten bereit stellt mit Binär- und Hex-Zahlen zu arbeiten?

Zunächst zur Darstellung von Ganzzahlen (Integer), da haben Sie drei Möglichkeiten:

  • 123 — als Folge von Ziffern ist es eine Dezimalzahl, das wussten Sie :-)
  • 7Bh — als Folge von Hex-Buchstaben mit einem »h« am Ende ist es eine hexadezimal notierte Zahl, hier also 7 × 16 + 11 = 123
  • 01111011b — als Folge von Nullen und Einsen mit einem »b« am Ende haben wir die Binärzahl, hier also 64 + 32 + 16 + 8 + 2 + 1 = 123

Wenn es jetzt darum geht, mit diesen Ganzzahlen zu rechnen, gibt es folgendes beachten:

  • Bei der Hex-Notation muss als erstes Zeichen immer einen Ziffer stehen, d.h. statt A0h (für 160) schreiben Sie dann 0A0h.
  • FrameScript unterscheidet nicht zwischen Groß- und Kleinschreibung, d.h. Sie können auch 7bh oder 7bH oder 7BH schreiben, mir erscheint aber 7Bh am übersichtlichsten.
  • Die Division zweier Ganzzahlen wird als Integer-Division ausgeführt: 9 / 4 = 2, wenn Sie hier ein Gleitkommaergebnis wollen, muss einen der Zahlen eine Real-Zahl werden, also z.B. 9.0 / 4 = 2.25

Mit Integer-Zahlen können aber auch die bitweisen Operationen ODER bzw. UND durchgeführt werden:

  • ODER: 0101b #| 0011b = 0111b , 5 #| 3 = 7
  • UND: 0101b #& 0011b = 0001b , 5 #& 3 = 1

Eine direkte Anwendung im FrameMaker-Umfeld ist die Einstellung, auf welchen Farbauszügen einen Farbe sichtbar, ausgeblendet oder ausgespart sein soll (Menüpunkt Darstellung > Farbe > Darstellung). Dafür zuständig ist die Eigenschaft ColorViewCtl, eine 12-Bit-Nummer. Um zu überprüfen, ob einen Farbe in Farbauszug 3 unsichtbar ist, muss Bit 5 gesetzt sein (= eine 1 enthalten). Das kann man sehr komfortabel folgendermaßen überprüfen:

If (lcColor.ColorViewCtl #& 10000b)
  // weitere Operationen
EndIf

In komplexeren Anwendungen kommen auch Shift-Vorgänge (Verschieben aller Bits nach rechts oder links) vor, die durch die Operatoren >> bzw. << dargestellt werden. Diese Operationen entsprechen einer Integer-Division bzw. Multiplikation mit Zweierpotenzen, sind aber performanter:

  • LINKS-SHIFT um 2 Bits: 0101b << 2 = 10100b , 5 * 2² = 20
  • RECHTS-SHIFT um 1 Bit: 1100b >> 1 = 0110b , 12 / 2¹ = 6

Eine letzte Bemerkung: Die bitweisen Operatoren haben einen höheren Rang als die anderen arithmetischen Operatoren, d.h. bei Kombinationen müssen Sie andere Operationen möglicherweise in Klammern setzen.

Sauber skripten

Seit 10 Jahren biete ich Schulungen zur FrameScript-Programmierung an. Nein, falsch, es geht nicht ums Programmieren, es geht darum, FrameMaker-Prozesse zu automatisieren. Und der Einstieg dazu ist nunmal immer noch die Skript-Programmierung. Wenn ich manchmal im frame_dev-Forum mitlese, wie kompliziert bestimmte Aktionen bei der Programmierung in C ausfallen (und dass sich der Programmierer auch um das Freigeben nicht benötigten Speichers kümmern muss), dann bin ich dankbar für FrameScript.

Einschub: So dankbar ich für FrameScript bin, so gerne nutze ich für bestimmte Aufgaben auch »echte« C-Plug-ins mit FrameMaker, insbesondere mit strukturierten Dokumenten. Zum Beispiel AXCM, InsetPlus, FrameSLT

Bei diesen Schulungen fällt immer wieder auf, dass FrameScript keine Deklaration der Variablen erfordert, man kann einfach schreiben

Set lvValues = MyFunction{};

und die Variable lvValues wird den Datentyp des Ergebnisses der Funktion MyFunction annehmen. Was einerseits sehr praktisch zu sein scheint, führt aber beim kleinsten Tippfehler im Namen einer Variable oft nicht zu einem gemeldeten Fehler, sondern schlicht zu unerwartetem Verhalten des Skripts. Tipps ich ein paar Zeilen weiter beispielsweise

Display lvValue;

bekomme ich diese wenig aussagekräftige Anzeige, weil ich das Plural-s beim Variablenbezeichner »vergessen« habe.

Es gibt aber eine Möglichkeit, solche Fehler melden zu lassen, und ich möchte heute dazu aufrufen, diese Möglichkeit sehr diszipliniert zu verwenden. Seit einigen Versionen gibt es die Session-Variable DeclareVarMode, die dazu verwendet werden kann, dass alle Variablen explizit entweder als Local oder als GlobalVar deklariert werden müssen. Folgende zwei Zeilen gehören in jedes Skript:

Set DeclareVarMode = True;
Set PlatformEncodingMode = True;

(Wegen der Rückwärtskompatibilität sind beide nicht standardmäßig gesetzt; den PlatformEncodingMode können Sie ignorieren, wenn Sie für FrameMaker 8 oder später im UTF-8-Mode programmieren.)

Und dann natürlich in jede Funktion oder Subroutine die entsprechenden Anweisungen Local oder GlobalVar.

Haben Sie das bereits ausprobiert? Wie sind Ihre Erfahrungen? Wie lange haben Sie schon nach Fehlern gesucht, nur um schließlich feststellen zu müssen, dass Sie sich bei einem Variablen-Bezeichner vertippt haben…

12 Jahre FrameScript = ElmScript

FrameScript für FrameMaker - seit 1997

Vor zwölf Jahren, im November 1997, wurde die erste Version des FrameMaker-Plug-ins FrameScript vorgestellt. Wegen einer Vorbelegung dieses Namens durch eine deutsche Firma (historische Infos dazu auf framescript.eu) hieß das Produkt hierzulande ElmScript — man wollte jedwedem Streit aus dem Wege gehen.

Vor knapp zehn Jahren, im Januar 2000, beschaffte ich meine erste ElmScript-Lizenz.

Diese beiden Daten bilden den Rahmen, um in Absprache mit FML alle Anwender, die noch ältere Versionen von FrameScript einsetzen, auf den aktuellen Stand zu bringen. Bis zum 30.11.2009 sparen Sie dabei pro Lizenz €30!

Die wichtigsten Vorteile der Version 5:

  • Unterstützung von FrameMaker 8 und 9, d.h. insbesondere der Unicode-Fähigkeiten
  • Dokumente beim Öffnen oder Speichern von XML-Dateien modifizieren
  • Verbesserte Performance durch optimierten Skript-Parser (V.4)
  • Debugger zum Testen Ihrer Skripte Zeile für Zeile (V.4)
  • Gestaltung eigener Dialoge (V.4)
  • Neu gegliederte Dokumentation
  • Beispielskripte für neue Funktionen

Informationen zum Bestellprozess und die Sonderpreise finden Sie auf cap-studio.de unter

Anwenderliste

Falls Sie sich fragen, ob FrameScript/ElmScript nur für »Amateure« geeignet ist, die nicht mit C »echte« Plug-ins für FrameMaker programmieren können, schauen Sie sich auf cap-studio.de die Liste der Firmen an, für die ich FrameScript in den letzten 10 Jahren beschaffen durfte, und die das Plug-in einsetzen oder eingesetzt haben. Dienstleister aus dem Umfeld der technischen Dokumentation und Übersetzung sind in der Liste nicht vertreten.