The logo is a pig framed between two angle brackets.

Was bringt InDesigns neue UXP Scripting API?

InDesign 2023 bringt vor allem neue Features, nach denen niemand gefragt hat und die keiner braucht: Eine mehr schlecht als recht funktionierende Beta-Version („Technologievorschau“) eines KI-gestützten Autoformatierers. Ein paar neue Bilddateiformate, die selten für Print verwendet werden. Eine Vorschau-Funktion, die Thumbnails der ersten Seite in MacOSX und Windows anzeigt. Immerhin stellt man fest, wie täuschend ähnlich sich Schmutztitel sehen, wenn man sie einmal auf 512 Pixel Breite eindampft. Angesichts dieser Magerkost fragt man sich, warum immer wieder wichtige Features wie Formel- und MathML-Support nachgefragt, aber von Adobe am Ende des Tages doch ignoriert werden. Dennoch könnte sich für das neue UXP Scripting die Installation von InDesign 2023 lohnen.

UXP steht für Unified Extensibility Platform. Im Vergleich zum tüchtig in die Jahre gekommenen aber weiter verfügbaren ExtendScript haben UXP-Skripte die Dateiendung idjs statt wie bisher idx. Zum Debuggen stellt Adobe die UXP Developer Tools zur Verfügung. UXP bietet die V8 JavaScript Engine von Google Chrome und eine runderneuerte Scripting API für InDesign. Der wichtigste Unterschied ist die Unterstützung von ECMAScript 6 (ES6). Dabei handelt es sich um die zweite große Überarbeitung von JavaScript im Jahr 2015, welche die Grundlage für viele heutige JavaScript-basierte Anwendungen bereitet hat.

Weil kein Mangel an Artikeln zu ES6 besteht, sind hier die wichtigsten Neuerungen im Schnelldurchlauf: Mit let lassen sich Variablen deklarieren, die nur in ihrem Block, z.B. einer while-Schleife gültig sind. const erlaubt die Definition von Konstanten, die sich im Programmverlauf nicht mehr verändern lassen. Arrow functions bieten syntactic sugar um einfache Funktionen mit einem Parameter und einem Rückgabewert kompakter zu schreiben. Für bessere Lesbarkeit sind auch template literals gedacht mit denen sich Strings mit Platzhaltern wie `Eins plus Eins ist ${1+1}` erstellen lassen. promise erlaubt flexibler auf asynchrone Operationen, z.B. einen Web-Request zu reagieren. Mit promise können alternative Funktionen für den Erfolg oder Fehlschlag einer asynchronen Operation implementiert werden. async und await vereinfachen asynchrone Programmierung weiter, weil man auf den Rückgabewert eines Promises bis zur Ausführung des Codes warten kann. Das mag kryptisch anmuten, aber es erleichtert den Umgang mit Web-Diensten in InDesign ungemein.

Eine Renovierung – vielleicht nennen wir es besser Abriss und Neubau – erfährt auch die Entwicklung von Benutzeroberflächen. Keine Träne weine ich der gewohnt-gehassten Script UI nach. Stattdessen gibt es jetzt ein dialog-Objekt, mit dem man Benutzeroberflächen für UXP-Skripte entwickeln kann. Warum ich für das in ExtentScript eingebaute alert() eine separate Funktion schreiben muss, erschließt sich mir dann nicht so recht:

function alert(msg) {
  let theDialog = app.dialogs.add();
  let col = theDialog.dialogColumns.add();
  let colText = col.staticTexts.add();
  colText.staticLabel = "" + msg;
  theDialog.canCancel = false;
  theDialog.show();
  theDialog.destroy();
  return;
}

Mit dialog kann man wahrscheinlich einen Teil der Script-UI-Funktionalität abbilden. Dennoch fehlt mit UXP Plugins ein Major Feature, was bei Photoshop und XD schon verfügbar ist. Dort lassen sich Apps mit HTML, CSS und JavaScript entwickeln und dabei auch React und Adobes Design Framework Spectrum verwenden. Diese Funktionalität soll aber frühestens im nächsten Jahr InDesign erreichen. Zum Testen habe ich mal ein ExtendScript von uns abgespeckt und mit dialog eine rudimentäre UI gebaut.

Ein mit dem UXP-dialog-Objekt entwickeltes Skript-Fenster

Für viele Skript-Entwickler:innen stellt sich sicher die Frage, wie leicht sich ein Skript auf UXP migrieren lässt? Da gibt es leider einige syntaktische Änderungen, die man beherzigen muss: Collection Objects wie documents können nicht mehr mit app.documents[0] ausgewählt werden. Mit UXP heißt es nun app.documents.item(0). Das bisher genutzte Object.constructor.name gibt für InDesign-DOM-Objekte als Rückgabewert einen leeren String zurück. instanceof wird für solche Objekte auch nicht mehr unterstützt. In beiden Fällen muss man auch nicht ganz verwechslungsfrei object.constructorName verwenden. Vergleichsoperatoren wie == und === geben für InDesign-DOM-Objekte immer false zurück, wenn sie nicht dieselbe Referenz haben. Als Alternative steht die Methode equals() zur Verfügung. Einen sehr knappen UXP-Migrations-Leitfaden stellt Adobe zur Verfügung.

Apropos Dokumentation: Gregor Fellenz hat in seinem Quickstart UXP Scripting schon höflich angemerkt, dass diese „leider stark verbesserungswürdig“ sei. Dem kann ich mich nur anschließen. Eine Spezifikation der neuen UXP-Objekte wirkt auf mich recht unvollständig. Die UXP-Guides von Adobe bestehen aus ein paar lose zusammen getackerten Artikeln, die einen mehr ratlos als tatenfreudig zurücklassen. Die beste Dokumentation ist noch der Code selbst, genauer gesagt die Beispielskripte, die sich in der Skript-Palette finden lassen. In diesem Sinne hoffe ich, dass Roland Dreger seine UXP-Script-Snippets auf GitHub weiter ausbaut.

Die InDesign-Skript-Palette beinhaltet nun auch UXP-Beispielskripte

Lohnt es sich nun von ExtendScript auf UXP umzusatteln? Angesichts der mangelhaften Dokumentation, dem Aufwand für die Migration und den noch nicht nutzbaren UI-Features würde ich erstmal auf Zeit spielen. Wenn man sich anschaut, wie lange Adobe schon seine antiquierten XML-First-Schnittstellen mit sich herumschleppt, gehe ich nicht davon aus, dass ExtendScript bald auf dem Abstellgleis landen wird. Nicht zuletzt haben viele Unternehmen Legacy Code in Gestalt von alten InDesign-Skripten angehäuft und dürften den Umstieg auf UXP scheuen.

Wirklich interessant wird es aus meiner Sicht erst, wenn InDesign auch UXP Plugins erlaubt. Dann lassen sich Apps für InDesign entwickeln, die komplexe Web-Dienste, komfortable Benutzeroberflächen und moderne Frameworks integrieren. Nicht zu vergessen wird es sich Adobe nicht nehmen lassen, über seine Creative Cloud irgendwann an den Plugins mitzuverdienen. Dafür muss Adobe aber schon etwas mehr tun, als nur das Produkt über den Zaun zu werfen und die Scripting-Community die Scherben aufkehren zu lassen.

Archiv

Tags

Amazon ARIA Barrierefreiheit BFSG BFSGV books in browsers CSS E-Books Enhanced Typesetting EPUB EPUB3 GND HTML InDesign ISCC ISNI JavaScript KF8 Kindle Language Tagging LaTeX Machine Learning MathML MOBI MS Narrator NVDA Open Source ORCID PDF Publishing RelaxNG Schematron Screenreader STM SVG tdm TeX tl;dr transpect Typografie Web Components Word XML XProc XSLT