Dokument ist veraltet
Programmsteuerung easy: Shell & ARexx:
ARexx ist eine systemweite Skript-Sprache.
Über ARexx-Schnittstellen (Ports) erhält man Zugriff auf (fast) jede Funktion jeder Applikation oder System-Komponente.
WWW: ARexxGuide Copyright © 1993,1994 Robin Evans AmigaGuide® with ready-to-run examples, also HTML (english) | ARexx Online Users Guide (english) | SelfHTML HTML-Kurs (deutsch)
Beispiel: HTML-Bildkataloge mit ImageFX erstellen
Grundprinzip
ARexx ist zwar eine komplette Programmiersprache, aber es lassen sich auch einzelne Befehle von der Shell aus "absetzen". Folgende Befehlszeile startet z.B. den ARexx-Interpreter, um das Programm ImageFX anzuweisen, ein Bild zu öffnen:
Rx "ADDRESS IMAGEFX.1 LOADBUFFER 'RAM:Bild.jpg'"
Erklärung
- Rx ist der Name des ARexx-Interpreters, dem als Argument eine ARexx-Befehlszeile übergeben wird:
- ADDRESS IMAGEFX.1 legt fest, daß alle weiteren Befehle an den ARexx-Port "IMAGEFX.1" gesendet werden. Das ist der ARexx-Port der ersten Instanz von ImageFX. Wird ein zweites ImageFX gestartet, bekommt es den Portnamen "IMAGEFX.2". Die folgenden Befehle müssen natürlich zum ARexx-Befehlssatz des Programms ImageFX gehören.
- Der Befehl LOADBUFFER 'RAM:Bild.jpg' veranlasst ImageFX, das angegebene Bild in den Haupt-Puffer zu laden. (einfaches Anführungszeichen: ALT-ä)
Das folgende Beispiel soll die Einfachheit und Effizienz von ARexx im Zusammenspiel mit der Shell verdeutlichen: Zwei Shell-Skripte, die ImageFX Befehle übermitteln, um eine bestehende Bildersammlung um Thumbnail-HTML-Kataloge zu ergänzen.
Hinweis: Bildbearbeitungsfunktionen können auch viel eleganter - z.B. durch Freeware-Tools wie NetPBM - in die Shell integriert werden.
Die "korrekte" Vorgehensweise wäre übrigens, ein ImageFX-PlugIn komplett in ARexx zu schreiben.
Man kann nämlich nicht nur aus der Shell heraus ARexx verwenden, sondern natürlich auch aus ARexx heraus das AmigaDOS - z.B. zur Datei-Stapelverarbeitung - benutzen (Portname "COMMAND").
benötigte Software:
- RexxMast muss aktiviert sein.
- AmigaOS-Zubehör, 68K/PPC
- Die ARexx-Funktionalität lässt sich bei Web-Browsern, E-Mail Clients, etc. aus Sicherheitsgründen einschränken/deaktivieren.
- www.amiga.com
- die erste Instanz von ImageFX (ImageFX.1) muss zur Laufzeit des Beispiel-Skripts aktiv sein und sollte möglichst nicht von anderen Prozessen/Anwendern benutzt werden.
- Bild-/Videobearbeitung, 68K/PPC
- Status: kommerziell
- Hersteller: Nova Design
- PicSize
- gibt den HTML-Tag (<IMG ...>) zu einer Bilddatei aus, 68K
- benötigt: Datatypes (ab AmigaOS 2.1, Aminet: util/dtype)
- gehört als Shell-Programm (Kommando) ins Verzeichnis C: (sys:c/)
- Autor: Christopher Naas
- Status: Freeware
- Quelle: Aminet (comm/www/picsize.lha)
- Argumente: PICTURE/A
- Rep
- sehr schnelles Suche/Ersetze-Kommando für die Shell (C:-Verzeichnis), 68K
- Autor: D. Keletsekis
- Status: Freeware
- Quelle: Aminet (util/cli/rep.lha)
- Argumente: FILE/A,STRING/A,NEWSTRING/A,(NEWFILE),(I=INSENSITIVE/S)
Disclaimer
Die folgende Software wurde getestet unter AmigaOS 3.1 und ImageFX 4.1. Der Autor übernimmt keine Haftung für Datenverluste durch Benutzung der Software.
Bekannte Fehler:
- Bug bei lokalisierter List-Funktion. Lösung:
- In Sicherheitsabfragen empty durch leer ersetzen.
- Bug bei Start in einem Wurzelverzeichnis
- Bug bei Datei-/Verz.-Namen mit Leerzeichen. Lösung: entweder alle Dateinamen in Anführungszeichen setzen (viel Spass beim maskieren), oder:
- Keine genaue Format-Prüfung (z.B. durch Datatypes)
- unkritisch: ARexx-Fehler 2054: ImageFX-Befehl COLOR2CMAP wird auf CMAP-Puffer angewandt
- keine GIF-Anim Previews von Video-Dateien (ist mit ImageFX möglich)
Das erste Skript: Verzweigung in Unterverzeichnisse
Dieses Skript sorgt nur für die Rekursion in Unterverzeichnisse, wo dann das Haupt-Skript die eigentliche Arbeit erledigt. Es muss im Stammverzeichnis der Bildersammlung gestartet werden.
#
|
s:htmlcat-rx / Download
|
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
|
SET hcwd `CD` LIST DIRS ALL P ~(tn) LFORMAT "CD %F%N*NCD*Nhtmlcat-rx.script" >T:htmlcat-rx-stapel.$process IF `LIST T:htmlcat-rx-stapel.$process LFORMAT %L` EQ "empty" DELETE T:htmlcat-rx-stapel.$process ELSE EXECUTE T:htmlcat-rx-stapel.$process DELETE T:htmlcat-rx-stapel.$process QUIET ENDIF CD $hcwd UNSET hcwd htmlcat-rx.script
|
Das Skript sollte sich mit gesetztem Script-Bit (protect s:htmlcat-rx +s) im S: Verzeichnis (sys:s/) befinden. Damit ist sichergestellt, dass das Skript sich im Suchpfad der Shell befindet und wie ein Kommando ausgeführt werden kann.
Erklärung
01 SET hcwd `CD`
Legt in der Shell-Variablen hcwd den Pfadnamen des Stammverzeichnisses ab.
- Mit SET <Variablenname> <Wert> bzw. UNSET <Name> werden lokale Shell-Variablen gesetzt/gelöscht.
- Die umgekehrten einfachen Anführungszeichen (über der TAB-Taste) haben in der Shell eine besondere Bedeutung: Die Befehlszeile zwischen den Zeichen wird in der Shell ausgeführt, und der gesamte Ausdruck vom ersten bis zum zweiten Anführungszeichen wird durch die Ausgabe erstetzt. `CD` ist also gleichbedeutend mit dem aktuellen Verzeichnispfad.
03 LIST DIRS ALL P ~(tn) LFORMAT "CD %F%N*NCD*Nhtmlcat-rx.script" >T:htmlcat-rx-stapel.$process
Erzeugt eine temporäre Befehlsdatei, die in sämtliche Unterverzeichnisse verzweigt, und dort jeweils das Haupt-Skript startet.
- DIRS sorgt dafür, dass nur Verzeichnisse (keine Dateien) aufgelistet werden.
- ALL - Rekursive Suche (Unterverzeichnisse werden mit einbezogen)
- P <Suchmuster> legt ein Suchmuster (Pattern) fest. ~(tn) bedeutet: Alles ausser "tn". In Verzeichnissen mit dem Namen "tn" legt das Haupt-Skript die verkleinerten Vorschau-Bilder (Thumbnails) für die Kataloge ab. Die Thumbnails selbst sollen natürlich nicht katalogisiert werden.
- Der Format-String für das temporäre Skript:
- Das allein stehende CD gibt zur Kontrolle den Namen des gerade bearbeiteten Unterverz. aus.
- htmlcat-rx.script ist der Name des Haupt-Skripts
- Um Multitasking-Probleme zu vermeiden (mehrere Prozesse greifen auf dieselbe Datei zu), sollte man an temporäre Dateien immer die Nummer des erzeugenden Prozesses anhängen. Die Shell stellt die aktuelle Prozessnummer in der Variablen process zur Verfügung.
- Shell-Variablen werden durch ein vorangestelltes Dollar-Zeichen referenziert.
04 IF `LIST T:htmlcat-rx-stapel.$process LFORMAT %L` EQ "empty"
Beginn einer bedingten Programmausführung. Standard-Sicherheitsabfrage.
Der folgende Block wird ausgeführt, falls das eben erzeugte Skript leer ist (also keine Unterverzeichnisse vorhanden sind). Durch diese Abfrage wird verhindert, dass eine leere Befehlsdatei ausgeführt wird, was zu einem Fehler-Abbruch führen würde.
- IF <Bedingung> (if: falls) bedeutet, dass der folgende Block nur ausgeführt wird, falls die Bedingung wahr (TRUE) ist.
- Ein bedingter Block endet entweder mit ELSE (anderenfalls) oder ENDIF.
- Der Format-String %L liefert die Länge einer Datei in Bytes, bzw. den String empty für eine leere Datei.
- Ist der LIST Befehl lokalisiert, muss empty evtl. durch leer ersetzt werden.
- EQ (equal, gleich) ist ein Vergleichsoperator für Strings, der den Wert TRUE (wahr) für identische Zeichenketten liefert. (Für Zahlenwerte: VAL EQ)
05 DELETE T:htmlcat-rx-stapel.$process
Das leere temporäre Skript wird gelöscht.
06 ELSE
Falls die temporäre Datei nicht leer ist:
07 EXECUTE T:htmlcat-rx-stapel.$process
Führt das temporäre Skript aus.
08 DELETE T:htmlcat-rx-stapel.$process QUIET
Löscht das temporäre Skript.
- QUIET unterdrückt bei den meisten Shell-Kommandos die Bildschirm-Ausgabe. Eine andere Möglichkeit: >NIL: (Umleitung ins Daten-Nirvana)
09 ENDIF
Ende der bedingten Ausführung.
11 CD $hcwd
Wechselt wieder ins Stammverzeichnis.
13 UNSET hcwd
hcwd wird nicht mehr gebraucht.
15 htmlcat-rx.script
Führt das Haupt-Skript im Stammverzeichnis aus.
Das Haupt-Skript: Katalog-Erzeugung
#
|
s:htmlcat-rx.script / Download
|
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
SET WD `cd` ECHO "<html><head><meta http-equiv=*"Content-Type*" content=*"text/html; charset=iso-8859-1*"><title>HTML-Katalog: $WD</title></head>" >index.htm ECHO "<body><a href=*"../index.htm*">zurück</a><br><br>" >>index.htm ECHO "<h4 align=*"center*">$WD/</h4><p align=*"center*">Thumbnail-Größe: 15%<br><br><br>" >>index.htm LIST DIRS P ~(tn) LFORMAT "ECHO *"DIR: <a href=***"%N/index.htm***">%N/</a><br>*" >>index.htm" >T:dirs.$process IF `LIST T:dirs.$process LFORMAT %L` EQ "empty" DELETE T:dirs.$process QUIET ELSE SORT T:dirs.$process T:dirs.$process EXECUTE T:dirs.$process DELETE T:dirs.$process QUIET ENDIF IF NOT EXISTS tn/ MAKEDIR tn ENDIF LIST P #?.(jpg|jpeg|jfif|tga|targa|gif|ilbm|iff|bmp|pcx|png) LFORMAT "IF NOT EXISTS tn/%M.gif*NRx *"ADDRESS IMAGEFX.1 LOADBUFFER '$WD/%N' FORCE*"*NRx *"ADDRESS IMAGEFX.1 SCALE 15 15 PERCENT*"*NRx *"ADDRESS IMAGEFX.1 COLOR2CMAP 256 NONE*"*NRx *"ADDRESS IMAGEFX.1 SAVEBUFFERAS GIF '$WD/tn/%M.gif'*"*NENDIF" >T:htmlcat-rx.$process IF `LIST T:htmlcat-rx.$process LFORMAT %L` EQ "empty" DELETE T:htmlcat-rx.$process QUIET ELSE EXECUTE T:htmlcat-rx.$process DELETE T:htmlcat-rx.$process QUIET ENDIF LIST P #?.(jpg|jpeg|jfif|tga|targa|gif|ilbm|iff|bmp|pcx|png) LFORMAT "ECHO *"<a href=***"%N***">*" noline >>T:tmp.$process*NPicSize tn/%M.gif >>T:tmp.$process*NECHO *"alt=***"%N***" border=***"0***"></a>*" >>T:tmp.$process" >T:index.$process IF `LIST T:index.$process LFORMAT %L` EQ "empty" DELETE T:index.$process QUIET ELSE EXECUTE T:index.$process DELETE T:index.$process QUIET ENDIF IF EXISTS T:tmp.$process ;its opened with >>, not > IF `LIST T:tmp.$process LFORMAT %L` EQ "empty" DELETE T:tmp.$process QUIET ELSE Rep T:tmp.$process "ALT=*"*" BORDER=*"0*">*N" "" SORT T:tmp.$process T:tmp.$process TYPE T:tmp.$process >>index.htm DELETE T:tmp.$process QUIET ENDIF ENDIF ECHO "<br clear=*"all*"><br><br>" >>index.htm LIST P #?.(jpg|jpeg|jfif|tga|targa|gif|ilbm|iff|bmp|pcx|png) LFORMAT %N >pix.txt IF `LIST pix.txt LFORMAT %L` EQ "empty" DELETE pix.txt QUIET ELSE SORT pix.txt pix.txt ECHO "<a href=*"pix.txt*">Liste der Bildnamen zum Batch-Download</a>" >>index.htm ENDIF ECHO "</p><hr><p align=*"right*"><small>htmlcat-rx by Alexander Richter<br>ImageFX © Nova Design<br>PicSize by Christopher Naas<br>Rep by D. Keletsekis<br>ARexx, Shell, Datatypes © Amiga Inc.</small></p></body></html>" >>index.htm
|
Erklärung
03 ECHO "<html><head><meta http-equiv=*"Content-Type*" content=*"text/html; charset=iso-8859-1*"><title>HTML-Katalog: $WD</title></head>" >index.htm
04 ECHO "<body><a href=*"../index.htm*">zurück</a><br><br>" >>index.htm
05 ECHO "<h4 align=*"center*">$WD/</h4><p align=*"center*">Thumbnail-Größe: 15%<br><br><br>" >>index.htm
Schreibt den Kopf des HTML-Dokuments (aktuelles Verz./index.htm).
- Das doppelte Umleitungszeichen >> sorgt dafür, dass die Datei nicht überschrieben wird, sondern zusätzliche Zeilen an die Datei angehängt werden.
07 LIST DIRS P ~(tn) LFORMAT "ECHO *"DIR: <a href=***"%N/index.htm***">%N/</a><br>*" >>index.htm" >T:dirs.$process
08 IF `LIST T:dirs.$process LFORMAT %L` EQ "empty"
09 DELETE T:dirs.$process QUIET
10 ELSE
11 SORT T:dirs.$process T:dirs.$process
12 EXECUTE T:dirs.$process
13 DELETE T:dirs.$process QUIET
14 ENDIF
Erzeugt Links zu Unterverzeichnissen (falls vorhanden). Ausführung der Stapel-Datei mit vorheriger Sicherheitsabfrage (Zeien 8-14).
16 IF NOT EXISTS tn/
17 MAKEDIR tn
18 ENDIF
Erzeugt das Thumbnail-Verzeichnis, falls es nicht schon existiert.
- Der logische DOS-Operator EXISTS liefert den Wert FALSE (falsch), falls der angegebene Verz.Eintrag nicht existiert.
- NOT FALSE ergibt TRUE (logische Verneinung)
- Mit MAKEDIR werden Verzeichnisse angelegt.
20 LIST P #?.(jpg|jpeg|jfif|tga|targa|gif|ilbm|iff|bmp|pcx|png) LFORMAT "IF NOT EXISTS tn/%M.gif*NRx *"ADDRESS IMAGEFX.1 LOADBUFFER '$WD/%N' FORCE*"*NRx *"ADDRESS IMAGEFX.1 SCALE 15 15 PERCENT*"*NRx *"ADDRESS IMAGEFX.1 COLOR2CMAP 256 NONE*"*NRx *"ADDRESS IMAGEFX.1 SAVEBUFFERAS GIF '$WD/tn/%M.gif'*"*NENDIF" >T:htmlcat-rx.$process
Erzeugt die Befehlsdatei, die die (noch nicht vorhandenen) Thumbnails erzeugt.
28 LIST P #?.(jpg|jpeg|jfif|tga|targa|gif|ilbm|iff|bmp|pcx|png) LFORMAT "ECHO *"<a href=***"%N***">*" noline >>T:tmp.$process*NPicSize tn/%M.gif >>T:tmp.$process*NECHO *"alt=***"%N***" border=***"0***"></a>*" >>T:tmp.$process" >T:index.$process
Erzeugt das Skript, das den HTML-Code für die Thumbnails in die temporäre Datei T:tmp.$process schreibt.
36 IF EXISTS T:tmp.$process ;its opened with >>, not >
37 IF `LIST T:tmp.$process LFORMAT %L` EQ "empty"
38 DELETE T:tmp.$process QUIET
39 ELSE
40 Rep T:tmp.$process "ALT=*"*" BORDER=*"0*">*N" ""
41 SORT T:tmp.$process T:tmp.$process
42 TYPE T:tmp.$process >>index.htm
43 DELETE T:tmp.$process QUIET
44 ENDIF
45 ENDIF
Der temporäre HTML-Code wird, falls vorhanden, korrigiert und an index.htm angefügt.
- Wird eine Datei mit doppelten Umleitungszeichen geöffnet, ist sie bei leerer Ausgabe nicht leer, sondern nicht vorhanden.
- Alles, was nach einem Semikolon (Strichpunkt) steht, wird von der Shell ignoriert (Kommentare).
- Der Rep Befehl löscht den überflüssigen HTML-Code inkl. des von PicSize ausgegebenen Zeilenumbruchs. Der Code wird damit auf eine Zeile pro Bild reduziert.
- Mit SORT werden Dateien zeilenweise (also hier die Bild-Links) alphanumerisch sortiert.
Anschliessend muss nur noch das Ende des HTML-Dokuments in index.htm geschrieben werden. Ausserdem wird noch eine Text-Liste der Bildnamen generiert (47-57).
Das Ergebnis sieht dann z.B. so aus:
16.5.2002