News   Magazin   Börse   Links   ArcArchie   Homepages
 Magazin  Skripte in StrongED Home 
Hardware   Software   Praxis   Sonstiges  
Skripte in StrongED  Carlos Michael Santillán 15. 10. 2009

In StrongED Modus erweitern habe ich gezeigt wie man mit einfachen Mitteln bei StrongED ein Programm aufrufen kann das aus einen Text eine Webseite generiert und diese dann im Browser anzeigt. Diesmal wende ich mich einer anderen Einbindung von Programmen in StrongED zu. Ab der Version 4.67 von StrongED kann man in StrongED mit einem externen Programm einen Text ändern. Damit ist man nicht mehr an die internen Möglichkeiten von StrongED gebunden und hat weit mehr Möglichkeiten einen Text zu verändern ohne dabei StrongED zu verlassen. Dank des leider inzwischen entfernten Artikel auf Gavin Wraiths Homepage und einen weiteren Artikel bei Drobe Launchpad konnte ich mir recht schnell einen Zugang zu dieser Technik verschaffen. Mit der Version 4.68 von StrongED hat sich einiges geändert mit den Skripten. Aber zum Glück kann man die alten Skripte unverändert weiter nutzen.

Apply SymbolScriptSEDFür die Einbindung von externen Programmen ist in der Toolbar von StrongED das Apply Symbol hinzugekommen. Am besten klickt man zuerst mit der Spezialtaste alias Adjust auf das Apply Symbol. Nun kommt eine Sicherheitswarnung, die man mit einen Klick auf Allow action ignoriert. Es öffnet sich dann die Anwendung ScriptSED. Dort muss man zuerst die Programmiersprache des gewünschten Skriptes und dann das eigentliche Skript auswählen. Mit einen Klick auf Apply wird das ausgewählte Programm auf den geladenen Text angewendet und in einen neuen Fenster wird der geänderte Text angezeigt. Der Text im ursprünglichen Fenster bleibt unverändert. Dies funktioniert aber nur wenn RISC OS die ausgewählte Programmiersprache bekannt ist. Bei BASIC ist das kein Problem, da es fester Bestandteil von RISC OS ist. Bei awk und sed muss man einfach den Interpreter in $.!Boot.Library ablegen. Bei awk muss man eventuell den Dateinamen von mawk oder gawk auf awk ändern oder einen entsprechenden Alias anlegen. Da awk und sed mehr Speicher brauchen als dies RISC OS standardmäßig vorgesehen hat, muss man den WimpSlot erhöhen. Ich habe das mit dem CLI Kommando *WimpSlot -next 2048K erledigt oder genauer ich habe dieses Kommando in eine Obey Datei geschrieben und starte diese bei jeden Start meines Rechners. Möchte man Lua, Perl oder Python nutzen, dann muss die jeweilige Laufzeitumgebung von RISC OS vorher gesehen worden sein. Am einfachsten ist es dann das jeweilige Anwendungsverzeichnis in $.!Boot.Resources abzulegen. Am Ende des Artikel findet man Links zu den benötigten Sprachen. In StrongED 4.68 ist standardmäßig sed nicht eingebunden, obwohl es drei Skripte gibt. Weiter unten erkläre ich wie man dies nachholt.

Flexibler ist es wenn man mit Auswahl alias Select auf das Apply Symbol klickt. Dann öffnet sich, nach der Warnung, ein Filer mit mehreren Verzeichnissen. Die Verzeichnisse heißen nach den Programmiersprachen und in ihnen befinden sich die StrongED Skripte. Wenn man ein Skript mit gedrückter Steuerungstaste (Strg/Ctrl) auf das Apply Symbol zieht, dann wird, wie bei ScriptSED, der geänderte Text in einen neuen Fenster angezeigt. Vorher kommt aber wieder die schon bekannte Sicherheitswarnung. Zieht man das Skript mit gedrückter Umschalttaste (Shift) auf das Apply Symbol, dann wird der aktuelle Text verändert. Auch hier kommt die Warnung und mit der Undo Funktion (<F8>) kann man die Änderung rückgängig machen.

Wie schon bemerkt ist die Sicherheitswarnung beim Einsatz von externen Skripten recht störend. Wem das zu lästig ist immer diese Meldung zu bestätigen, kann dies in der Datei ModeLock abschalten. Mit einen Auswahlklick mit gedrückter Steuerungstaste über dem StrongED Symbol auf der Iconbar kann man die Datei ModeLock öffnen. Im Text muss man dann alle N unter Prozess und unter Run in Y ändert. Wer möchte kann diese Einstellung für einzelne StrongED Modi anders handhaben.

Nun sollte man die fehlende Programmiersprache sed für die StrongED Skripte einbinden. Da man keine Änderung in StrongED selbst machen sollte, kopiert man zuerst die Anwendung ScriptSED von !StrongED.Defaults.Tools nach !StrED_cfg.UserPrefs.Tools. Dann wechselt man in das Verzeichnis !StrED_cfg.UserPrefs.Tools.!ScriptSED.Languages und erstellt von der Obeydatei awk eine Kopie mit dem Namen sed im gleichen Verzeichnis. Diese neue Datei wird dann mit StrongED geöffnet und dann alle awk durch sed ersetzt. Danach sollte in der Datei sed ohne Kommentar sed -f <StrongED$Script_Script> <StrongED$Script_Infile> > <StrongED$Script_Outfile> stehen. Damit kann StrongED auch mit externen sed Skripten umgehen. Die Variable StrongED$Script_Script steht für das StrongED Skript, StrongED$Script_Infile für den Text der bearbeitet werden soll und in der Datei StrongED$Script_Infile wird der geänderte Text abgelegt. Wenn man eine Programmiersprache hinzufügen möchte, muss man eine weitere Obeydatei in !ScriptSED.Languages und ein gleichnamiges Verzeichnis in !ScriptSED.Scripts anlegen. Bei awk, sed und anderen Programmiersprachen wird über die Ausgabeumlenkung im Unixstil (> <StrongED$Script_Outfile>) die Ausgabe des Skripts gespeichert. Bei Programmiersprachen, wie zum Beispiel BASIC, die mit der RISC OS Ausgabeumlenkung ({ > DATEI }) umgehen können muss mit einen zweiten Parameter die Zieldatei angeben werden. Aus einen mir nicht ersichtlichen Grund kann StrongED bei den Skripten nicht mit der RISC OS Ausgabeumlenkung arbeiten. Das Programm speichert dann den geänderten Text selbst in die Zieldatei. Bei BASIC heißt der Aufruf deshalb Run <StrongED$Script_Script> <StrongED$Script_Infile> <StrongED$Script_Outfile>. Bei Python Skripten wird, wie bei BASIC, der zweite Parameter für die Zieldatei genommen. Bei Programmiersprachen die sowohl mit der Unix Ausgabeumlenkung umgehen können und auch direkt in einen Datei reinschreiben können hat man die Wahl. Man kann auch für eine Programmiersprache beide Verfahren einsetzen, muss dann dafür zwei angepasste Obeys und zwei Skriptverzeichnisse anlegen.

Screenshot: Zeilenummer einfügen Nun aber endlich zu den Skripten selbst. Beim Aufruf wird dem Programm der Dateiname des ursprünglichen Textes via Parameter übergeben. Diese Datei muss dann im Skript eingelesen werden und je nach Wunsch verändert werden. Über die Ausgabe per print, printf, echo und so weiter wird der neue Text ausgegeben und mit Hilfe des zuständigen Obey aus !ScriptSED.Languages in die Zieldatei geleitet. Bei BASIC und Python speichert das Programm die Änderung über den zweiten Parameter. Wie schon geschrieben kann man dies natürlich ändern. Als erstes Beispiel nehme ich ein awk Skript. Die Sprache ist für die Textmanipulation sehr geeignet und ist auch unter RISC OS recht schnell. Zum Glück stellt StrongED jeden frei die Programmiersprache selber zu wählen und da muss jeder für sich entscheiden, welche Programmiersprache man beherrscht und einen am geeignetsten für das jeweilige Problem erscheint.

#! awk
# Zeilennummer vor jeder Zeile
{ print NR, $0 }
Zeilen nummerieren in awk

Dieses sehr kleine awk Skript schreibt vor jeder Zeile ($0) die Zeilenummer (NR). In BASIC könnte das gleiche Programm wie folgt aussehen:

REM Zeilennummer einfuegen
REM Quell- und Zeildatei via Parameter

ON ERROR PRINT "Error in "; ERL; ": "; REPORT$: END

REM Parameter lesen
DIM blk% 1024
SYS "OS_GetEnv" TO env%
syntax$ = "basic,quit/S,load/S,self,infile,outfile"
SYS "XOS_ReadArgs", syntax$, env%, blk%, 1024
SYS "XOS_GenerateError", blk%!16 TO rein$
SYS "XOS_GenerateError", blk%!20 TO raus$

REM Quelle oeffnen
f_rein% = OPENIN(rein$)

REM Ziel oeffnen
f_raus% = OPENOUT(raus$)

REM erste Zeilennummer ausgeben
zeile% = 1
BPUT#f_raus%, STR$(zeile%) + " ";

REM Datei durchgehen
zeich% = 0
WHILE(zeich% <> 254)
  REM aktuelles Zeichen ausgeben falls nicht 0
  IF zeich% <> 0 THEN BPUT#f_raus%, CHR$(zeich%);

  REM naechstes Zeichen holen
  zeich% = BGET#f_rein%

  REM Zeilenumbruch?
  IF zeich% = 10 THEN
    BPUT#f_raus%, CHR$(zeich%);

    REM Zeilennummer erhoehen
    zeile% += 1
    BPUT#f_raus%, STR$(zeile%) + " ";

    REM aktuelles Zeichen auf 0 setzen
    zeich% = 0
  ENDIF
ENDWHILE
CLOSE #f_raus%
CLOSE #f_rein%
Zeilen nummerieren in BASIC

Beide Beispielskripte und einige weitere kann man herunterladen. Wer selbst ein Skript für StrongED erstellen möchte, kann dies in einen TaskWindow erproben und muss es nicht direkt als StrongED Skript einsetzen. Bei awk geht das, wie im awk Obey in !ScriptSED.Languages, mit dem Aufruf awk -f SCRIPT QUELLDATEI. Der geänderte Text wird dann im TaskWindow ausgegeben. Bei BASIC ist der Aufruf SCRIPT QUELLDATEI ZIELDATEI und hier landet das Ergebnis in die Datei ZIELDATEI. Ich denke wer eine Programmiersprache unter RISC OS mehr oder weniger beherrscht, wird sehen das die Möglichkeit Skripte in StrongED einzubinden nicht nur ein sehr mächtiges Werkzeug ist um kleine und große Probleme komfortabel zu lösen, sondern auch recht einfach anzuwenden ist.

Links zu den benötigten Programmiersprachen:

Kommentar zum Artikel? Fehler gefunden? Etwas unklar? Anmerkungen zu machen? Ergänzungen oder Tipps? Einfach eine Nachricht an mich schicken!

Name:

EMail:

Text:
Hardware   Software   Praxis   Sonstiges  
ArcSite   News   Magazin   Börse   Links   ArcArchie   Homepages