mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 14:49:27 +02:00
346 lines
9.1 KiB
ObjectPascal
346 lines
9.1 KiB
ObjectPascal
{
|
|
$Id$
|
|
|
|
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, DOM, XMLWrite,
|
|
dGlobals, PasTree, PParser, dw_XML, dw_HTML, dw_LaTeX, dw_ipf;
|
|
|
|
resourcestring
|
|
STitle = 'FPDoc - Free Pascal Documentation Tool';
|
|
SCopyright = '(c) 2000 - 2003 Areca Systems GmbH / Sebastian Guenther, sg@freepascal.org';
|
|
SCmdLineHelp = 'See documentation for usage.';
|
|
SCmdLineInvalidOption = 'Ignoring unknown option "%s"';
|
|
SCmdLineInvalidFormat = 'Invalid format "%s" specified';
|
|
SCmdLineOutputOptionMissing = 'Need an output filename, please specify one with --output=<filename>';
|
|
SWritingPages = 'Writing %d pages...';
|
|
SNeedPackageName = 'No package name specified. Please specify one using the --package option.';
|
|
SDone = 'Done.';
|
|
|
|
type
|
|
TCmdLineAction = (actionHelp, actionConvert);
|
|
TOutputFormat = (fmtHTM, fmtHTML, fmtXHTML, fmtLaTeX, fmtXMLStruct, fmtIPF);
|
|
|
|
const
|
|
CmdLineAction: TCmdLineAction = actionConvert;
|
|
OutputFormat: TOutputFormat = fmtHTML;
|
|
OSTarget: String = {$I %FPCTARGETOS%};
|
|
CPUTarget: String = {$I %FPCTARGETCPU%};
|
|
|
|
var
|
|
InputFiles, DescrFiles: TStringList;
|
|
PackageName, DocLang, ContentFile, SearchPage: String;
|
|
Engine: TFPDocEngine;
|
|
|
|
|
|
procedure InitOptions;
|
|
begin
|
|
InputFiles := TStringList.Create;
|
|
DescrFiles := TStringList.Create;
|
|
Engine := TFPDocEngine.Create;
|
|
end;
|
|
|
|
procedure FreeOptions;
|
|
begin
|
|
Engine.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
|
|
CmdLineAction := actionHelp
|
|
else if s = '--hide-protected' then
|
|
Engine.HideProtected := 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 Arg = 'HTM' then
|
|
OutputFormat := fmtHTM
|
|
else if Arg = 'HTML' then
|
|
OutputFormat := fmtHTML
|
|
else if Arg = 'XHTML' then
|
|
OutputFormat := fmtXHTML
|
|
else if Arg = 'LATEX' then
|
|
OutputFormat := fmtLaTeX
|
|
else if Arg = 'IPF' then
|
|
OutputFormat := fmtIPF
|
|
else if Arg = 'XML-STRUCT' then
|
|
OutputFormat := fmtXMLStruct
|
|
else
|
|
WriteLn(StdErr, Format(SCmdLineInvalidFormat, [Arg]));
|
|
end else if (Cmd = '-l') or (Cmd = '--lang') then
|
|
DocLang := Arg
|
|
else if (Cmd = '--latex-highlight') then
|
|
LatexHighLight:=True
|
|
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 = '--html-search' then
|
|
SearchPage := Arg
|
|
else if Cmd = '--ostarget' then
|
|
OSTarget := Arg
|
|
else if Cmd = '--cputarget' then
|
|
CPUTarget := Arg
|
|
else if Cmd = '--latex-extension' then
|
|
TexExtension:=Arg
|
|
else
|
|
WriteLn(StdErr, Format(SCmdLineInvalidOption, [s]));
|
|
end;
|
|
end;
|
|
|
|
procedure ParseCommandLine;
|
|
var
|
|
i: Integer;
|
|
begin
|
|
for i := 1 to ParamCount do
|
|
ParseOption(ParamStr(i));
|
|
end;
|
|
|
|
|
|
var
|
|
i: Integer;
|
|
XMLDoc: TXMLDocument;
|
|
Allocator: TFileAllocator;
|
|
HTMLWriter: THTMLWriter;
|
|
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(SCopyright);
|
|
WriteLn;
|
|
|
|
InitOptions;
|
|
ParseCommandLine;
|
|
|
|
if CmdLineAction = actionHelp then
|
|
WriteLn(SCmdLineHelp)
|
|
else
|
|
begin
|
|
if (PackageName='') then
|
|
begin
|
|
Writeln(SNeedPackageName);
|
|
Halt(1);
|
|
end;
|
|
// Action is to create documentation
|
|
|
|
// Read all description files
|
|
for i := 0 to DescrFiles.Count - 1 do
|
|
Engine.AddDocFile(DescrFiles[i]);
|
|
|
|
// Set the name of the package to be processed
|
|
Engine.SetPackageName(PackageName);
|
|
|
|
// Read all source files
|
|
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;
|
|
|
|
// Translate internal documentation strings
|
|
if Length(DocLang) > 0 then
|
|
TranslateDocStrings(DocLang);
|
|
|
|
case OutputFormat of
|
|
fmtHTM:
|
|
begin
|
|
Allocator := TShortNameFileAllocator.Create('.htm');
|
|
try
|
|
HTMLWriter := THTMLWriter.Create(Engine, Allocator, Engine.Package);
|
|
try
|
|
HTMLWriter.SearchPage := SearchPage;
|
|
WriteLn(Format(SWritingPages, [HTMLWriter.PageCount]));
|
|
HTMLWriter.WriteHTMLPages;
|
|
finally
|
|
HTMLWriter.Free;
|
|
end;
|
|
finally
|
|
Allocator.Free;
|
|
end;
|
|
end;
|
|
fmtHTML:
|
|
begin
|
|
Allocator := TLongNameFileAllocator.Create('.html');
|
|
try
|
|
HTMLWriter := THTMLWriter.Create(Engine, Allocator, Engine.Package);
|
|
try
|
|
HTMLWriter.SearchPage := SearchPage;
|
|
WriteLn(Format(SWritingPages, [HTMLWriter.PageCount]));
|
|
HTMLWriter.WriteHTMLPages;
|
|
finally
|
|
HTMLWriter.Free;
|
|
end;
|
|
finally
|
|
Allocator.Free;
|
|
end;
|
|
end;
|
|
{ fmtXHTML:
|
|
begin
|
|
Allocator := TLongNameFileAllocator.Create('.xml');
|
|
try
|
|
BeginXHTMLDocForPackage(Engine, XHTMLOptions, Allocator);
|
|
for i := 0 to InputFiles.Count - 1 do
|
|
CreateXHTMLDocFromModule(Engine, XHTMLOptions, Allocator,
|
|
ParseSource(Engine, InputFiles[i]));
|
|
EndXHTMLDocForPackage(Engine, XHTMLOptions, Allocator);
|
|
finally
|
|
Allocator.Free;
|
|
end;
|
|
end;}
|
|
fmtLaTeX:
|
|
begin
|
|
if Length(Engine.Output) = 0 then
|
|
WriteLn(SCmdLineOutputOptionMissing)
|
|
else
|
|
CreateLaTeXDocForPackage(Engine.Package, Engine);
|
|
end;
|
|
fmtIPF:
|
|
begin
|
|
if Length(Engine.Output) = 0 then
|
|
WriteLn(SCmdLineOutputOptionMissing)
|
|
else
|
|
CreateIPFDocForPackage(Engine.Package, Engine);
|
|
end;
|
|
{ fmtXMLStruct:
|
|
for i := 0 to InputFiles.Count - 1 do
|
|
begin
|
|
XMLDoc := ModuleToXMLStruct(Module);
|
|
try
|
|
WriteXMLFile(XMLDoc, StdOut);
|
|
finally
|
|
XMLDoc.Free;
|
|
end;
|
|
end;}
|
|
end;
|
|
|
|
if Length(ContentFile) > 0 then
|
|
Engine.WriteContentFile(ContentFile);
|
|
|
|
|
|
end;
|
|
|
|
FreeOptions;
|
|
|
|
WriteLn(SDone);
|
|
end.
|
|
|
|
|
|
{
|
|
$Log$
|
|
Revision 1.4 2003-10-08 11:41:54 yuri
|
|
+ Initial OS/2 IPF support added
|
|
|
|
Revision 1.3 2003/03/27 17:14:13 sg
|
|
* Added --ostarget and --cputarget
|
|
|
|
Revision 1.2 2003/03/18 19:28:44 michael
|
|
+ Some changes to output handling, more suitable for tex output
|
|
|
|
Revision 1.1 2003/03/17 23:03:20 michael
|
|
+ Initial import in CVS
|
|
|
|
Revision 1.13 2003/03/13 22:02:13 sg
|
|
* New version with many bugfixes and our own parser (now independent of the
|
|
compiler source)
|
|
|
|
Revision 1.12 2002/10/12 17:09:45 michael
|
|
+ Added check for package name
|
|
|
|
Revision 1.11 2002/05/24 00:13:22 sg
|
|
* much improved new version, including many linking and output fixes
|
|
|
|
Revision 1.10 2002/03/12 10:58:36 sg
|
|
* reworked linking engine and internal structure
|
|
|
|
Revision 1.9 2002/01/08 13:00:06 michael
|
|
+ Added correct array handling and syntax highlighting is now optional
|
|
|
|
Revision 1.8 2001/12/17 23:24:11 sg
|
|
* Added "--package" switch
|
|
* Now uses translation files written in lower-case
|
|
|
|
Revision 1.7 2001/07/27 12:17:20 sg
|
|
* Added "--html-search" command line argument
|
|
|
|
Revision 1.6 2001/07/27 10:21:42 sg
|
|
* Just a new, improved version ;)
|
|
(detailed changelogs will be provided again with the next commits)
|
|
} |