mkfpdoc.pp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. unit mkfpdoc;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, dglobals, fpdocxmlopts, dwriter, pscanner, pparser, fpdocproj;
  6. const
  7. DefOSTarget = {$I %FPCTARGETOS%};
  8. DefCPUTarget = {$I %FPCTARGETCPU%};
  9. DefFPCVersion = {$I %FPCVERSION%};
  10. DefFPCDate = {$I %FPCDATE%};
  11. Type
  12. { TFPDocCreator }
  13. TFPDocCreator = Class(TComponent)
  14. Private
  15. FOnLog: TPasParserLogHandler;
  16. FPParserLogEvents: TPParserLogEvents;
  17. FProject : TFPDocProject;
  18. FScannerLogEvents: TPScannerLogEvents;
  19. FVerbose: Boolean;
  20. function GetOptions: TEngineOptions;
  21. function GetPackages: TFPDocPackages;
  22. Protected
  23. procedure SetVerbose(AValue: Boolean); virtual;
  24. Procedure DoLog(Const Msg : String);
  25. procedure DoLog(Const Fmt : String; Args : Array of Const);
  26. procedure CreateOutput(APackage: TFPDocPackage; Engine: TFPDocEngine); virtual;
  27. Public
  28. Constructor Create(AOwner : TComponent); override;
  29. Destructor Destroy; override;
  30. Procedure CreateDocumentation(APackage : TFPDocPackage; ParseOnly : Boolean); virtual;
  31. Procedure CreateProjectFile(Const AFileName : string);
  32. Procedure LoadProjectFile(Const AFileName: string);
  33. Property Project : TFPDocProject Read FProject;
  34. Property ScannerLogEvents : TPScannerLogEvents Read FScannerLogEvents Write FScannerLogEvents;
  35. Property ParserLogEvents : TPParserLogEvents Read FPParserLogEvents Write FPParserLogEvents;
  36. Property Verbose : Boolean Read FVerbose Write SetVerbose;
  37. Property OnLog : TPasParserLogHandler Read FOnLog Write FOnLog;
  38. // Easy access
  39. Property Options : TEngineOptions Read GetOptions;
  40. Property Packages : TFPDocPackages Read GetPackages;
  41. end;
  42. implementation
  43. { TFPDocCreator }
  44. procedure TFPDocCreator.SetVerbose(AValue: Boolean);
  45. begin
  46. if FVerbose=AValue then Exit;
  47. FVerbose:=AValue;
  48. if FVerbose then
  49. begin
  50. ScannerLogEvents:=[sleFile];
  51. ParserLogEvents:=[];
  52. end
  53. else
  54. begin
  55. ScannerLogEvents:=[];
  56. ParserLogEvents:=[];
  57. end;
  58. end;
  59. procedure TFPDocCreator.DoLog(const Msg: String);
  60. begin
  61. If Assigned(OnLog) then
  62. OnLog(Self,Msg);
  63. end;
  64. procedure TFPDocCreator.DoLog(const Fmt: String; Args: array of const);
  65. begin
  66. DoLog(Format(Fmt,Args));
  67. end;
  68. function TFPDocCreator.GetOptions: TEngineOptions;
  69. begin
  70. Result:=FProject.Options;
  71. end;
  72. function TFPDocCreator.GetPackages: TFPDocPackages;
  73. begin
  74. Result:=FProject.Packages;
  75. end;
  76. constructor TFPDocCreator.Create(AOwner: TComponent);
  77. begin
  78. inherited Create(AOwner);
  79. FProject:=TFPDocProject.Create(Self);
  80. FProject.Options.StopOnParseError:=False;
  81. FProject.Options.CPUTarget:=DefCPUTarget;
  82. FProject.Options.OSTarget:=DefOSTarget;
  83. end;
  84. destructor TFPDocCreator.Destroy;
  85. begin
  86. FreeAndNil(FProject);
  87. inherited Destroy;
  88. end;
  89. procedure TFPDocCreator.CreateOutput(APackage: TFPDocPackage;Engine : TFPDocEngine);
  90. Var
  91. WriterClass : TFPDocWriterClass;
  92. Writer : TFPDocWriter;
  93. I : Integer;
  94. Cmd,Arg : String;
  95. begin
  96. WriterClass:=GetWriterClass(Options.Backend);
  97. Writer:=WriterClass.Create(Engine.Package,Engine);
  98. With Writer do
  99. Try
  100. If FVerbose then
  101. DoLog('Writing documentation');
  102. OnLog:=Self.OnLog;
  103. If Options.BackendOptions.Count>0 then
  104. for I:=0 to ((Options.BackendOptions.Count-1) div 2) do
  105. begin
  106. Cmd:=Options.BackendOptions[I*2];
  107. Arg:=Options.BackendOptions[I*2+1];
  108. If not InterPretOption(Cmd,Arg) then
  109. DoLog(SCmdLineInvalidOption,[Cmd+'='+Arg]);
  110. end;
  111. WriteDoc;
  112. Finally
  113. Free;
  114. end;
  115. if Length(APackage.ContentFile) > 0 then
  116. Engine.WriteContentFile(APackage.ContentFile);
  117. end;
  118. procedure TFPDocCreator.CreateDocumentation(APackage: TFPDocPackage; ParseOnly : Boolean);
  119. var
  120. i,j: Integer;
  121. Engine : TFPDocEngine;
  122. Cmd,Arg : String;
  123. begin
  124. Engine:=TFPDocEngine.Create;
  125. try
  126. For J:=0 to Apackage.Imports.Count-1 do
  127. begin
  128. Arg:=Apackage.Imports[j];
  129. i := Pos(',', Arg);
  130. Engine.ReadContentFile(Copy(Arg,1,i-1),Copy(Arg,i+1,Length(Arg)));
  131. end;
  132. for i := 0 to APackage.Descriptions.Count - 1 do
  133. Engine.AddDocFile(APackage.Descriptions[i],Options.donttrim);
  134. Engine.SetPackageName(APackage.Name);
  135. Engine.Output:=APackage.Output;
  136. Engine.OnLog:=Self.OnLog;
  137. Engine.ScannerLogEvents:=Self.ScannerLogEvents;
  138. Engine.ParserLogEvents:=Self.ParserLogEvents;
  139. Engine.HideProtected:=Options.HideProtected;
  140. Engine.HidePrivate:=Not Options.ShowPrivate;
  141. if Length(Options.Language) > 0 then
  142. TranslateDocStrings(Options.Language);
  143. for i := 0 to APackage.Inputs.Count - 1 do
  144. try
  145. ParseSource(Engine, APackage.Inputs[i], Options.OSTarget, Options.CPUTarget);
  146. except
  147. on e: EParserError do
  148. If Options.StopOnParseError then
  149. Raise
  150. else
  151. DoLog('%s(%d,%d): %s',[e.Filename, e.Row, e.Column, e.Message]);
  152. end;
  153. if Not ParseOnly then
  154. CreateOutput(APackage,Engine);
  155. finally
  156. FreeAndNil(Engine);
  157. end;
  158. end;
  159. procedure TFPDocCreator.CreateProjectFile(Const AFileName: string);
  160. begin
  161. With TXMLFPDocOptions.Create(Self) do
  162. try
  163. SaveOptionsToFile(FProject,AFileName);
  164. finally
  165. Free;
  166. end;
  167. end;
  168. procedure TFPDocCreator.LoadProjectFile(const AFileName: string);
  169. begin
  170. With TXMLFPDocOptions.Create(self) do
  171. try
  172. LoadOptionsFromFile(FProject,AFileName);
  173. finally
  174. Free;
  175. end;
  176. end;
  177. end.