fpdoc.pp 6.6 KB

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