[GastForen Programmierung/Entwicklung AppleScript QXP 7.5: Fehler beim Ermitteln von Stilvor

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

QXP 7.5: Fehler beim Ermitteln von Stilvor

Goar
Beiträge gesamt: 395

18. Mär 2009, 12:34
Beitrag # 1 von 8
Bewertung:
(1546 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Skripter,

für verschiedene Arbeiten frage ich die Namen der im Textrahmen einer Seite vorkommenden Stilvorlagen ab, z. B. für lebende Kolumnentitel oder Hintergrundflächen.

Bei Arbeiten in QXP 7.5 fiel mir auf, dass die Skripts nicht mehr in der von QXP 6.5 gewohnten Weise funktionierten. Nach einigen Anpassungen liefen sie fast wieder ordentlich. Nur die ausgelesenen Stilvorlagen-Namen stimmten nicht immer mit den tatsächlich verwendeten überein:

ausgelesen: {"HG Titel3", "GS", "HG Titel3", "BU", "GS ff", "GS ff"}*
tatsächlich verwendet: {"HG GS nText", "GS", "HG GS nText", "GS nHG", "GS ff"}

Um der Ursache auf die Spur zu kommen habe ich in Tests die zugehörigen Namen, Index, uniqueID, base style und next style aus den style specs ausgelesen

{"HG Titel3", 20, 21, "Titel3", "HG Titel3"}
{"HG GS nText", 19, 20, "HG GS", "HG GS nText"}

{"BU", 23, 24, "", "BU"}
{"GS nHG", 22, 23, "GS", "GS nHG"}

Hier fällt der Zusammenhang zwischen Index der falschen und uniqueID der richtigen Stilvorlage auf.
Also habe ich eine Liste aller Stilvorlagen mit den dazugehörigen Indices und uniqueID zusammengestellt.

Name, Index, uniqueID
Normal, 1, 1
GS, 2, 2
GS ff, 3, 3
Titel1, 4, 4
Titel2, 5, 5
Titel3, 6, 6
Titel4, 7, 7
Titel5, 8, 8
Zitat, 9, 9
Zitat Name, 10, 10
GS Aufz, 11, 11
GS nAufz, 12, 13
GS nGr, 13, 14
GS Gr, 14, 15
GS Gr nText, 15, 16
GS Gr ff, 16, 17
HG GS, 17, 18
HG GS ff, 18, 19
HG GS nText, 19, 20
HG Titel3, 20, 21
HG Titel3 nText, 21, 22
GS nHG, 22, 23
BU, 23, 24
KolTit re, 24, 25
KolTit li, 25, 26
Stern, 26, 27
Inhalt Titel, 27, 28
Inhalt Text 1, 28, 29
Inhalt Text 2, 29, 30
GS Aufz e2, 30, 31
Zitat nText, 31, 32
GS ff blau, 32, 12
HG GS ff blau, 33, 33
Platzhaltertitel, 34, 34
Platzhaltertext, 35, 35

Da fand ich meinen Verdacht bestätigt:
Index und uniqueID der richtig ermittelten Stilvorlagennamen sind identisch.
Offensichtlich wird der Stilvorlagenname nicht direkt ausgelesen, sondern die uniqueID. Der Name wird dann über den Stilvorlagen-Index mit dieser Zahl ermittelt. Das funktioniert, solange Index und uniqueID identisch sind.

Um doch an die richtigen Stilvorlagennamen zu gelangen, habe ich zunächst die Indices der vorkommenden Stilvorlagen ermittelt. An den Namen der Stilvorlage komme ich, wenn ich herausbekommen habe, welches style spec die jeweils ermittelte Index-Nummer als uniqueID hat. Da sich style specs aber nicht über uniqueID ansprechen lassen, ist einmalig etwas Vorarbeit erforderlich.

Zunächst werden die uniqueID und Namen aller style spec in einer Variablen gespeichert. Dann werden sie den uniqueID aufsteigend sortiert. Das Listenelement an der Position des ermittelten Index enthält jetzt den richtigen Stilvorlagennamen. Schließlich werden die uniqueID aus der Aufliste entfernt.

Jetzt kann ich mir mit den zuerst ermittelten Indices die korrekten Stilvorlagennamen aus der Auflistung greifen.

Code
tell document 1 of application "QuarkXPress Passport" 
    -- erstellt eine Auflistung aus uniqueID, Name
    -- (einmalige Vorbereitung)
    set specList to {}
    repeat with i from 1 to count of style specs
        set askStyle to i
        set tmpSpec to ""
        set tmpSpec to tmpSpec & uniqueID of style spec askStyle & " "
        set tmpSpec to tmpSpec & name of style spec askStyle
        set end of specList to tmpSpec
    end repeat
    -- jetzt wird die Liste nach uniqueID sortiert und die uniqueID wieder entfernt
    set AppleScript's text item delimiters to (ASCII character 10)
    set IDList to (do shell script "sort  -n <<< " & quoted form of (specList as text))
    set AppleScript's text item delimiters to {""}
    set IDList to (change (ASCII character 10) into return in IDList)
    set nameList to (change "^[0-9]+ " into "" in IDList with regexp)
   
    -- beispielhaft mit einer Textbox
    tell current box
        set allIndex to (index of style sheet) of every paragraph
        set allPara to {}
        repeat with i from 1 to length of allIndex
            set curIndex to item i of my allIndex
            set end of allPara to text of paragraph curIndex of nameList
        end repeat
    end tell
   
end tell


Weiß jemand, wie es zu dem beschriebenen Fehler kommt und ob der in QXP 8 behoben ist?
Kommentare und weitere Informationen sind willkommen.

Mit freundlichen Grüßen
Goar

Zum Thema »Listen sortieren« habe ich von diesem Beitrag profitiert:
http://www.page-online.de/forum/viewthread/3672/

* richtig beobachtet: ausgelesen wurden 6 Stilvorlagennamen, obwohl nur 5 Absätze in dem Textrahmen enthalten waren. Wenn der letzte Absatz auf einer Seite endet, rechnet QXP aus unerfindlichen Gründen den ersten Absatz der nachfolgenden Seite (sofern die Textrahmen verkettet sind) denen der laufenden Seite zu. Aber das ist ein eigenes Thema.
X

QXP 7.5: Fehler beim Ermitteln von Stilvor

Hans Haesler
  
Beiträge gesamt: 5826

18. Mär 2009, 20:41
Beitrag # 2 von 8
Beitrag ID: #422938
Bewertung:
(1545 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

Deine Schilderung klingt überzeugend. Aber ich kann das Problem nicht nachvollziehen. Mit dem Script ...
---
set allNames to {}
tell document 1 of application "QuarkXPress Passport"
   tell current box
      repeat with i from 1 to count of paragraphs
         set end of allNames to name of style sheet of paragraph i
      end repeat
   end tell
end tell
allNames
---
... werden die Namen der zugewiesenen Stilvorlagen in der richtigen Reihenfolge aufgelistet.

Und es war schon immer so, dass die Liste der im Dokument definierten Stilvorlagen in der Reihenfolge ihrer Erzeugung zurückgegeben wurde.

Dieser Code ...
---
tell document 1 of application "QuarkXPress Passport"
   set specList to {}
   repeat with i from 1 to count of style specs
      set askStyle to i
      set tmpSpec to ""
      set tmpSpec to tmpSpec & uniqueID of style spec askStyle & " "
      set tmpSpec to tmpSpec & name of style spec askStyle
      set end of specList to tmpSpec
   end repeat
   set AppleScript's text item delimiters to (ASCII character 10)
   set IDList to (do shell script "sort  -n <<< " & quoted form of (specList as text))
   set AppleScript's text item delimiters to {""}
   set IDList to (change (ASCII character 10) into return in IDList)
   set nameList to (change "^[0-9]+ " into "" in IDList with regexp)
end tell
---
... führt die Namen in exakt derselben Reihenfolge auf wie dieser:
---
tell document 1 of application "QuarkXPress Passport"
   set nameList to name of every style spec
end tell
---
Das Hantieren und Sortieren mit uniqueID ist unnötig. Scheint bei Dir anders zu sein. Oder?

Gruss, Hans


als Antwort auf: [#422937]

QXP 7.5: Fehler beim Ermitteln von Stilvor

Goar
Beiträge gesamt: 395

19. Mär 2009, 07:57
Beitrag # 3 von 8
Beitrag ID: #422939
Bewertung:
(1545 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

bisher habe ich die Namen der zugewiesenen Stilvorlagen mit folgendem Skript aufgesammelt:
---
tell document 1 of application "QuarkXPress Passport"
     tell current box
          set allNames to (name of style sheet) of every paragraph
     end tell
end tell
allNames
---
Möglicherweise ist es störanfälliger als die repeat-Schleife, die Du vorschlägst. Aber es hat immer gut funktioniert.

Mein aktuelles Problem besteht aber nicht darin, dass die Namen der Stilvorlagen in der falschen Reihenfolge gelistet werden, sondern darin, dass zum Teil falsche Stilvorlagennamen gelistet werden. Auch mit der repeat-Schleife.

In der Gegenüberstellung (ganz oben) der ausgelesenen und tatsächlich verwendeten Stilvorlagen habe ich die Namen rot markiert, die das Skript falsch angegeben hat. Die grün gefärbten sind die richtigen Namen, also die Stilvorlagen, die im Stilvorlagenfenster markiert werden, wenn ich die Einfügemarke in den entsprechenden Absatz setze.

Der erste Absatz ist demnach mit der Stilvorlage HG GS nText formatiert, das Skript liest für diesen Absatz aber den Stilvorlagennamen HG Titel3 aus.

Der Index von HG Titel3 ist identisch mit der uniqueID von HG GS nText, beide 20.
Der Fehler tritt (in diesem Dokument) nur bei den Stilvorlagen mit den Indices von 12 bis 32 auf, da hier Index und uniqueID nicht identisch sind.

Die Frage ist nur, warum das so ist.

Grüße, Goar


als Antwort auf: [#422937]

QXP 7.5: Fehler beim Ermitteln von Stilvor

Hans Haesler
  
Beiträge gesamt: 5826

19. Mär 2009, 09:47
Beitrag # 4 von 8
Beitrag ID: #422940
Bewertung:
(1545 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

ja, jetzt kann ich das Problem auch nachvollziehen. Gestern hatte ich die Stilvorlagen (mit QXP 7.5) "nur" in nicht-alphabetischer Reihenfolge erzeugt. Jetzt habe ich es mit einem neuen QuarkXPress-8.01-Dokument wiederholt ...
---
test1
test3
test5
test7
test2
test4
test6
test8
---
... und dann "test5" gelöscht.

In der Testbox habe ich die Stilvorlagen den Absätzen in alphabetischer Reihenfolge zugewiesen:
---
test1
test2
test3
test4
test6
test7
test8
---

Das Ergebnis mit Deiner 'every paragraph'-Lösung:
---
{"test1", "test4", "test3", "test6", "test8", "test2"}
---
Ein Durcheinander. Und: Nur sechs Namen!

Mit meiner Schleife ... kommt eine Fehlermeldung, weil der Name der Stilvorlage von Absatz 7 nicht gelesen werden kann.

Die Properties von Absatz 7 verlangt:
---
... space before:"0 mm", style sheet:null, tab list:{}, ...
---

Da läuft einiges schief ...

Gruss, Hans


als Antwort auf: [#422937]

QXP 7.5: Fehler beim Ermitteln von Stilvor

Hans Haesler
  
Beiträge gesamt: 5826

19. Mär 2009, 23:02
Beitrag # 5 von 8
Beitrag ID: #422941
Bewertung:
(1545 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

nochmals ein paar Versuche. Wieder mit QuarkXPress 7.5. Aber es ist nichts zu machen: Wenn eine Stilvorlage gelöscht worden ist, dann rutschen die Namen um eine Position nach oben und beim letzten setzt es eine Fehlermeldung ab.

Vier Absatzstilvorlagen erzeugen – Reihenfolge alphabetisch – und sie den gleichnamigen Absätzen zuweisen:
---
test1
test2
test3
test4
---
Mit folgendem Script die Liste der Namen verlangen:
---
tell document 1 of application "QuarkXPress 7.5"
   tell current box
      set allNames to (name of style sheet) of every paragraph
   end tell
end tell
allNames
---
Ergebnis: {"test1", "test2", "test3", "test4"}

So weit, so gut. Jetzt die Stilvorlage "test2" löschen und durch "Kein Stil" ersetzen.
Erneut das Script starten.
Ergebnis: {"test1", "Keine Stil", "test4"}

Der Absatz "test3" gibt "test4" zurück, obwohl in der Palette "test3" ausgewählt ist. Und der Absatz "test4" bleibt die Antwort schuldig. In den Properties steht zwar dasselbe, wie bei Absatz "test2" (= style sheet:null).

Während letzterer mit diesem Script ...
---
tell document 1 of application "QuarkXPress 7.5"
   tell current box
      tell story 1
         tell paragraph 2
            name of style sheet
         end tell
      end tell
   end tell
end tell
---
... als Ergebnis "Keine Stil" zurückgibt, kommt beim Ansprechen von Absatz 4 eine Fehlermeldung. Wegen der Verschiebung um eine Position ist beim letzten nichts zugewiesen worden.

Ein Hoffnungsschimmer: Beim Export im XPress-Tags-Format wird der korrekte Name in die Datei gesetzt. Man könnte diese Datei einlesen, z.B. in die Variable aString und mit RegExp den Namen ausziehen.
---
set aString to "@test4=[S\"\",\"test4\"]<*L*h\"drap_sc\"*kn0*kt0*ra0*rb0*d0*p(0,0,0,13,0,0,g) Ps100p100t0h100z12k0b0cKf\"Helvetica\"n1o(\"Calt\",\"liga\")G0>
@test4:test4"

set curName to find text "(\\@)([ -z]+)(:)" in aString using "\\2" with string result and regexp
---
Egebnis: "test4"

Gruss, Hans


als Antwort auf: [#422937]

QXP 7.5: Fehler beim Ermitteln von Stilvor

Hans Haesler
  
Beiträge gesamt: 5826

20. Mär 2009, 07:05
Beitrag # 6 von 8
Beitrag ID: #422942
Bewertung:
(1545 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

und jetzt noch mit QuarkXPress 6.52. Gleiches Vorgehen wie im letzten Beitrag.

Nach dem Löschen von "test2" ist das Ergebnis von ...
---
tell document 1 of application "QuarkXPress 6.52"
   tell current box
      set allNames to (name of style sheet) of every paragraph
   end tell
end tell
allNames
---
... wie erwartet:
---
{"test1", "Keine Stil", "test3", "test4"}
---
Die vorher festgestellte Verschiebung – wenn die Zuweisung per AppleScript geprüft wird – findet nicht statt. Das muss erst mit QXP 7 "eingeführt" worden sein.

Gruss, Hans


als Antwort auf: [#422937]

QXP 7.5: Fehler beim Ermitteln von Stilvor

Goar
Beiträge gesamt: 395

20. Mär 2009, 13:03
Beitrag # 7 von 8
Beitrag ID: #422943
Bewertung:
(1545 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

jetzt haben wir ja schon eine Menge herausbekommen.

Doch es gibt noch mehr. Und ich komme auf Index und uniqueID zurück.

Alle Stilvorlagen bekommen in der Reihenfolge ihrer Erstellung eine laufende Nummer, den Index. Wird eine Stilvorlage gelöscht, werden die Nummern neu vergeben, die Reihenfolge ändert sich dabei nicht.
Neben dem Index wird jeder neuen Stilvorlage eine uniqueID zugewiesen, die der Stilvorlage aber bis an ihr Lebensende erhalten bleibt. Wird z. B. die Stilvorlage mit der uniqueID 2 gelöscht, dann kommt die uniqueID 2 eben nicht mehr vor. QXP ist aber bestrebt, diese Lücke aufzufüllen und gibt der nächsten neuen Stilvorlage in diesem Beispiel die uniqueID 2. Das bedeutet: Die uniqueID entsprechen nicht der Reihenfolge, in der die Stilvorlagen angelegt wurden.

Dieses Prinzip wird in der langen Stilvorlagenliste meines ersten Eintrags deutlich. Zunächst habe ich alle Stilvorlagen bis »Zitat nText« (Index 31) angelegt. Dann die Stilvorlage nach »GS Aufz« gelöscht, so dass die uniqueID 12 fehlte. Anschließend habe ich die Stilvorlage »GS ff blau« angelegt, der die fehlende uniqueID 12 zugewiesen wurde. Damit fehlten keine ID mehr und als ich die letzten Stilvorlagen (ab Index 33) anlegte, bekamen die jeweils eine neue uniqueID.

Mit meiner Umgehung (Skript im grauen Feld des ersten Eintrags) konnte ich alle Stilvorlagennamen korrekt auslesen, weil die höchste uniqueID der Anzahl der Stilvorlagen entsprach.

Als ich Hans’ Test nachvollzog,
--- (Text)
testa
testb
testc
testd
teste
testf
testg
---
und die Stilvorlagen testb und teste gelöscht hatte, stieß dieses Skript an seine Grenzen, da es in dem Dokument nicht zu jedem Index eine uniqueID gab.
---
Name, Index, uniqueID
Normal, 1, 1
testa, 2, 2
testc, 3, 4
testd, 4, 5
testf, 5, 7
testg, 6, 8
---

Damit das Skript funktioniert, müssen die gelöschten Stilvorlagen durch zusätzliche (notfalls Dummy-)Stilvorlagen »ersetzt« werden. Anders ausgedrückt: Die ursprüngliche Anzahl der Stilvorlagen muss wiederhergestellt werden.
In der erweiterten Form des obigen Skripts wird also zunächst geprüft, ob Stilvorlagen gelöscht und nicht ebensoviele neu angelegt wurden. Falls ja, legt das Skript Dummy-Stilvorlagen in erforderlicher Anzahl an. Um doppelte Stilvorlagennamen zu vermeiden, kommt die fehlende uniqueID mit in den Namen.

--- (nameList: Liste aller Stilvorlagen, sortiert nach uniqueID)
Normal
testa
z_tmp3
testc
testd
z_tmp6
testf
testg
---

Mit dieser Liste kann das Skript die Stilvorlagennamen korrekt zusammenstellen.
Code
tell document 1 of application "QuarkXPress Passport" 
    -- prüfen, ob Stilvorlagen gelöscht wurden, und Ersatzstilvorlagen anlegen
    -- (Anzahl Stilvorlagen ist kleiner als die höchste uniqueID)
    set allID to uniqueID of every style spec -- alle vorhandenen uniqueID in eine Liste
    set cntStyles to count style spec
    set AppleScript's text item delimiters to "\n"
    -- ID sortieren
    set allID to paragraphs of (do shell script "sort -u <<< " & quoted form of (allID as text))
    set AppleScript's text item delimiters to {""}
    set greatestID to (item -1 of allID) as number
    if (greatestID is greater than cntStyles) then -- wenn Stilvorlagen gelöscht und nicht ersetzt wurden
        repeat with i from 1 to length of allID
            if ((i as string) is not in allID) then -- fehlende ID aufspüren
                set newStyleName to "z_tmp" & i
                make style spec at beginning with properties {name:newStyleName} -- Ersatzstil anlegen
            end if
            if (greatestID is equal to cntStyles) then
                exit repeat
            end if
        end repeat
    end if
   
    -- erstellt eine Auflistung aus uniqueID, Name
    -- (einmalige Vorbereitung)
    set specList to {}
    repeat with i from 1 to count of style specs
        set askStyle to i
        set tmpSpec to ""
        set tmpSpec to tmpSpec & uniqueID of style spec askStyle & " "
        set tmpSpec to tmpSpec & name of style spec askStyle
        set end of specList to tmpSpec
    end repeat
    -- jetzt wird die Liste nach uniqueID sortiert und die uniqueID wieder entfernt
    set AppleScript's text item delimiters to (ASCII character 10)
    set IDList to (do shell script "sort  -n <<< " & quoted form of (specList as text))
    set AppleScript's text item delimiters to {""}
    set IDList to (change (ASCII character 10) into return in IDList)
    set nameList to (change "^[0-9]+ " into "" in IDList with regexp)
   
    -- beispielhaft mit einer Textbox
    tell current box
        set allIndex to (index of style sheet) of every paragraph
        set allPara to {}
        repeat with i from 1 to length of allIndex
            set curIndex to item i of my allIndex
            if (curIndex is equal to 0) then
                set end of allPara to "Kein Stil"
            else
                set end of allPara to text of paragraph curIndex of nameList
            end if
        end repeat
    end tell
   
end tell
allPara

---
{"testa", "Kein Stil", "testc", "testg", "Kein Stil", "testf", "testg"}
---

Das ist zwar jetzt für die Umgehung von set allPara to (name of style sheet) of every paragraph eine ganze Menge Code, aber der größte Teil davon läuft bei jedem Skriptgang nur einmal ab und mit do script recht flott.

Entgegen Deiner Beobachtung, Hans, listet dieser Code die Stilvorlagennamen nicht in der gleichen Reihenfolge auf wie der folgende:
Code
tell document 1 of application "QuarkXPress Passport" 
  set nameList to name of every style spec
end tell

Der erste sortiert die Namen nach der uniqueID, der zweite nach dem Index. Da aber über die uniqueID auf den Stilvorlagennamen zugegriffen wird, ist auch diese Sortierung erforderlich, und zwar aufgefüllt mit allen Ersatzstilvorlagen.

Grüße, Goar


als Antwort auf: [#422937]

QXP 7.5: Fehler beim Ermitteln von Stilvor

Hans Haesler
  
Beiträge gesamt: 5826

20. Mär 2009, 21:59
Beitrag # 8 von 8
Beitrag ID: #422944
Bewertung:
(1545 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

bewundernswert, wie Du Dich da hineinkniest!

Zu Deinem Hinweis am Ende des Beitrages: In meiner Antwort vom 18. März ging ich von einem "Schönwetter"-Dokument aus, in welchem die Stilvorlagen zwar nicht in alphabetischer Reihenfolge erzeugt wurden, aber keine davon gelöscht worden ist.

Und in diesem Fall ist eine Sortierung nur sinnvoll, wenn die Stilvorlagen in derselben Reihenfolge wie in der Palette stehen sollen.

Zu Deinem Workaround: Hut ab! :-) Ich habe ihn zwar nur kurz durchgelesen und mit meinem Vier-Stilvorlagen-Dokument (in welchem eine gelöscht worden ist) getestet. Und tatsächlich: Beim Absatz, welcher mit der gelöschten "test2" formatiert war, wird korrekt "Kein Stil" (QXP-Speak wäre "Keine Stil") eingesetzt. Und "test4" wird nicht mehr verschwiegen, sondern richtig wiedergegeben.

Nochmals: Gratulation!

Gruss, Hans


als Antwort auf: [#422937]
X