You've already forked lazarus-ccr
jvcllaz: Fix resolution of html entities in TJvMarkupLabel and TJvMarkupViewer.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8276 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -38,6 +38,7 @@ type
|
||||
TJvHTMLElement = class(TObject)
|
||||
private
|
||||
FFontSize: Integer;
|
||||
FNoEntText: string;
|
||||
FText: string;
|
||||
FFontName: string;
|
||||
FFontStyle: TFontStyles;
|
||||
@ -61,7 +62,9 @@ type
|
||||
procedure SetBreakLine(const Value: Boolean);
|
||||
public
|
||||
procedure Breakup(ACanvas: TCanvas; Available: Integer);
|
||||
class function FixHTMLEntities(const S: String): String;
|
||||
property Text: string read FText write SetText;
|
||||
property NoEntText: String read FNoEntText;
|
||||
property SolText: string read FSolText write SetSolText;
|
||||
property EolText: string read FEolText write SetEolText;
|
||||
property FontName: string read FFontName write SetFontName;
|
||||
@ -89,6 +92,9 @@ type
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
StrUtils, htmldefs;
|
||||
|
||||
//=== { TJvHTMLElement } =====================================================
|
||||
|
||||
procedure TJvHTMLElement.Breakup(ACanvas: TCanvas; Available: Integer);
|
||||
@ -101,7 +107,7 @@ begin
|
||||
ACanvas.Font.Style := FontStyle;
|
||||
ACanvas.Font.Color := FontColor;
|
||||
if SolText = '' then
|
||||
S := Text
|
||||
S := FNoEntText
|
||||
else
|
||||
S := EolText;
|
||||
if ACanvas.TextWidth(S) <= Available then
|
||||
@ -125,6 +131,29 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
class function TJvHTMLElement.FixHTMLEntities(const S: String): String;
|
||||
var
|
||||
ent: string;
|
||||
wch: widechar = #0;
|
||||
p1, p2: Integer;
|
||||
begin
|
||||
Result := S;
|
||||
p1 := pos('&', Result);
|
||||
while p1 > 0 do begin
|
||||
p2 := posex(';', Result, p1);
|
||||
if p2 > 0 then
|
||||
begin
|
||||
ent := Copy(Result, p1+1, p2-p1-1);
|
||||
if ResolveHTMLEntityReference(widestring(ent), wch) then
|
||||
begin
|
||||
ent := Copy(Result, p1, p2-p1+1);
|
||||
Result := StringReplace(Result, ent, UTF8Encode(wch), [rfReplaceAll])
|
||||
end;
|
||||
end;
|
||||
p1 := posex('&', Result, p1+1);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TJvHTMLElement.SetAscent(const Value: Integer);
|
||||
begin
|
||||
FAscent := Value;
|
||||
@ -173,6 +202,7 @@ end;
|
||||
procedure TJvHTMLElement.SetText(const Value: string);
|
||||
begin
|
||||
FText := Value;
|
||||
FNoEntText := FixHTMLEntities(FText);
|
||||
end;
|
||||
|
||||
procedure TJvHTMLElement.SetWidth(const Value: Integer);
|
||||
|
@ -423,7 +423,7 @@ end;
|
||||
procedure TJvMarkupLabel.RenderHTML;
|
||||
var
|
||||
R: TRect;
|
||||
I, C, X, Y: Integer;
|
||||
I, C, X, Y, W: Integer;
|
||||
ATotalWidth, AClientWidth, ATextWidth, BaseLine: Integer;
|
||||
iSol, iEol, PendingCount, MaxHeight, MaxAscent: Integer;
|
||||
El: TJvHTMLElement;
|
||||
@ -517,8 +517,9 @@ begin
|
||||
end;
|
||||
if El.SolText <> '' then
|
||||
begin
|
||||
ATotalWidth := ATotalWidth - Canvas.TextWidth(El.SolText) - 5;
|
||||
ATextWidth := ATextWidth + Canvas.TextWidth(El.SolText);
|
||||
W := Canvas.TextWidth(El.SolText);
|
||||
ATotalWidth := ATotalWidth - W - 5;
|
||||
ATextWidth := ATextWidth + W;
|
||||
if El.EolText = '' then
|
||||
begin
|
||||
if I >= C - 1 then
|
||||
|
@ -159,7 +159,7 @@ begin
|
||||
for I := 0 to C - 1 do
|
||||
begin
|
||||
Element := TJvHTMLElement(FElementStack.Items[I]);
|
||||
s := Element.Text;
|
||||
s := Element.NoEntText;
|
||||
Canvas.Font.Name := Element.FontName;
|
||||
Canvas.Font.Size := Element.FontSize;
|
||||
Canvas.Font.Style := Element.FontStyle;
|
||||
|
Reference in New Issue
Block a user