mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2026-02-04 08:34:49 +01:00
+ handle tables
This commit is contained in:
parent
644db9b964
commit
94d61762a2
329
ide/whtmlhlp.pas
329
ide/whtmlhlp.pas
@ -38,7 +38,43 @@ type
|
||||
|
||||
TParagraphAlign = (paLeft,paCenter,paRight);
|
||||
|
||||
PTableElement = ^TTableElement;
|
||||
TTableElement = object(Tobject)
|
||||
TextBegin,TextEnd : sw_word;
|
||||
Alignment : TParagraphAlign;
|
||||
NextEl : PTableElement;
|
||||
constructor init(AAlignment : TParagraphAlign);
|
||||
end;
|
||||
|
||||
PTableLine = ^TTableLine;
|
||||
TTableLine = object(Tobject)
|
||||
NumElements : sw_word;
|
||||
Nextline : PTableLine;
|
||||
FirstEl,LastEl : PTableElement;
|
||||
constructor Init;
|
||||
procedure AddElement(PTE : PTableElement);
|
||||
destructor Done; virtual;
|
||||
end;
|
||||
|
||||
PHTMLTopicRenderer = ^THTMLTopicRenderer;
|
||||
PTable = ^TTable;
|
||||
TTable = object(Tobject)
|
||||
NumLines,NumCols : sw_word;
|
||||
GlobalOffset,
|
||||
GlobalTextBegin : sw_word;
|
||||
WithBorder : boolean;
|
||||
FirstLine : PTableLine;
|
||||
LastLine : PTableLine;
|
||||
PreviousTable : PTable;
|
||||
Renderer : PHTMLTopicRenderer;
|
||||
constructor Init(Previous : PTable);
|
||||
procedure AddLine(PL : PTableLine);
|
||||
procedure AddElement(PTE : PTableElement);
|
||||
procedure TextInsert(Pos : sw_word;const S : string);
|
||||
procedure FormatTable;
|
||||
destructor Done; virtual;
|
||||
end;
|
||||
|
||||
THTMLTopicRenderer = object(THTMLParser)
|
||||
function BuildTopic(P: PTopic; AURL: string; HTMLFile: PTextFile; ATopicLinks: PTopicLinkCollection): boolean;
|
||||
public
|
||||
@ -97,8 +133,11 @@ type
|
||||
LinkPtr: sw_integer;
|
||||
LastTextChar: char;
|
||||
{ Anchor: TAnchor;}
|
||||
{ Table stuff }
|
||||
CurrentTable : PTable;
|
||||
procedure AddText(S: string);
|
||||
procedure AddChar(C: char);
|
||||
procedure AddCharAt(C: char;AtPtr : sw_word);
|
||||
end;
|
||||
|
||||
PCustomHTMLHelpFile = ^TCustomHTMLHelpFile;
|
||||
@ -162,6 +201,211 @@ implementation
|
||||
uses Views,WConsts,WUtils,WViews,WHTMLScn;
|
||||
|
||||
|
||||
|
||||
constructor TTableElement.init(AAlignment : TParagraphAlign);
|
||||
begin
|
||||
Alignment:=AAlignment;
|
||||
NextEl:=nil;
|
||||
TextBegin:=0;
|
||||
TextEnd:=0;
|
||||
end;
|
||||
|
||||
|
||||
{ TTableLine methods }
|
||||
|
||||
constructor TTableLine.Init;
|
||||
begin
|
||||
NumElements:=0;
|
||||
NextLine:=nil;
|
||||
Firstel:=nil;
|
||||
LastEl:=nil;
|
||||
end;
|
||||
|
||||
procedure TTableLine.AddElement(PTE : PTableElement);
|
||||
begin
|
||||
if not assigned(FirstEl) then
|
||||
FirstEl:=PTE;
|
||||
if assigned(LastEl) then
|
||||
LastEl^.NextEl:=PTE;
|
||||
LastEl:=PTE;
|
||||
Inc(NumElements);
|
||||
end;
|
||||
|
||||
destructor TTableLine.Done;
|
||||
begin
|
||||
LastEl:=FirstEl;
|
||||
while assigned(LastEl) do
|
||||
begin
|
||||
LastEl:=FirstEl^.NextEl;
|
||||
Dispose(FirstEl,Done);
|
||||
FirstEl:=LastEl;
|
||||
end;
|
||||
inherited Done;
|
||||
end;
|
||||
|
||||
{ TTable methods }
|
||||
constructor TTable.Init(Previous : PTable);
|
||||
begin
|
||||
PreviousTable:=Previous;
|
||||
NumLines:=0;
|
||||
NumCols:=0;
|
||||
GlobalOffset:=0;
|
||||
GlobalTextBegin:=0;
|
||||
FirstLine:=nil;
|
||||
LastLine:=nil;
|
||||
|
||||
WithBorder:=false;
|
||||
end;
|
||||
|
||||
procedure TTable.AddLine(PL : PTableLine);
|
||||
begin
|
||||
If not assigned(FirstLine) then
|
||||
FirstLine:=PL;
|
||||
if Assigned(LastLine) then
|
||||
LastLine^.NextLine:=PL;
|
||||
LastLine:=PL;
|
||||
Inc(NumLines);
|
||||
end;
|
||||
|
||||
procedure TTable.AddElement(PTE : PTableElement);
|
||||
begin
|
||||
if assigned(LastLine) then
|
||||
begin
|
||||
LastLine^.AddElement(PTE);
|
||||
If LastLine^.NumElements>NumCols then
|
||||
NumCols:=LastLine^.NumElements;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTable.TextInsert(Pos : sw_word;const S : string);
|
||||
var
|
||||
i : longint;
|
||||
begin
|
||||
for i:=1 to Length(S) do
|
||||
begin
|
||||
Renderer^.AddCharAt(S[i],Pos+i-1+GlobalOffset);
|
||||
end;
|
||||
GlobalOffset:=GlobalOffset+length(S);
|
||||
end;
|
||||
|
||||
procedure TTable.FormatTable;
|
||||
const
|
||||
MaxCols = 200;
|
||||
type
|
||||
TLengthArray = Array [ 1 .. MaxCols] of sw_word;
|
||||
PLengthArray = ^TLengthArray;
|
||||
var
|
||||
ColLengthArray : PLengthArray;
|
||||
CurLine : PTableLine;
|
||||
CurEl : PTableElement;
|
||||
Align : TParagraphAlign;
|
||||
TextBegin,TextEnd : sw_word;
|
||||
i,j,Length : sw_word;
|
||||
begin
|
||||
GetMem(ColLengthArray,Sizeof(sw_word)*NumCols);
|
||||
FillChar(ColLengthArray^,Sizeof(sw_word)*NumCols,#0);
|
||||
{ Compute the largest cell }
|
||||
CurLine:=FirstLine;
|
||||
For i:=1 to NumLines do
|
||||
begin
|
||||
CurEl:=CurLine^.FirstEl;
|
||||
For j:=1 to NumCols do
|
||||
begin
|
||||
if not assigned(CurEl) then
|
||||
break;
|
||||
Length:=CurEl^.TextEnd-CurEl^.TextBegin;
|
||||
if Length>ColLengthArray^[j] then
|
||||
ColLengthArray^[j]:=Length;
|
||||
CurEl:=CurEl^.NextEl;
|
||||
end;
|
||||
CurLine:=CurLine^.NextLine;
|
||||
end;
|
||||
{ Adjust to largest cell }
|
||||
CurLine:=FirstLine;
|
||||
TextBegin:=GlobalTextBegin;
|
||||
If (NumLines>0) and WithBorder then
|
||||
Begin
|
||||
TextInsert(TextBegin,#218);
|
||||
For j:=1 to NumCols do
|
||||
begin
|
||||
TextInsert(TextBegin,CharStr(#196,ColLengthArray^[j]));
|
||||
if j<NumCols then
|
||||
TextInsert(TextBegin,#194);
|
||||
end;
|
||||
TextInsert(TextBegin,#191);
|
||||
TextInsert(TextBegin,hscLineBreak);
|
||||
End;
|
||||
For i:=1 to NumLines do
|
||||
begin
|
||||
CurEl:=CurLine^.FirstEl;
|
||||
For j:=1 to NumCols do
|
||||
begin
|
||||
if not assigned(CurEl) then
|
||||
begin
|
||||
Length:=0;
|
||||
Align:=paLeft;
|
||||
end
|
||||
else
|
||||
begin
|
||||
TextBegin:=CurEl^.TextBegin;
|
||||
TextEnd:=CurEl^.TextEnd;
|
||||
Length:=CurEl^.TextEnd-CurEl^.TextBegin;
|
||||
Align:=CurEl^.Alignment;
|
||||
end;
|
||||
if WithBorder then
|
||||
TextInsert(TextBegin,#179);
|
||||
if Length<ColLengthArray^[j] then
|
||||
begin
|
||||
case Align of
|
||||
paLeft:
|
||||
TextInsert(TextEnd,CharStr(' ',ColLengthArray^[j]-Length));
|
||||
paRight:
|
||||
TextInsert(TextBegin,CharStr(' ',ColLengthArray^[j]-Length));
|
||||
paCenter:
|
||||
begin
|
||||
TextInsert(TextBegin,CharStr(' ',(ColLengthArray^[j]-Length) div 2));
|
||||
TextInsert(TextEnd,CharStr(' ',(ColLengthArray^[j]-Length)- ((ColLengthArray^[j]-Length) div 2)));
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
if Assigned(CurEl) then
|
||||
CurEl:=CurEl^.NextEl;
|
||||
end;
|
||||
if WithBorder then
|
||||
TextInsert(TextEnd,#179);
|
||||
CurLine:=CurLine^.NextLine;
|
||||
end;
|
||||
If (NumLines>0) and WithBorder then
|
||||
Begin
|
||||
TextInsert(TextEnd,hscLineBreak);
|
||||
TextInsert(TextEnd,#192);
|
||||
For j:=1 to NumCols do
|
||||
begin
|
||||
TextInsert(TextEnd,CharStr(#196,ColLengthArray^[j]));
|
||||
if j<NumCols then
|
||||
TextInsert(TextEnd,#193);
|
||||
end;
|
||||
TextInsert(TextEnd,#217);
|
||||
TextInsert(TextEnd,hscLineBreak);
|
||||
End;
|
||||
|
||||
end;
|
||||
|
||||
destructor TTable.Done;
|
||||
begin
|
||||
LastLine:=FirstLine;
|
||||
while assigned(LastLine) do
|
||||
begin
|
||||
LastLine:=FirstLine^.NextLine;
|
||||
Dispose(FirstLine,Done);
|
||||
FirstLine:=LastLine;
|
||||
end;
|
||||
if Assigned(PreviousTable) then
|
||||
Inc(PreviousTable^.GlobalOffset,GlobalOffset);
|
||||
inherited Done;
|
||||
end;
|
||||
|
||||
|
||||
{ THTMLAnsiConsole methods }
|
||||
|
||||
procedure THTMLAnsiConsole.GotoXY(X,Y : integer);
|
||||
@ -217,7 +461,10 @@ begin
|
||||
if ord(c)>16 then
|
||||
HTMLOwner^.AddChar(c)
|
||||
else
|
||||
HTMLOwner^.AddChar('*');
|
||||
begin
|
||||
HTMLOwner^.AddChar(hscDirect);
|
||||
HTMLOwner^.AddChar(c);
|
||||
end;
|
||||
end;
|
||||
{ Write start of next line in normal color, for correct alignment }
|
||||
HTMLOwner^.AddChar(hscNormText);
|
||||
@ -622,23 +869,77 @@ begin
|
||||
end;
|
||||
|
||||
procedure THTMLTopicRenderer.DocTable(Entered: boolean);
|
||||
var
|
||||
ATable : PTable;
|
||||
Border : String;
|
||||
begin
|
||||
if AnyCharsInLine then
|
||||
DocBreak;
|
||||
begin
|
||||
AddChar(hscLineBreak);
|
||||
AnyCharsInLine:=false;
|
||||
end;
|
||||
if Entered then
|
||||
DocBreak;
|
||||
begin
|
||||
DocBreak;
|
||||
New(ATable,Init(CurrentTable));
|
||||
CurrentTable:=ATable;
|
||||
CurrentTable^.Renderer:=@Self;
|
||||
if DocGetTagParam('BORDER',border) then
|
||||
CurrentTable^.WithBorder:=true;
|
||||
end
|
||||
else
|
||||
begin
|
||||
CurrentTable^.FormatTable;
|
||||
ATable:=CurrentTable;
|
||||
CurrentTable:=ATable^.PreviousTable;
|
||||
Dispose(ATable,Done);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure THTMLTopicRenderer.DocTableRow(Entered: boolean);
|
||||
var
|
||||
ATableLine : PTableLine;
|
||||
begin
|
||||
if AnyCharsInLine then
|
||||
DocBreak;
|
||||
begin
|
||||
AddChar(hscLineBreak);
|
||||
AnyCharsInLine:=false;
|
||||
end;
|
||||
if Entered then
|
||||
begin
|
||||
New(ATableLine,Init);
|
||||
if CurrentTable^.GlobalTextBegin=0 then
|
||||
CurrentTable^.GlobalTextBegin:=TextPtr;
|
||||
CurrentTable^.AddLine(ATableLine);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure THTMLTopicRenderer.DocTableItem(Entered: boolean);
|
||||
var
|
||||
Align : String;
|
||||
NewEl : PTableElement;
|
||||
PAlignEl : TParagraphAlign;
|
||||
begin
|
||||
if Entered then
|
||||
AddText(' - ');
|
||||
begin
|
||||
if assigned(CurrentTable^.LastLine) and Assigned(CurrentTable^.LastLine^.LastEl) then
|
||||
begin
|
||||
NewEl:=CurrentTable^.LastLine^.LastEl;
|
||||
NewEl^.TextEnd:=TextPtr;
|
||||
end;
|
||||
PAlignEl:=paLeft;
|
||||
if DocGetTagParam('ALIGN',Align) then
|
||||
DecodeAlign(Align,PAlignEl);
|
||||
New(NewEl,Init(PAlignEl));
|
||||
CurrentTable^.AddElement(NewEl);
|
||||
NewEl^.TextBegin:=TextPtr;
|
||||
{ AddText(' - ');}
|
||||
end
|
||||
else
|
||||
begin
|
||||
NewEl:=CurrentTable^.LastLine^.LastEl;
|
||||
NewEl^.TextEnd:=TextPtr;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure THTMLTopicRenderer.DocHorizontalRuler;
|
||||
@ -661,6 +962,19 @@ begin
|
||||
AnyCharsInLine:=true;
|
||||
end;
|
||||
|
||||
procedure THTMLTopicRenderer.AddCharAt(C: char;AtPtr : sw_word);
|
||||
begin
|
||||
if (Topic=nil) or (TextPtr=MaxBytes) then Exit;
|
||||
if AtPtr>TextPtr then
|
||||
AtPtr:=TextPtr
|
||||
else
|
||||
begin
|
||||
Move(Topic^.Text^[AtPtr],Topic^.Text^[AtPtr+1],TextPtr-AtPtr);
|
||||
end;
|
||||
Topic^.Text^[AtPtr]:=ord(C);
|
||||
Inc(TextPtr);
|
||||
end;
|
||||
|
||||
procedure THTMLTopicRenderer.AddText(S: string);
|
||||
var I: sw_integer;
|
||||
begin
|
||||
@ -919,7 +1233,10 @@ end;
|
||||
END.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.3 2002-03-20 17:16:11 pierre
|
||||
Revision 1.4 2002-04-11 07:04:23 pierre
|
||||
+ handle tables
|
||||
|
||||
Revision 1.3 2002/03/20 17:16:11 pierre
|
||||
* correct some ansii file conversion problems
|
||||
|
||||
Revision 1.2 2001/09/18 11:33:53 pierre
|
||||
|
||||
Loading…
Reference in New Issue
Block a user