Zum Inhalt springen

Tipps und Tricks zu Javascript in Adobe Illustrator 2022

Von Null auf ... Javascript in Illustrator – eine kurze, einfache Einführung, Teil 04. Tipps und Tricks

(Info:) (<neu>) Im vierten Artikel »Tipps und Tricks zu Javascript in Adobe Illustrator 2022« erfahren Sie in kurzen Mini-Tutorials Von Null auf …, wie Sie Probleme oder (Bug:) Fehler in Javascript in Adobe Illustrator 2022 umgehen können. Dieser Artikel deckt auch das Verhalten älterer Versionen von Adobe Illustrator ab. Außerdem erfahren Sie auch Tricks für Javascript in Photoshop und InDesign.

(Hilfe:) Sie wollen oder können nicht selbst programmieren? Sie brauchen kurzfristig ein Javascript für eine Automatisierung für ein aktuelles Problem in Illustrator oder einem anderen Adobe Programm? Dann helfe ich Ihnen gerne als JavaScript-Entwickler mit meiner jahrzehntelang Programiererfahrung.
Schreiben Sie mir einfach und unverbindlich per Kontaktformular.

Adobe ExtendScript

Das Scripting (Programmierung) in Adobe Illustrator basiert auf Adobe ExtendScript, eine Abart von ECMAScript 3, kurz ES3, und ist somit ein Dialekt von Javascript. Die Dateiendung eines Adobe ExtendScript ist ».jsx«. Trotzdem spricht man auch bei den Adobe Programmen von Javascripts. Javascripts haben übrigens die Endung ».js«.

(Tipp:) Wenn Sie noch nicht mit Javascript vertraut sind, dann lesen Sie zuerst die Artikel »Illustrator mit Javascript automatisieren«.

Inhaltsverzeichnis

Tipp 01: Warnung für .jsx in Illustrator unterdrücken

Wenn Sie ein Javascript mit der Endung ».jsx« auf die Arbeitsfläche des Illustrators ziehen, dann sehen Sie eine Warnung, die Sie mit »Fortfahren« bestätigen müssen. Das ist natürlich lästig und hält auf. Mit der folgenden Zeile können Sie diese Warnung abschalten:

app.preferences.setBooleanPreference("ShowExternalJSXWarning",false);

Diese Warnung sehen Sie mit dem nächsten Benutzen eines Javascripts mit der Endung ».jsx« nicht mehr. Es ist also eine globale Einstellung für den Illustrator. Wenn Sie die Warnung wieder sehen wollen, dann ersetzen Sie »false« mit »true«.

Tipp 02: Ein Javascript nur für den Illustrator

Sie möchten, dass ein Javascript nur in Adobe Illustrator ausgeführt wird, jedoch nicht in Photoshop oder InDesign? Dann gibt es scheinbar zwei Möglichkeiten, doch die erste funktioniert nicht so recht. Probieren Sie es aus und fügen Sie am Anfang eines Javascripts die folgende Zeile ein:

#target Illustrator

(ID:) Starten Sie das Javascript in InDesign, dann ruft InDesign den Illustrator auf und lässt es dort ablaufen. Mit der Ergänzung der Versionsnummer, also »#target Illustrator-26« wird Illustrator 2022 (v26) gestartet.

(PS:) Starten Sie das Javascript in Photoshop 2022 (v23.1), dann ignoriert Photoshop den Befehl »#target« und führt es in Photoshop aus. (Bug:) Ein Bug?

(AI:) Starten Sie das Javascript in Illustrator, dann läuft im Illustrator dort ab. Die Versionsnummer wird ignoriert. (Bug:) Ein Bug?

(Hindernis:) So lässt sich die Aufgabe, dass das Javascript nur im Illustrator abläuft, nicht zuverlässig umsetzen.

Die bessere Alternative: Erkenne, welches Adobe Programm läuft

Daher ist es die bessere, zuverlässige Alternative, zu erkennen, in welchem Programm das Javascript gestartet wurde und das können Sie so erreichen:

var vApp = "";
try {
    var vAppPath = "" + app.path; // tell if it is AI or PS
    if (vAppPath.indexOf("Illustrator") > -1) { vApp = "AI";}
    if (vAppPath.indexOf("Photoshop") > -1) { vApp = "PS"}
}
catch (e) { }
if (vApp == "") {
    try {
        var vAppName = "" + app.fullName; //
        if (vAppName.indexOf("InDesign") > -1) { vApp = "ID";}
    } 
    catch (e) { alert("Kein AI, PS oder ID erkannt!“); }
}

Die Variable vApp bekommt den Wert »AI«, »PS« oder »ID« zugewiesen. Ist die Applikation unbekannt, dann ist die Variable leer.

(Achtung:) (ID:) InDesign kennt den Befehl ».path« nicht. Daher muss man in diesem Programm mit ».fullName« arbeiten.

Tipp 03: Wenn die Abfrage einer Datei keinen String liefert

Normalerweise kann mit dem Befehl »vName.indexOf(„Javascript“)« feststellen, ob das Wort »Javascript« in der Variable vom Type String vorkommt. Versucht man dies mit der Abfrage einer Datei wie »vFileName.fullName.indexOf(„Javascript“)«, dann bekommen Sie eine Fehlermeldung. Sie müssen die Rückmeldung erst in einen String verwandeln.

var vFileName = vFile.fullName.toString();
var vPos = vFileName.fullName.indexOf("Javascript"); // -1, wenn nicht enthalten

oder

var vFileName = ""+ vFile.fullName;
var vPos = vFileName.fullName.indexOf("Javascript"); // -1, wenn nicht enthalten

Tipp 04: Änderungsdatum einer Datei abfragen

(Bug!) (AI:) Möchten Sie das Datum der letzten Änderung einer Datei abfragen, so bekommen Sie in (AI:) Illustrator als Antwort nur »null« zurück, während der gleiche Befehl in (PS:) Photoshop funktioniert.

var vDocRef = app.activeDocument; // Get data about the document
var vDocFullName = vDocRef.fullName;
var vFile = File(vDocFullName);
alert("modified: " + vFile.modified); // shows 'null' for the date

Jedoch findet man das Änderungsdatum in den XMP-Informationen. (XMP steht für Extensible Metadata Platform und ist ein offener Standard um Metadaten zu einer Datei zu speichern.)

<xmp:ModifyDate>2022-01-12T11:31:22+01:00</xmp:ModifyDate>
<xmp:CreateDate>2022-01-12T11:31:22+01:00</xmp:CreateDate>

und dies kann man wie folgt abfragen, was (AI:) nur in Illustrator funktioniert!

var vDocRef = app.activeDocument; // Get data about the document

var vXMP = vDocRef.XMPString;
var vPosStart = 16 + vXMP.indexOf("<xmp:ModifyDate>");
var vPosEnd = vXMP.indexOf("</xmp:ModifyDate>");
var vModified = vXMP.substring(vPosStart, vPosEnd);
var vPos = vModified.lastIndexOf("+");
if (vPos == -1) {vPos = vModified.lastIndexOf("-");}
vModified = vModified.substring(0, vPos);
alert("modified: " + vModified ); // shows the date of modification

Tipp 05: indexOf funktioniert nicht mit selbstdefiniertem Array

Während in reinem Javascript viele Dinge direkt funktionieren, muss man in (AI:) Illustrator immer wieder über Fehlermeldungen staunen. Besonders wenn man mit dem Programmieren in und für Illustrator ist dies mühsam solche (Bug:) Fehler zuerkennen, die nicht vom Programmierer, sondern vom Illustrator verursacht werden. Dabei spielt es keine Rolle, ob das Array Zeichenketten (Strings) enthält oder nur Zahlen.
(Hinweis:) Der (Bug:) Fehler tritt in (AI:) Illustrator, (PS:) Illustrator und (ID:) InDesign auf.

Es gibt in Javascript mehrere Möglichkeiten ein Array zu definieren. Die Methode ».indexOf« erzeugt in allen vier Fällen eine Fehlermeldung, dass diese Methode nicht bekannt ist.

var aOne = ["alpha", "beta", "gamma"];
alert("1: "+aOne+"\nbeta ist Nr. "+aOne.indexOf("beta")); // error 

var aTwo = new Array();
var vString = "alpha, beta, gamma";
aTwo = vString.split(", ");
alert("2: "+aTwo+"\nbeta ist Nr. "+aTwo.indexOf("beta")); // error 

var vString = "alpha, beta, gamma";
aThree = vString.split(", ");
alert("3: "+aThree+"\nbeta ist Nr. "+aThree.indexOf("beta")); // error 

var aFour = new Array();
aFour.push("alpha", "beta", "gamma");
alert("4: "+aFour+"\nbeta ist Nr. "+aFour.indexOf("beta")); // error 

In diesem Fall hilft es nur, die »fehlende« Methode selbst zu ergänzen. Fügen Sie folgende Funktion »Array.prototype.indexOf« ein. Das komplette Javascript sieht dann so aus:

Array.prototype.indexOf = function ( item ) {
  var index = 0, length = this.length, result = -1;
  for ( ; index < length; index++ ) {
    if ( this[index].toString() === item.toString() ) { result = index; break;} 
  }
  return result;
} // end-of-function

var aOne = ["alpha", "beta", "gamma"];
alert("1: "+aOne+"\nbeta ist Nr. "+aOne.indexOf("beta")); // no error 

var aTwo = new Array();
var vString = "alpha, beta, gamma";
aTwo = vString.split(", ");
alert("2: "+aTwo+"\nbeta ist Nr. "+aTwo.indexOf("beta")); // no error 

var vString = "alpha, beta, gamma";
aThree = vString.split(", ");
alert("3: "+aThree+"\nbeta ist Nr. "+aThree.indexOf("beta")); // no error 

var aFour = new Array();
aFour.push("alpha", "beta", "gamma");
alert("4: "+aFour+"\nbeta ist Nr. "+aFour.indexOf("beta")); // no error 

Alternative: Prüfen, ob ein Wort in einer Liste enthalten ist

Statt für ein Array eine Funktion wie »Array.prototype.indexOf« hinzufügen, können Sie innerhalb eines Strings, das aus einer Liste von Wörtern besteht, prüfen, ob ein Begriff enthalten ist. Der Trick dabei ist, dass die Liste mit einem Komma als Erkennungszeichen eines neuen Wortes beginnt. Das nachfolgende Javascript liefert für »,apple« das Ergebnis 17. Denn es wird immer ab dem nullten Element in Javascript gezählt und der Suchbegriff »,apple« beginnt mit 18. Zeichen.

var aFruits = ["pineapple","orange","apple","mango"];
var vFruits = "," + aFruits.toString()
var vPos = vFruits.indexOf(",apple");
if (vPos > -1) { alert("apple is number " + vPos); }
else { alert("not found");}

Fazit

Da Javascript in (AI:) Adobe Illustrator nicht immer den Definitionen von Javascript nach ECMA folgt oder (Bug:) Fehler enthält, muss man als Entwickler manchmal etwas andere Wege gehen.
Diese Reihe wird im Laufe der Zeit weiter fortgesetzt.

ENDE

(Hilfe:) Wenn Sie eine Funktion in (AI:), (PS:), (IC:), (ID:) oder (FM:) benötigen, jedoch nicht selbst programmieren, dann sprechen Sie mich an. Ich übernehme gerne kleine Aufträge: zum Kontaktformular.