123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- {
- FPDoc - Free Pascal Documentation Tool
- Copyright (C) 2000 - 2003 by
- Areca Systems GmbH / Sebastian Guenther, [email protected]
- See the file COPYING, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- }
- program FPDoc;
- uses
- SysUtils, Classes, Gettext, DOM, XMLWrite, PasTree, PParser,
- dGlobals, // GLobal definitions, constants.
- dwriter, // TFPDocWriter definition.
- dwlinear, // Linear (abstract) writer
- dw_LaTeX, // TLaTex writer
- dw_XML, // XML writer
- dw_HTML, // HTML writer
- dw_ipf, // IPF writer
- dw_man, // Man page writer
- dw_txt; // TXT writer
- const
- OSTarget: String = {$I %FPCTARGETOS%};
- CPUTarget: String = {$I %FPCTARGETCPU%};
- FPCVersion: String = {$I %FPCVERSION%};
- FPCDate: String = {$I %FPCDATE%};
- var
- Backend : String;
- BackendOptions : TStrings;
- InputFiles, DescrFiles: TStringList;
- PackageName, DocLang, ContentFile : String;
- Engine: TFPDocEngine;
- Procedure Usage(AnExitCode : Byte);
- Var
- I,P : Integer;
- S : String;
- L : TStringList;
- C : TFPDocWriterClass;
- begin
- Writeln(Format(SCmdLineHelp,[ExtractFileName(Paramstr(0))]));
- Writeln(SUsageOption010);
- Writeln(SUsageOption020);
- Writeln(SUsageOption030);
- Writeln(SUsageOption040);
- Writeln(SUsageOption050);
- Writeln(SUsageOption060);
- Writeln(SUsageOption070);
- Writeln(SUsageOption080);
- Writeln(SUsageOption090);
- Writeln(SUsageOption100);
- Writeln(SUsageOption110);
- Writeln(SUsageOption120);
- Writeln(SUsageOption130);
- Writeln(SUsageOption140);
- Writeln(SUsageOption150);
- Writeln(SUsageOption160);
- Writeln(SUsageOption170);
- L:=TStringList.Create;
- Try
- If (Backend='') then
- begin
- Writeln;
- Writeln(SUsageFormats);
- EnumWriters(L);
- For I:=0 to L.Count-1 do
- begin
- S:=L[i];
- P:=Pos('=',S);
- Writeln(Format(' %s - %s',[Copy(S,1,P-1)+Space(10-p),Copy(S,P+1,Length(S))]));
- end;
- Writeln(SUsageBackendHelp);
- end
- else
- begin
- Writeln;
- Writeln(Format(SUsageFormatSpecific,[Lowercase(Backend)]));
- C:=GetWriterClass(backend);
- C.Usage(L);
- If L.Count>0 then
- For I:=0 to (L.Count-1) div 2 do
- begin
- S:=L[i*2];
- Writeln(Format('%s %s',[S+Space(30-Length(S)),L[(i*2)+1]]));
- end;
- end;
- Finally
- L.Free;
- end;
- Halt(AnExitCode);
- end;
- procedure InitOptions;
- begin
- InputFiles := TStringList.Create;
- DescrFiles := TStringList.Create;
- BackendOptions := TStringList.Create;
- Engine := TFPDocEngine.Create;
- end;
- procedure FreeOptions;
- begin
- Engine.Free;
- BackendOptions.Free;
- DescrFiles.Free;
- InputFiles.Free;
- end;
- procedure ReadContentFile(const AParams: String);
- var
- i: Integer;
- begin
- i := Pos(',', AParams);
- Engine.ReadContentFile(Copy(AParams, 1, i - 1),
- Copy(AParams, i + 1, Length(AParams)));
- end;
- procedure ParseOption(const s: String);
- procedure AddToFileList(List: TStringList; const FileName: String);
- var
- f: Text;
- s: String;
- begin
- if Copy(FileName, 1, 1) = '@' then
- begin
- Assign(f, Copy(FileName, 2, Length(FileName)));
- Reset(f);
- while not EOF(f) do
- begin
- ReadLn(f, s);
- List.Add(s);
- end;
- Close(f);
- end else
- List.Add(FileName);
- end;
- var
- i: Integer;
- Cmd, Arg: String;
- begin
- if (s = '-h') or (s = '--help') then
- Usage(0)
- else if s = '--hide-protected' then
- Engine.HideProtected := True
- else if s = '--warn-no-node' then
- Engine.WarnNoNode := True
- else if s = '--show-private' then
- Engine.HidePrivate := False
- else
- begin
- i := Pos('=', s);
- if i > 0 then
- begin
- Cmd := Copy(s, 1, i - 1);
- Arg := Copy(s, i + 1, Length(s));
- end
- else
- begin
- Cmd := s;
- SetLength(Arg, 0);
- end;
- if Cmd = '--descr' then
- AddToFileList(DescrFiles, Arg)
- else if (Cmd = '-f') or (Cmd = '--format') then
- begin
- Arg:=UpperCase(Arg);
- If FindWriterClass(Arg)=-1 then
- WriteLn(StdErr, Format(SCmdLineInvalidFormat, [Arg]))
- else
- BackEnd:=Arg;
- end
- else if (Cmd = '-l') or (Cmd = '--lang') then
- DocLang := Arg
- else if (Cmd = '-i') or (Cmd = '--input') then
- AddToFileList(InputFiles, Arg)
- else if (Cmd = '-o') or (Cmd = '--output') then
- Engine.Output := Arg
- else if Cmd = '--content' then
- ContentFile := Arg
- else if Cmd = '--import' then
- ReadContentFile(Arg)
- else if Cmd = '--package' then
- PackageName := Arg
- else if Cmd = '--ostarget' then
- OSTarget := Arg
- else if Cmd = '--cputarget' then
- CPUTarget := Arg
- else
- begin
- BackendOptions.Add(Cmd);
- BackendOptions.Add(Arg);
- end;
- end;
- end;
- procedure ParseCommandLine;
- var
- i: Integer;
- begin
- for i := 1 to ParamCount do
- ParseOption(ParamStr(i));
- If (BackEnd='') then
- BackEnd:='html';
- if (PackageName='') then
- begin
- Writeln(SNeedPackageName);
- Usage(1);
- end;
- end;
- procedure CreateDocumentation;
- var
- i: Integer;
- WriterClass : TFPDocWriterClass;
- Writer : TFPDocWriter;
- begin
- for i := 0 to DescrFiles.Count - 1 do
- Engine.AddDocFile(DescrFiles[i]);
- Engine.SetPackageName(PackageName);
- if Length(DocLang) > 0 then
- TranslateDocStrings(DocLang);
- for i := 0 to InputFiles.Count - 1 do
- try
- ParseSource(Engine, InputFiles[i], OSTarget, CPUTarget);
- except
- on e: EParserError do
- WriteLn(StdErr, Format('%s(%d,%d): %s',
- [e.Filename, e.Row, e.Column, e.Message]));
- end;
- WriterClass:=GetWriterClass(Backend);
- Writer:=WriterClass.Create(Engine.Package,Engine);
- With Writer do
- Try
- If BackendOptions.Count>0 then
- for I:=0 to ((BackendOptions.Count-1) div 2) do
- If not InterPretOption(BackendOptions[I*2],BackendOptions[I*2+1]) then
- WriteLn(StdErr, Format(SCmdLineInvalidOption,[BackendOptions[I*2]+' '+BackendOptions[I*2+1]]));
- WriteDoc;
- Finally
- Free;
- end;
- if Length(ContentFile) > 0 then
- Engine.WriteContentFile(ContentFile);
- end;
- begin
- {$IFDEF Unix}
- gettext.TranslateResourceStrings('/usr/local/share/locale/%s/LC_MESSAGES/fpdoc.mo');
- {$ELSE}
- gettext.TranslateResourceStrings('intl/fpdoc.%s.mo');
- {$ENDIF}
- WriteLn(STitle);
- WriteLn(Format(SVersion, [FPCVersion, FPCDate]));
- WriteLn(SCopyright);
- WriteLn;
- InitOptions;
- Try
- ParseCommandLine;
- CreateDocumentation;
- WriteLn(SDone);
- Finally
- FreeOptions;
- end;
- end.
|