mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-14 02:19:39 +02:00
LazUtils: Split long lines in THTML2TextRenderer.
This commit is contained in:
parent
eb6ba60940
commit
103d9f42e1
@ -31,7 +31,7 @@ type
|
||||
THTML2TextRenderer = class
|
||||
private
|
||||
fHTML, fOutput: string;
|
||||
fMaxLines: integer;
|
||||
fMaxLines, fMaxLineLen: Integer;
|
||||
fLineEndMark: String; // End of line, by default standard LineEnding
|
||||
fTitleMark: String; // Text at start/end of title text: <div class="title">...</div>
|
||||
fHorzLine: String; // Text for <hr> tag
|
||||
@ -43,7 +43,7 @@ type
|
||||
fPendingSpace: Boolean;
|
||||
fPendingNewLineCnt: Integer;
|
||||
fIndentStep: integer; // Increment (in spaces) for each nested HTML level
|
||||
fIndent: integer;
|
||||
fIndent, fLineLen: Integer;
|
||||
fLineCnt, fHtmlLen: Integer;
|
||||
p: Integer;
|
||||
procedure AddNewLine;
|
||||
@ -52,6 +52,7 @@ type
|
||||
function HtmlTag: Boolean;
|
||||
function HtmlEntity: Boolean;
|
||||
procedure Reset;
|
||||
function SplitLongLine: Boolean;
|
||||
public
|
||||
constructor Create(const aHTML: string);
|
||||
constructor Create(const Stream: TStream);
|
||||
@ -65,7 +66,8 @@ type
|
||||
property LinkEndMark: String read fLinkEnd write fLinkEnd;
|
||||
property ListItemMark: String read fListItemMark write fListItemMark;
|
||||
property MoreMark: String read fMoreMark write fMoreMark;
|
||||
property IndentStep: integer read fIndentStep write fIndentStep;
|
||||
property MaxLineLen: Integer read fMaxLineLen write fMaxLineLen;
|
||||
property IndentStep: Integer read fIndentStep write fIndentStep;
|
||||
end;
|
||||
|
||||
function RenderHTML2Text(const AHTML: String): String;
|
||||
@ -107,6 +109,7 @@ begin
|
||||
//fListItemMark:='⚫ ';
|
||||
//fListItemMark:='⚪ ';
|
||||
fMoreMark:='...';
|
||||
fMaxLineLen:=80;
|
||||
fIndentStep:=2;
|
||||
end;
|
||||
|
||||
@ -114,7 +117,7 @@ constructor THTML2TextRenderer.Create(const Stream: TStream);
|
||||
var
|
||||
s: string;
|
||||
begin
|
||||
SetLength(s{%H-},Stream.Size);
|
||||
SetLength(s,Stream.Size);
|
||||
if s<>'' then
|
||||
Stream.Read(s[1],length(s));
|
||||
Create(s); // Call the constructor above.
|
||||
@ -132,6 +135,7 @@ begin
|
||||
fPendingSpace:=False;
|
||||
fPendingNewLineCnt:=0;
|
||||
fIndent:=0;
|
||||
fLineLen:=0;
|
||||
fLineCnt:=1;
|
||||
end;
|
||||
|
||||
@ -148,31 +152,47 @@ begin
|
||||
fPendingNewLineCnt:=1;
|
||||
end;
|
||||
|
||||
function THTML2TextRenderer.SplitLongLine: Boolean;
|
||||
// Split long lines. Return True if actually split.
|
||||
begin
|
||||
Result:=fLineLen>fMaxLineLen;
|
||||
if Result then
|
||||
AddNewLine;
|
||||
end;
|
||||
|
||||
function THTML2TextRenderer.AddOutput(const aText: String): Boolean;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
Result:=True;
|
||||
if fPendingSpace and (fPendingNewLineCnt=0) then
|
||||
if fPendingSpace and (fPendingNewLineCnt=0) and not SplitLongLine then
|
||||
begin
|
||||
fOutput:=fOutput+' '; // Don't add space at end of line (before newline)
|
||||
Inc(fLineLen);
|
||||
end;
|
||||
fPendingSpace:=False;
|
||||
for i:=0 to fPendingNewLineCnt-1 do
|
||||
begin
|
||||
fOutput:=fOutput+fLineEndMark;
|
||||
fLineLen:=0;
|
||||
Inc(fLineCnt);
|
||||
// Return False if max # of lines exceeded.
|
||||
if fLineCnt>fMaxLines then
|
||||
begin
|
||||
fOutput:=fOutput+fLineEndMark+fMoreMark;
|
||||
Exit(False);
|
||||
Exit(False); // Return False if max # of lines exceeded.
|
||||
end;
|
||||
end;
|
||||
if fPendingNewLineCnt>0 then
|
||||
begin
|
||||
fOutput:=fOutput+StringOfChar(' ',fIndent*fIndentStep);
|
||||
i:=fIndent*fIndentStep;
|
||||
fOutput:=fOutput+StringOfChar(' ', i);
|
||||
Inc(fLineLen, i);
|
||||
fPendingNewLineCnt:=0;
|
||||
end;
|
||||
fOutput:=fOutput+aText;
|
||||
Inc(fLineLen, Length(aText));
|
||||
if aText='.' then // Split also after '.'
|
||||
SplitLongLine;
|
||||
end;
|
||||
|
||||
function THTML2TextRenderer.HtmlTag: Boolean;
|
||||
|
@ -460,8 +460,8 @@ begin
|
||||
LabelText := GetLabelText;
|
||||
DrawText(DC, PChar(LabelText), Length(LabelText), R, Flags);
|
||||
SelectObject(DC, OldFont);
|
||||
AWidth := R.Right - R.Left + 8; // border
|
||||
AHeight := R.Bottom - R.Top + 8; // border
|
||||
AWidth := R.Right - R.Left;
|
||||
AHeight := R.Bottom - R.Top;
|
||||
finally
|
||||
ReleaseDC(Parent.Handle, DC);
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user