home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 February / DPPCPRO0299.ISO / February / Delphi / Runimage / DELPHI20 / DEMOS / INTERNET / HTTP / MAIN.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1996-06-10  |  5.1 KB  |  219 lines

  1. unit main;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   StdCtrls, ExtCtrls, Menus, ComCtrls, OleCtrls, ISP, Buttons, Ole2;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     StatusBar1: TStatusBar;
  12.     MainMenu1: TMainMenu;
  13.     File1: TMenuItem;
  14.     Exit1: TMenuItem;
  15.     Panel1: TPanel;
  16.     Bevel1: TBevel;
  17.     URLs: TComboBox;
  18.     GoButton: TSpeedButton;
  19.     CancelBtn: TSpeedButton;
  20.     Label1: TLabel;
  21.     HTTP1: THTTP;
  22.     Memo1: TMemo;
  23.     procedure Exit1Click(Sender: TObject);
  24.     procedure GoButtonClick(Sender: TObject);
  25.     procedure CancelBtnClick(Sender: TObject);
  26.     procedure HTML1BeginRetrieval(Sender: TObject);
  27.     procedure HTML1EndRetrieval(Sender: TObject);
  28.     procedure URLsKeyDown(Sender: TObject; var Key: Word;
  29.       Shift: TShiftState);
  30.     procedure HTTP1DocOutput(Sender: TObject; const DocOutput: Variant);
  31.   private
  32.     { Private declarations }
  33.   public
  34.     { Public declarations }
  35.   end;
  36.  
  37. var
  38.   Form1: TForm1;
  39.   Data: String;
  40.  
  41. implementation
  42.  
  43. {$R *.DFM}
  44.  
  45. { TSimpleHTMLParser }
  46.  
  47. type
  48.  
  49.   TToken = (etEnd, etSymbol, etLineEnd, etHTMLTag);
  50.  
  51.   TSimpleHTMLParser = class
  52.   private
  53.     FText: string;
  54.     FSourcePtr: PChar;
  55.     FTokenPtr: PChar;
  56.     FTokenString: string;
  57.     FToken: TToken;
  58.     procedure NextToken;
  59.     procedure NextSymbol;
  60.     function TokenSymbolIs(const S: string): Boolean;
  61.     function TokenHTMLTagIs(const S: string): Boolean;
  62.   public
  63.     constructor Create(const Text: string);
  64.   end;
  65.  
  66. constructor TSimpleHTMLParser.Create(const Text: string);
  67. begin
  68.   FText := Text;
  69.   FSourcePtr := PChar(Text);
  70.   NextToken;
  71. end;
  72.  
  73. procedure TSimpleHTMLParser.NextToken;
  74. var
  75.   P, TokenStart: PChar;
  76.   StrBuf: array[0..255] of Char;
  77. begin
  78.   FTokenString := '';
  79.   P := FSourcePtr;
  80.   while (P^ <> #0) and (P^ <= ' ') do Inc(P);
  81.   FTokenPtr := P;
  82.   case P^ of
  83.     '<':
  84.       begin
  85.         Inc(P);
  86.         TokenStart := P;
  87.         while (P^ <> '>') and (P^ <> #0) do Inc(P);
  88.         SetString(FTokenString, TokenStart, P - TokenStart);
  89.         FToken := etHTMLTag;
  90.         Inc(P);
  91.       end;
  92.     #13: FToken := etLineEnd;
  93.     #0: FToken := etEnd;
  94.   else
  95.     begin
  96.       TokenStart := P;
  97.       Inc(P);
  98.       while not (P^ in ['<', #0, #13,#10]) do Inc(P);
  99.       SetString(FTokenString, TokenStart, P - TokenStart);
  100.       FToken := etSymbol;
  101.     end;
  102.   end;
  103.   FSourcePtr := P;
  104. end;
  105.  
  106. procedure TSimpleHTMLParser.NextSymbol;
  107. begin
  108.   while (FToken <> etEnd) do
  109.   begin
  110.     NextToken;
  111.     if FToken = etSymbol then
  112.       break;
  113.   end;
  114. end;
  115.  
  116. function TSimpleHTMLParser.TokenSymbolIs(const S: string): Boolean;
  117. begin
  118.   Result := (FToken = etSymbol) and (CompareText(FTokenString, S) = 0);
  119. end;
  120.  
  121. function TSimpleHTMLParser.TokenHTMLTagIs(const S: string): Boolean;
  122. begin
  123.   Result := (FToken = etHTMLTag) and ((CompareText(FTokenString, S) = 0) or
  124.     (Pos(S, FTokenString) = 1));
  125. end;
  126.  
  127. procedure TForm1.Exit1Click(Sender: TObject);
  128. begin
  129.   Close;
  130. end;
  131.  
  132. procedure TForm1.GoButtonClick(Sender: TObject);
  133. var
  134.   a,b: variant;
  135. begin
  136.   Memo1.Lines.Clear;
  137.   if URLs.Items.IndexOf(URLs.Text) = -1 then
  138.     URLs.Items.Add(URLs.Text);
  139.   HTTP1.GetDoc(URLs.text, a, b);
  140.   Statusbar1.Panels[0].Text := HTTP1.URL;
  141. end;
  142.  
  143. procedure TForm1.CancelBtnClick(Sender: TObject);
  144. begin
  145.   HTTP1.Cancel;
  146.   CancelBtn.Enabled := False;
  147. end;
  148.  
  149. procedure TForm1.HTML1BeginRetrieval(Sender: TObject);
  150. begin
  151.   CancelBtn.Enabled := True;
  152. end;
  153.  
  154. procedure TForm1.HTML1EndRetrieval(Sender: TObject);
  155. begin
  156.   CancelBtn.Enabled := False;
  157. end;
  158.  
  159. procedure TForm1.URLsKeyDown(Sender: TObject; var Key: Word;
  160.   Shift: TShiftState);
  161. begin
  162.   if Key = VK_Return then
  163.     GoButtonClick(nil);
  164. end;
  165.  
  166. procedure TForm1.HTTP1DocOutput(Sender: TObject; const DocOutput: Variant);
  167. var
  168.   S: String;
  169.   i: integer;
  170.   MsgNo, Header: String;
  171.   Parser: TSimpleHTMLParser;
  172.   ALine: String;
  173. begin
  174.   Statusbar1.Panels[2].Text := Format('Bytes: %s',[DocOutput.BytesTransferred]);
  175.   case DocOutput.State of
  176.     icDocBegin:
  177.       begin
  178.         Memo1.Lines.Clear;
  179.         Data := '';
  180.       end;
  181.     icDocData:
  182.       begin
  183.         DocOutput.GetData(S, VT_BSTR);
  184.         Data := Data + S;
  185.       end;
  186.     icDocEnd:
  187.       begin
  188.         { Now remove all the HTML tags and only display the text }
  189.         Parser := TSimpleHTMLParser.Create(Data);
  190.         ALine := '';
  191.         while Parser.FToken <> etEnd do
  192.         begin
  193.           case Parser.FToken of
  194.             etHTMLTag:
  195.               begin
  196.                 if Parser.TokenHTMLTagIs('BR') then
  197.                   ALine := ALine + #13#10;
  198.                 if Parser.TokenHTMLTagIs('P') then
  199.                   ALine := ALine + #13#10#13#10;
  200.               end;
  201.             etSymbol: ALine := ALine + ' ' + Parser.FTokenString;
  202.             etLineEnd:
  203.               begin
  204.                 Memo1.Lines.Add(ALine);
  205.                 ALine := '';
  206.               end;
  207.           end;
  208.           Parser.NextToken;
  209.         end;
  210.         Memo1.Lines.Add(ALine);
  211.         Memo1.SelStart := 0;
  212.         SendMessage(Memo1.Handle, EM_ScrollCaret, 0, 0);
  213.       end;
  214.   end;
  215.   Refresh;
  216. end;
  217.  
  218. end.
  219.