diff --git a/utils/fpdoc/dglobals.pp b/utils/fpdoc/dglobals.pp index 6a6414413b..187c30071c 100644 --- a/utils/fpdoc/dglobals.pp +++ b/utils/fpdoc/dglobals.pp @@ -248,7 +248,10 @@ type // The main FPDoc engine + { TFPDocEngine } + TFPDocEngine = class(TPasTreeContainer) + private protected DescrDocs: TObjectList; // List of XML documents DescrDocNames: TStringList; // Names of the XML documents @@ -275,6 +278,7 @@ type procedure AddLink(const APathName, ALinkTo: String); function FindAbsoluteLink(const AName: String): String; function ResolveLink(AModule: TPasModule; const ALinkDest: String): String; + function FindLinkedNode(ANode: TDocNode): TDocNode; // Documentation file support procedure AddDocFile(const AFilename: String); @@ -1195,24 +1199,51 @@ begin end; function TFPDocEngine.FindShortDescr(AElement: TPasElement): TDOMElement; + var - DocNode: TDocNode; + DocNode,N: TDocNode; + begin DocNode := FindDocNode(AElement); if Assigned(DocNode) then - Result := DocNode.ShortDescr + begin + N:=FindLinkedNode(DocNode); + If (N<>Nil) then + DocNode:=N; + Result := DocNode.ShortDescr; + end else Result := nil; end; + +function TFPDocEngine.FindLinkedNode(ANode : TDocNode) : TDocNode; + +Var + S: String; + +begin + If (ANode.Link='') then + Result:=Nil + else + Result:=FindDocNode(CurModule,ANode.Link); +end; + function TFPDocEngine.FindShortDescr(ARefModule: TPasModule; const AName: String): TDOMElement; + var - DocNode: TDocNode; + N,DocNode: TDocNode; + begin DocNode := FindDocNode(ARefModule, AName); if Assigned(DocNode) then - Result := DocNode.ShortDescr + begin + N:=FindLinkedNode(DocNode); + If (N<>Nil) then + DocNode:=N; + Result := DocNode.ShortDescr; + end else Result := nil; end; diff --git a/utils/fpdoc/dw_html.pp b/utils/fpdoc/dw_html.pp index e52b10aadb..eb8e3da300 100644 --- a/utils/fpdoc/dw_html.pp +++ b/utils/fpdoc/dw_html.pp @@ -191,11 +191,11 @@ type AShFlags: Byte): Byte; Procedure AppendShortDescr(AContext : TPasElement;Parent: TDOMNode; DocNode : TDocNode); procedure AppendShortDescr(Parent: TDOMNode; Element: TPasElement); + procedure AppendShortDescrCell(Parent: TDOMNode; Element: TPasElement); procedure AppendDescr(AContext: TPasElement; Parent: TDOMNode; DescrNode: TDOMElement; AutoInsertBlock: Boolean); procedure AppendDescrSection(AContext: TPasElement; Parent: TDOMNode; DescrNode: TDOMElement; const ATitle: DOMString); - procedure AppendShortDescrCell(Parent: TDOMNode; Element: TPasElement); function AppendHyperlink(Parent: TDOMNode; Element: TPasElement): TDOMElement; function AppendType(CodeEl, TableEl: TDOMElement; Element: TPasType; Expanded: Boolean; @@ -1364,16 +1364,28 @@ end; Procedure THTMLWriter.AppendShortDescr(AContext: TPasElement; Parent: TDOMNode; DocNode : TDocNode); +Var + N : TDocNode; + begin - if Assigned(DocNode) and Assigned(DocNode.ShortDescr) then + if Assigned(DocNode) then begin - PushOutputNode(Parent); - try - if not ConvertShort(AContext,TDomElement(DocNode.ShortDescr)) then - Warning(AContext, SErrInvalidShortDescr) - finally - PopOutputNode; - end; + If (DocNode.Link<>'') then + begin + N:=Engine.FindLinkedNode(DocNode); + If (N<>Nil) then + DocNode:=N; + end; + If Assigned(DocNode.ShortDescr) then + begin + PushOutputNode(Parent); + try + if not ConvertShort(AContext,TDomElement(DocNode.ShortDescr)) then + Warning(AContext, SErrInvalidShortDescr) + finally + PopOutputNode; + end; + end; end; end; @@ -1383,6 +1395,22 @@ begin AppendShortDescr(Element,Parent,Engine.FindDocNode(Element)); end; +procedure THTMLWriter.AppendShortDescrCell(Parent: TDOMNode; + Element: TPasElement); + +var + ParaEl: TDOMElement; + +begin + if Assigned(Engine.FindShortDescr(Element)) then + begin + AppendNbSp(CreatePara(CreateTD(Parent)), 2); + ParaEl := CreatePara(CreateTD(Parent)); + ParaEl['class'] := 'cmt'; + AppendShortDescr(ParaEl, Element); + end; +end; + procedure THTMLWriter.AppendDescr(AContext: TPasElement; Parent: TDOMNode; DescrNode: TDOMElement; AutoInsertBlock: Boolean); begin @@ -1409,19 +1437,6 @@ begin end; -procedure THTMLWriter.AppendShortDescrCell(Parent: TDOMNode; - Element: TPasElement); -var - ParaEl: TDOMElement; -begin - if Assigned(Engine.FindShortDescr(Element)) then - begin - AppendNbSp(CreatePara(CreateTD(Parent)), 2); - ParaEl := CreatePara(CreateTD(Parent)); - ParaEl['class'] := 'cmt'; - AppendShortDescr(ParaEl, Element); - end; -end; function THTMLWriter.AppendHyperlink(Parent: TDOMNode; Element: TPasElement): TDOMElement; diff --git a/utils/fpdoc/fpclasschart.pp b/utils/fpdoc/fpclasschart.pp index 622c16f4ea..02657a7dc4 100644 --- a/utils/fpdoc/fpclasschart.pp +++ b/utils/fpdoc/fpclasschart.pp @@ -60,6 +60,301 @@ type const ASourceFilename: String; ASourceLinenumber: Integer): TPasElement; override; end; + { TClassChartFormatter } + TClassMode = (cmNormal,cmSubClass,cmheadClass,cmFirstClass); + TClassChartFormatter = Class (TObject) + private + FClassMode: TClassMode; + FClassTree: TXMLDocument; + FCurrentColCount: Integer; + FCurrentRowCount: Integer; + FFileName: String; + FLargeHeadClassObjects: TStrings; + FLevel: Integer; + FMaxObjectsPerColumn: Integer; + FStartColumnObjects: TStrings; + Protected + procedure FirstClass(E : TDomElement); virtual; + procedure DoEmitClass(E : TDomElement); virtual; + procedure DoHeadClass(E: TDomElement); virtual; + procedure DoNextColumn(E: TDomElement); virtual; + procedure EndSubClass(E: TDomElement; HasSiblings : Boolean); virtual; + procedure StartSubClass(E: TDomElement); virtual; + Procedure StartChart; virtual; + Procedure EndChart; virtual; + procedure EmitClass(E : TDomElement; HasSiblings : Boolean); + Public + Constructor Create (AXML : TXMLDocument); virtual; + Destructor Destroy; override; + Procedure CreateChart; + Property CurrentColCount : Integer Read FCurrentColCount; + Property CurrentRowCount : Integer Read FCurrentRowCount; + Property ClassTree : TXMLDocument Read FClassTree; + Property Level : Integer Read FLevel Write FLevel; + Property ClassMode : TClassMode Read FClassMode; + Published + Property FileName : String Read FFileName Write FFilename; + Property StartColumnObjects : TStrings Read FStartColumnObjects; + Property LargeHeadClassObjects : TStrings Read FLargeHeadClassObjects; + Property MaxObjectsPerColumn : Integer Read FMaxObjectsPerColumn Write FMaxObjectsPerColumn; + end; + +{ TChartFormatter } + +constructor TClassChartFormatter.Create(AXML: TXMLDocument); +begin + FClassTree:=AXML; + MaxObjectsPerColumn:=60; + FStartColumnObjects:=TStringList.Create; + FLargeHeadClassObjects:=TStringList.Create; + FLargeHeadClassObjects.Add('TPersistent'); + FLargeHeadClassObjects.Add('TComponent'); +end; + +destructor TClassChartFormatter.Destroy; +begin + FreeAndNil(FStartColumnObjects); + FreeAndNil(FLargeHeadClassObjects); + Inherited; +end; + +procedure TClassChartFormatter.CreateChart; + +Var + N : TDomNode; + E : TDomElement; + I : Integer; + L : TFPList; + +begin + (FStartColumnObjects as TStringList).Sorted:=False; + (FLargeHeadClassObjects as TStringList).Sorted:=False; + StartChart; + try + N:=FClassTree.DocumentElement.FirstChild; + FCurrentColCount:=0; + FCurrentRowCount:=0; + FLevel:=0; + L:=TFPList.Create; + try + While (N<>nil) do + begin + If (N.NodeType=ELEMENT_NODE) then + L.Add(N); + N:=N.NextSibling; + end; + If (L.Count>0) then + begin + FirstClass(TDomElement(L[0])); + For I:=0 to L.Count-1 do + EmitClass(TDomElement(L[i]),II) or ((FCurrentRowCount>MaxObjectsPerColumn) and (FLevel=2)) then + DoNextColumn(E) + else + begin + I:=FLargeHeadClassObjects.IndexOf(E.NodeName); + if (-1<>I) then + begin + FLargeHeadClassObjects.Objects[i]:=E; + Exit; // Must be picked up later. + end; + end; + DoEmitClass(E); + N:=E.FirstChild; + DidSub:=False; + L:=TFPList.Create; + try + While (N<>Nil) do + begin + if (N.NodeType=ELEMENT_NODE) then + L.Add(N); + N:=N.NextSibling; + end; + If L.Count>0 then + begin + StartSubClass(TDomElement(L[0])); + For I:=0 to L.Count-1 do + begin + EmitClass(TDomElement(L[i]),I0 then + Dec(Findent); +end; + +procedure TPostScriptClassChartFormatter.StartSubClass(E: TDomElement); +begin + inherited StartSubClass(E); + Inc(Findent); +end; + +procedure TPostScriptClassChartFormatter.StartChart; +begin + Assign(FFile,FileName); + Rewrite(FFile); +end; + +procedure TPostScriptClassChartFormatter.EndChart; +begin + Close(FFile); +end; + +Type + TOutputFormat = (ofxml,ofPostscript); + +Var + OutputFormat : TOutputFormat = ofXML; + const OSTarget: String = {$I %FPCTARGETOS%}; CPUTarget: String = {$I %FPCTARGETCPU%}; @@ -277,7 +572,18 @@ begin Engine.Free; end; end; - WriteXMlFile(XML,AOutputName); + Case OutputFormat of + ofXML : + WriteXMlFile(XML,AOutputName); + ofPostScript : + With TPostScriptClassChartFormatter.Create(XML) do + try + FileName:=AOutputName; + CreateChart; + finally + Free; + end; + end; Writeln(StdErr,Format(SClassesAdded,[ACount,InputFiles.Count])); Finally XML.Free; @@ -377,6 +683,8 @@ begin OutputName := Arg else if (Cmd = '-k') or (Cmd = '--kind') then cmdObjectKind:=TPasObjKind(GetEnumValue(TypeInfo(TPasObjKind),'ok'+Arg)) + else if (Cmd = '-f') or (Cmd = '--format') then + OutputFormat:=TOutputFormat(GetEnumValue(TypeInfo(TOutputFormat),'of'+Arg)) else if Cmd = '--merge' then begin if FileExists(Arg) then diff --git a/utils/fpdoc/fpdoc.lpi b/utils/fpdoc/fpdoc.lpi index baa0740e06..922b445054 100644 --- a/utils/fpdoc/fpdoc.lpi +++ b/utils/fpdoc/fpdoc.lpi @@ -12,6 +12,7 @@ +