Ha Pascal programokat Web-lapjainkon meg szeretnénk
jeleníteni, akkor nagy segítséget nyújthat ez az egyszerű kis program. A program
Delphi-ben készült *.pas kiterjesztésű állományokat
tud átírni HTML kóddá. Igyekeztem minél több esetre felkészíteni, de
lehetséges, hogy nem minden fordítható Pascal listát konvertál helyesen. Főleg
a megjegyzések egymásba ágyazására kell vigyázni, mert ott gondok lehetnek.
Ugyancsak gond lehet DOS-os verziójú listákban, ha az ékezetes betűket
tartalmaz. Ez utóbbi esetben a karaktereket kézzel kell a listában átírni.
A program kezelő felülete igen puritán. Gyakorlatilag
csak egy forrásállomány kiválasztására van lehetőség, mely választás után a
konvertálás megtörténik. A HTML állomány a Pascal állomány nevével azonos nevű,
de html kiterjesztésű lesz.
A program futtatási képe:

A forrásfájl kiválasztása OpenDialog segítségével:

A program listája:
unit UPasToHtml;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls;
Const M=93;
Keys: Array[1..M] Of String[14]=
('ABSOLUTE', 'ABSTRACT', 'AND',
'AS', 'ASM', 'ASSEMBLER',
'ARRAY', 'BEGIN', 'CASE',
'CDECL', 'CLASS', 'CONST',
'CONSTRUCTOR', 'DESTRUCTOR', 'DISPID',
'DISPINTERFACE', 'DIV', 'DO',
'DOWNTO', 'DYNAMIC', 'ELSE',
'END', 'EXCEPT', 'EXPORT',
'EXPORTS', 'EXTERNAL', 'FAR',
'FILE', 'FINALIZATION', 'FINALLY',
'FOR', 'FORWARD', 'FUNCTION',
'GOTO', 'IF', 'IMPLEMENTATION',
'IN', 'INDEX', 'INHERITED',
'INITIALIZATION', 'INLINE', 'INTERFACE',
'IS', 'LABEL', 'LIBRARY',
'MESSAGE', 'MOD', 'NEAR',
'NIL', 'NOT', 'OBJECT',
'OF', 'ON', 'OR',
'OUT', 'OVERLOAD', 'OVERRIDE',
'PACKED', 'PASCAL', 'PLATFORM',
'PRIVATE', 'PROCEDURE', 'PROGRAM',
'PROPERTY', 'PROTECTED', 'PUBLIC',
'PUBLISHED', 'RAISE', 'RECORD',
'REGISTER', 'REINTRODUCE', 'REPEAT',
'RESOURCETRING', 'SAFECALL', 'SET',
'SHL', 'SHR', 'STDCALL',
'STRING', 'THREADVAR', 'THEN',
'TO', 'TRY', 'TYPE',
'UNIT', 'UNTIL', 'USES',
'VAR', 'VARARGS', 'VIRTUAL',
'WHILE', 'WITH', 'XOR');
type
TfmPasToHtml = class(TForm)
btForrasFile: TButton;
btKilepes: TButton;
OpenDialog: TOpenDialog;
Function Van(S: String): Boolean;
Procedure Kiir(S: String);
procedure btKilepesClick(Sender: TObject);
procedure btForrasFileClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmPasToHtml: TfmPasToHtml;
FTextP, FTextH: Text;
DNev, HNev: String;
Direkt, Gomb, Kapocs, Rem, Idez: Boolean;
implementation
{$R *.dfm}
procedure TfmPasToHtml.btKilepesClick(Sender: TObject);
begin
Close;
end;
Function TfmPasToHtml.Van(S: String): Boolean;
Var I: Word;
Begin
Van:= False;
For I:= 1 To M Do If S=Keys[I] Then Begin Van:= True; Break End;
End;
Procedure TfmPasToHtml.Kiir(S: String);
Var I, J: Word;
A, B: String;
Begin
I:= 1; Rem:= False;
If S<>'' Then While S[I]=' ' Do Begin Write(FTextH, ' '); Inc(I) End;
While I<=Length(S) Do
Begin
A:= '';
Case S[I] Of
//nyitó kapcsos zárójelet és $ jeleket keres:
#123: If S[I+1]='$' Then
Begin
Direkt:= True; Write(FTextH, '<font color=green>',Chr(123),'$');
Inc(I,2);
End
//ha csak nyitó kapcsos zárójelet talált:
Else
If Not Rem Then
Begin
Kapocs:= True;
Write(FTextH, '<font color=blue><i>',Chr(123)); Inc(I);
End;
//ha záró kapcsos zárójelet talált:
#125: Begin
Kapocs:= False; Write(FTextH,Chr(125),'</i>','</font>');
Inc(I);
End;
//( és * jeleket keres:
'(': If S[I+1]='*' Then
Begin
If Not Gomb And Not Kapocs And Not Rem Then
Begin
Gomb:= True;
Write(FTextH, '<font color=blue><i>',Chr(40),'*');
Inc(I,2);
End;
End
//ha csak (-jelet talált:
Else
Begin Write(FTextH, '('); Inc(I) End;
//* és ) jeleket keres:
'*': If S[I+1]=')' Then
Begin
If Gomb Or Kapocs Or Rem Then
Begin
Gomb:= False;
Write(FTextH, '</i>*',Chr(41),'</font>');
Inc(I,2);
End;
End
//ha csak *-jelet talált:
Else
Begin Write(FTextH, '*'); Inc(I) End;
//egysoros rem-et keres:
'/': If S[I+1]='/' Then
Begin
Rem:= True;
Write(FTextH, '<font color=blue>/',Chr(47),'<i>'); Inc(I,2);
End
//ha csak egy /-jelet talált
Else
Begin Write(FTextH, '/'); Inc(I) End;
//ha idézőjelet talált:
#39: Begin Write(FTextH, Chr(39)); Inc(I); Idez:= Not Idez End;
//ha tag-nyitó jelet talál
'<': Begin Write(FTextH, '<'); Inc(I) End;
//szót keres:
'a'..'z','A'..'Z':
While (S[I] In ['a'..'z','A'..'Z']) And (I<=Length(S)) Do
Begin A:= A+S[I]; Inc(I) End;
//több space-t keres a sor belsejében
' ': If S<>'' Then While S[I]=' ' Do
Begin Write(FTextH, ' '); Inc(I) End;
Else Begin Write(FTextH, S[I]); Inc(I) End;
End;
If Length(A)>0 Then //ha szót talált
Begin
B:= A; For J:= 1 To Length(A) Do B[J]:= UpCase(A[J]);
If Van(B) And Not Direkt And Not Gomb And
Not Kapocs And Not Rem And Not Idez Then
//nem Rem-ben és idézőjelben lévő lefoglalt szót talált
Write(FTextH, '<b><u>', A, '</u></b>') Else Write(FTextH, A);
End;
End;
WriteLn(FTextH, '<br>');
If Direkt Then
Begin Direkt:= False; Write(FTextH, '</font><font face=Courier>') End;
If Rem Then Begin Rem:= False; Write(FTextH,'</i></font>') End;
End;
procedure TfmPasToHtml.btForrasFileClick(Sender: TObject);
Var Ws: String;
begin
With OpenDialog Do
If Execute Then
Begin
DNev:= FileName; HNev:= Copy(DNev,1,Length(DNev)-3)+'html';
AssignFile(FTextP,DNev); Reset(FTextP);
AssignFile(FTextH,HNev); ReWrite(FTextH);
Write(FTextH, '<html><body><font face=Courier>');
Direkt:= False; Gomb:= False; Kapocs:= False; Idez:= False;
While Not EOF(FTextP) Do
Begin ReadLn(FtextP, Ws); Kiir(Ws) End;
Write(FTextH, '</font></body></html>');
CloseFile(FTextH);
CloseFile(FTextP);
End;
end;
end.