fpdoc.pp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. {
  2. FPDoc - Free Pascal Documentation Tool
  3. Copyright (C) 2000 - 2003 by
  4. Areca Systems GmbH / Sebastian Guenther, [email protected]
  5. See the file COPYING, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. }
  11. program FPDoc;
  12. uses
  13. SysUtils, Classes, Gettext, DOM, XMLWrite, PasTree, PParser,
  14. dGlobals, // GLobal definitions, constants.
  15. dwriter, // TFPDocWriter definition.
  16. dwlinear, // Linear (abstract) writer
  17. dw_LaTeX, // TLaTex writer
  18. dw_XML, // XML writer
  19. dw_HTML, // HTML writer
  20. dw_ipf, // IPF writer
  21. dw_man, // Man page writer
  22. dw_txt; // TXT writer
  23. const
  24. OSTarget: String = {$I %FPCTARGETOS%};
  25. CPUTarget: String = {$I %FPCTARGETCPU%};
  26. FPCVersion: String = {$I %FPCVERSION%};
  27. FPCDate: String = {$I %FPCDATE%};
  28. var
  29. Backend : String;
  30. BackendOptions : TStrings;
  31. InputFiles, DescrFiles: TStringList;
  32. PackageName, DocLang, ContentFile : String;
  33. Engine: TFPDocEngine;
  34. Procedure Usage(AnExitCode : Byte);
  35. Var
  36. I,P : Integer;
  37. S : String;
  38. L : TStringList;
  39. C : TFPDocWriterClass;
  40. begin
  41. Writeln(Format(SCmdLineHelp,[ExtractFileName(Paramstr(0))]));
  42. Writeln(SUsageOption010);
  43. Writeln(SUsageOption020);
  44. Writeln(SUsageOption030);
  45. Writeln(SUsageOption040);
  46. Writeln(SUsageOption050);
  47. Writeln(SUsageOption060);
  48. Writeln(SUsageOption070);
  49. Writeln(SUsageOption080);
  50. Writeln(SUsageOption090);
  51. Writeln(SUsageOption100);
  52. Writeln(SUsageOption110);
  53. Writeln(SUsageOption120);
  54. Writeln(SUsageOption130);
  55. Writeln(SUsageOption140);
  56. Writeln(SUsageOption150);
  57. Writeln(SUsageOption160);
  58. Writeln(SUsageOption170);
  59. L:=TStringList.Create;
  60. Try
  61. If (Backend='') then
  62. begin
  63. Writeln;
  64. Writeln(SUsageFormats);
  65. EnumWriters(L);
  66. For I:=0 to L.Count-1 do
  67. begin
  68. S:=L[i];
  69. P:=Pos('=',S);
  70. Writeln(Format(' %s - %s',[Copy(S,1,P-1)+Space(10-p),Copy(S,P+1,Length(S))]));
  71. end;
  72. Writeln(SUsageBackendHelp);
  73. end
  74. else
  75. begin
  76. Writeln;
  77. Writeln(Format(SUsageFormatSpecific,[Lowercase(Backend)]));
  78. C:=GetWriterClass(backend);
  79. C.Usage(L);
  80. If L.Count>0 then
  81. For I:=0 to (L.Count-1) div 2 do
  82. begin
  83. S:=L[i*2];
  84. Writeln(Format('%s %s',[S+Space(30-Length(S)),L[(i*2)+1]]));
  85. end;
  86. end;
  87. Finally
  88. L.Free;
  89. end;
  90. Halt(AnExitCode);
  91. end;
  92. procedure InitOptions;
  93. begin
  94. InputFiles := TStringList.Create;
  95. DescrFiles := TStringList.Create;
  96. BackendOptions := TStringList.Create;
  97. Engine := TFPDocEngine.Create;
  98. end;
  99. procedure FreeOptions;
  100. begin
  101. Engine.Free;
  102. BackendOptions.Free;
  103. DescrFiles.Free;
  104. InputFiles.Free;
  105. end;
  106. procedure ReadContentFile(const AParams: String);
  107. var
  108. i: Integer;
  109. begin
  110. i := Pos(',', AParams);
  111. Engine.ReadContentFile(Copy(AParams, 1, i - 1),
  112. Copy(AParams, i + 1, Length(AParams)));
  113. end;
  114. procedure ParseOption(const s: String);
  115. procedure AddToFileList(List: TStringList; const FileName: String);
  116. var
  117. f: Text;
  118. s: String;
  119. begin
  120. if Copy(FileName, 1, 1) = '@' then
  121. begin
  122. Assign(f, Copy(FileName, 2, Length(FileName)));
  123. Reset(f);
  124. while not EOF(f) do
  125. begin
  126. ReadLn(f, s);
  127. List.Add(s);
  128. end;
  129. Close(f);
  130. end else
  131. List.Add(FileName);
  132. end;
  133. var
  134. i: Integer;
  135. Cmd, Arg: String;
  136. begin
  137. if (s = '-h') or (s = '--help') then
  138. Usage(0)
  139. else if s = '--hide-protected' then
  140. Engine.HideProtected := True
  141. else if s = '--warn-no-node' then
  142. Engine.WarnNoNode := True
  143. else if s = '--show-private' then
  144. Engine.HidePrivate := False
  145. else
  146. begin
  147. i := Pos('=', s);
  148. if i > 0 then
  149. begin
  150. Cmd := Copy(s, 1, i - 1);
  151. Arg := Copy(s, i + 1, Length(s));
  152. end
  153. else
  154. begin
  155. Cmd := s;
  156. SetLength(Arg, 0);
  157. end;
  158. if Cmd = '--descr' then
  159. AddToFileList(DescrFiles, Arg)
  160. else if (Cmd = '-f') or (Cmd = '--format') then
  161. begin
  162. Arg:=UpperCase(Arg);
  163. If FindWriterClass(Arg)=-1 then
  164. WriteLn(StdErr, Format(SCmdLineInvalidFormat, [Arg]))
  165. else
  166. BackEnd:=Arg;
  167. end
  168. else if (Cmd = '-l') or (Cmd = '--lang') then
  169. DocLang := Arg
  170. else if (Cmd = '-i') or (Cmd = '--input') then
  171. AddToFileList(InputFiles, Arg)
  172. else if (Cmd = '-o') or (Cmd = '--output') then
  173. Engine.Output := Arg
  174. else if Cmd = '--content' then
  175. ContentFile := Arg
  176. else if Cmd = '--import' then
  177. ReadContentFile(Arg)
  178. else if Cmd = '--package' then
  179. PackageName := Arg
  180. else if Cmd = '--ostarget' then
  181. OSTarget := Arg
  182. else if Cmd = '--cputarget' then
  183. CPUTarget := Arg
  184. else
  185. begin
  186. BackendOptions.Add(Cmd);
  187. BackendOptions.Add(Arg);
  188. end;
  189. end;
  190. end;
  191. procedure ParseCommandLine;
  192. var
  193. i: Integer;
  194. begin
  195. for i := 1 to ParamCount do
  196. ParseOption(ParamStr(i));
  197. If (BackEnd='') then
  198. BackEnd:='html';
  199. if (PackageName='') then
  200. begin
  201. Writeln(SNeedPackageName);
  202. Usage(1);
  203. end;
  204. end;
  205. procedure CreateDocumentation;
  206. var
  207. i: Integer;
  208. WriterClass : TFPDocWriterClass;
  209. Writer : TFPDocWriter;
  210. begin
  211. for i := 0 to DescrFiles.Count - 1 do
  212. Engine.AddDocFile(DescrFiles[i]);
  213. Engine.SetPackageName(PackageName);
  214. if Length(DocLang) > 0 then
  215. TranslateDocStrings(DocLang);
  216. for i := 0 to InputFiles.Count - 1 do
  217. try
  218. ParseSource(Engine, InputFiles[i], OSTarget, CPUTarget);
  219. except
  220. on e: EParserError do
  221. WriteLn(StdErr, Format('%s(%d,%d): %s',
  222. [e.Filename, e.Row, e.Column, e.Message]));
  223. end;
  224. WriterClass:=GetWriterClass(Backend);
  225. Writer:=WriterClass.Create(Engine.Package,Engine);
  226. With Writer do
  227. Try
  228. If BackendOptions.Count>0 then
  229. for I:=0 to ((BackendOptions.Count-1) div 2) do
  230. If not InterPretOption(BackendOptions[I*2],BackendOptions[I*2+1]) then
  231. WriteLn(StdErr, Format(SCmdLineInvalidOption,[BackendOptions[I*2]+' '+BackendOptions[I*2+1]]));
  232. WriteDoc;
  233. Finally
  234. Free;
  235. end;
  236. if Length(ContentFile) > 0 then
  237. Engine.WriteContentFile(ContentFile);
  238. end;
  239. begin
  240. {$IFDEF Unix}
  241. gettext.TranslateResourceStrings('/usr/local/share/locale/%s/LC_MESSAGES/fpdoc.mo');
  242. {$ELSE}
  243. gettext.TranslateResourceStrings('intl/fpdoc.%s.mo');
  244. {$ENDIF}
  245. WriteLn(STitle);
  246. WriteLn(Format(SVersion, [FPCVersion, FPCDate]));
  247. WriteLn(SCopyright);
  248. WriteLn;
  249. InitOptions;
  250. Try
  251. ParseCommandLine;
  252. CreateDocumentation;
  253. WriteLn(SDone);
  254. Finally
  255. FreeOptions;
  256. end;
  257. end.