PROGRAM HTML;

{$DEFINE debug}

{$IFDEF debug}
{$A-,B-,D+,E+,F-,G+,I-,L+,N-,O-,P-,Q+,R+,S+,T-,V-,X+,Y+}
{$ELSE}
{$A-,B-,D-,E+,F-,G+,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X+,Y-}
{$ENDIF}

USES
  APP,DIALOGS,DOS,DRIVERS,EDITORS,HISTLIST,MEMORY,MENUS,OBJECTS,
  STDDLG,VIEWS,CRT;

TYPE
  TMyApp	= OBJECT(TApplication)
		    PROCEDURE	HandleEvent(VAR Event: TEvent); VIRTUAL;
		    PROCEDURE	InitMenuBar; VIRTUAL;
		    PROCEDURE	InitStatusLine; VIRTUAL;
		    PROCEDURE 	ChDir;
		    PROCEDURE	Change;
		    PROCEDURE	HTML;
		    PROCEDURE	Head;
		    PROCEDURE	Adr;
		  END;
  PWaitDialog   = ^TWaitDialog;
  TWaitDialog   = OBJECT(TDialog)
		    st		: PStaticText;
		    CONSTRUCTOR	INIT(sti: STRING);
		    PROCEDURE	Update(sti: STRING);
		  END;
  NameType	= ^NameRec;
  NameRec	= RECORD
		    old	: STRING[80];
		    new	: STRING[12];
		    next: NameType;
		  END;

CONST
  cmChange	= 200;
  cmHTML	= 201;
  cmHead	= 202;
  cmAdr		= 203;
  MaxChange	= 11;
  CArray	: ARRAY[1..2*MaxChange] OF STRING =
		    ('<a href','<A HREF','</a>','</A>',
		     '<li>','<LI>','</li>','</LI>',
		     '<menu>','<MENU>','</menu>','</MENU>',
		     '<hr>','<HR>',
		     '<dl>','<DL>','</dl>','</DL>',
		     '<dt>','<DT>',
		     '<dd>','<DD>'
		    );

VAR
  MyApp				: TMyApp;
  buff				: ARRAY[1..20000] OF BYTE;

PROCEDURE InsertButton(x,y,b:WORD;
		       ATitle: TTitleStr; ACommand: Word;AFlags: Byte;
		       dlg:PDialog);
 VAR
   rect : TRect;
 BEGIN
   WITH dlg^DO BEGIN
     rect.Assign(x,y,x+b,y+2);
     INSERT(NEW(PButton,Init(rect,Atitle,Acommand,AFlags)));
   END;
 END {InsertButton};

PROCEDURE InsertButton_OK (x,y:WORD;dlg:PDialog);
 VAR
   rect : TRect;
 BEGIN
   WITH dlg^ DO BEGIN
     rect.Assign(x,y,x+10,y+2);
     INSERT(NEW(PButton,Init(rect,'O~K~',cmOK,bfdefault)));
   END;
 END {InsertButton_OK};

PROCEDURE InsertButton_Cancel (x,y:WORD;dlg:PDialog);
 VAR
   rect : TRect;
 BEGIN
   WITH dlg^ DO BEGIN
     rect.Assign(x,y,x+10,y+2);
     INSERT(NEW(PButton,Init(rect,'~C~ancel',cmCancel,bfnormal)));
   END;
 END {InsertButton_OK};

FUNCTION Ext(VAR fs,ts: STRING):WORD;
  VAR
    dlg		: PDialog;
    rect	: TRect;
    control	: PView;
    data	: RECORD
		    fstr,tstr: STRING[3]
		  END;
    butt	: WORD;
  BEGIN
    rect.Assign(0,0,28,7);
    NEW(dlg,Init(rect,'Extension'));
    WITH dlg^ DO BEGIN
      options:=options OR ofCentered;

      rect.Assign(9,2,14,3);
      control:=NEW(PInputLine,Init(rect,3));
      INSERT(control);
      rect.Assign(2,2,8,3);
      INSERT(NEW(PLabel,Init(rect,'From:',control)));

      rect.Assign(20,2,25,3);
      control:=NEW(PInputLine,Init(rect,3));
      INSERT(control);
      rect.Assign(15,2,19,3);
      INSERT(NEW(PLabel,Init(rect,'To:',control)));

      InsertButton_OK(2,4,dlg);
      InsertButton_Cancel(15,4,dlg);

      SelectNext(FALSE);
    END;
    data.fstr:=fs; data.tstr:=ts;
    butt:=MyApp.ExecuteDialog(dlg,@data);
    IF butt=cmOK THEN BEGIN
      fs:=data.fstr; ts:=data.tstr;
    END;
    Ext:=butt;
  END {Ext};

FUNCTION Exist(fname:STRING):BOOLEAN;
  VAR
    f	: FILE;
  BEGIN
    Exist:=TRUE;
    {$I-}
    ASSIGN(f,fname); RESET(f); CLOSE(f);
    {$I+}
    IF IORESULT<>0 THEN Exist:=FALSE;
  END {Exist};

CONSTRUCTOR TWaitDIALOG.Init;
  VAR
    rect: TRECT;
  BEGIN
    rect.Assign(0,0,21,5);
    INHERITED Init(rect,'Examing...');
    rect.ASSIGN(3,2,16,3);
    st:=NEW(PStaticText,Init(rect,sti));
    INSERT(st);
    options:=options+ofCentered;
  END {TWaitDialog.Init};

PROCEDURE TWaitDIALOG.Update;
  VAR
    rect: TRECT;
    sp	: STRING[4];
  BEGIN
    DISPOSE(st,DONE);
    rect.ASSIGN(3,2,15,3);
    st:=NEW(PStaticText,Init(rect,sti));
    INSERT(st);
  END {TWaitDialog.Update};

PROCEDURE TMyApp.HandleEvent(VAR Event: TEvent);
  VAR
    rect	: TRect;
  BEGIN
    INHERITED HandleEvent(Event);
    IF Event.What=evCommand THEN BEGIN
      CASE Event.Command OF
	cmChangeDir 	: ChDir;
	cmChange	: Change;
	cmHTML		: HTML;
	cmHead		: Head;
	cmAdr		: Adr;
      END;
      ClearEvent(Event);
    END;
  END {TMyApp.HandleEvent};

PROCEDURE TMyApp.InitMenuBar;
  VAR
    rect: TRect;
  BEGIN
    GetExtent(rect);
    rect.B.Y:=rect.A.Y+1;
    MenuBar:=NEW(PMenuBar,Init(rect,NewMenu(
      NewSubMenu('~F~ile',0,NewMenu(
	StdFileMenuItems(
	NIL)),
      NewSubMenu('~E~dit',0,NewMenu(
	NewItem('Change ~S~tyle','',kbNoKey,cmChange,0,
	NewItem('HTML ~r~eferences','',kbNoKey,cmHTML,0,
	NewItem('~H~eader','',kbNoKey,cmHead,0,
	NewItem('~A~ddress','',kbNoKey,cmAdr,0,
	NIL))))),
      NIL)))
    ));
  END {TMyApp.InitMenuBar};

PROCEDURE TMyApp.InitStatusLine;
  VAR
    rect: TRect;
  BEGIN
    GetExtent(rect);
    rect.A.Y:=rect.B.Y-1;
    StatusLine:=NEW(PStatusLine,Init(rect,
      NewStatusDef(0,$FFFF,
	NewStatusKey('~Alt-X~ Exit',kbAltX,cmQuit,
	NIL),
      NIL)
    ));
  END {TMyApp.InitStatusLine};

PROCEDURE TMyApp.ChDir;
  VAR
    chdirdlg	: PChDirDialog;
    c		: WORD;
  BEGIN
    NEW(chdirdlg,Init(cdNormal,2));
    ExecuteDialog(chdirdlg,@c);
  END {TMyApp.ChDir};

PROCEDURE TMyApp.Change;
  VAR
    e1,e2	: STRING[3];
    p,n,e,liner,linew	: STRING;
    fr,fw	: TEXT;
    recC	: SearchRec;
    dlg		: PWaitDialog;
    c		: CHAR;
    po,i,l	: BYTE;
    butt	: WORD;
  BEGIN
    e1:='HTM'; e2:='HT1';
    butt:=Ext(e1,e2);
    IF butt=cmOK THEN BEGIN
      New(dlg,Init('Starting...')); Desktop^.Insert(dlg);
      FINDFIRST('*.'+e1,AnyFile,recC);
      WHILE DOSERROR=0 DO BEGIN
	dlg^.Update(recC.Name);
	ASSIGN(fr,recC.Name); RESET(fr);
	FSPLIT(recC.Name,p,n,e);
	ASSIGN(fw,n+'.'+e2); REWRITE(fw);
	REPEAT
	  READLN(fr,liner);
	  linew:=liner;
	  FOR i:=1 TO MaxChange DO BEGIN
	    po:=POS(CArray[2*i-1],liner);
	    IF po>0 THEN BEGIN
	      l:=LENGTH(CArray[2*i-1]);
	      SYSTEM.DELETE(linew,po,l); SYSTEM.INSERT(CArray[2*i],linew,po);
	    END;
	  END;
	  WRITELN(fw,linew);
	UNTIL EOF(fr);
	CLOSE(fr); CLOSE(fw);
	FINDNEXT(recC);
      END;
      Desktop^.Delete(dlg);
    END {BUTT};
  END {TMyApp.Change};

PROCEDURE TMyApp.HTML;
  VAR
    rect	: TRect;
    dlg		: PDialog;
    dlg2	: PWaitDialog;
    control	: PView;
    butt	: WORD;
    data	: STRING[8];
    e1,e2	: STRING[3];
    fi,fr,fw	: TEXT;
    linei,liner,linew	: STRING;
    search,newname	: STRING;
    poi,por,po_,i	: BYTE;
    starti,endi		: BYTE;
    p,n,e		: STRING;
    recH		: SearchRec;
    namef,namel,nameh	: NameType;
  BEGIN
    e1:='HT1'; e2:='HT2';
    NEW(namef); namel:=namef; namel^.old:=''; namel^.new:='';
    butt:=Ext(e1,e2);
    IF butt=cmOK THEN BEGIN
      ASSIGN(fi,'biblio.'+e1); RESET(fi);
      REPEAT
	READLN(fi,linei);
	poi:=POS('.html',linei);
	IF poi>0 THEN BEGIN
	  starti:=POS('"',linei)+1; endi:=poi+4;
	  search:=SYSTEM.COPY(linei,starti,endi-starti+1);
			{search=Adie_Chris.html}
	  po_:=POS('_',search);
	  newname:=search;
	  DEC(newname[0],5);
	  IF po_>0 THEN DEC(newname[0],BYTE(newname[0])-po_+1);
			{newname=Adie}
	  FOR i:=1 TO BYTE(newname[0]) DO
	    IF newname[i]<'a' THEN newname[i]:=CHAR(BYTE(newname[i])+$20);
			{newname=adie}
	  IF BYTE(newname[0])>6 THEN DEC(newname[0],BYTE(newname[0])-6);
	  newname:='i_'+newname;
	  IF NOT Exist(newname+'.htm') THEN BEGIN
	    rect.Assign(0,0,50,10);
	    NEW(dlg,Init(rect,'Input name'));
	    WITH dlg^ DO BEGIN
	      options:=options OR ofCentered;

	      rect.Assign(3,2,31,4);
	      INSERT(NEW(PStaticText,Init(rect,search+
			#13#10'File '+newname+'.htm not found.')));

	      rect.Assign(13,5,23,6);
	      control:=NEW(PInputLine,Init(rect,8));
	      INSERT(control);
	      rect.Assign(2,5,12,6);
	      INSERT(NEW(PLabel,Init(rect,'New name:',control)));

	      InsertButton_OK(5,7,dlg);
	      InsertButton_Cancel(18,7,dlg);

	      SelectNext(FALSE);
	    END {WITH dlg^};
	    data:=newname;
	    butt:=MyApp.ExecuteDialog(dlg,@data);
	    IF butt=cmOK THEN newname:=data;
	  END {NOT Exist};
	  NEW(nameh); namel^.next:=nameh; namel:=nameh;
	  namel^.old:=search; namel^.new:=newname+'.htm'; namel^.next:=NIL;
	END {poi>0};
      UNTIL EOF(fi);
      CLOSE(fi);

      New(dlg2,Init('Starting...')); Desktop^.Insert(dlg2);
      FINDFIRST('*.'+e1,AnyFile,recH);
      WHILE DOSERROR=0 DO BEGIN
	dlg2^.Update(recH.Name);
	ASSIGN(fr,recH.Name); RESET(fr);
	FSPLIT(recH.Name,p,n,e);
	ASSIGN(fw,n+'.'+e2); REWRITE(fw);
	REPEAT
	  READLN(fr,liner);
	  linew:=liner;
	  por:=POS('.html',liner);
	  IF por>0 THEN BEGIN
	    po_:=POS('"',liner)+1;
	    search:=SYSTEM.COPY(liner,po_,por-po_+5);
	    SYSTEM.DELETE(linew,po_,por+5-po_);
	    nameh:=namef;
	    REPEAT
	      nameh:=nameh^.next;
	    UNTIL (nameh=NIL) OR (nameh^.old=search);
	    IF nameh=NIL THEN SYSTEM.INSERT(search,linew,po_+1)
	    ELSE SYSTEM.INSERT(nameh^.new,linew,po_);
	  END {por>0};
	  WRITELN(fw,linew);
	UNTIL EOF(fr);
	CLOSE(fr); CLOSE(fw);
	FINDNEXT(recH);
      END {DOSERROR=0};
      Desktop^.Delete(dlg2);
      nameh:=namef;
      REPEAT
	nameh:=nameh^.next; DISPOSE(namef); namef:=nameh;
      UNTIL namef=NIL;
    END {butt};
  END {TMyApp.HTML};

PROCEDURE TMyApp.Head;
  VAR
    butt		: WORD;
    e1,e2		: STRING[3];
    fr,fw		: TEXT;
    namef,namel,nameh,nameh2	: NameType;
    liner,linew,start	: STRING;
    po_			: BYTE;
    dlg			: PWaitDialog;
    ok			: BOOLEAN;
    p,n,e		: STRING;
  BEGIN
    e1:='HT2'; e2:='HT3';
    butt:=Ext(e1,e2);
    IF butt=cmOK THEN BEGIN
      NEW(namef); namef^.next:=NIL; namel:=namef; namel^.new:=''; namel^.old:='';
      ASSIGN(fr,'biblio.'+e1); RESET(fr);
      ok:=FALSE;
      REPEAT
	READLN(fr,liner);
	start:=liner; IF start[0]>#10 THEN SYSTEM.DELETE(start,11,BYTE(start[0])-10);
	po_:=POS('.htm',liner);
	IF start='<A NAME=A>' THEN ok:=TRUE;
	IF (po_>0) AND ok THEN BEGIN
	  NEW(nameh); namel^.next:=nameh; nameh^.next:=NIL; namel:=nameh;
	  linew:=liner;
	  po_:=POS('"',linew);
	  SYSTEM.DELETE(linew,1,po_);
	  po_:=POS('"',linew);
	  SYSTEM.DELETE(linew,po_,BYTE(linew[0])-po_+1);
	  namel^.old:=linew;
	  linew:=liner;
	  po_:=POS('">',linew);
	  SYSTEM.DELETE(linew,1,po_+2);
	  po_:=POS(',',linew);
	  SYSTEM.DELETE(linew,po_,BYTE(linew[0])-po_+1);
	  namel^.new:=linew;
	END {po_>0}
      UNTIL EOF(fr);
      CLOSE(fr);
      New(dlg,Init('Starting...')); Desktop^.Insert(dlg);
      nameh:=namef; nameh2:=namef;
      REPEAT
	nameh:=nameh^.next;
	FSPLIT(nameh^.old,p,n,e);
	ASSIGN(fr,n+'.'+e1); RESET(fr);
	ASSIGN(fw,n+'.'+e2); REWRITE(fw);
	dlg^.Update(n+'.'+e2);
	REPEAT
	  READLN(fr,liner);
	  WRITELN(fw,liner);
	  linew:=liner;
	  SYSTEM.DELETE(linew,8,BYTE(linew[0])-7);
	  IF linew='<TITLE>' THEN BEGIN
	    WRITELN(fw);
	    WRITELN(fw,'<BR>');
	    IF nameh2=namef THEN WRITELN(fw,'<IMG SRC="b_prev_g.gif"></A>')
	    ELSE WRITELN(fw,'<A HREF="'+nameh2^.old+'"><IMG SRC="b_prev.gif"></A>');
	    WRITELN(fw,'<A HREF="biblio.htm"><IMG SRC="b_up.gif"></A>');
	    IF nameh^.next=NIL THEN WRITELN(fw,'<IMG SRC="b_next_g.gif"></A>')
	    ELSE WRITELN(fw,'<A HREF="'+nameh^.next^.old+'"><IMG SRC="b_next.gif"></A>');
	    WRITELN(fw,'<A HREF="hyper.htm"><IMG SRC="b_cont.gif"></A>');
	    WRITELN(fw,'<BR>');
	    IF nameh2<>namef THEN WRITELN(fw,'<B>Previous: </B><A HREF="'+nameh2^.old+'">'+nameh2^.new+'</A>');
	    WRITELN(fw,'<B>Up: </B><A HREF="biblio.htm">Bibliographie</A>');
	    IF nameh^.next<>NIL THEN WRITELN(fw,'<B>Next: </B><A HREF="'+nameh^.next^.old+'">'+nameh^.next^.new+'</A>');
	    WRITELN(fw,'<B>Contents: </B><A HREF="hyper.htm">Inhalt</A>');
	    WRITELN(fw,'<HR>');
	    WRITELN(fw);
	  END {linew='<title>'}
	UNTIL EOF(fr);
	CLOSE(fr); CLOSE(fw);
	nameh2:=nameh2^.next;
      UNTIL nameh^.next=NIL;
      Desktop^.Delete(dlg);
      nameh:=namef;
      REPEAT
	nameh:=nameh^.next; DISPOSE(namef); namef:=nameh;
      UNTIL namef=NIL;
    END;
  END {TMyApp.Head};

PROCEDURE TMyApp.Adr;
  VAR
    butt		: WORD;
    e1,e2		: STRING[3];
    recA		: SearchRec;
    quit		: BOOLEAN;
    dlg			: PWaitDialog;
    fr,fw		: TEXT;
    p,n,e,liner,linew	: STRING;
  BEGIN
    e1:='HT3'; e2:='HT4';
    butt:=Ext(e1,e2);
    IF butt=cmOK THEN BEGIN
      New(dlg,Init('Starting...')); Desktop^.Insert(dlg);
      FINDFIRST('i_*.'+e1,AnyFile,recA);
      WHILE DOSERROR=0 DO BEGIN
	dlg^.Update(recA.Name);
	ASSIGN(fr,recA.Name); RESET(fr);
	FSPLIT(recA.Name,p,n,e);
	ASSIGN(fw,n+'.'+e2); REWRITE(fw);
	quit:=FALSE;
	REPEAT
	  READLN(fr,liner);
	  linew:=liner;
	  WRITELN(fw,linew);
	  IF (linew='</menu>') OR (linew='</MENU>') THEN BEGIN
	    quit:=TRUE;
	    WRITELN(fw,'<HR>');
	    WRITELN(fw,'<ADDRESS>Erzeugt: 27.09.''95 - Letzte &Auml;nderung: 27.09.''95</ADDRESS>');
	    WRITELN(fw,'<ADDRESS>Olaf Krusche</ADDRESS>');
	    WRITELN(fw,'</HTML>');
	  END;
	UNTIL EOF(fr) OR quit;
	CLOSE(fr); CLOSE(fw);
	FINDNEXT(recA);
      END;
      Desktop^.Delete(dlg);
    END {BUTT};
  END {TMyApp.Adr};

BEGIN
  MyApp.Init;
  MyApp.Run;
  MyApp.Done;
END {ASMEDIT}.
