Главная / FAQ по Builder'у / 140 Функция, преобразующая RTF текст...

140 Функция, преобразующая RTF текст в HTML код!


В эхе было обсуждение преобразования RTF -> HTML... Вот, хотелось бы
добавить мной написанную функцию, которая преобразует ТОЛЬКО текст
RTF в HTML со всеми аттрибутами текста. При чем на выходе строка
годная для прямой вставки в документ, а не сам документ HTML (т.е.
строка без <HTML>, <BODY> и прочих).

------------------------------------------------
String __fastcall ColorToHTML (TColor c)
{
 BYTE R = GetRValue(c);
 BYTE G = GetGValue(c);
 BYTE B = GetBValue(c);
 return (String)"#"+IntToHex(R, 2)+IntToHex(G,2)+IntToHex(B, 2);
}

String __fastcall RTF2HTML (TRichEdit* txt)
{
 TMemoryStream* pms = new TMemoryStream();
 txt->Lines->SaveToStream(pms);
 pms->Position = 0;
 // frmMain - главная форма приложения
 // txtCompile - TRichEdit на этой самой форме со свойством Visible =
 // false
 // такой изврат сделан, потому что иначе на исходном RichEdit
 // при выполнении функции будет бегать курсор, что не есть хорошо...
 // а создавать RichEdit динамически - драгоценное время
 frmMain->txtCompile->Lines->LoadFromStream(pms);
 delete pms;
 txt = frmMain->txtCompile;

 String sFont1      = "-";
 int    iColor1     = -1;
 int    iSize1      = -1;
 int    fBold1      = -1;
 int    fItalic1    = -1;
 int    fUnderline1 = -1;
 int    fStrikeout1 = -1;

 bool fFontTagClosed = true;
 bool fParaTagClosed = true;

 char* sAlignment[3] = {"justify", "right", "center"};

 String src = txt->Text;
 String dst;
 int cnt = src.Length();
 int j;

 for (int i=0; i<cnt; i++)
 {
  txt->SelStart  = i;
  txt->SelLength = 1;

  if (!i || src[i+1]=='\r')
  {
   if (i!=0 && i+3<cnt)
   {
    dst += "</P>";
    i += 2;
    fParaTagClosed = true;
   }
   txt->SelStart  = i;
   txt->SelLength = 1;
   int iAlign = txt->Paragraph->Alignment;
   if (i<cnt)
   {
    fParaTagClosed = false;
    dst += (String)"<P align=" + sAlignment[iAlign] + ">";
   }
  }

  TTextAttributes* attr = txt->SelAttributes;
  String sFont2      = attr->Name;
  int    iColor2     = attr->Color;
  int    iSize2      = attr->Size;
  bool   fBold2      = attr->Style.Contains(fsBold);
  bool   fItalic2    = attr->Style.Contains(fsItalic);
  bool   fUnderline2 = attr->Style.Contains(fsUnderline);
  bool   fStrikeout2 = attr->Style.Contains(fsStrikeOut);

  // шрифт
  if (sFont2!=sFont1 || iColor2!=iColor1 || iSize2!=iSize1)
  {
   if (!fFontTagClosed)
    dst += "</FONT>";
   fFontTagClosed = false;
   sFont1  = sFont2;
   iSize1  = iSize2;
   iColor1 = iColor2;
   dst += "<FONT STYLE=\"";
   dst += "FONT-FAMILY: " + sFont1 + "; ";
   dst += "FONT-SIZE: " + (String)iSize1 + "pt; ";
   dst += "COLOR: " + ColorToHTML((TColor)iColor1) + ";\">";
  }

  // стиль
  if (fBold2!=fBold1)
  {
   if (fBold1!=-1 && !fBold2)
    dst += "</B>";
   if (fBold2)
    dst += "<B>";
   fBold1 = fBold2;
  }
  if (fItalic2!=fItalic1)
  {
   if (fItalic1!=-1 && !fItalic2)
    dst += "</I>";
   if (fItalic2)
    dst += "<I>";
   fItalic1 = fItalic2;
  }
  if (fUnderline2!=fUnderline1)
  {
   if (fUnderline1!=-1 && !fUnderline2)
    dst += "</U>";
   if (fUnderline2)
    dst += "<U>";
   fUnderline1 = fUnderline2;
  }
  if (fStrikeout2!=fStrikeout1)
  {
   if (fStrikeout1!=-1 && !fStrikeout2)
    dst += "</STRIKE>";
   if (fStrikeout2)
    dst += "<STRIKE>";
   fStrikeout1 = fStrikeout2;
  }

  char t[2] = {src[i+1], 0};
  if (t[0]=='&')
   dst += "&1;";     //1=amp
  else if (t[0]=='<')
   dst += "&2;";     //2=lt
  else if (t[0]=='>')
   dst += "&3;";     //3=gt
  else if (t[0]=='\"')
   dst += "&4;";     //4=quot
  else if (t[0]=='-')
   dst += "&5;";     //5=copy
  else if (t[0]=='R')
   dst += "&6;";     //6=reg
  else if (t[0]=='\t')
   dst += "<DIR></DIR>";
  else
   dst += t;
 }

 if (fStrikeout1==1)
  dst += "</STRIKE>";
 if (fUnderline1==1)
  dst += "</U>";
 if (fItalic1==1)
  dst += "</I>";
 if (fBold1==1)
  dst += "</B>";
 if (!fFontTagClosed)
  dst += "</FONT>";
 if (!fParaTagClosed)
  dst += "</P>";

 frmMain->txtCompile->Lines->Clear();

 return dst;
}

Anton Batenev

Предыдущий вопрос   |  Список вопросов   |   Следующий вопрос

источник      На главную      by jenyok
Copyright © 2003 JTSOFT
Сайт управляется системой uCoz