Browse Source

* Some refactorings for new HTML writer

Michaël Van Canneyt 2 weeks ago
parent
commit
af9c66274d
1 changed files with 105 additions and 9 deletions
  1. 105 9
      utils/fpdoc/dw_basehtml.pp

+ 105 - 9
utils/fpdoc/dw_basehtml.pp

@@ -18,12 +18,23 @@ unit dw_basehtml;
 
 interface
 
-uses Classes, DOM, DOM_HTML, dGlobals, PasTree, dWriter;
+uses Classes, contnrs, DOM, DOM_HTML, dGlobals, PasTree, dWriter;
 
 
 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 }
 
@@ -38,6 +49,8 @@ type
     FCurOutputNode: TDOMNode;
     FDoPasHighlighting : Boolean;
     FHighlighterFlags: Byte;
+    FContentElementStack : Array of THTMLElement;
+    FContentElementCount : Integer;
   Protected
 
     Procedure SetContentElement(aElement : THTMLELement); virtual;
@@ -106,10 +119,12 @@ type
     procedure AppendKw(Parent: TDOMNode; const AText: AnsiString); 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; aLinkIdentifierMap : TLinkIdentifierMap): Byte; virtual;
     procedure AppendFragment(aParentNode: TDOMElement; aStream: TStream); virtual;
     // FPDoc specifics
     procedure AppendSourceRef(aParent: TDOMElement; AElement: TPasElement);
     Procedure AppendSeeAlsoSection(AElement: TPasElement; DocNode: TDocNode); virtual;
+    Procedure AppendSeeAlsoSection(AElement: TPasElement; aParent : TDOMElement; DocNode: TDocNode); virtual;
     Procedure AppendExampleSection(AElement : TPasElement;DocNode : TDocNode); virtual;
     Procedure AppendShortDescr(Parent: TDOMNode; Element: TPasElement); virtual;
     procedure AppendShortDescr(AContext: TPasElement; Parent: TDOMNode; DocNode: TDocNode); virtual;
@@ -121,7 +136,8 @@ type
 
     // 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 CreateH1(Parent: TDOMNode): THTMLElement; virtual;
     function CreateH2(Parent: TDOMNode): THTMLElement; virtual;
@@ -137,6 +153,11 @@ type
     function CreateCode(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
     Property ContentElement : THTMLELement Read FContentElement Write SetContentElement;
@@ -158,7 +179,7 @@ Function FixHTMLpath(const S : String) : STring;
 
 implementation
 
-uses fpdocstrs, xmlread, sysutils, sh_pas;
+uses fpdocstrs, xmlread, sysutils, sh_pas ;
 
 Function FixHTMLpath(const S : String) : STring;
 
@@ -166,6 +187,44 @@ begin
   Result:=StringReplace(S,'\','/',[rfReplaceAll]);
 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);
 
 begin
@@ -181,7 +240,7 @@ begin
   inherited Destroy;
 end;
 
-Procedure TBaseHTMLWriter.SetContentElement(aElement : THTMLELement);
+procedure TBaseHTMLWriter.SetContentElement(aElement: THTMLELement);
 
 begin
   FContentElement:=aElement;
@@ -194,6 +253,12 @@ begin
   Parent.AppendChild(Result);
 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;
 begin
   Result := CreateEl(Parent, 'p');
@@ -275,6 +340,26 @@ begin
   Result['class'] := 'warning';
 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);
 begin
   AppendText(CreateH2(ContentElement), SDocNotes);
@@ -704,6 +789,12 @@ end;
 function TBaseHTMLWriter.AppendPasSHFragment(Parent: TDOMNode;
   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
   Line, Last, p: PChar;
@@ -780,8 +871,13 @@ begin
 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
   Node: TDOMNode;
@@ -801,8 +897,8 @@ begin
        if IsFirstSeeAlso then
          begin
          IsFirstSeeAlso := False;
-         AppendText(CreateH2(ContentElement), SDocSeeAlso);
-         TableEl := CreateTable(ContentElement);
+         AppendText(CreateH2(aParent), SDocSeeAlso);
+         TableEl := CreateTable(aParent);
          end;
        El:=TDOMElement(Node);
        TREl:=CreateTR(TableEl);