Mega Code Archive

 
Categories / Delphi / LAN Web TCP
 

Simple HTML parsing and painting

Title: Simple HTML parsing and painting Question: How to do simple HTML parsing and painting Answer: This morning a friend asked me how to do a simple HTML parsing. He wanted to implement a hint box with formatting possibilities. So I developed a very simple procedure which draws the contents of a string to a rectangle on a canvas. It only understands the HTML tags b, i and u, and it moves to the next line when it finds a new line code. (This is not HTML conform, but in this case really useful) The parsing itself is extremely simple, but you need to work with pointers and not with strings since they make it more difficult to get each individual character. The following procedure is just a little example. If you need HTML editing/painting please try out WPTools. // Draw simple HTML text to any canvas // 3/16/2000 by Julian Ziersch, http://www.wptools.de // Products: WPTools, WPReporter, WPForm // wPDF: PDF Export for WPTools procedure DrawHTML(r: TRect; aCanvas: TCanvas; const text: string); var p: PChar; c: Char; x, y, w, wc, hc: Integer; code: string; begin p := PChar(text); x := r.Left; y := r.Top; hc := aCanvas.TextHeight('Ag'); if p nil then while p^ #0 do begin c := p^; if c = ' begin code := ''; inc(p); while (p^ '') and (p^ #0) do begin code := code + uppercase(p^); inc(p); end; if code = 'B' then aCanvas.Font.Style := aCanvas.Font.Style + [fsBold] else if code = 'I' then aCanvas.Font.Style := aCanvas.Font.Style + [fsItalic] else if code = 'U' then aCanvas.Font.Style := aCanvas.Font.Style + [fsUnderline] else if code = '/B' then aCanvas.Font.Style := aCanvas.Font.Style - [fsBold] else if code = '/I' then aCanvas.Font.Style := aCanvas.Font.Style - [fsItalic] else if code = '/U' then aCanvas.Font.Style := aCanvas.Font.Style - [fsUnderline]; end else if c = #10 then begin x := r.Left; inc(y, hc); end else if c = #32 then begin wc := aCanvas.TextWidth(c); if x + wc r.Right then begin x := r.Left; inc(y, hc); end; if y + hc aCanvas.TextOut(x, y, c); inc(x, wc); end; if p^#0 then inc(p); end; end;