PROGRAM LOCOSCRIPT_KONVERTIERUNG; (* Aus dem Original von W.Otternberg habe ich lediglich den Teil verwendet, *) (* der aus der LocoScript-Datei eine ASCII-Datei macht *) (* Dies habe ich noch erweitert fuer optionale HTML-Ausgabe *) (* Es wird immer die gesamte Datei gewandelt! *) const PufferLen = 2176; {17 Bloecke mit je 128 byte} ff = #$0C; {Form Feed} type FormString = string[ 6]; UmlString = string[10]; NameString = string[15]; HTMLstring = string[50]; var KonvWahl : char; LiRand, Kopfteil, i,n,m, BloeckeEin, StartBlock, ErsteSeite, LetzteSeite : integer; Quelldatei : file; Zieldatei : text; Zieldateiname, Quelldateiname : NameString; Puffer : Array[0..PufferLen] of byte; LayoutTabelle : Array[0..10,0..5] of byte; (* 11111111112222222222333333333344444444445 *) const (* 12345678901234567890123456789012345678901234567890 *) HTMLTexte : array[0..13] of string[40] = ('', (* 0 *) '', (* 1 *) '', (* 2 *) '', (* 3 *) '', (* 4 *) '', (* 5 *) '', (* 6 *) '', (* 7 *) '', (* 8 *) '', (* 9 *) (* *) '"', (* 10 *) '&', (* 11 *) '<', (* 12 *) '>' (* 13 *) ); procedure Fehler(n:integer); Begin case n of 1 : writeln('Ausgabe-Datei ',Zieldateiname,' kann nicht angelegt werden'); 2 : begin writeln('LocoScript nach HTML-Wandler'); writeln; writeln('Aufruf mit:'); writeln; writeln(' LOCOHTML LocoDatei [[HTMLDatei] [Modus]]'); writeln; writeln('Modus ist H (HTML) oder A (ASCII)'); end; 3 : writeln('Fehler ! Datei: ',Quelldateiname,' nicht gefunden'); 4 : writeln('Keine Locoscript-Datei !!!!'); 5 : writeln('Format der Locoscript-Datei ungeeignet!'); 6 : writeln('Locoscript-Datei ist zu lang !!'); end; halt; End; procedure DateinamenHolen; var Modus : string[3]; Ziel : boolean; p : integer; procedure CheckModus; begin KonvWahl:=Modus[2]; if not ((Modus[1]='[') and (Modus[3]=']') and (KonvWahl in ['A','H'])) then begin writeln('Falscher Modus.'); Fehler(2); end; end; procedure CheckZiel; begin p:=pos('.',Zieldateiname); if p=0 then if KonvWahl='H' then Zieldateiname:=Zieldateiname+'.HTM' else Zieldateiname:=Zieldateiname+'.TXT'; end; Begin { DateinamenHolen } KonvWahl:='H'; Ziel:=false; Modus:=''; if Paramcount in [1..3] then Quelldateiname:=ParamStr(1); if Paramcount in [2..3] then Zieldateiname:= ParamStr(2); case Paramcount of 1 : ; 2 : if Zieldateiname[1]='[' then Modus:=Zieldateiname else Ziel:=true; 3 : begin Modus:=ParamStr(3); Ziel:=true; end; else Fehler(2); end; if not (Modus='') then CheckModus; if not Ziel then begin p:=pos('.',Quelldateiname); if p=0 then begin Zieldateiname:=Quelldateiname; CheckZiel; end else begin Zieldateiname:=copy(Quelldateiname,1,pred(p)); CheckZiel; end; end else CheckZiel; End; procedure QuelldateiOeffnen; Begin assign(Quelldatei,Quelldateiname); {$I-}reset(Quelldatei);{$I+} if IOresult<>0 then Fehler(3); End; function UmlautASC(var b:byte):FormString; Begin case b of 208: UmlautASC:='['; 211: UmlautASC:='\'; 212: UmlautASC:=']'; 240: UmlautASC:='{'; 243: UmlautASC:='|'; 244: UmlautASC:='}'; 186: UmlautASC:='~'; else UmlautASC:=chr(b); end; End; function HTMLUmlaut(var b:byte):UmlString; Begin if KonvWahl='H' then begin case b of 208: HTMLUmlaut:='Ä'; 211: HTMLUmlaut:='Ö'; 212: HTMLUmlaut:='Ü'; 240: HTMLUmlaut:='ä'; 243: HTMLUmlaut:='ö'; 244: HTMLUmlaut:='ü'; 186: HTMLUmlaut:='ß'; else HTMLUmlaut:=chr(b); end end else HTMLUmlaut:=UmlautASC(b); End; procedure LocoVorhanden; Begin Blockread(Quelldatei,Puffer,3,BloeckeEin); if ((Puffer[0]=ord('J')) and (Puffer[1]=ord('O')) and (Puffer[2]=ord('Y'))) then begin writeln('Locoscriptdatei : << ',Quelldateiname,' >> gefunden.'); StartBlock:=Puffer[$7E]; if ((not(StartBlock in [1..15])) or (BloeckeEin<3)) then Fehler(4) else begin ErsteSeite:= Puffer[107]; LetzteSeite:=Puffer[109]; writeln('Von Seite : ',ErsteSeite); writeln(' bis Seite: ',LetzteSeite); writeln('Dateigroesse: ',FileSize(Quelldatei) shl 7,' Bytes'); write('Text-Info : '); for i:= 5 to 34 do write(UmlautASC(Puffer[i])); writeln; for i:=35 to 64 do write(UmlautASC(Puffer[i])); writeln; for i:=65 to 94 do write(UmlautASC(Puffer[i])); writeln; for n:=0 to 10 do for m:=0 to 5 do {10 Layouts } LayoutTabelle[n,m]:=Puffer[$80+((10+Puffer[$60])*n)+m]; {Schrift-Rand} Kopfteil:=(Puffer[$70] shr 1)-6; end; end else Fehler(5); End; procedure LocoDateiBearbeiten; var Seitenlaenge, LetzterTab, LiVersatz, n,p,SeitenNr : integer; PufferChr, Schriftart, Hervorhebecode : byte; Textzeile : string[128]; Unterstreichen, StartFlag, EndFlag : boolean; function HTMLcode(i:integer):HTMLstring; begin if KonvWahl='H' then HTMLcode:=HTMLTexte[i] else HTMLcode:=''; end; procedure HTMLout(i:integer); begin Textzeile:=Textzeile+HTMLcode(i); end; procedure ASCIIorHTML(i:integer); begin if KonvWahl='H' then HTMLout(i) else Textzeile:=Textzeile+chr(PufferChr); end; procedure Out(Zeichen:FormString); begin case Zeichen[1] of #$86: begin {Zeilenanfang} p:=LiRand-LiVersatz; Textzeile:=''; if Unterstreichen then HTMLout(3); for n:=1 to p do Textzeile:=Textzeile+' '; if Unterstreichen then HTMLout(2); end; #$88: begin {Zeilenende} if Textzeile[length(Textzeile)]=' ' then delete(Textzeile,length(Textzeile),1); for n:=1 to length(Textzeile) do write(Zieldatei,Textzeile[n]); writeln(Zieldatei); Textzeile:=''; end; #$89: begin {TAB} for n:=succ(p) to (LetzterTab-LiVersatz) do begin Textzeile:=Textzeile+' '; p:=succ(p); end; end; ff: writeln(Zieldatei,ff); {Seitenende} else begin Textzeile:=Textzeile+Zeichen; if length(Zeichen)<6 then p:=p+length(Zeichen); {keine Steuersequenz} end; end; end; {Out} procedure Schriftwahl(x:byte); begin case x of $00: HTMLout(6); $0E: HTMLout(9); $10: HTMLout(9); $14: HTMLout(8); $18: HTMLout(7); end; end; procedure Hervorheben(x:byte); {doppelt/kursiv/unterstr.} begin if (x and $11)>0 then HTMLout(0) else HTMLout(1); if (x and $20)>0 then HTMLout(4) else HTMLout(5); if (x and $06)>0 then begin HTMLout(2); Unterstreichen:=True; end else HTMLout(3); end; procedure LocoSonderzeichen; begin case Puffer[i] of $80: if EndFlag then Out(ff); {Seitenende} $81: Out(' '); {Leerzeichen} $82: begin if Puffer[succ(i)]=1 then Out(#$88); {Seitenwech.} if Puffer[succ(i)]=2 then Out('-'); {Bindestrich} i:=succ(i); end; $86: begin {Zeilenanfang} Out(#$86); i:=i+2; end; $88: begin {Zeilenende} if Puffer[succ(i)]=8 then else Out(#$88); i:=succ(i); end; $89, {Tab} $8B: begin {Buendig-Tab} if Puffer[succ(i)]=0 then LiRand:=Puffer[i+2] else begin LetzterTab:=Puffer[i+2]; Out(#$89); end; if Puffer[i]=$8B then i:=i+7 else i:=i+4; end; $8A: begin {buendig} if Puffer[succ(i)]=8 then else Out(#$88); i:=i+5; end; end; end; {LocoSonderzeichen} procedure Steuerzeichen; begin case Puffer[i] of $83 : begin {Hervorheben ein} case Puffer[succ(i)] of 0,4: HTMLout(0); 1,2: begin HTMLout(2); Unterstreichen:=True; end; 5 : HTMLout(4); end; i:=succ(i); end; $84 : begin {Hervorheben aus} case Puffer[succ(i)] of 0,4: HTMLout(1); 1,2: begin HTMLout(3); Unterstreichen:=False; end; 5 : HTMLout(5); end; i:=succ(i); end; $85 : begin {Einfuegen} case Puffer[succ(i)] of 0: if Puffer[i+2]=1 then Out('-'); {Softtrenn} 2: if Puffer[i+2]<11 then {neues Layout} begin Unterstreichen:=False; Hervorhebecode:=LayoutTabelle[Puffer[i+2],3]; Hervorheben(Hervorhebecode); Schriftart:=LayoutTabelle[Puffer[i+2],0]; Schriftwahl(Schriftart); end; 5: begin {Schrift} Schriftart:=Puffer[i+2]; Schriftwahl(Schriftart); end; end; i:=i+2; end; end; End; {Steuerzeichen} procedure Seitenanfang; Begin Schriftart:=(Puffer[9] and $7F); Hervorhebecode:=Puffer[12]; LiRand:=Puffer[8]; LiVersatz:=LayoutTabelle[0,4]; if LiVersatz>LiRand then LiVersatz:=LiRand; Out(#$86); for n:=3 to Kopfteil do writeln(Zieldatei); end; Begin {LocoDateiBearbeiten} writeln('* B i t t e e t w a s G e d u l d *'); Unterstreichen:=False; SeitenNr:=ErsteSeite; Textzeile:=''; p:=1; QuelldateiOeffnen; Blockread(Quelldatei,Puffer,StartBlock); {Info-Bloecke blind einlesen} while not((eof(Quelldatei)) or (SeitenNr>LetzteSeite)) do begin repeat Blockread(Quelldatei,Puffer,1); {1. Textblock } Seitenlaenge:=(Puffer[0] SHL 7)-2; StartFlag:=(Puffer[2] and $80)>0; EndFlag:=(Puffer[2] and $01)>0; Blockread(Quelldatei,Puffer[128],pred(Puffer[0]),BloeckeEin); if (BloeckeEin<(Puffer[0]-1)) then exit; if StartFlag then Seitenanfang; i:=13; {Textanfang} repeat PufferChr:=Puffer[i]; case PufferChr of $00..$1A: ; { ASCII Steuerzeichen } $22 : ASCIIorHTML(10); { ASCII " } $26 : ASCIIorHTML(11); { ASCII & } $3C : ASCIIorHTML(12); { ASCII < } $3E : ASCIIorHTML(13); { ASCII > } $20..$5A, $61..$7A: Out(chr(PufferChr)); { Druckbare ASCII Steuerzeichen } (* PufferChr !!! *) $83..$85: Steuerzeichen; { LOCO Steuerzeichen } $80..$82, $86..$9F: LocoSonderzeichen; { LOCO Sonderzeichen } else Out(HTMLUmlaut(PufferChr)); { $1B..$1F, $5B..$60, $7B..$7F, $A0..$FF} (* PufferChr !!! *) end; i:=succ(i); until i>Seitenlaenge; until EndFlag=True; SeitenNr:=succ(SeitenNr); end; End; {LocoDateiBearbeiten} procedure Ausgabe; Begin assign(Zieldatei,Zieldateiname); {$I-}rewrite(Zieldatei);{$I+} if IOresult<>0 then Fehler(1); if KonvWahl='H' then begin writeln(Zieldatei,''); writeln(Zieldatei,''); writeln(Zieldatei,''); writeln(Zieldatei,'',Quelldateiname,''); writeln(Zieldatei,''); writeln(Zieldatei,''); writeln(Zieldatei,''); writeln(Zieldatei,''); writeln(Zieldatei,''); end; LocoDateiBearbeiten; if KonvWahl='H' then begin writeln(Zieldatei,''); writeln(Zieldatei,''); end; close(Quelldatei); close(Zieldatei); end; BEGIN {LOCOCON} DateinamenHolen; QuelldateiOeffnen; LocoVorhanden; close(Quelldatei); Ausgabe; END.