Forenindex » Programmierung/Entwicklung » AppleScript » Text formatieren

Text formatieren

Gast
Beiträge gesamt:

5. Aug 2003, 23:56
Bewertung:

gelesen: 1619

Beitrag als Lesezeichen
Ich habe Text mit Steuerzeichen wie z.B #01 Text text text #02, #03 Text text text #04
Wie kann ich ein Script schreiben, das ich zwischen den  Steuerzeichen denn Text formatieren kann?
der Text sollte sich nacher auch in Qxp4 importieren lassen.

Wer kann mir helfen?

Text formatieren

Hans Haesler
  
Beiträge gesamt: 5826

6. Aug 2003, 10:32
Bewertung:

gelesen: 1618

Beitrag als Lesezeichen
Hallo schnurgly_01,

ich nehme an, dass die Steuerzeichen durch Codes im XPress-Tags-Format ersetzt werden sollen. Das kann einfaches Fett- oder Kursivstellen sein (= <B>  oder <I>). Oder auch Namen von Absatz- oder Zeichenstilvorlagen (= @Titel: oder <@Bullet>).

Das Script liest die Textdatei in eine Variable, das bedeutet in einen Teil des Speichers, welcher mit einem Namen adressiert wird. Anschliessend werden mit Suchen/Ersetzen-Routinen die Steuerzeichen durch die XPress-Tags ausgetauscht. Schliesslich wird der Text wieder in eine Datei auf der Harddisk geschrieben. Am besten unter einem neuen Namen. Man kann auch nur das Suffix ändern (sofern vorhanden). Die Datei "Muster.txt" wird als "Muster.xtg" gespeichert ("xtg" steht für "XPress Tags").

Vorerst aber ein einfaches Beispiel. Damit kann jeder Interessierte das Script ausführen, ohne dass er eine entsprechende Textdatei zur Verfügung haben muss. Der Variablen 'oldString' wird direkt der Text zugewiesen. Ein "String" ist eine Textkette (= aneinandergereihte Buchstaben).
---
set oldString to "#01Text text text#02, #03Text text text#04"
copy oldString to newString
set searchList to {"#01", "#02", "#03", "#04"}
set replaceList to {"<B>", "<B>", "<I>", "<I>"}

repeat with i from 1 to count of searchList
  set searchString to item i of my searchList
  set replaceString to item i of my replaceList
  set newString to SnR(searchString, replaceString, newString)
end repeat

on SnR(searchString, replaceString, newString)
  set oD to AppleScript's text item delimiters
  set AppleScript's text item delimiters to {searchString}
  set tmpList to (every text item of newString) as list
  set AppleScript's text item delimiters to {replaceString}
  set newString to tmpList as string
  set AppleScript's text item delimiters to oD
  return newString
end SnR

newString -->"<B>Text text text<B>, <I>Text text text<I>"
---
Die Steuerzeichen werden in 'searchList' aufgelistet. Die entsprechenden XPress-Tags in 'replaceList'. Eine Repeat-Schleife weist den Variablen 'searchString' und 'replaceString' bei jedem Umgang ein Element der beiden Listen zu. Dann wird der Handler 'SnR()' aufgerufen. Als Parameter werden immer die aktuellen Such- und Ersetzen-Strings, sowie der gesamte Text übergeben.

Im Handler werden die aktuellen "text item delimiters", also die Trenner von Text-Einheiten in der Variablen 'oD' (= old delimiters) gespeichert. Dann werden den "text item delimiters" die Textkette 'searchString' zugewiesen. Im nächsten Befehl wird der Variablen 'tmpList' der ganze Text als temporäre Liste zugewiesen. Die Liste enthält soviele Elemente wie sie durch den Trenner abgeteilt werden. Nun werden den "text item delimiters" die Textkette 'replaceString' zugewiesen. Die Liste 'tmpList' wird in die Textkette 'newString' verwandelt. Die Umwandlung von Liste zu Textkette geschieht mit dem Zusatz 'as string'. Dabei werden die Listenelemente wieder an einem Stück aufgereiht und zwischen den Elementen wird der Trenner 'replaceString' eingefügt.

Der ganze Vorgang wird wiederholt bis alle Elemente der 'searchList' erledigt sind. Am Schluss steht das Ergebnis in 'newString' und kann im Ergebnisfenster des Skripteditors kontrolliert werden.

Die beschriebene Methode ist die "Vanilla"-Version des Suchen-und-Ersetzen-Vorgangs. "Vanilla", weil keine Scripting Addition eines Drittanbieters benutzt wird. Sie ist sehr schnell, hat aber Probleme, wenn die temporären Listen zuviele Elemente aufweisen. Wenn dies der Fall sein sollte, könnte man eine "fremde" Scripting Addition wie "RegEx Commands" einsetzen. Das Script wird dann kürzer:
---
set oldString to "#01Text text text#02, #03Text text text#04"
copy oldString to newString
set searchList to {"#01", "#02", "#03", "#04"}
set replaceList to {"<B>", "<B>", "<I>", "<I>"}

repeat with i from 1 to count of searchList
  set searchString to item i of my searchList
  set replaceString to item i of my replaceList
  set newString to REReplace newString pattern searchString with replaceString
end repeat

newString -->"<B>Text text text<B>, <I>Text text text<I>"
---

Damit das Ganze effizienter wird, muss der Text, wie eingangs beschrieben, in die Variable eingelesen werden. Die Textdatei kann durch einen Dialog ausgewählt oder &#150; anwenderfreundlicher &#150; auf ein Droplet gezogen werden.

Vorschlag: sende mir bitte eine Textdatei. Dazu genaue Angaben: Wodurch werden die Steuerzeichen ersetzt? Welche Version des Mac OS? Ich werde dann versuchen, ein passendes Droplet zu entwickeln.

Hans Haesler, hsa@ringier.ch