[GastForen Programmierung/Entwicklung AppleScript Quark 6 und Lange Texte

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

Quark 6 und Lange Texte

Anonym
Beiträge gesamt: 22827

6. Sep 2004, 11:37
Beitrag # 1 von 6
Bewertung:
(1450 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusamnnem,

ich bin gerade mal wieder in eine böse Falle von Quark 6 und Applescript gelaufen (Oder bin ich nur mit Blindheit und Dummheit geschlagen).

hier das Testscript:
tell application "QuarkXPress Passport"
 tell document 1
  get selection
  set insPoint to offset of first character of selection
 
  if insPoint < 0 then set insPoint to insPoint + 65536
  log (insPoint)
 end tell
end tell

Wenn also ein sehr langer Text (mehr als 32768 Zeichen) als Testtext verwendet wird, verschluckt sich Quark, das offest anscheinend nur Werte kleiner der magischen Grenze 32768 korrekt berechnet. Größtere Werte erzeugen einen Überlauf, 32789 ergibt also
-1. Bei jedem Vielfachen  wird wieder bei -1 begonnen. Immerhin gibt get selection die richtigen Werte aus.
Hilfe, ich brauche immer den richtigen Startwert der Auswahl.


Gruß Michael
X

Quark 6 und Lange Texte

Hans Haesler
  
Beiträge gesamt: 5826

6. Sep 2004, 23:29
Beitrag # 2 von 6
Beitrag ID: #419014
Bewertung:
(1449 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

Deine Feststellungen kann ich zum Teil bestätigen. Wenn das 32768ste Zeichen einer Textkette ausgewählt ist, dann kommt als Ergebnis die korrekte Zahl '32767' (die Anzahl der Zeichen, welche sich vor dem ausgewählten befinden).

Wenn das Zeichen 32769 ausgewählt ist, dann ist das Resultat aber '-32768' (und nicht '-1' wie von Dir gemeldet).
Wenn ich das Zeichen 33000 auswähle, dann wird '-32537' zurückgegeben. Es wird also rückwärts gezählt.

Ich habe eine recht abenteuerliche erste Lösung gefunden, mit welcher die 32-K-Limite kein Problem ist. Dafür versagt sie bei Zahlen unter 10853...

Die endgültige Lösung ist ähnlich aufgebaut, und nicht allzu einfach zu erklären. Zu Beginn wird mit einem try-Block sichergestellt, dass mindestens ein Zeichen ausgewählt ist. Wenn nur der Cursor blinkt, dann funktioniert es nicht. In die Variable 'objRef' wird die Objektreferenz des ersten Zeichens der Auswahl gegeben. Dieses Resultat kann man nicht in einen String verwandeln (aus welchem dann die Zahl ausgezogen werden könnte).
---
tell application "QuarkXPress 6.1"
  tell document 1
    try
      set objRef to (object reference of first character of selection)
    on error
      display dialog "Keine Auswahl vorhanden!" buttons "OK" default button 1 with icon 2
      error number -128
    end try
    try
      set insPoint to (find text "[0-9]+" in objRef)
    on error errMsg
      try
        set insPoint to (item 1 of (find text "[0-9]+" in errMsg with all occurrences, string result and regexp)) - 1
      end try
    end try
  end tell
end tell
---
In der Mitte des Scripts kommt ein weiterer try-Block. Der Befehl, Ziffernfolgen zu finden, richtet sich an 'objRef'. Diese Zeile (eine Kurzfassung, welche so kein Resultat ergäbe) stammt aus dem Wortschatz der "Satimage.osax", setzt aber voraus, dass ein String angesprochen wird. Weil aber &#150; wie oben erwähnt &#150; der Inhalt von 'objRef' nicht in eine Textkette verwandelt werden kann, wird eine Fehlermeldung generiert.

Hier ist es ausnahmsweise Absicht. Denn dadurch wird die Objektreferenz in einen String verwandelt. Nämlich in jenen der Fehlermeldung. Diese wird in die Variable 'errMsg' gesetzt. Zum Beispiel: "QuarkXPress got an error: Can't make text from character 33025 to character 33025 of text from character 33025 to character 33036 of story 1 of text box 4 of document \"test_offset\" into a string."

Daraus kann im 'on error'-Abschnitt mit dem komplettierten Satimage-Befehl die erste Zahl ausgezogen werden. Davon muss noch 1 abgezogen werden, damit der Offset-Wert stimmt = 33024.

Damit Du diese Lösung einsetzen kannst, muss die Freeware-Scripting-Addition "Satimage.osax" installiert sein. Du findest sie hier: http://www.fachhefte.ch dort auf den Link "AppleScripts" klicken und im Ordner "z_additions_os_x" die Datei "satimage_osax.sit" wählen. Nach dem Entstuffen den Ordner öffnen und die Scripting-Addition nach der kurzen Anleitung installieren.

Hoffe, dass es klappt.

Hans Haesler <hsa@ringier.ch>


als Antwort auf: [#419013]

Quark 6 und Lange Texte

Anonym
Beiträge gesamt: 22827

7. Sep 2004, 09:53
Beitrag # 3 von 6
Beitrag ID: #419015
Bewertung:
(1449 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans, das ist ja super, wie du das wieder rausbekommen hast. Aber eigentlich ist es ja armselig von Quark, das sie nicht weiter als bis 32768 zählen können. Vor allem, wenn die Objektreference selber den korrekten Wert angibt. Hat wohl wieder mal einer bei der Programmierung gepennt oder war bei der Typenzuweisung etwas sparsam.

Stimmt es wirklich, das sich die Position der Einfügemarke nicht mehr abfragen läßt? Unter 4.x ging das doch noch? Wenn sich doch bloß die Referenz direkt in einen Text wandeln ließe.

Aber mitdeiner Hilfe komme ich schon einen Schritt weiter. Jetzt muß ich nur noch folgende Zeile ein bißchen manipulieren, da wird nämlich auch rückwärts gezählt:
set myArrow to (horizontal offset of character 1 where it is "&#145;") as real
(mit Zapf Dingbats seht dann dort ein Pfeil :-)  )

Aber das sollte sich jetzt ja mit ein bißchen Zahlenakrobatik lösen lassen, nachdem man den falschen Wert von Quark und den richtigen vom Hans hat.


Gruß Michael

PS.: Warum läßt Quark immer solche Tretminen rumliegen um die unsereiner dann mühsam rumprogramieren muß


als Antwort auf: [#419013]

Quark 6 und Lange Texte

Hans Haesler
  
Beiträge gesamt: 5826

8. Sep 2004, 22:27
Beitrag # 4 von 6
Beitrag ID: #419016
Bewertung:
(1449 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

doch, doch, die Einfügemarke ('insertion point') kann man immer noch ansprechen. Allerdings braucht es dazu spezielle, gymnastische "Verrenkungen".
Nachstehend die erweiterte Version des Offset-Feststellen-Scripts, welches sowohl mit ausgewählten Textketten als auch blinkendem Cursor fertig wird.

Zuerst Grundlegendes:
A) Wenn eine Textkette ausgewählt ist, dann ist das Ergebnis aus 'object reference of first character of selection' immer im Format &#133;
Code
text from character n to character n of text (... usw.) 

Davon muss man [b]immer die Zahl '1' abzählen, wenn man als Resultat den 'offset'-Wert wünscht.

B) Wenn hingegen nur der Cursor blinkt, dann ist das Ergebnis aus 'object reference of selection' [b]meistens im Format &#133;
Code
insertion point [b]after character n of text flow 1 (... usw.) 

Wenn der Cursor ganz am Anfang der Story blinkt dann ergibt dies &#133;
Code
insertion point [b]before character 1 of text flow 1 (... usw.) 

Man muss sich also auch danach erkundigen, ob das Resultat 'after' oder 'before' enthält und bei 'before' die Zahl '1' abziehen. Im nachfolgenden Script wird die Variable 'compVal' entsprechend vorbereitet.

Ob Textkettenauswahl oder Position des Cursors: In beiden Fällen wird zuerst eine Fehlermeldung provoziert, damit die Objektreferenz in einen String verwandelt wird, aus welchem man dann mit gütiger Hilfe der Satimage-OSAX den Offset-Wert ausziehen kann.
---
tell application "QuarkXPress 6.1"
  tell document 1
    if tool mode is not contents mode then set tool mode to contents mode
    set boxCount to count (every text box whose selected is true)
    if boxCount = 1 then
      tell selection
        set selCount to count of characters
      end tell
      if selCount = 0 then
        set objRef to object reference of selection
        try
          set insPoint to (find text "[0-9]+" in objRef)
        on error errMsg
          try
            if errMsg contains "after" then
              set compVal to 0
            else
              set compVal to 1
            end if
            set insPoint to ((item 1 of (find text "[0-9]+" in errMsg with all occurrences, string result and regexp)) - compVal) as integer
          end try
        end try
      else
        try
          set objRef to (object reference of first character of selection)
        on error
          display dialog "Keine Auswahl vorhanden!" buttons "OK" default button 1 with icon 2
          error number -128
        end try
        try
          set insPoint to (find text "[0-9]+" in objRef)
        on error errMsg
          try
            set insPoint to (item 1 of (find text "[0-9]+" in errMsg with all occurrences, string result and regexp)) - 1
          end try
        end try
      end if
    else if boxCount = 0 then
      display dialog "Es ist keine Texbox ausgewählt." buttons "OK" default button 1 with icon 2
      error number -128
    else if boxCount > 1 then
      display dialog "Nicht mehrere Boxen aufs Mal auswählen." buttons "OK" default button 1 with icon 0
    end if
  end tell
end tell
---
Hans Haesler <hsa@ringier.ch>


als Antwort auf: [#419013]

Quark 6 und Lange Texte

Anonym
Beiträge gesamt: 22827

9. Sep 2004, 10:19
Beitrag # 5 von 6
Beitrag ID: #419017
Bewertung:
(1449 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

was würde ich nur ohne dich machen. Dein Wissen ist eine Goldgrube und du solltest ein Buch drüber schreiben. Ehrlich, ich würde es sofort kaufen und auswendig lernen :-)

Aber ging das mit Quark 4 nicht mal einfacher und ohne die Auswertun einer provozierten Fehlermeldung? Da sollte Quark auf jeden Fall mal ein bißchen nachbessern beim nächsten Update/Wartungsrelease.

Sobald ich die "Zahlenakrobatik in ein Script gegosseen habe, werde ich hier das Ergebnis posten. Nur schon mal soviel als Idee: Je nach wirklichem Offset, müssen wohl ganze Vielfache von 65536 dazu gezählt werden
(+/- 1). Genaueres muß ich erst noch überprufen (und da ich nicht sooo fit in AS bin muß ich auch erstmal suchen, wie ich den Ganzzahligen Rest bei einer Division am besten in AS bekomme. Aber da werde ich schon noch was finden. Sicher.


Gruß Michael


als Antwort auf: [#419013]

Quark 6 und Lange Texte

Hans Haesler
  
Beiträge gesamt: 5826

9. Sep 2004, 12:08
Beitrag # 6 von 6
Beitrag ID: #419018
Bewertung:
(1449 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

ich weiss auch nicht, was ich ohne mich machen würde ;-)
Nun, der vom Buch-Schreiben kommt hin und wieder vor. Ich hätte sogar einen
Leser in Mexiko &#133;

Ja, mit QuarkXPress 4 geht es viel einfacher. Der Code reduziert sich auf:
---
tell application "QuarkXPress 4.11"
  tell document 1
    tell selection
      set insPoint to offset
    end tell
  end tell
end tell
---
Ob nur blinkender Cursor oder ausgewählter Text: das Resultat ist richtig.

Mit QuarkXPress 6.1 muss man halt die oben gezeigte Komplikation in Kauf
nehmen. Aber: Es ist nicht notwendig, Vielfache von 65536 dazuzuzählen.

Hans Haesler <hsa@ringier.ch>


als Antwort auf: [#419013]
X