|
@@ -18,12 +18,23 @@ unit dw_basehtml;
|
|
|
|
|
|
|
|
interface
|
|
interface
|
|
|
|
|
|
|
|
-uses Classes, DOM, DOM_HTML, dGlobals, PasTree, dWriter;
|
|
|
|
|
|
|
+uses Classes, contnrs, DOM, DOM_HTML, dGlobals, PasTree, dWriter;
|
|
|
|
|
|
|
|
|
|
|
|
|
type
|
|
type
|
|
|
|
|
|
|
|
- { THTMLWriter }
|
|
|
|
|
|
|
+ { TLinkIdentifierMap }
|
|
|
|
|
+
|
|
|
|
|
+ TLinkIdentifierMap = class
|
|
|
|
|
+ Flist : TFPStringHashTable;
|
|
|
|
|
+ FWriter: TMultiFileDocWriter;
|
|
|
|
|
+ Public
|
|
|
|
|
+ constructor create(aWriter: TMultiFileDocWriter);
|
|
|
|
|
+ destructor destroy; override;
|
|
|
|
|
+ function GetLink(const aIdentifier : String) : String;
|
|
|
|
|
+ procedure AddLink(const aName, aLink : String);
|
|
|
|
|
+ procedure AddLink(const AElement : TPasElement);
|
|
|
|
|
+ end;
|
|
|
|
|
|
|
|
{ TBaseHTMLWriter }
|
|
{ TBaseHTMLWriter }
|
|
|
|
|
|
|
@@ -38,6 +49,8 @@ type
|
|
|
FCurOutputNode: TDOMNode;
|
|
FCurOutputNode: TDOMNode;
|
|
|
FDoPasHighlighting : Boolean;
|
|
FDoPasHighlighting : Boolean;
|
|
|
FHighlighterFlags: Byte;
|
|
FHighlighterFlags: Byte;
|
|
|
|
|
+ FContentElementStack : Array of THTMLElement;
|
|
|
|
|
+ FContentElementCount : Integer;
|
|
|
Protected
|
|
Protected
|
|
|
|
|
|
|
|
Procedure SetContentElement(aElement : THTMLELement); virtual;
|
|
Procedure SetContentElement(aElement : THTMLELement); virtual;
|
|
@@ -106,10 +119,12 @@ type
|
|
|
procedure AppendKw(Parent: TDOMNode; const AText: AnsiString); virtual;
|
|
procedure AppendKw(Parent: TDOMNode; const AText: AnsiString); virtual;
|
|
|
procedure AppendKw(Parent: TDOMNode; const AText: DOMString); virtual;
|
|
procedure AppendKw(Parent: TDOMNode; const AText: DOMString); virtual;
|
|
|
function AppendPasSHFragment(Parent: TDOMNode; const AText: String; AShFlags: Byte): Byte; virtual;
|
|
function AppendPasSHFragment(Parent: TDOMNode; const AText: String; AShFlags: Byte): Byte; virtual;
|
|
|
|
|
+ function AppendPasSHFragment(Parent: TDOMNode; const AText: String; AShFlags: Byte; aLinkIdentifierMap : TLinkIdentifierMap): Byte; virtual;
|
|
|
procedure AppendFragment(aParentNode: TDOMElement; aStream: TStream); virtual;
|
|
procedure AppendFragment(aParentNode: TDOMElement; aStream: TStream); virtual;
|
|
|
// FPDoc specifics
|
|
// FPDoc specifics
|
|
|
procedure AppendSourceRef(aParent: TDOMElement; AElement: TPasElement);
|
|
procedure AppendSourceRef(aParent: TDOMElement; AElement: TPasElement);
|
|
|
Procedure AppendSeeAlsoSection(AElement: TPasElement; DocNode: TDocNode); virtual;
|
|
Procedure AppendSeeAlsoSection(AElement: TPasElement; DocNode: TDocNode); virtual;
|
|
|
|
|
+ Procedure AppendSeeAlsoSection(AElement: TPasElement; aParent : TDOMElement; DocNode: TDocNode); virtual;
|
|
|
Procedure AppendExampleSection(AElement : TPasElement;DocNode : TDocNode); virtual;
|
|
Procedure AppendExampleSection(AElement : TPasElement;DocNode : TDocNode); virtual;
|
|
|
Procedure AppendShortDescr(Parent: TDOMNode; Element: TPasElement); virtual;
|
|
Procedure AppendShortDescr(Parent: TDOMNode; Element: TPasElement); virtual;
|
|
|
procedure AppendShortDescr(AContext: TPasElement; Parent: TDOMNode; DocNode: TDocNode); virtual;
|
|
procedure AppendShortDescr(AContext: TPasElement; Parent: TDOMNode; DocNode: TDocNode); virtual;
|
|
@@ -121,7 +136,8 @@ type
|
|
|
|
|
|
|
|
// Helper functions for creating DOM elements
|
|
// Helper functions for creating DOM elements
|
|
|
|
|
|
|
|
- function CreateEl(Parent: TDOMNode; const AName: DOMString): THTMLElement; virtual;
|
|
|
|
|
|
|
+ function CreateEl(Parent: TDOMNode; const AName: DOMString): THTMLElement; virtual; overload;
|
|
|
|
|
+ function CreateEl(Parent: TDOMNode; const AName, aClass: DOMString): THTMLElement; virtual; overload;
|
|
|
function CreatePara(Parent: TDOMNode): THTMLElement; virtual;
|
|
function CreatePara(Parent: TDOMNode): THTMLElement; virtual;
|
|
|
function CreateH1(Parent: TDOMNode): THTMLElement; virtual;
|
|
function CreateH1(Parent: TDOMNode): THTMLElement; virtual;
|
|
|
function CreateH2(Parent: TDOMNode): THTMLElement; virtual;
|
|
function CreateH2(Parent: TDOMNode): THTMLElement; virtual;
|
|
@@ -137,6 +153,11 @@ type
|
|
|
function CreateCode(Parent: TDOMNode): THTMLElement; virtual;
|
|
function CreateCode(Parent: TDOMNode): THTMLElement; virtual;
|
|
|
function CreateWarning(Parent: TDOMNode): THTMLElement; virtual;
|
|
function CreateWarning(Parent: TDOMNode): THTMLElement; virtual;
|
|
|
|
|
|
|
|
|
|
+ // Push new content element. Returns the old content element.
|
|
|
|
|
+ function PushContentElement(aElement: THTMLELement) : THTMLElement;
|
|
|
|
|
+ // Pop content element, returns the old content element.
|
|
|
|
|
+ function PopContentElement : THTMLElement;
|
|
|
|
|
+
|
|
|
|
|
|
|
|
// Some info
|
|
// Some info
|
|
|
Property ContentElement : THTMLELement Read FContentElement Write SetContentElement;
|
|
Property ContentElement : THTMLELement Read FContentElement Write SetContentElement;
|
|
@@ -158,7 +179,7 @@ Function FixHTMLpath(const S : String) : STring;
|
|
|
|
|
|
|
|
implementation
|
|
implementation
|
|
|
|
|
|
|
|
-uses fpdocstrs, xmlread, sysutils, sh_pas;
|
|
|
|
|
|
|
+uses fpdocstrs, xmlread, sysutils, sh_pas ;
|
|
|
|
|
|
|
|
Function FixHTMLpath(const S : String) : STring;
|
|
Function FixHTMLpath(const S : String) : STring;
|
|
|
|
|
|
|
@@ -166,6 +187,44 @@ begin
|
|
|
Result:=StringReplace(S,'\','/',[rfReplaceAll]);
|
|
Result:=StringReplace(S,'\','/',[rfReplaceAll]);
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
+{ TLinkIdentifierMap }
|
|
|
|
|
+
|
|
|
|
|
+constructor TLinkIdentifierMap.create(aWriter: TMultiFileDocWriter);
|
|
|
|
|
+begin
|
|
|
|
|
+ FList:=TFPStringHashTable.Create;
|
|
|
|
|
+ FWriter:=aWriter;
|
|
|
|
|
+end;
|
|
|
|
|
+
|
|
|
|
|
+destructor TLinkIdentifierMap.destroy;
|
|
|
|
|
+begin
|
|
|
|
|
+ Flist.Free;
|
|
|
|
|
+ inherited destroy;
|
|
|
|
|
+end;
|
|
|
|
|
+
|
|
|
|
|
+function TLinkIdentifierMap.GetLink(const aIdentifier: String): String;
|
|
|
|
|
+begin
|
|
|
|
|
+ Result:=FList.Items[Trim(LowerCase(aIdentifier))]
|
|
|
|
|
+end;
|
|
|
|
|
+
|
|
|
|
|
+procedure TLinkIdentifierMap.AddLink(const aName, aLink: String);
|
|
|
|
|
+begin
|
|
|
|
|
+ if (aName='') or (aLink='') then
|
|
|
|
|
+ exit;
|
|
|
|
|
+ FList.Add(LowerCase(aName),aLink);
|
|
|
|
|
+end;
|
|
|
|
|
+
|
|
|
|
|
+procedure TLinkIdentifierMap.AddLink(const AElement: TPasElement);
|
|
|
|
|
+var
|
|
|
|
|
+ lLink : String;
|
|
|
|
|
+begin
|
|
|
|
|
+ if aElement.Name<>'' then
|
|
|
|
|
+ begin
|
|
|
|
|
+ lLink:=FWriter.ResolveLinkID(aElement.FullName);
|
|
|
|
|
+ if lLink<>'' then
|
|
|
|
|
+ AddLink(aElement.Name,lLink);
|
|
|
|
|
+ end;
|
|
|
|
|
+end;
|
|
|
|
|
+
|
|
|
constructor TBaseHTMLWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
|
|
constructor TBaseHTMLWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
|
|
|
|
|
|
|
|
begin
|
|
begin
|
|
@@ -181,7 +240,7 @@ begin
|
|
|
inherited Destroy;
|
|
inherited Destroy;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
-Procedure TBaseHTMLWriter.SetContentElement(aElement : THTMLELement);
|
|
|
|
|
|
|
+procedure TBaseHTMLWriter.SetContentElement(aElement: THTMLELement);
|
|
|
|
|
|
|
|
begin
|
|
begin
|
|
|
FContentElement:=aElement;
|
|
FContentElement:=aElement;
|
|
@@ -194,6 +253,12 @@ begin
|
|
|
Parent.AppendChild(Result);
|
|
Parent.AppendChild(Result);
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
+function TBaseHTMLWriter.CreateEl(Parent: TDOMNode; const AName, aClass: DOMString): THTMLElement;
|
|
|
|
|
+begin
|
|
|
|
|
+ Result:=CreateEl(Parent,aName);
|
|
|
|
|
+ Result['class']:=aClass;
|
|
|
|
|
+end;
|
|
|
|
|
+
|
|
|
function TBaseHTMLWriter.CreatePara(Parent: TDOMNode): THTMLElement;
|
|
function TBaseHTMLWriter.CreatePara(Parent: TDOMNode): THTMLElement;
|
|
|
begin
|
|
begin
|
|
|
Result := CreateEl(Parent, 'p');
|
|
Result := CreateEl(Parent, 'p');
|
|
@@ -275,6 +340,26 @@ begin
|
|
|
Result['class'] := 'warning';
|
|
Result['class'] := 'warning';
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
+function TBaseHTMLWriter.PushContentElement(aElement: THTMLELement): THTMLElement;
|
|
|
|
|
+begin
|
|
|
|
|
+ if FContentElementCount=Length(FContentElementStack) then
|
|
|
|
|
+ SetLength(FContentElementStack,FContentElementCount+10);
|
|
|
|
|
+ Result:=FContentElement;
|
|
|
|
|
+ FContentElementStack[FContentElementCount]:=Result;
|
|
|
|
|
+ FContentElement:=aElement;
|
|
|
|
|
+ Inc(FContentElementCount);
|
|
|
|
|
+end;
|
|
|
|
|
+
|
|
|
|
|
+function TBaseHTMLWriter.PopContentElement: THTMLElement;
|
|
|
|
|
+begin
|
|
|
|
|
+ if FContentElementCount=0 then
|
|
|
|
|
+ Raise EFPDocWriterError.Create('Cannot pop content element, at bottom of stack');
|
|
|
|
|
+ Result:=FContentElement;
|
|
|
|
|
+ FContentElement:=FContentElementStack[FContentElementCount-1];
|
|
|
|
|
+ FContentElementStack[FContentElementCount-1]:=Nil;
|
|
|
|
|
+ Dec(FContentElementCount);
|
|
|
|
|
+end;
|
|
|
|
|
+
|
|
|
procedure TBaseHTMLWriter.DescrEmitNotesHeader(AContext: TPasElement);
|
|
procedure TBaseHTMLWriter.DescrEmitNotesHeader(AContext: TPasElement);
|
|
|
begin
|
|
begin
|
|
|
AppendText(CreateH2(ContentElement), SDocNotes);
|
|
AppendText(CreateH2(ContentElement), SDocNotes);
|
|
@@ -704,6 +789,12 @@ end;
|
|
|
function TBaseHTMLWriter.AppendPasSHFragment(Parent: TDOMNode;
|
|
function TBaseHTMLWriter.AppendPasSHFragment(Parent: TDOMNode;
|
|
|
const AText: String; AShFlags: Byte): Byte;
|
|
const AText: String; AShFlags: Byte): Byte;
|
|
|
|
|
|
|
|
|
|
+begin
|
|
|
|
|
+ Result:=AppendPasSHFragment(Parent,aText,AShFlags,Nil);
|
|
|
|
|
+end;
|
|
|
|
|
+
|
|
|
|
|
+function TBaseHTMLWriter.AppendPasSHFragment(Parent: TDOMNode; const AText: String; AShFlags: Byte;
|
|
|
|
|
+ aLinkIdentifierMap: TLinkIdentifierMap): Byte;
|
|
|
|
|
|
|
|
var
|
|
var
|
|
|
Line, Last, p: PChar;
|
|
Line, Last, p: PChar;
|
|
@@ -780,8 +871,13 @@ begin
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
-procedure TBaseHTMLWriter.AppendSeeAlsoSection ( AElement: TPasElement;
|
|
|
|
|
- DocNode: TDocNode ) ;
|
|
|
|
|
|
|
+
|
|
|
|
|
+procedure TBaseHTMLWriter.AppendSeeAlsoSection (AElement: TPasElement; DocNode: TDocNode) ;
|
|
|
|
|
+begin
|
|
|
|
|
+ AppendSeeAlsoSection(aElement,ContentElement,DocNode);
|
|
|
|
|
+end;
|
|
|
|
|
+
|
|
|
|
|
+procedure TBaseHTMLWriter.AppendSeeAlsoSection(AElement: TPasElement; aParent: TDOMElement; DocNode: TDocNode);
|
|
|
|
|
|
|
|
var
|
|
var
|
|
|
Node: TDOMNode;
|
|
Node: TDOMNode;
|
|
@@ -801,8 +897,8 @@ begin
|
|
|
if IsFirstSeeAlso then
|
|
if IsFirstSeeAlso then
|
|
|
begin
|
|
begin
|
|
|
IsFirstSeeAlso := False;
|
|
IsFirstSeeAlso := False;
|
|
|
- AppendText(CreateH2(ContentElement), SDocSeeAlso);
|
|
|
|
|
- TableEl := CreateTable(ContentElement);
|
|
|
|
|
|
|
+ AppendText(CreateH2(aParent), SDocSeeAlso);
|
|
|
|
|
+ TableEl := CreateTable(aParent);
|
|
|
end;
|
|
end;
|
|
|
El:=TDOMElement(Node);
|
|
El:=TDOMElement(Node);
|
|
|
TREl:=CreateTR(TableEl);
|
|
TREl:=CreateTR(TableEl);
|