123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- {
- $Id$
- 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,
- 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, [email protected]';
- 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 = '--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 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.5 2004-08-28 18:03:23 michael
- + Added warning if docnode not found (option --warn-no-node
- 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)
- }
|