Html to RichEdit

0

Witam;
Mam taki problem. Czy ktoś nie wie jak napisać program w Borland Builder 6, który ma dwa pola richedit. W pierwszym polu byłby tekst i formatowanie a w drugim sam tekst, natomiast zamiast formatowania z pierwszego pola tekstowego byłyby tagi html. Np. pierwszy richedit: Ala ma kota a drugi:

<b>Ala</b> <i> ma</i> kota

Pozdrawiam

0

Napisz prosty parser HTML.
Parsuj każdy znak po kolei, jeżeli napotkasz <, czytaj znaki do napotkania (to będzie nazwa znacznika) />, potem czytaj tekst do napotkania znacznika zamykającego (to będzie tekst, na który oddziałuje znacznik) i oznaczaj przeczytany tekst jako np.pogrubiony (jeżeli znacznik był b).
Oczywiście to jest - jak wspomniałem - to jest prosty parser i przewiduje, że kod HTML jest poprawny.

0

Proponuję skorzystać z jakiejś biblioteki/programu zamieniającego HTML na RTF.

0

adf88 masz racje, to byłoby najprostsze, próbowałem biblioteki rtftohtml_sautinsoft.dll, problem w tym, że program się kompilował a przy zmianie tekstu rtf na html, wywalał mi w drugim richedit chińskie znaczki.

Patryk27 - hmm tak sobie wyobrażałem ten algorytm, lecz nie umiem wcielić go w życie. M. in. by mi zamieniał np. /b na .

0

Znalazłem pewien kod ale w delphi, czy ktoś umie przepisać go do C++ Builder? Nie znam delphi, więc z odpowiednią interpretacją u mnie ciężko.

O to kod:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls, XPMan;

  type
TKolorowanie = record
  b, i, u: boolean;
  color: tcolor;
end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ColorBox1: TColorBox;
    RichEdit1: TRichEdit;
    XPManifest1: TXPManifest;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
 function color2html(color: tcolor): string; 
begin
  Result:='#' + IntToHex(GetRValue(color), 2) + 
  IntToHex(GetGValue(color), 2) + 
  IntToHex(GetBValue(color), 2);
end; 
 
procedure openhtml(var s: string; k: tkolorowanie);
begin 
  if k.b then s:=s + '<b>';
  if k.i then s:=s + '<;i>';
  if k.u then s:=s + '<u>';
  s:=s + '<font color=' + color2html(k.color) + '>'; 
end; 
 
procedure closehtml(var s: string; k: tkolorowanie); 
begin 
  if k.b then s:=s + '</b>'; 
  if k.i then s:=s + '</i>'; 
  if k.u then s:=s + '</u>'; 
  s:=s + '</font>' 
end; 
 
function equal(a, b: tkolorowanie): boolean; 
begin 
  result:=(a.b = b.b) and (a.u = b.u) and (a.i = b.i) and (a.color = 
  b.color) 
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  k, nk: tkolorowanie;
  res: string; 
  i: Integer; 
  attr: TTextAttributes; 
begin 
  res:='<html><body>';
  richedit1.selstart:=1; 
  richedit1.sellength:=1; 
  attr:=richedit1.selattributes; 
 
  k.b:=fsBold in attr.Style; 
  k.u:=fsUnderline in attr.Style; 
  k.i:=fsItalic in attr.Style; 
  k.color:=attr.Color; 
 
  openhtml(res, k); 
  res:=res + richedit1.lines.text[1]; 
 
  for i:=2 to length(richedit1.lines.text) do begin 
  if richedit1.lines.text[i] = #10 then Continue; 
  if richedit1.lines.text[i] = #13 then begin 
    res:=res + '<br>'; 
    Continue 
  end; 
 
  richedit1.selstart:=i; 
  richedit1.sellength:=1; 
  attr:=richedit1.selattributes; 
 
  nk.b:=fsBold in attr.Style; 
  nk.u:=fsUnderline in attr.Style; 
  nk.i:=fsItalic in attr.Style; 
  nk.color:=attr.Color; 
 
  if not equal(nk, k) then begin 
    closehtml(res, k); 
    openhtml(res, nk); 
    k:=nk 
  end; 
 
  res:=res + richedit1.lines.text[i] 
  end; 
 
  closehtml(res, nk); 

  res:=res + '</body></html>';
  RichEdit1.Text:=res; 
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

end.
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1