fpc/utils/fpdoc/fpdoc.pp
michael 57647f4521 * Added functionality to add (and show) notes
git-svn-id: trunk@20304 -
2012-02-11 09:58:13 +00:00

380 lines
9.4 KiB
ObjectPascal

{
FPDoc - Free Pascal Documentation Tool
Copyright (C) 2000 - 2003 by
Areca Systems GmbH / Sebastian Guenther, sg@freepascal.org
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, custapp,
dGlobals, // GLobal definitions, constants.
dwriter, // TFPDocWriter definition.
dwlinear, // Linear (abstract) writer
dw_LaTeX, // TLaTex writer
dw_XML, // XML writer
dw_dxml, // Delphi XML doc.
dw_HTML, // HTML writer
dw_ipflin, // IPF writer (new linear output)
dw_man, // Man page writer
dw_linrtf, // linear RTF writer
dw_txt, fpdocproj, mkfpdoc; // TXT writer
Type
{ TFPDocAplication }
TFPDocAplication = Class(TCustomApplication)
private
FCreator : TFPDocCreator;
FPackage : TFPDocPackage;
FDryRun,
FProjectFile : Boolean;
FWriteProjectFile : String;
Protected
procedure OutputLog(Sender: TObject; const Msg: String);
procedure ParseCommandLine;
procedure Parseoption(const S: String);
Procedure Usage(AnExitCode : Byte);
Procedure DoRun; override;
Public
Constructor Create(AOwner : TComponent); override;
Destructor Destroy; override;
Function SelectedPackage : TFPDocPackage;
end;
Procedure TFPDocAplication.Usage(AnExitCode : Byte);
Var
I,P : Integer;
S : String;
L : TStringList;
C : TFPDocWriterClass;
Backend : String;
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(SUsageOption155);
Writeln(SUsageOption160);
Writeln(SUsageOption170);
Writeln(SUsageOption180);
Writeln(SUsageOption190);
Writeln(SUsageOption200);
Writeln(SUsageOption210);
Writeln(SUsageOption220);
Writeln(SUsageOption230);
Writeln(SUsageOption240);
Writeln(SUsageOption250);
Writeln(SUsageOption260);
L:=TStringList.Create;
Try
Backend:=FCreator.OPtions.Backend;
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;
destructor TFPDocAplication.Destroy;
begin
FreeAndNil(FCreator);
Inherited;
end;
function TFPDocAplication.SelectedPackage: TFPDocPackage;
begin
Result:=FPackage;
if (FPackage=Nil) or (FPackage.Name='') then
begin
Writeln(SNeedPackageName);
Usage(1);
end;
end;
procedure TFPDocAplication.OutputLog(Sender: TObject; const Msg: String);
begin
Writeln(StdErr,Msg);
end;
procedure TFPDocAplication.ParseCommandLine;
Function ProjectOpt(Const s : string) : boolean;
begin
Result:=(Copy(s,1,3)='-p=') or (Copy(s,1,10)='--project=');
end;
Function PackageOpt(Const s : string) : boolean;
begin
Result:=((Copy(s,1,3)='-a=') or (Copy(s,1,10)='--package='));
end;
var
i : Integer;
s : string;
begin
// Check project
for i := 1 to ParamCount do
begin
s:=ParamStr(I);
If ProjectOpt(S) then
ParseOption(s);
If (FCreator.Packages.Count=1) then
FPackage:=FCreator.Packages[0]
else if (FCreator.Options.DefaultPackageName<>'') then
Fpackage:=FCreator.Packages.FindPackage(FCreator.Options.DefaultPackageName);
end;
If FCreator.Project.Packages.Count=0 then
begin
FPackage:=FCreator.Packages.Add as TFPDocPackage;
end;
// Check package
for i := 1 to ParamCount do
begin
s:=ParamStr(I);
If PackageOpt(S) then
ParseOption(s);
end;
for i := 1 to ParamCount do
begin
s:=ParamStr(I);
If Not (ProjectOpt(s) or PackageOpt(S)) then
ParseOption(s);
end;
SelectedPackage; // Will print error if none available.
end;
procedure TFPDocAplication.Parseoption(Const S : String);
procedure AddDirToFileList(List: TStrings; const ADirName, AMask: String);
Var
Info : TSearchRec;
D : String;
begin
if (ADirName<>'') and not DirectoryExists(ADirName) then
OutputLog(Self,'Directory '+ADirName+' does not exist')
else
begin
if (ADirName='.') or (ADirName='') then
D:=''
else
D:=IncludeTrailingPathDelimiter(ADirName);
If (FindFirst(D+AMask,0,Info)=0) then
try
Repeat
If (Info.Attr and faDirectory)=0 then
List.Add(D+Info.name);
Until FindNext(Info)<>0;
finally
FindClose(Info);
end;
end;
end;
procedure AddToFileList(List: TStrings; const FileName: String);
var
f: Text;
s: String;
begin
if Copy(FileName, 1, 1) = '@' then
begin
AssignFile(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
FCreator.Options.HideProtected := True
else if s = '--warn-no-node' then
FCreator.Options.WarnNoNode := True
else if s = '--show-private' then
FCreator.Options.ShowPrivate := False
else if s = '--stop-on-parser-error' then
FCreator.Options.StopOnParseError := True
else if s = '--dont-trim' then
FCreator.Options.donttrim := True
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 = '--project') or (Cmd='-p') then
begin
FProjectFile:=True;
FCreator.LoadProjectFile(Arg);
end
else if (Cmd = '--descr') then
AddToFileList(SelectedPackage.Descriptions, Arg)
else if (Cmd = '--descr-dir') then
AddDirToFileList(SelectedPackage.Descriptions, Arg, '*.xml')
else if (Cmd = '-f') or (Cmd = '--format') then
begin
Arg:=UpperCase(Arg);
If FindWriterClass(Arg)=-1 then
WriteLn(StdErr, Format(SCmdLineInvalidFormat, [Arg]))
else
FCreator.Options.BackEnd:=Arg;
end
else if (Cmd = '-l') or (Cmd = '--lang') then
FCreator.Options.Language := Arg
else if (Cmd = '-i') or (Cmd = '--input') then
AddToFileList(SelectedPackage.Inputs, Arg)
else if (Cmd = '--input-dir') then
begin
AddDirToFileList(SelectedPackage.Inputs, Arg,'*.pp');
AddDirToFileList(SelectedPackage.Inputs, Arg,'*.pas');
end
else if (Cmd = '-o') or (Cmd = '--output') then
SelectedPackage.Output := Arg
else if (Cmd = '-v') or (Cmd = '--verbose') then
FCreator.Verbose:=true
else if (Cmd = '-n') or (Cmd = '--dry-run') then
FDryRun:=True
else if (Cmd = '-t') or (Cmd = '--emit-notes') then
FCreator.Options.EmitNotes := True
else if Cmd = '--content' then
SelectedPackage.ContentFile := Arg
else if Cmd = '--import' then
SelectedPackage.Imports.Add(Arg)
else if Cmd = '--package' then
begin
If FProjectFile then
FPackage:=FCreator.Packages.FindPackage(Arg)
else
FPackage.Name:=Arg;
end
else if Cmd = '--ostarget' then
FCreator.Options.OSTarget := Arg
else if Cmd = '--cputarget' then
FCreator.Options.CPUTarget := Arg
else if Cmd = '--mo-dir' then
FCreator.Options.modir := Arg
else if Cmd = '--parse-impl' then
FCreator.Options.InterfaceOnly:=false
else if Cmd = '--write-project' then
FWriteProjectFile:=Arg
else
begin
FCreator.Options.BackendOptions.Add(Cmd);
FCreator.Options.BackendOptions.Add(Arg);
end;
end;
end;
Procedure TFPDocAplication.DoRun;
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, [DefFPCVersion, DefFPCDate]));
WriteLn(SCopyright);
WriteLn;
ParseCommandLine;
if (FWriteProjectFile<>'') then
FCreator.CreateProjectFile(FWriteProjectFile)
else
FCreator.CreateDocumentation(FPackage,FDryRun);
WriteLn(SDone);
Terminate;
end;
constructor TFPDocAplication.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
StopOnException:=true;
FCreator:=TFPDocCreator.Create(Self);
FCreator.OnLog:=@OutputLog;
end;
begin
With TFPDocAplication.Create(Nil) do
try
Run;
finally
Free;
end;
end.