ASCII-Datei-Formatierer (Pascal)

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


Dietmar Rabich
Aus: ST-Computer 01 / 1989, Seite 93

Links

Copyright-Bestimmungen: siehe Über diese Seite