[GastForen Programmierung/Entwicklung AppleScript XPress: Absatz-Zeilenzahlen in langer Story ermitteln

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

XPress: Absatz-Zeilenzahlen in langer Story ermitteln

Goar
Beiträge gesamt: 395

12. Jun 2003, 13:08
Beitrag # 1 von 5
Bewertung:
(1924 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Forum,

in einer Story möchte ich Headline-Absätze manipulieren.
Die Story läuft auf jeder Seite durch drei verkettete automatische Textrahmen und erzeugt beim Einladen die erforderliche Anzahl Seiten, das können mal zwei, aber auch bis zu 90 Seiten sein.

Um die Headline-Absätze korrekt einstellen zu können, brauche ich die Anzahl der Zeilen dieser Absätze (da müssen jeweils die Werte für "Abstand vor" und "Absatzlinie oben" angepasst werden; s. Beitrag "XPress: Absatzlinie oben auslesen")

Mit einer Zusammenstellung einiger denkbarer Muster habe ich das Skript entwickelt. Die Hierarchie-Struktur lautete dabei:
---
tell document 1 of application "QuarkXPress 4.11"
 tell current box
  tell story 1
   do something
  end tell
 end tell
end tell
---
Zunächst klickte ich den Test-Textrahmen an und ließ dann das Skript ablaufen. Wunderbar. Als alles richtig funktionierte, probierte ich das ganze mit einem etwas längeren Testtext, der über mehrere Spalten ging. Ich klickte den ersten Rahmen der Textkette an und: Nicht wunderbar. Die Zeilenzahl der geprüften Absätze ab dem zweiten Textrahmen wurde nicht korrekt ermittelt, so dass die Absatzmanipulation auch daneben ging.
Vielleicht hängt es mit der 'current box' zusammen, dachte ich. Im AppleScript Kochbuch fand ich den Hinweis, dass eine Story auch direkt angesprochen werden kann. Also baute ich mein Skript um ...
---
tell document 1 of application "QuarkXPress 4.11"
 tell story 5
   do something
 end tell
end tell
---
... mit dem Erfolg, dass zwar andere Zeilenzahlen ermittelt wurden, aber auch nicht die richtigen. Interessant: bei dieser Vorgehensweise ist es gleich, ob ein Rahmen der Textkette beim Auslösen des Skriptes aktiviert ist und wenn ja, welcher; das Skript aktiviert immer den ersten.

Da im ersten Rahmen alles korrekt ausgeführt wurde, vermute ich, dass meine "do something" richtig funktionieren und dass das Problem in den tell-Klammern liegt.

Meine Frage: wie kann ich die Zeilenzahl von Absätzen einer Story (Textkette über mehrere Rahmen und Seiten) zuverlässig auslesen?
Falls das über Story geht, wie kann ich von AS den Index einer Story ermitteln lassen?

==============================================

Zur Kontrolle habe ich meinen Mustertext, bestehend aus 23 Absätzen, mit diesem Skript  behandelt:
---
tell document 1 of application "QuarkXPress 4.11"
 set ergebnis to {}
 tell story 5
  repeat with i from 1 to count of paragraphs
   set stilvorlage to name of style sheet of paragraph i
   set zeilen to count of lines of paragraph i
   -- set end of ergebnis to i & stilvorlage & zeilen -- diese nur beim ersten Durchgang
   set end of ergebnis to i & zeilen -- diese bei den weiteren
  end repeat
  display dialog ergebnis -- das gab zwar eine Fehlermeldung, aber egal
 end tell
end tell
---
Das Ergebnis kopierte ich mir jeweils aus dem Eventprotokoll, formatierte es ein wenig um und setzte es in Excel zu einer Tabelle zusammen.
Beim ersten Durchlauf war der gesamte Mustertext im ersten Rahmen der Kette. Beim zweiten, dritten und vierten befanden sich 14, 7 bzw. 1 Absätze im ersten, der Rest im zweiten Rahmen beim letzten Versuch war Absatz 1 im ersten, die Absätze 2 bis 14 im zweiten und der Rest im dritten Rahmen.
Alle Absatzlängen im ersten Rahmen wurden in jedem Durchgang richtig ausgelesen. Zu den Ergebnissen aus dem zweiten und dritten Rahmen ist mir kein logischer Zusammenhang aufgefallen, obwohl das sicher ein interessantes Zahlenspiel wäre, falls nicht der Zufall seine Finger im Spiel hat.
X

XPress: Absatz-Zeilenzahlen in langer Story ermitteln

Hans Haesler
  
Beiträge gesamt: 5826

12. Jun 2003, 16:34
Beitrag # 2 von 5
Beitrag ID: #418190
Bewertung:
(1921 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

ich kann Deine "unzuverlässigen" Resultate bestätigen. Eine Variante davon habe ich schon mit mehrspaltigen Textboxen angetroffen.
Dabei zählt jeder Wechsel der Spalte als Zeile. Das Total Zeilen wird entsprechend erhöht.

Ich habe eine Idee für einen Workaround. Vielleicht kann ich diesen im späteren Abend präsentieren (wenn es funktioniert).

Zur Fehlermeldung: weil 'ergebnis' eine Liste von Listen ist, kommt 'display dialog' nicht damit zurecht. Aber beim Umwandeln
in einen String kommen alle Ziffern ohne Abstand daher. Dem kann man abhelfen, aber dass das Resultat besser lesbar ist, sollten
beim Zusammensetzen der Liste Trennzeichen eingefügt werden:
---
      set end of ergebnis to i & ": " & zeilen & " | "
    end repeat
    set AppleScript's text item delimiters to {" "}
    set aResult to (every item of ergebnis) as string
    set AppleScript's text item delimiters to {""}
    display dialog aResult
Code
Aber dieses Resultat muss man auswendig lernen. Wenn man die folgende Variante benuzt, dann kann man es kopieren: 

     display dialog "" default answer aResult
---
Doch noch einfacher ist das Anzeigen im Resultatfenster, indem man als letzten Befehl des Scripts 'aResult' einsetzt. Ich verwende auch
das Eventprotokoll, aber nur ausnahmsweise.

Hans Haesler, hsa@ringier.ch


als Antwort auf: [#418189]

XPress: Absatz-Zeilenzahlen in langer Story ermitteln

Hans Haesler
  
Beiträge gesamt: 5826

12. Jun 2003, 23:14
Beitrag # 3 von 5
Beitrag ID: #418191
Bewertung:
(1921 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

der angekündigte Workaround klappt nicht. :-(

Aber inzwischen habe ich mich an ein Script erinnert, welches ich vor 14 Monaten für eine ähnliche Aufgabe
entwickelt hatte. Den Untertiteln war eine Stilvorlage zugewiesen worden. Der Vorgabewert für "Abstand vor"
war auf 3 Zeilen eingestellt. War die Anzahl anders, musste dieser Wert geändert werden. Und zusätzlich noch
die Grundlinie zweier Piktogramme.

Damals hatte ich viele Fehlversuche, bis ich endlich die "Zauberformel" fand: die verketteten Boxen mussten der
Reihe nach ausgewählt und angezeigt werden. Und dann musste der Text der aktuellen Box mit 'text 1' (statt mit
'story 1') adressiert werden.

Mit 'set view scale to fit page in window' wird sichergestellt, dass die Ansichtsgrösse des Dokuments die ganze
Seite zeigt. Die aktuelle Box muss sichtbar sein. Zu Beginn kann eine beliebige Box ausgewählt sein. Mit dem Befehl ...
---
tell current box
  set objRef to object reference of text box 1 of story 1
end tell
---
... wird die Objekt-Referenz der ersten Box der Textkette festgestellt. In der anschliessenden Repeat-Schleife
wird diese Box mit 'set selected of objRef to true' ausgewählt und mit 'show objRef' angezeigt. Nur dadurch
ist die Information über die Anzahl Zeilen korrekt.

Mit einer weiteren Repeat-Schleife werden die Namen der Stilvorlagen abgefragt. Sobald die gewünschte gefunden ist,
wird die Anzahl Zeilen festgestellt und einem Handler übergeben, welcher die Werte anpasst. Hier, in diesem
abgespeckten Beispiel, wird nur die Anzahl Zeilen an die Liste angehängt.

Anschliessend wird versucht, mit 'set objRef to object reference of next text box' die Objektreferenz der nächsten
Box der Textkette zu erfahren. Falls diese Box existiert, geht das Script in die Repeat-Schleife. Sonst wird diese
mit 'exit repeat' verlassen.
---
set nLines to {}

tell application "QuarkXPress 4.11"
  activate
  tell document 1
    set view scale to fit page in window
    tell current box
      set objRef to object reference of text box 1 of story 1
    end tell
    repeat
      set selected of objRef to true
      do updates
      show objRef
      tell objRef
        tell text 1
          repeat with i from 1 to count of paragraphs
            try
              if name of style sheet of paragraph i = "Headline" then
                set zeilen to count of lines of paragraph i
                set end of nLines to zeilen
              end if
            end try
          end repeat
        end tell
        try
          set objRef to object reference of next text box
        on error
          exit repeat
        end try
      end tell
    end repeat
  end tell
end tell

nLines
---
Dies funktionierte sehr gut. Ausnahme: wenn der Absatz "Headline" von einer Box zur anderen führte. Dann war das
Resultat falsch. In meinem Script habe ich es so gelöst, dass der Anwender den Cursor in den betreffenden Absatz
setzen und das Script nochmals laufen lassen konnte. Und die Werte wurden korrigiert.

Hans Haesler, hsa@ringier.ch


als Antwort auf: [#418189]

XPress: Absatz-Zeilenzahlen in langer Story ermitteln

Goar
Beiträge gesamt: 395

13. Jun 2003, 14:48
Beitrag # 4 von 5
Beitrag ID: #418192
Bewertung:
(1921 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans, ganz herzlichen Dank, jetzt ist aller Frust vergessen!

=== zu Deinem Alternativvorschlag "Zeilen zählen"
Die jeweilige "Textbox in Bearbeitung" zu aktivieren, schwebte mir auch schon vor, aber ohne Deine unermüdliche Arbeit hätten mir noch einige Tage oder Wochen voller Frust ins Haus gestanden.

Ich hatte mich seelisch schon darauf eingestellt, das Skript als Einzelfunktion umzuschreiben: manuell die Einfügemarke in einen zu bearbeitenden Absatz setzen und das Skript aufrufen, das dann nur diese Stelle analysiert und entsprechend anpasst.

Aber dann kam Dein Vorschlag. Das Kernstück meines Skriptes habe ich angepasst und es klappte. Und wie Du schon anmerktest, wenn ein Headline-Absatz von einer Box in die nächste führt, ist das Resultat falsch. Da ich aber bei allen Arten von Headlines "alle Zeilen zusammenhalten" eingestellt habe, stehen diese Absätze immer am Anfang der folgenden Box, wenn sie nicht komplett in die aktuelle passen. AS zählt laut Eventprotokoll bei "count of paragraphs" den ersten Absatz der nachfolgenden Box mit. Na, da habe ich einen Korrekturwert 'korr' eingebaut, der 1 ist, wenn eine Box folgt, und 0, wenn nicht. Dieser Wert wird in der repeat-Zeile von der ermittelten Absatz-Anzahl abgezogen. Jetzt sind die Resultate korrekt. Hier der geänderte Auszug aus Deinem o.g. Skript:
---
      tell objRef
        if exists next text box then -- AS zählt den ersten Absatz des folgenden Rahmens mit
          set korr to 1
        else
          set korr to 0
        end if
        tell text 1
          repeat with i from 1 to (count of paragraphs) - korr
            do something
          end repeat
        end tell
        try
          set objRef to object reference of next text box
        on error
          exit repeat
        end try
      end tell
---

=== zu Deiner Anregung zu meinem Kontrollskript:
für die wenigen Kontrolldurchgänge reichte das holprige Liste-in-Liste-Ergebnis.
Dein Lösungsvorschlag bietet aber die anpassungsfähige Möglichkeit, im Ernstfall maßgeschneiderte Ergebnisse direkt zur Verfügung zu stellen. Deshalb habe ich mir diese Passage mal separat unter dem Thema "Liste-in-Liste-Ergebnis" abgespeichert.
Genial wäre noch …
Code
     set end of ergebnis to i & "(Tabsprung)" & zeilen & "(Return)" 

gewesen, aber da weiß ich natürlich nicht wie das geht. Das könnte man dann vielleicht sogar direkt in Excel einsetzen.

Gruß, Goar


als Antwort auf: [#418189]

XPress: Absatz-Zeilenzahlen in langer Story ermitteln

Hans Haesler
  
Beiträge gesamt: 5826

13. Jun 2003, 15:38
Beitrag # 5 von 5
Beitrag ID: #418193
Bewertung:
(1921 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

bitte sehr. Ich bin froh, dass Dein Script nun funktioniert.

Und hier die gewünschte geniale Fassung des Kontrollscripts. Das Resultat ist direkt in Excel einsetzbar:
---
tell document 1 of application "QuarkXPress 4.11"
  set ergebnis to {}
  tell story 1
    repeat with i from 1 to count of paragraphs
      set end of ergebnis to "" & i & tab & zeilen & return
    end repeat
    display dialog "" & ergebnis
  end tell
end tell
ergebnis as string
---
Für "(Tabsprung)" und "(Return)" gibt es Konstanten: ganz einfach 'tab' und 'return', welche mit dem "&"-Zeichen an die
Variablen gehängt werden. Damit die Liste "handlicher" wird (das heisst keine Liste-in-Liste) muss jedes Zwischenergebnis
in einen String verwandelt werden. Eine elegante Lösung ist, mit einem leeren String zu beginnen...
Code
      set end of ergebnis to "" & 

... dann wird alles was weiter angehängt wird, automatisch in einen String verwandelt.

Und weil das ganze 'ergebnis' eine einfache Liste ist, hilft der gleiche Trick beim 'display dialog'. Und die letzte Zeile
('ergebnis as string') lässt das Ergebnis im Ergebnisfenster erscheinen, wo es kopiert und irgendwo eingesetzt werden kann.

Hans Haesler, hsa@ringier.ch


als Antwort auf: [#418189]
X