[GastForen Programmierung/Entwicklung AppleScript Position eines Zeichens ermitteln

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

Position eines Zeichens ermitteln

Anonym
Beiträge gesamt: 22827

19. Apr 2005, 19:38
Beitrag # 1 von 10
Bewertung:
(4549 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Lieber Hans,

wie kann ich die Position eines Zeichens in einer Zeichenkette bestimmen, wenn ich "offset" nicht verwenden kann. In diesem Fall habe ich die "Pipe" (alt-7) verwendet, weil sie in Texten normalerweise nicht vorkommt.

"offset" ist offenbar Teil des AppleScript-Vokabulars für QuarkXPress. Sobald ich mich also mit meinem AppleScript in QuarkXPress befinde, wirkt der Befehl anders als ich möchte bzw. er funktioniert in meinem Script überhaupt nicht.

Gibt es eine andere Möglichkeit die Position des Zeichens zu ermitteln? Vor die kritische Stelle im Skript habe ich drei Ausrufezeichen gesetzt.

[code:1]-- Platzhalter für die Seitenverweise fetten und ersetzen

tell application "QuarkXPress Passport"
 activate
      set theList to {"XXX1|Seite 20", "XXX2|Seite 33", "XXX3|319"}
      repeat with i in theList
 -- Die folgende Zeile macht das Problem, weil ich mich jetzt schon im Sprachbereich von XPress befinde
!!! set trennZeichen to offset of "|" in i
 
 set suchText to (characters 1 thru (trennZeichen - 1) of i as string)
 set ersatzText to (characters -1 thru (trennZeichen + 1) of i as string)
  try
   tell document 1
    -- Zur Erklärung: Die Zeichenstilvorlage in meinem Textdokument hat den Namen "fetterText"
    set (character style of every word of every story where it is suchText) to "fetterText"
    set (every word of every story where it is suchText) to ersatzText
   end tell
  end try
end repeat
end tell
[/code:1]

Das könnte mir sehr helfen ... Für einen Alternativvorschlag bin ich selbstverständlich auch dankbar.

Vielen Dank schonmal!

X

Position eines Zeichens ermitteln

Hans Haesler
  
Beiträge gesamt: 5818

19. Apr 2005, 21:27
Beitrag # 2 von 10
Beitrag ID: #419553
Bewertung:
(4548 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Lieber Michael,

eine kurze Nachforschung ergab, dass Dein Script unter Mac OS X und QuarkXPress 6.5 funktionieren sollte.

[[ Eine Bitte an alle Scripter: Benennt doch die Programmdatei mit der entsprechenden Versionsnummer
(z.B. "QuarkXPress 6.5"). Dann sieht man Eurem Beispielcode auch sofort an, worum es sich handelt. ]]

In der Tat ist der 'offset' der Scripting Addition "Standard Additions" und der 'offset' von QuarkXPress
nicht dasselbe. In QuarkXPress bedeutet dies seit der Einführung von AppleScript die Anzahl Zeichen, welche
sich in derselben Textkette vor dem gesuchten Buchstaben befinden. Ein Offset-Wert von Null bedeutet, dass
es das erste Zeichen ist. Folglich muss man immer mit 'offset + 1' rechnen, damit der richtige Buchstabe
adressiert werden kann.

Jetzt muss ich erst mal versuchen, ein Test-Dokument herzustellen ...

Und hier kommt mein Vorschlag: Zwei Listen erstellen. Damit entfällt schon mal die Position des Trennzeichens.
Weiter: Statt 'every word' besser 'every text verwenden:
---
set aList to {"XXX1", "XXX2", "XXX3"}
set bList to {"Seite 20", "Seite 33", "319"}
tell application "QuarkXPress 6.5"
   activate
   repeat with i from 1 to count of aList
      set suchText to item i of my aList
      set ersatzText to item i of my bList
      try
         tell document 1
            set (character style of every text of every story where it is suchText) to "fetterText"
            set (every text of every story where it is suchText) to ersatzText
         end tell
      end try
   end repeat
end tell
Code
Eine schnellere Ausführung erreicht man, indem die beiden letzten Befehle zu einem zusammengefasst werden: 

set properties of (every text of every story where it is suchText) to {contents:ersatzText, character style:"fetterText"}
---
Gruss, Hans


als Antwort auf: [#419552]

Position eines Zeichens ermitteln

Anonym
Beiträge gesamt: 22827

19. Apr 2005, 21:46
Beitrag # 3 von 10
Beitrag ID: #419554
Bewertung:
(4548 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Lieber Hans,

Ups! Tut mir leid, dass ich im Eifer des Gefechts nicht die technischen Angaben gemacht habe: Es ist QuarkXPress 6.5 auf Mac OS 10.3.8. Über sowas ärgere ich mich selbst immer ...

Aber ich habe jetzt nach etwas Probieren und Blättern eine Lösung gefunden, bei der ich die Suchtext-Ersatztext-Paare aus der Liste anders als mit "offset" in zwei Teile zerlege. Dazu ändere ich den "text item delimiter". So sind auch mehr als 2 Elemente möglich. Ein weiteres könnte z.B. der Name der jeweils gewünschten Stilvorlage sein: "XXX3|Seite 39|fetterText".

Die Variante mit den zwei Listen erscheint mir nicht so praktisch, weil die Paare dann nicht zusammen sind. Die Liste liegt so als tabulatorgetrennte Textdatei vor und kann leicht präpariert werden, indem ich den Tabulator durch das Pipe-Zeichen ersetze und die Zeilenschaltung durch die Zeichenfolge ",". Dann noch ein Anführungszeichen an den Anfang und eins ans Ende, fertig ist die Liste.

Hier das Script, wie es bei mir ganz einwandfrei klappt:

[code:1]-- Platzhalter für die Seitenverweise fetten und ersetzen

tell application "QuarkXPress Passport"
 activate
 set theList to {"XXX1|Seite 20", "XXX2|Seite 33", "XXX3|Seite 319 unten", "XXX4|Seite 401 oben"}
 repeat with i in theList
  -- Den Listeneintrag zuerst teilen.
  -- Dazu das Pipe-Zeichen auswerten
  set AppleScript's text item delimiters to "|"
  set suchText to text item 1 of i as string
  set ersatzText to text item 2 of i as string
  try
   tell document 1
    -- Zeichenstilvorlage "fetterText" auf den Platzhalter anwenden
    set (character style of every word of every story where it is suchText) to "fetterText"
    -- und dann den Platzhalter durch den echten Seitenverweis ersetzen
    set (every word of every story where it is suchText) to ersatzText
   end tell
  end try
 end repeat
end tell[/code:1]

Vielen Dank für die schnelle Reaktion.


als Antwort auf: [#419552]

Position eines Zeichens ermitteln

Hans Haesler
  
Beiträge gesamt: 5818

19. Apr 2005, 22:32
Beitrag # 4 von 10
Beitrag ID: #419555
Bewertung:
(4548 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Lieber Michael,

ich glaube gerne, dass Deine letzte Version einwandfrei klappt. Aber ich habe dennoch ein paar Einwände :-)

1) Der Umwandlung 'as string' der 'text items' ist nicht notwendig.
2) Die 'text item delimiters' gehören als Liste definiert = {"|"} und müssen nach der Repeat-Schleife
wieder auf einen leeren String zurückgesetzt werden  = {""}.
3) 'every word' ist eine schlimme Bremse. Mein Layout hat nur 6 Seiten mit je zwei Stories, in welchen
je zwei Platzhalter sind. Ausführungszeit = gut 24 Sekunden. Wenn 'every word' durch 'every text' ersetzt
wird, dann dauert es nur noch 1.2 Sekunden bis alle 24 Platzhalter ersetzt und formatiert sind.

Weitere Optimierungen: Das Suchen/Ersetzen in ein Script-Objekt packen und mit 'do script' aufrufen,
die Liste mit 'my' adressieren, die beiden Ersetzen-Befehle in einen zusammenfassen = ca 0.5 Sekunden.
---
tell application "QuarkXPress 6.5"
   activate
   do script {SearchReplace}
end tell

script SearchReplace
   global theList
   tell application "QuarkXPress 6.5"
      set theList to {"XXX1|Seite 20", "XXX2|Seite 33", "XXX3|Seite 319 unten", "XXX4|Seite 401 oben"}
      repeat with i in my theList
         -- Den Listeneintrag zuerst teilen.
         -- Dazu das Pipe-Zeichen auswerten
         set AppleScript's text item delimiters to {"|"}
         set suchText to text item 1 of i
         set ersatzText to text item 2 of i
         try
            tell document 1
               -- Die Platzhalter durch die echten Seitenverweise ersetzen und die Zeichenstilvorlage "fetterText" darauf anwenden
               set properties of (every text of every story where it is suchText) to {contents:ersatzText, character style:"fetterText"}
            end tell
         end try
      end repeat
      set AppleScript's text item delimiters to {""}
   end tell
end script

---
Gruss, Hans


als Antwort auf: [#419552]

Position eines Zeichens ermitteln

Anonym
Beiträge gesamt: 22827

20. Apr 2005, 15:56
Beitrag # 5 von 10
Beitrag ID: #419556
Bewertung:
(4548 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Lieber Hans,

ich habe das Script nach Deinen Hinweisen angepasst.

Eins allerdings machte Probleme:

[code:1]set properties of (every text of every story where it is suchText) to {character style:stilVorlage, contents:ersatzText}
[/code:1]

Der Platzhalter "XXX1" soll durch "322" ersezt werden. Verwende ich hier "every text" wird z.B. aus "... siehe Seite XXX1" nach Anwendung des Scripts "... siehe Seite3221". Beim Paar "XX32"/"411" wird aus "Seite XX32" wird "Seite4112". Das letzte Zeichen des Suchtextes bleibt also stehen, stattdessen wird das Leerzeichen vor der Suchstelle mit "ersetzt".

Das Leerzeichen wird offenbar mit zum Suchtext gezählt und dann werden genau 4 Zeichen (die Länge des Suchtextes) ersetzt. Das letzte Zeichen bleibt dadurch einfach stehen.

Das passiert nicht, wenn ich statt "text" den Begriff "word" verwende:

[code:1]set properties of (every word of every story where it is suchText) to {character style:stilVorlage, contents:ersatzText}
[/code:1]

Allerdings dauert es dann - wie Du mich ja warnst - wirklich erheblich länger. Auch mit "do script".

Wenn ich in XPress ein Wort doppelt anklicke und es dann lösche, wird ein eventuelles Leerzeichen dahinter(!) immer automatisch mit gelöscht. Im Script wird bei "text" das Leerzeichen davor(!) mit genommen. Ob das zusammenhängt?

Was meintest Du mit "Liste mit 'my' adressieren"? Ich habe, wie von Dir vorgegeben, die Variable zuerst global angegeben. Sonst, nehme ich an, wird sie in "do script" nicht erkannt.


als Antwort auf: [#419552]

Position eines Zeichens ermitteln

Hans Haesler
  
Beiträge gesamt: 5818

20. Apr 2005, 17:58
Beitrag # 6 von 10
Beitrag ID: #419557
Bewertung:
(4548 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

nun, ich habe in meinem Dummy-Test-Projekt die Textboxen mit den Wort "testen" gefüllt und dann ab und zu
eines dieser Worte durch die Suchbegriffe ersetzt: "... testen XXX1 testen ...". Und das Resultat war bei
allen vier Begriffen okay: "...  testen Seite 20 testen ..." Keine Verschiebung, nichts.

Jetzt habe ich es mit Deinen neuen Paarungen {"XXX1|322", "XX32|411"} und einem beliebigen Text erneut versucht:
"... paths of Seite XXX1 dropped ..." wird zu "... paths of Seite  322 dropped ..."
Auch das "411" wird korrekt eingesetzt. Ich habe die Suchbegriffe teils kopiert und eingesetzt und teils getippt.
Mal mit, mal ohne Wortzwischenräume. Alles korrekt.

Ich kann mir Deine Ergebnisse nicht erklären. :-(

Es sollte nicht mit dem "smart space"-Verhalten zusammenhängen. Aber ich erinnere mich, während des Beta-Tests für
QXP 5 auf ein Problem gestossen bin, bei welchem die Anzahl Buchstaben entscheidend war, ob das Ersetzen
vorgenommen wurde oder nicht. Doch auch dies kann man ausschliessen.

Wenn man die Liste mit 'my' adressiert, ist die Ausführung schneller. Sehr spürbar bei Listen mit vielen Elementen.
Die Variable muss als 'global' definiert werden, weil sonst der 'my'-Trick eine Fehlermeldung generieren würde.
Und weil dies innerhalb des Script-Objekts geschieht, würde nichts ausgeführt.

Gruss, Hans


als Antwort auf: [#419552]

Position eines Zeichens ermitteln

Anonym
Beiträge gesamt: 22827

20. Apr 2005, 18:47
Beitrag # 7 von 10
Beitrag ID: #419558
Bewertung:
(4548 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Lieber Hans,

kein Wunder, dass Du den Fehler nicht nachstellen konntest. Ich denke, ich habe die Ursache dafür gefunden:

In den Dateien, die ich bearbeite, verwende ich die Xtension "Xcatalog" von Emsoftware. Die Texte, in denen ersetzt wird, sind von unsichtbaren Markierungen dieser Xtension umgeben, die ihnen eine bestimmte ID zuweisen. Eine am Anfang des Textbereichs, eine am Ende.

Irgend etwas daran scheint den Fehler zu bewirken. Entferne ich dieses "Link" vom Text, klappt das Script auch mit "every text" fehlerfrei. Ist es da, klappt es nicht mit "every text", sondern nur mit "every word" fehlerfrei.

Sieht man sich den Text eines solchen verlinkten Bereiches als Tags an, sieht man, dass da eine ganze Menge auf den sichtbaren Text folgt. Das wird sicher das Problem sein.

Ohne Verlinkung sieht der Text als Markentext so aus:
[code:1]@StandardCopy:Mehr dazu auf Seite XXX1.[/code:1]

Ist er verlinkt, sieht er so aus:
[code:1]@StandardCopy&#58;<&Cs>Mehr dazu auf Seite XXX1.<&Ce&#40;"DataDescriptor.txt",,"12345",l,"Infotext",,,""&#41;>[/code:1]

Ich erspare Dir hier die komplette Erklärung des Codes. Nur soviel: "DataDescriptor.txt" ist eine Steuerdatei, in der Feldnamen festgelegt sind, "12345" ist die ID des Textes in einer Quelldatei oder Datenbank und "Infotext" ist der Name des Feldes bzw. der Spalte, in der der Text steht.

Diese Markierungen von Xcatalog wirken sich auch in anderen Bereichen "ungewöhnlich" aus. Hat z.B. der letzte Absatz eines Textes eine Linie unten und der Text ist komplett mit Xcatalog verlinkt, wird die Linie nicht angezeigt. Erst wenn ein beliebiges Zeichen hinter dieser Markierung folgt, ist die Linie wieder da. Wird die Verlinkung komplett entfernt, ist die Linie ebenfalls sichtbar. Ich werde den Leuten von Emsoftware mal dazu schreiben ...

Vielen Dank für Deine Mühe!



als Antwort auf: [#419552]

Position eines Zeichens ermitteln

Hans Haesler
  
Beiträge gesamt: 5818

20. Apr 2005, 21:59
Beitrag # 8 von 10
Beitrag ID: #419559
Bewertung:
(4548 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

ach sooooo ... Danke für die Aufklärung dieses "Falles"! Du hast mir damit erspart, nach den drei letzten Strohhalmen
zu greifen &#150; bevor ich Dich um die Zusendung eines dieser störrischen Dokumente gebeten hätte.

Strohhalm #1: Das Projekt ist ursprünglich mit QXP 3.31 erstellt und nie upgegradet worden.
Strohhalm #2: Der Text ist in verketteten Boxen importiert.
Strohhalm #3: Der Text befindet sich in mehrspaltigen Boxen.

Übrigens: Es ist nicht das erste Mal, dass diese XTension ein normales Bearbeiten eines Textes verunmöglicht. Deshalb:
Immer alle Umstände angeben. Wenn im ersten Posting "Xcatalog" gestanden hätte, wäre ich sofort hellhörig geworden ...

Gruss, Hans


als Antwort auf: [#419552]

Position eines Zeichens ermitteln

Anonym
Beiträge gesamt: 22827

21. Apr 2005, 11:42
Beitrag # 9 von 10
Beitrag ID: #419560
Bewertung:
(4548 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Lieber Hans,

ich weiß, dass Xcatalog so seine Eigenarten hat, aber es ist in Verbindung mit Xtags sehr brauchbar und hat mir schon viel Arbeit abgenommen.

Ich hatte deswegen nichts davon ins Posting geschrieben, weil meine ursprüngliche Frage ja auf die Unterteilung der Listenelemente zielte. Das Problem mit "every text" vs. "every word" war ja ein anschließendes Nebenproblem, das ich ja insofern schon umgangen hatte, indem ich "every word" verwendet hatte.

Vielen Dank nochmal und einen schönen Tag!


als Antwort auf: [#419552]

Position eines Zeichens ermitteln

Hans Haesler
  
Beiträge gesamt: 5818

21. Apr 2005, 15:39
Beitrag # 10 von 10
Beitrag ID: #419561
Bewertung:
(4548 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

ja, da hast Du vollkommen recht. Du hättest ja
über hellseherische Fähigkeiten verfügen müssen ...

Gruss, Hans


als Antwort auf: [#419552]
X

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
02.02.2023

Prozesse optimieren und effizient gestalten

Zürich
Donnerstag, 02. Feb. 2023, 08.00 - 10.00 Uhr

Digitalisierung, Webauftritt

Digitalisierung mitgestalten - Worauf kommt es an? Wie wichtig ist die Webseite? Webseite mit Word Press? Interne Prozesse optimieren

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: Birol Isik, E-Mailinfo AT bkcc DOT ch

https://digitalisierung-heute.ch/digitalisierung-informationstag-schweiz/

Veranstaltungen
01.03.2023 - 09.03.2023

Online
Mittwoch, 01. März 2023, 00.00 Uhr - Donnerstag, 09. März 2023, 00.00 Uhr

Online Webinar

Wie gehen wir mit diesen Veränderungen um? Was ist notwendig, damit wir die Digitalisierung im Unternehmen klappt? Veränderungsprozesse verstehen und entsprechend handeln Mitarbeiter als Botschafter Webseite mit WordPress erstellen SEA /SEO (Ads aufschalten)

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: B. Isik, E-Mailinfo AT snfa DOT ch

https://www.fernstudiumfitness.ch/digitalisierung-schweiz/