From efabb72e71ee2955316174c0511ff0cd777ea6b5 Mon Sep 17 00:00:00 2001 From: marco Date: Sun, 2 Jan 2011 21:09:30 +0000 Subject: [PATCH] * grapviz output for fpclasschart, mantis 18201 git-svn-id: trunk@16690 - --- utils/fpdoc/fpclasschart.pp | 86 ++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 2 deletions(-) diff --git a/utils/fpdoc/fpclasschart.pp b/utils/fpdoc/fpclasschart.pp index 19d1cda35c..e4049dca09 100644 --- a/utils/fpdoc/fpclasschart.pp +++ b/utils/fpdoc/fpclasschart.pp @@ -349,8 +349,82 @@ begin Close(FFile); end; +type + { TGraphVizClassChartFormatter } + + TGraphVizClassChartFormatter = class(TClassChartFormatter) + FFile : Text; + FMode : TClassMode; + FIndent : integer; + Procedure EmitLine(S : string); + Protected + procedure DoEmitClass(E : TDomElement); override; + procedure DoNextColumn(E: TDomElement); override; + procedure DoHeadClass(E: TDomElement); override; + procedure StartSubClass(E: TDomElement); override; + procedure EndSubClass(E: TDomElement; HasSiblings : Boolean); override; + Procedure StartChart; override; + Procedure EndChart; override; + end; + + { TGraphVizClassChartFormatter } + + procedure TGraphVizClassChartFormatter.EmitLine(S: String); + begin + Writeln(FFile,StringofChar(' ',Findent*2),S); + end; + + procedure TGraphVizClassChartFormatter.DoEmitClass(E: TDomElement); + begin + Case ClassMode of + cmFirstClass : EmitLine(Format('%s -> %s', [E.ParentNode.NodeName, E.NodeName])); + cmNormal : EmitLine(Format('%s -> %s', [E.ParentNode.NodeName, E.NodeName])); + cmSubClass : EmitLine(Format('%s -> %s', [E.ParentNode.NodeName, E.NodeName])); + cmHeadClass : EmitLine(Format('%s -> %s', [E.ParentNode.NodeName, E.NodeName])); + end; + end; + + procedure TGraphVizClassChartFormatter.DoNextColumn(E: TDomElement); + begin + Inherited; + FIndent:=0; + end; + + procedure TGraphVizClassChartFormatter.DoHeadClass(E: TDomElement); + begin + // DoNextColumn(E); + inherited DoHeadClass(E); + end; + + + procedure TGraphVizClassChartFormatter.EndSubClass(E: TDomElement; HasSiblings : Boolean); + begin + If FIndent>0 then + Dec(Findent); + end; + + procedure TGraphVizClassChartFormatter.StartSubClass(E: TDomElement); + begin + inherited StartSubClass(E); + Inc(Findent); + end; + + procedure TGraphVizClassChartFormatter.StartChart; + begin + Assign(FFile,FileName); + Rewrite(FFile); + EmitLine('digraph G {'); + end; + + procedure TGraphVizClassChartFormatter.EndChart; + begin + EmitLine('}'); + Close(FFile); + end; + + Type - TOutputFormat = (ofxml,ofPostscript); + TOutputFormat = (ofXML,ofPostscript, ofGraphViz); Var OutputFormat : TOutputFormat = ofXML; @@ -361,7 +435,6 @@ const FPCVersion: String = {$I %FPCVERSION%}; FPCDate: String = {$I %FPCDATE%}; - function TClassTreeEngine.CreateElement(AClass: TPTreeElement; const AName: String; AParent: TPasElement; AVisibility : TPasMemberVisibility; @@ -583,6 +656,14 @@ begin finally Free; end; + ofGraphViz : + With TGraphVizClassChartFormatter.Create(XML) do + try + FileName:=AOutputName; + CreateChart; + finally + Free; + end; end; Writeln(StdErr,Format(SClassesAdded,[ACount,InputFiles.Count])); Finally @@ -632,6 +713,7 @@ begin Writeln(' --kind=objectkind Specify object kind. One of object, class, interface.'); Writeln(' --lang=language Use selected language.'); Writeln(' --output=filename Send output to file.'); + Writeln(' --format=name Kind of output to create: XML, PostScript, GraphViz.'); end; procedure ParseOption(const s: String);