Наступним логічним кроком є об'єднання необхідного для роботи функціоналу в одну бібліотеку. Бібліотека не обмежується лише функціями по створенню html-коду. Сам код потрібно передати у внутрішній переглядач, наприклад TWebBrowser. Багато функцій по роботі з TWebBrowser можна зустріти на теренах Інтернету. Є навіть написані цілі класи, наприклад тут. Але в цю бібліотеку мною зібрано достатній мінімум для повсякденної роботи.
Бібліотека vmsHtmlConsts.pas, що використовується в модулі, наведено в статті Дві допоміжні бібліотеки з константами.
Бібліотека vmsHtmlConsts.pas, що використовується в модулі, наведено в статті Дві допоміжні бібліотеки з константами.
{*******************************************************************************}
{ }
{ модуль vmsHtmlLib }
{ v.3.0.0.7 }
{ створено 10/05/2012 }
{ }
{ Модуль містить процедури та функції для роботи з Html-об'єктами }
{ }
{*******************************************************************************}
unit vmsHtmlLib;
interface
uses
Windows, Classes, Forms, SHDocVw, ActiveX, MSHTML, Variants, Graphics, SysUtils,
RegularExpressions,
vmsHtmlConsts;
type
TvmsHtmlLib = class(TObject)
class function CodeMessageToHtml(const aCode: string): string;
{
Description:
Заміна символів рядка на xml-(html)-теги
}
class function EncodeXMLStr(const aValue: string): string;
{
Description:
конвертує тип TColor в кольорову палітру html
Parameters:
aWebBrowser - компонент TWebBrowser
}
class function ColorToHtml(aColor: TColor): string;
{
Description:
встановлює текст SQL-запиту у вигляді html-тексту з підствіткою синтаксису
Parameters:
aSqlText - текст SQL-запиту
}
class function SqlToHtml(const aSqlText: string): string;
{
Description:
Отримує виділений текст у вікні aWebBrowser
Parameters:
aWebBrowser - компонент TWebBrowser
}
class function GetSelectionText(var aWebBrowser: TWebBrowser): string;
{
Description:
Зберігає текст html-текст в буфер обміну
Parameters:
aWebBrowser - компонент TWebBrowser
}
class procedure CopyToClipboard(var aWebBrowser: TWebBrowser);
{
Description:
Відображає у вікні aWebBrowser html-текст
Parameters:
aWebBrowser - компонент TWebBrowser
aHtmlText - html-текст
}
class procedure LoadStringToBrowser(var aWebBrowser: TWebBrowser; const aHtmlText: string);
{
Description:
Зберігає текст html-текст в зовнішній файл
Parameters:
aWebBrowser - компонент TWebBrowser
}
class procedure SaveHTMLSourceToFile(var aWebBrowser: TWebBrowser; const aFileName: string);
{
Description:
Встановлює колір межі компонента TWebBrowser
Parameters:
aWebBrowser - компонент TWebBrowser
aBorderColor - колір
}
class procedure SetBorderColor(var aWebBrowser: TWebBrowser; aBorderColor: TColor);
{
Description:
Встановлює стиль межі компонента TWebBrowser
Parameters:
aWebBrowser - компонент TWebBrowser
aBorderStyle - стиль: 'none' No border is drawn
'dashed' Border is a dashed line. (as of IE 5.5)
'dotted' Border is a dotted line. (as of IE 5.5)
'double' Border is a double line
'groove' 3-D groove is drawn
'inset' 3-D inset is drawn
'outset' 3-D outset is drawn
'ridge' 3-D ridge is drawn
'solid' Border is a solid line
}
class procedure SetBorderStyle(var aWebBrowser: TWebBrowser; aBorderStyle: string);
{
Description:
Повертає заповнений табличний тег <TABLE>
Parameters:
aCaptionHead - варіантний масив з заголовками таблиці: VarArrayOf(['Заголовок 1','Заголовок 2'])
}
class function GetTableTag(aColumns: Variant; aTableCaption: string = ''): string;
{
Description:
Повертає заповнений рядок таблиці з тегами <TR><TD>
Parameters:
aLineText - варіантний масив з даними таблиці: VarArrayOf(['Заголовок 1','Заголовок 2'])
}
class function GetTableLineTag(aLineText: Variant): string;
{
Description:
Повертає кольоровий текст
Parameters:
aText - заданий текст
aColor - колір, заданий текстом: red, green, blue або
типу TColor: clRed, clGreen, clBlue
}
class function GetColorTag(aText: string; aColor: TColor): string; overload;
class function GetColorTag(aText: string; aColor: string): string; overload;
class function GetSpoilerTag(aCaption, aText: string): string;
class function GetSrcSQLTag(aCaption, aText: string): string;
class function GetBoldText(aText: string): string;
end;
implementation
class procedure TvmsHtmlLib.LoadStringToBrowser(var aWebBrowser: TWebBrowser; const aHtmlText: string);
var
iDocument : IHTMLDocument2;
vHtmlText : OleVariant;
begin
if (aWebBrowser.Document = nil) then
aWebBrowser.Navigate(C_VMS_HTML_BLANK);
while (aWebBrowser.Document = nil) do
Application.ProcessMessages;
iDocument := aWebBrowser.Document as IHTMLDocument2;
vHtmlText := VarArrayCreate([0, 0], varVariant);
vHtmlText[0] := aHtmlText;
iDocument.Write(PSafeArray(TVarData(vHtmlText).VArray));
iDocument.Close;
end;
class procedure TvmsHtmlLib.CopyToClipboard(var aWebBrowser: TWebBrowser);
begin
if (aWebBrowser.Document <> nil) then
begin
aWebBrowser.ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DONTPROMPTUSER);
aWebBrowser.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DONTPROMPTUSER);
aWebBrowser.ExecWB(OLECMDID_CLEARSELECTION, OLECMDEXECOPT_DONTPROMPTUSER);
end;
end;
class function TvmsHtmlLib.GetColorTag(aText: string; aColor: TColor): string;
begin
Result := GetColorTag(aText, ColorToHtml(aColor));
end;
class function TvmsHtmlLib.GetBoldText(aText: string): string;
begin
Result := Concat('<b>', aText, '</b>');
end;
class function TvmsHtmlLib.GetColorTag(aText, aColor: string): string;
begin
Result := Concat('<font color="', aColor, '">', aText, '</font>');
end;
class function TvmsHtmlLib.GetSelectionText(var aWebBrowser: TWebBrowser): string;
var
vDocument: Variant;
begin
if (aWebBrowser.Document <> nil) then
begin
vDocument := aWebBrowser.Document;
try
Result := vDocument.Selection.CreateRange.Text
finally
vDocument := Unassigned;
end;
end
else
Result := '';
end;
class function TvmsHtmlLib.CodeMessageToHtml(const aCode: string): string;
begin
if (aCode <> '') then
//Result := vmsFrameText(aCode, '<br><font color="navy" size="2">[', ']</font>')
Result := '<br><a href="' + aCode + '"><font color="navy" size="2">[' + aCode + ']</font></a>'
else
Result := aCode;
end;
class function TvmsHtmlLib.EncodeXMLStr(const aValue: string): string;
const
HSym : array[0..3] of string = ('&','<','>','"');
TSym : array[0..3] of string = ('&' ,'<' ,'>' ,'"' );
var
i : integer;
sTmp : string;
begin
for i := 1 to Length(aValue) do
if (Ord(aValue[i]) in [32, 40..58]) or (Ord(aValue[i]) >= 65)then
sTmp := Concat(sTmp, aValue[i])
else
begin
case aValue[i] of
//' ' : sTmp := Concat(sTmp, ' '); // space
'<' : sTmp := Concat(sTmp, '<'); // <
'>' : sTmp := Concat(sTmp, '>'); // >
'&' : sTmp := Concat(sTmp, '&'); // &
'"' : sTmp := Concat(sTmp, '"'); // "
'''' : sTmp := Concat(sTmp, '''); // '
else
sTmp := Concat(sTmp, '&#' + IntToStr(Ord(aValue[i])) + ';');
end;
end;
Result := sTmp;
end;
class function TvmsHtmlLib.ColorToHtml(aColor: TColor): string;
var
nRGB: TColorRef;
begin
nRGB := ColorToRGB(aColor);
Result := Format('#%.2x%.2x%.2x', [GetRValue(nRGB), GetGValue(nRGB), GetBValue(nRGB)]);
end;
class procedure TvmsHtmlLib.SetBorderStyle(var aWebBrowser: TWebBrowser; aBorderStyle: string);
var
iDocument : IHTMLDocument2;
iElement : IHTMLElement;
begin
iDocument := aWebBrowser.Document as IHTMLDocument2;
if Assigned(iDocument) then
begin
iElement := iDocument.Body;
if (iElement <> nil) then
iElement.Style.BorderStyle := aBorderStyle;
end;
end;
class procedure TvmsHtmlLib.SaveHTMLSourceToFile(var aWebBrowser: TWebBrowser; const aFileName: string);
var
iPersistStream : IPersistStreamInit;
iStreamAdapter : IStream;
loFileStream : TFileStream;
nSaveResult : HRESULT;
begin
iPersistStream := aWebBrowser.Document as IPersistStreamInit;
loFileStream := TFileStream.Create(aFileName, fmCreate);
try
iStreamAdapter := TStreamAdapter.Create(loFileStream, soReference) as IStream;
nSaveResult := iPersistStream.Save(iStreamAdapter, True);
finally
loFileStream.Free;
end;
end;
class procedure TvmsHtmlLib.SetBorderColor(var aWebBrowser: TWebBrowser; aBorderColor: TColor);
var
iDocument : IHTMLDocument2;
iElement : IHTMLElement;
begin
iDocument := aWebBrowser.Document as IHTMLDocument2;
if Assigned(iDocument) then
begin
iElement := iDocument.Body;
if (iElement <> nil) then
iElement.Style.BorderColor := ColorToHtml(aBorderColor);
end;
end;
class function TvmsHtmlLib.SqlToHtml(const aSqlText: string): string;
const
C_COMMENTS_PATTERN = '(?is)((/\*.*?\*/)|(--.*?\n))';
C_LEXEM_PATTERN = '(?i)(' +
'\bAGGREGATE\b|\bALL\b|\bALTER\b|\bAND\b|\bANY\b|\bAS\b|\bASC\b|\bAVG\b|\bBEFORE\b|\bBEGIN\b|' +
'\bBETWEEN\b|\bBULK\b|\bBY\b|\bCASE\b|\bCAST\b|\bCHAR\b|\bCHECK\b|\bCOLLECT\b|\bCOMMENT\b|' +
'\bCOMMIT\b|\bCOUNT\b|\bCURRENT\b|\bCURRENT_USER\b|\bCURSOR\b|\bDATE\b\bDAY\b|\bDEC\b|' +
'\bDECIMAL\b|\bDECLARE\b|\bDEFAULT\b|\bDELETE\b|\bDESC\b|\bDISTINCT\b|\bEACH\b|\bELSE\b|' +
'\bELSIF\b|\bEND\b|\bEXCEPTION\b|\bEXECUTE\b|\bEXISTS\b|\bFALSE\b|\bFETCH\b|\bFIRST\b|' +
'\bFOR\b|\bFORALL\b|\bFOUND\b|\bFROM\b|\bFULL\b|\bFUNCTION\b|\bGROUPING\b|\bHAVING\b|\bIF\b|' +
'\bIN\b|\bINNER\b|\bINSERT\b|\bINTEGER\b|\bINTERSECT\b|\bINTERVAL\b|\bINTO\b|\bIS\b|\bJOIN\b|' +
'\bLAST\b|\bLEFT\b|\bLEVEL\b|\bLIKE\b|\bLOOP\b|\bMAX\b|\bMIN\b|\bMONTH\b|\bNEXT\b|\bNEXTVAL\b|' +
'\bNOT\b|\bNOTFOUND\b|\bNOWAIT\b|\bNULL\b|\bNULLS\b|\bNUMBER\b|\bNUMERIC\b|\bOF\b|\bOLD\b|' +
'\bON\b|\bOR\b|\bORDER\b|\bOUT\b|\bOUTER\b|\bPLS_INTEGER\b|\bPOSITIVE\b|\bPRIOR\b|\bPROCEDURE\b|' +
'\bRAISE\b|\bRANGE\b|\bRAW\b|\bREPLACE\b|\bRESULT\b|\bRETURN\b|\bRIGHT\b|\bROLLBACK\b|\bROW\b| ' +
'\bROWCOUNT\b|\bROWID\b|\bROWTYPE\b|\bSELECT\b|\bSELF\b|\bSET\b|\bSETS\b|\bSTRING\b|\bSUBTYPE\b|' +
'\bSUM\b|\bSYSDATE\b|\bTABLE\b|\bTHEN\b|\bTIME\b|\bTIMESTAMP\b|\bTO\b|\bTRANSACTION\b|' +
'\bTRIGGER\b|\bTRIM\b|\bTRUE\b|\bTYPE\b|\bUNDER\b|\bUNION\b|\bUNIQUE\b|\bUPDATE\b|\bUROWID\b|' +
'\bUSE\b|\bUSER\b|\bUSING\b|\bVALUE\b|\bVALUES\b|\bVARCHAR\b|\bVARCHAR2\b|\bVARIABLE\b|\bWHEN\b|' +
'\bWHERE\b|\bWHILE\b|\bWITH\b|\bXOR\b|\bYEAR\b)';
begin
Result := TRegEx.Replace(aSqlText, C_LEXEM_PATTERN, '<b>$1</b>');
Result := TRegEx.Replace(Result, C_COMMENTS_PATTERN, '<font color="DarkCyan">$1</font>');
end;
class function TvmsHtmlLib.GetTableTag(aColumns: Variant; aTableCaption: string = ''): string;
const
C_TABLE_TAG = '<TABLE width="100%" border="1" bordercolor="gray" cols="%d" cellspacing="0" cellpadding="2">';
var
i : Integer;
nArrayBound : Byte;
sTableTag : string;
sTrTag : string;
begin
if VarIsArray(aColumns) then
begin
nArrayBound := VarArrayHighBound(aColumns, 1);
sTableTag := Format(C_TABLE_TAG, [nArrayBound]);
if (aTableCaption <> '') then
sTableTag := Concat(sTableTag, '<CAPTION>', aTableCaption, '</CAPTION>');
sTrTag := '<THEAD><TR bgcolor="#85ACE3">';
for i := VarArrayLowBound(aColumns, 1) to nArrayBound do
sTrTag := Concat(sTrTag, '<TH>', VarToStr(aColumns[i]), '</TH>');
sTrTag := Concat(sTrTag, '</TR></THEAD>');
end
else
begin
sTableTag := Format(C_TABLE_TAG, [1]);
if (aTableCaption <> '') then
sTableTag := Concat(sTableTag, '<CAPTION>', aTableCaption, '</CAPTION>');
sTrTag := Concat('<THEAD><TR bgcolor="#85ACE3"><TH>', VarToStr(aColumns), '</TH></TR></THEAD>')
end;
Result := Concat(sTableTag, sTrTag);
end;
class function TvmsHtmlLib.GetSpoilerTag(aCaption, aText: string): string;
begin
if (Trim(aText) <> '') then
Result := Concat(
'<td class="msgBody">',
'<table width="96%" border="0" bgcolor="#c0c0c0" cellspacing="0" cellpadding="4" style="border:solid 1px #888888;margin:10px">',
'<tr>',
'<td>',
'<span style="font-family:monospace;padding:1px;cursor:pointer;background-color:#E8E8E8;border:1px solid #888888;txt-align:center;" ', 'onclick="var el=this.parentNode.parentNode.parentNode.rows[1]; el.style.display=el.style.display==''none''?'''':''none'';this.innerHTML=this.innerHTML==''+''?''-'':''+'';">+</span> ',
aCaption,
'</td>',
'</tr>',
'<tr style="display:none">',
'<td bgcolor="#E8E8E8">',
aText,
'</td>',
'</tr>',
'</table>',
'</td>');
end;
class function TvmsHtmlLib.GetSrcSQLTag(aCaption, aText: string): string;
begin
if (Trim(aText) <> '') then
Result := Concat(
'<table width="96%" border="0" bgcolor="#c0c0c0" cellspacing="0" cellpadding="4" style="border:solid 1px #888888; margin :10px">',
'<tr height="1">',
'<td>',
aCaption,
'</td>',
'</tr>',
'<tr>',
'<td bgcolor="#E8E8E8"><pre>',
SqlToHtml(aText),
'</pre></td>',
'</tr>',
'</table>');
end;
class function TvmsHtmlLib.GetTableLineTag(aLineText: Variant): string;
var
i : Integer;
sTrTag : string;
begin
if VarIsArray(aLineText) then
begin
sTrTag := '<TR>';
for i := VarArrayLowBound(aLineText, 1) to VarArrayHighBound(aLineText, 1) do
sTrTag := Concat(sTrTag, '<TD>', VarToStr(aLineText[i]), '</TD>');
sTrTag := Concat(sTrTag, '</TR>');
end
else
sTrTag := Concat('<TR><TD>', VarToStr(aLineText), '</TD></TR>');
Result := sTrTag;
end;
end.
Скачати файл vmsHtmlLib.pas
Немає коментарів :
Дописати коментар