Illustrating austauschen

Home of

 

austauschen

"Austauschen" ist eine ultraschnelle AppleScript-Routine, mit der Suchen/Ersetzen-Vorgänge in Strings ca. 300 mal schneller ablaufen als mit den üblichen Routinen. (Die üblichen Routinen gehen mit einer Schleife durch den String.)
"Austauschen" wurde von mir, Sascha Welter, erfunden und allen AppleScriptern kostenlos und frei zur Verfügung gestellt. Alles, was ich mir wünsche, ist dass ich als Autor der Routine zitiert werde.

Aber Achtung: Austauschen funktioniert erst ab OS 8, bei Systemen vor OS8 könnte es Ihren Mac hängen oder abstürzen lassen. Wenn Sie Scripts schreiben, die Sie weitergeben möchten, sollten sie mit einer Routine die Systemversion überprüfen.

 

"Austauschen" is an ultrafast AppleScript-Routine, which makes search/replace-Operations about 300 times faster than the usual routines. (The usual Routines would loup through the string.)
"Austauschen" was invented by me, Sascha Welter, and I offered it without cost and free to all AppleScripters. All I ever asked for was that I would be quoted as the author.

But take care: Austauschen works only on OS 8 and later, on systems before OS8 it could hang or crash your mac. If you write scripts to give to other people include a routine that checks for the system version.

Geschichte:

Ungefähr am Anfang Dezember 1997 zerbrach ich mir den Kopf weil ich etwas brauchte, um in einem String einen Text zu suchen/ersetzen. Dieses etwas müsste funktionieren, ohne etwas im Systemordner zu installieren -- weil es gedacht war um auch auf anderer Leute rechner zu laufen.
Eines Nachts arbeitete ich spät und endlich begann ich ausserhalb der Grenzen zu denken. Das Resultat ist "austauschen". Einige Wochen später schrieb ich einige scripts für die Emailer-Talk mailingliste und als ich sie auf meiner Webseite publizierte, schrieb ich dieses Mail auf der Liste:

 

History:

About in the beginning of december 1997 I was banging my head on the wall, because I needed something to search/replace in a string. This thing would have to run without installing something in the system folder -- because it was meant to run on other peoples machines.
One night I was staying up late and finally I began to "think outside the dots". The result is "austauschen" (austauschen is the german word for "swap"). A couple of weeks later I had written some scripts for the Emailer-Talk mailinglist and when I published them on my webpage I announced them on the list:
Thema:       [Announce] Saschas EmailerScripts on the Web
Datum:       24.12.1997 16:55 Uhr
An:          Emailer-Talk, emailer-talk@eskimo.com

Hi!

I managed to put some of the AppleScripts I have done for Claris Emailer 
on my home page. 
These Scripts include the "Dated messages" scripts, ready to use for US 
and European style dates (thank you Brian for testing this out!)

The scripts come all in one package (121k stuffed and binhexed):

* Stupefy Quotes, ..., etc.
  Turn curly quotes, ellipsis, ligatures etc. into their ASCII 
  counterparts

  This Script uses a search/replace subroutine I brewed up myself 
  and which is approx. 300 times faster than the average "loop 
  through a string AppleScript search/replace" -- without needing any 
  osaxen. 
  Could be of interest to you scripters out there.
...

 

Wie funktioniert es?

Der Lattenzaun

Es war einmal ein Lattenzaun,
mit Zwischenraum, hindurchzuschaun.

Ein Architekt, der dieses sah,
stand eines Abends plötzlich da --

und nahm den Zwischenraum heraus
und baute draus ein grosses Haus.

Der Zaun indessen stand ganz dumm
mit Latten ohne was herum.

Ein Anblick grässlich und gemein,
drum zog ihn der Senat auch ein.

Der Architekt jedoch entfloh
nach Afri- od. Ameriko.

     Christian Morgenstern 

 
Die meisten Scripter sahen die "text item delimiters" als etwas, mit dem man die Einträge in einer Liste zu einem String zusammensetzen kann und wieder auseinandernehmen kann. So wie wir normalerweise davon ausgehen, dass ein Lattenzaun aus den Latten besteht, sahen die Scripter eine Liste als aus den Elementen (items) bestehend. Wenn sie ein Element ersetzen wollen, dachten sie, dass man die einzelnen Elemente durchsuchen muss, um das richtige zu finden und zu ersetzen. Dabei könnte man den Spiess auch umdrehen:
Nehmen wir einmal an, wir wollen das Wort "Hase" suchen. Jetzt könnten wir natürlich jedes Wort durchgehen, bis wir jeden Hasen erwischt haben. Oder, wir erklären den Hasen zum Zwischenraum zwischen den Zaunpfählen. Dann können wir den Zwischenraum austauschen, ohne die einzelnen Zaunpfähle durchzugehen.

 

How does it work?

The Picket Fence

One time there was a picket fence
with space to gaze from hence to thence

An architect who saw this sight
approached it suddenly one night.

Removed the spaces from the fence 
and built of them a residence.

The picket fence stodd there dumbfounded
with picket wholly unsurrounded,

a view so loathsome and obscene,
the Senate had to intervene.

The architect, hoowever, flew
to Afri- or Americoo.

     Christian Morgenstern 
     (Translation by Max Knight)

 
Most scripters thought about the "text item delimiters" as something to delimit (take apart) list items from a string into a list and put together list items to form a string again. Like we usually take it that a picket fence consists of pickets, the scripters thought of a list as something made out of list items. When they wanted to replace an item, they thougth, that they would have to go through the elements in the list, one by one, to find the right one and replace it. But we could turn the whole thing around and solve the problem from a different angle.
For now, lets assume we are looking for the word "Rabbit". Now we could go throug each and every word, until we catched our Rabbit. Or, we declare the Rabbit to the space between the pickets. Then we can replace the "space between", without touching all the pickets themselves.

Und dies ist austauschen:

 

And this is austauschen:

(* Saschas fast search/replace routine for AppleScript searching and replacing in a string.
This routine is my very own invention. So if you use it in your own scripts
(that's OK with me!), then I want you to credit me within the source of your AppleScript and within any Readme-Files and Documentation your AppleScripts may have.
(Just keep this comment in your script.)

This routine is approx. > 300 times faster than searching replacing by looping through
all the characters in a string. Author: Sascha Welter <swelter@mus.ch>
*)

on austauschen(suchen, ersetzen, theString) -- Parameters: search, replace, the String
    set olddelis to my text item delimiters

    set my text item delimiters to (suchen)
    tell me to set theList to (every text item of theString)

    set my text item delimiters to (ersetzen)
    set theString to theList as string

    set my text item delimiters to olddelis

    return theString
end austauschen

"austauschen" Schritt für Schritt

on austauschen(suchen, ersetzen, theString) -- Parameters: search, replace, the String
Die erste Zeile der Routine gibt an, welche Parameter gebraucht werden, umd die Routine aufzurufen: Es ist der zu suchende String (suchen), der String, der dafür eingesetzt werden soll (ersetzen) und zuletzt, der String indem die Suchoperation aufgeführt werden soll (theString).

    set my text item delimiters to (suchen)
In dieser Zeile heben wir die bestehenden "text item delimiters" für späteren Gebrauch auf, denn es ist möglich, dass sie von einem anderen Teil des Scripts gebraucht und verändert wurden.

    set my text item delimiters to (suchen)
Jetzt stellen wir die text item delimiters auf den String ein, den wir suchen wollen: Wir erklären unseren Hasen zum Zwischenraum zwischen den Zaunpfählen.

    tell me to set theList to (every text item of theString)
Hier läuft die "Action" ab: Wir wenden einen Befehl an, der aus einem String eine Liste macht, wobei die einzelnen Teile der Liste durch den Inhalt der "text item delimiters" bestimmt werden. Beispiel: Wir suchen wieder das Wort "Hase", unser String heisst: "Da kam ein grosser Hase und frass die Rübe". Als Resultat erhalten wir die Liste: {"Da kam ein grosser ", " und frass die Rübe"} -- wie Sie sehen ist der Hase verschwunden, wir haben den Zwischenraum zwischen den Zaunpfählen entfernt. Ein anderes Beispiel "Da kam ein grosser Fuchs und frass das Nagetier" würde als Resultat ergeben: {"Da kam ein grosser Fuchs und frass das Nagetier"} -- eine Liste mit nur einem Element, da kein Hase unseren Text zerteilt.
Ein weiteres Beispiel wäre "ein Hase und noch ein Hase und ein weiterer Hase zusammen", was ergäbe: {"ein ", " und noch ein ", " und ein weiterer ", " zusammen"}

    set my text item delimiters to (ersetzen)
Jetzt wirds spannend: Wir stellen den Zwischenraum auf ein neues Wort ein: Zum Beispiel "Zauberer".

    set theString to theList as string
Und in dieser Zeile fügen wir den Zaun wieder zusammen, mit unserem neuen Zwischenraum. In unserem Beispiel würde sich ergeben: "Da kam ein grosser " & "Zauberer" (neu eingesetzt) & " und frass die Rübe" = "Da kam ein grosser Zauberer und frass die Rübe".

    set my text item delimiters to olddelis
    return theString
end austauschen
Wir stellen die "text item delimiters" wieder auf den ursprünglichen Wert, um unseren Arbeitsplatz sauber zu hinterlassen, geben an, dass wir das Ergebnis zurückgeben wollen und beenden unsere Routine.

 

 

"austauschen" step by step

on austauschen(suchen, ersetzen, theString) -- Parameters: search, replace, the String
The first line in our subroutine declares the needed parameters, to call the routine: It's the String that we want to search for (called "suchen"), the string that we want to replace it with (called "ersetzen") and last the string where the search operation should take place (called "theString").

    set my text item delimiters to (suchen)
In this line we conserve the "text item delimiters" as we found them for future use, because it is possible that some other part of the script that called our routine is using them and set them to something special..

    set my text item delimiters to (suchen)
Now we set the text item delimiters to the string we want to search for: We declare our Rabbit to be the space between the pickets.

    tell me to set theList to (every text item of theString)
This is where the "Action" is taking place: We use a command that makes a list out of a string, where the single items are separated by the "text item delimiters". Example: We are looking for the word "Rabbit", our String is: "There came a big Rabbit and ate the carrot". As a result we will get the list: {"There came a big ", " and ate the carrot"} -- as you see, the Rabbit is gone, we took away the space between the pickets. Another example, "There came a big fox and ate the Bunny" would get us the result: {"There came a big fox and ate the Bunny"} -- a list with only one element, because there was no Rabbit in our text to take the string apart.
Another example would be "a Rabbit and another Rabbit and a third Rabbit together", which would become {"a ", " and another ", " and a third ", " together"}

    set my text item delimiters to (ersetzen)
Now it gets interesting: We are setting the space inbetween to a new word: Take as an example the word "Wizard".

    set theString to theList as string
And in this line we put the picket fence together again, with our new space inbetween. In our first Example we would get: "There came a big " & "Wizard" & " and ate the carrot" = "There came a big Wizard and ate the carrot".

    set my text item delimiters to olddelis
    return theString
end austauschen
We are resetting the "text item delimiters" to what they where, in order to leave our workplace tidy, we set our routine to report the resulting string and leave the routine.

 

Fragen, Antworten und Lobeshymnen:

Sie können Ihre Fragen, Antworten und Lobeshymnen an den Autor schicken: Sascha Welter, swelter@mus.ch.

 

Questions, Answers and Praise:

You may send your questions, Answers ans Praise to the Author: Sascha Welter, swelter@mus.ch.

Back home (english) - Zurück zur homepage (deutsch)

Back to my AppleScript-page - Zurück zu meiner AppleScript-Seite