Vor langer Zeit habe ich folgendes Script geschrieben. Es erzeugt eine Liste der Schriften, welche XPress zur Verfügung stehen (wenn man ein Dokument anspricht, bekommt man die Liste der Schriften, welche verwendet wurden).
---
tell application "QuarkXPress 4.11"
set fList to {}
set fontList to font list
repeat with i from 1 to count of fontList
set fList to fList & name of item i of fontList
end repeat
end tell
fList
---
Die Variable 'fList' wird als leere Liste – {} – initialisiert.
Der Variablen 'fontList' werden die Schriften, welche XPress "sieht" (die 'font list'), zugewiesen.
Dies ist aber nicht eine Liste der Namen, sondern ein "Record", welcher die Namen und die IDs der Schriften enthält, z.B. {{name:"B Times Bold", id:151}, {name:"I Times Italic", id:16075}, ...
Um die Namen auszuziehen, gibt es nur eins: mit einer Repeat-Schleife jedes Element abfragen. Ein Anfänger macht dies wie das obenstehende Beispiel zeigt. Die Liste wird zusammenstellt, indem mit dem "&"-Operatoren der Name angehängt wird. Das Problem dabei ist, dass jedesmal die ganze Liste kopiert wird. Das braucht Zeit.
Später habe ich gelernt, die Ausführung zu beschleunigen durch 'set end of aList to name of item i of fontList'. Dadurch wird jeder neue Name nur angehängt und die Liste wird nur bei jedem 16. Umgang kopiert.
---
tell application "QuarkXPress 4.11"
set fList to {}
set fontList to font list
repeat with i from 1 to count of fontList
<b>set end of fList</b> to name of item i of fontList
end repeat
end tell
fList
---
Aber der grosse Geschwindigkeitsschub kommt erst durch Verwendung des Wortes 'my'. Dies habe ich Diskussionen der AppleScript-Users-Mailingliste entnommen:
---
tell application "QuarkXPress 4.11"
set fList to {}
set fontList to font list
repeat with i from 1 to count of fontList
set curName to name of item i of <b>my</b> fontList
set end of fList to curName
end repeat
end tell
fList
---
Dieses Script hat eine zusätzliche Befehlszeile: der Variablen 'curName' wird der Name des aktuellen Elementes zugewiesen. Man könnte annehmen, dass dieser Schritt überflüssig ist und die Ausführung verzögert. Aber das Gegenteil ist wahr: dies ist die schnellste Lösung.
Für das Zusammenstellen einer Liste mit 457 Elementen (auf meinem G4/800) braucht das erste Script 64 Ticks. Das zweite 56 Ticks und das dritte nur noch 14 Ticks (eine Sekunde = 60 Ticks).
Ein Problem taucht auf, wenn dieser Trick in einer Subroutine angewendet wird. Eine Fehlermeldung sagt, dass das Resultat nicht im gewünschten Typ angezeigt werden kann. Die Lösung: die Variable der Liste innerhalb der Subroutine als "global" deklarieren:
---
getFontNames()
on getFontNames()
<b>global fontList</b>
tell application "QuarkXPress 4.11"
set fList to {}
set fontList to font list
repeat with i from 1 to count of fontList
set curName to name of item i of my fontList
set end of fList to curName
end repeat
end tell
fList
end getFontNames
---
Ich habe diese Technik in anderen Repeat-Schleifen gebraucht und dabei noch spektakulärere Ergebnisse erzielt.
Hans Haesler <hsa@ringier.ch>
als Antwort auf: [#417949]