В эхе было обсуждение преобразования 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
|