Oft besteht der Wunsch, eine ASCII-Datei nachträglich zu bearbeiten, etwa durch das Hervorheben einiger besonderer Worte. Mit diesem Formatierer ist dies für alle ASCII-Texte möglich.
Nun, was kann der Formatierer? Mit ihm ist es möglich, bestimmte Worte (hier als Schlüsselworte bezeichnet) durch Großschreibung hervorzuheben. Zusätzlich kann man Zeilennummern vor jede Zeile schreiben.
Und wie arbeitet man mit dem Programm? Ganz einfach. Mit irgendeinem ASCII-Editor fertigt man sich eine Schlüsselwortdatei an. Pro Zeile steht dort ein bis zu 40 Zeichen langes Wort. ('Donaudampf schiffahrtsgesellschaftskapitän' geht leider nicht mehr!) Wichtig ist, daß man eventuell Leerzeichen hinzufügt. Untersucht man etwa einen PASCAL-Quelltext auf das Wort for, so werden alle Buchstabenkombinationen mit for hervorgehoben. also auch ein Name wie format. Dieser wird zu FORmat. Hängt man an das 'for' ein Leerzeichen, kann diese Fehlformatierung nicht auftreten. Hat man eine solche Schlüsselwort-Datei zur Verfügung, braucht man nur noch das Programm FORMATER.TTP aufzurufen und in der Dialogbox erst die zu verändernde Datei, dann die Schlüsselwortdatei und schließlich eventuell ein '+' für Zeilennummern einzutragen.
Die Schlüsselwortdateien haben einen großen Vorteil gegenüber steifen Textformatierern. Man kann beliebige ASCII-Texte bearbeiten (etwa Sourcecodetexte in BASIC PASCAL oder anderen Programmiersprachen) und dort bestimmte Worte hervorheben. Beispielsweise könnte man in einem PASCAL-Sourcecode Pascal- oder Library-Schlüsselworte hervorheben.
Nun etwas zum Programm. Das in ST Pascal Plus geschriebene Programm liest erst eine Schlüsselwort- und dann eine Textdatei zeilenweise ein. Beim Einlesen der Schlüssel worte werden diese automatisch in Kleinbuchstabenschreibweise übersetzt. Also braucht man auf die Schreibweise der Schlüsselworte nicht unbedingt zu achten. Jede Textzeile wird nacheinander nach jedem Schlüsselwort untersucht. Hierzu wird jeweils eine Kennzeile erzeugt (mit Kleinbuchstaben), in der die ebenso klein geschriebenen Schlüsselworte gesucht werden. Sollte ein Schlüsselwort gefunden werden, wird es in der Text- und der Kennzeile groß geschrieben. Somit kann es in der Kennzeile zumindest an dieser Stelle nicht erneut gesucht werden. Die fertige Zeile wird ggf. mit Zeilennummer in die neue Datei OUTPUT TXT geschrieben. Für die PASCAL-Programmierer sind noch einige Bemerkungen im Listing zu finden. Das Programm wurde als TOS-Anwendung übersetzt und nachträglich von .TOS in .TTP umbenannt.
Als Beispiel einer solchen Textformatierung wurde das Listing dieses Programmes bearbeitet.
(***********************************************)
(* Universal-Formatierer für ASCII-Texte *)
(* ------------------------------------------- *)
(* Mit Hilfe dieses kleinen Programmes können
bestimmte Worte in *)
(* beliebigen ASCII-Texten durch
Großschreibung dieser Worte *)
(* hervorgehoben werden. Besonders eignet sich
dieses Programm, *)
(* um Programmtexte in BASIC, PASCAL oder
anderen Programmier- *)
(* sprachen zu bearbeiten. *)
(* Autor : Dietmar Rabich,
Dövelingsweg 2, 4408 Dülmen *)
(* Programmiersprache : ST Pascal Plus
Version 1.20 *)
(* Version : 1.0 *)
(* Datum 14. September 1987 *)
(***********************************************)
program ascii_formater;
const max_worte = 250; (* maximale Anzahl der Schlüsselworte *)
type str255 = string|255]; (* maximaler String, 255 Zeichen *)
str40 = string[40]; (* Schlüsselwort, maximal 40 Zeichen *)
var anz_worte : integer; (* Anzahl der Schlüsselworte *)
wort : array [1..max_worte] of str40; (* Array für *)
(* Schlüsselworte *)
(* Procedure, die die Schlüsselworte aus Datei liest *)
procedure schluessel;
var datei : text; (* Textdatei *)
nama : string; (* Dateiname *)
i : integer; (* Laufvariable *)
(* Wandelt Schlüsselworte in Worte mit Kleinbuchstaben u, *)
procedure wandle40(var s:str40);
var i : integer;
begin
for i:=1 to length(s) do
if s[i] in ['A'..'Z'] then
s[i]:=chr(ord(s[i])-ord('A')+ord('a'))
else
case s[i] of
'Ä' : s[i]:='ä' ; (* Umlaute extra betrachtet *)
'Ö' : s[i]:='ö';
'Ü' : s[i]:='ü';
end;
end;
begin
(* Namen der Schlüsselwortdatei ermitteln *)
name:='';
cmd_getarg(2,name); (* Liest ggf. Dateinamen aus Command-Line *)
if name='' then
begin
write('Bitte Schlüsselwortdateiname:');
readln(name);
end
else
writeln('Schlüsselwortdatei: ',name);
(* Schlüsselwortdatei einlesen *)
i:=0;
reset(datei,name);
while (not(eof(datei)) and (i<max_worte)) do
begin
i:=i+1;
readln(datei,wort[i]);
wandle40(wort(i));
end;
close(datei);
anz_worte:=i;
end;
(* Procedure, um Zeile zu formatieren *)
procedure format(var z:str255);
var i : integer; (* Laufvariable *)
p : integer; (* Position Schlüsselwort *)
kenn : str255; (* Kennzeile *)
(* Kennzeile (mit Kleinbuchstaben) erzeugen *)
procedure erzeuge_kennung(z:str255;var k:str255];
(* Procedure ähnlich 'wandle40, aber mit str255*)
var i : integer;
begin
k:=z;
for i:=1 to length(k) do
if k[i] in ['A'..'Z'] then
k[i]:=chr(ord(k[i])-ord('A')+ord('a'))
else
case k[i] of
'Ä' : k[i]:='ä'; (* Umlaute extra betrachtet *)
'Ö' : k[i]:='ö';
'Ü' : k[i]:='ü';
end;
end;
(* Zeichen im String s hervorheben *)
procedure ersetze(var s:str255; m,n:integer);
var i : integer;
begin
for i:=m to m+fn-1 do
if s[i] in ['a'..'z'] then
s[i]:=chr(ord(s[i])-ord('a')+ord('A'))
else
case s[i] of
'ä' : s[i]:='Ä'; (* Umlaute extra betrachtet *)
'ö' : s[i]:='oÖ';
'ü' : s[i]:='Ü';
end;
end;
begin
for i:=1 to anz_worte do
begin
erzeuge_kennung(z,kenn); (*Kennung für jedes M
p:=pos(wort[i],kenn); (* Schlüssel wort *)
while ((p>=1) and (p<=length(z))) do
begin
ersetze(z,p,length(wort[i])); (* Wort in Zeile hervorheben *)
ersetze(kenn,p,length(wort[i])); (* Ebenso in der Kennzeile *)
p:=pos(wort[i],kenn);
end;
end;
end;
(* ASCII-Textdatei Aändern *)
procedure aendere_text;
var datei,datei2 : text; (* Textdateien *)
name : string; (* Dateiname *)
zeile : str255; (* Textzeile *)
zlnr : string; (* Zeilennummerstatus*)
nr : integer; (* Zeilennummer *)
begin
(* Dateinamen ermitteln *)
name:='';
cmd_getarg(1,name); (* Liest ggf. Dateinamen aus Command-Line *)
if name='' then
begin
write('Bitte Dateiname:');
readln(name);
end
else
writeln('Eingabedatei: ',name);
cmd_getarg( 3 ,zlnr); (* Liest ggf. Zeichen aus Command-Line *)
(* Datei verändern, neue Datei: OUTPUT.TXT *)
writeln('Ausgabedatei : OUTPUT.TXT');
nr:=0;
reset(datei,name);
rewrite(datei2,'OUTPUT.TXT');
while not(eof(datei)) do
begin
nr:=nr+1; (* aktuelle Zeilennummer *)
readln(datei,zeile);
format(zeile);
if zlnr='+' then
write(datei2,'( ',nr:5,': ) '); (* Zeilennummer hinzufügen *)
writeln(datei2,zeile);
end;
close(datei2);
close(datei);
end;
(* Hauptprogramm *)
begin
writeln('Universalformatierer für ASCII-Texte ((p)1987/ D. Rabich)');
writeln('<<<<<<<<<< Entwickelt mit ST Pascal Plus 1.20 >>>>>>>>>>>');
schluessel; (* Schlüsselworte lesen *)
aendere_text; (* Text einlesen, ändern und ausgeben *)
end.
(*.... Programmende ................ *)
Listing: Universal-Formatierer für ASCII-Texte