mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-16 04:39:38 +02:00

* Patch with new linear based IPF writer * patch for Interfaces Overview in all Linear writers * patch with new Linear Writer specific parameter to control if linked documentation should be duplicated or not. new parameter is: --duplinkeddoc Default is that linked docs are not duplicated. * patch for fixing minor spelling mistakes in fpdoc * patch to not create a section Errors if there isn't actually any specific documentation for errors. makeskel generates error nodes but most don't have any items. This caused an Errors title in the docs, but with no content. * patch to fix SeeAlso section in Linear writer. It never output the custom text, but always the node link as text. * new features for linear writer that could be overridden in descendants. - marked some protected methods as virtual so it can be overridden in descendants for customization. - new section for listing Types found in a unit. Default does nothing, except in IPF writer. - new section for listing Variables found in a unit. Default does nothing, except in IPF writer. - new section for listing Constants found in a unit. Default does nothing, except in IPF writer. git-svn-id: trunk@15849 -
682 lines
15 KiB
ObjectPascal
682 lines
15 KiB
ObjectPascal
{
|
|
|
|
FPDoc - Free Pascal Documentation Tool
|
|
Copyright (C) 2005 by Michael Van Canneyt
|
|
|
|
* Text output generator
|
|
|
|
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.
|
|
}
|
|
{$mode objfpc}
|
|
{$H+}
|
|
unit dw_txt;
|
|
|
|
interface
|
|
|
|
uses DOM, dGlobals, PasTree, dwriter;
|
|
|
|
const
|
|
TxtHighLight : Boolean = False;
|
|
TxtExtension : String = '.txt';
|
|
|
|
Procedure CreateTxtDocForPackage(APackage: TPasPackage; AEngine: TFPDocEngine);
|
|
|
|
implementation
|
|
|
|
uses SysUtils, Classes, dwLinear;
|
|
|
|
Const
|
|
MaxListLevel = 10;
|
|
DefaultLineWidth = 72;
|
|
|
|
Type
|
|
{ TTxtWriter }
|
|
|
|
TTXTWriter = class(TLinearWriter)
|
|
protected
|
|
LineWidth : Integer;
|
|
FCheckEOL : Boolean;
|
|
FCurrentPos : Integer;
|
|
FListLevel,
|
|
FChapterCount,
|
|
FSectionCount,
|
|
FSubSectionCount,
|
|
FSubSubSectionCount,
|
|
FTableCount : Integer;
|
|
FInVerbatim : Boolean;
|
|
FLists : Array [0..MaxListLevel] of integer;
|
|
Inlist,
|
|
TableRowStartFlag,
|
|
TableCaptionWritten: Boolean;
|
|
procedure Write(const s: String); override;
|
|
procedure WriteLn(const s: String); override;
|
|
procedure NewLine;
|
|
// Private methods
|
|
procedure WriteLine(LineLength : Integer; DoubleLine : Boolean);
|
|
Procedure WriteLine(DoubleLine : Boolean);
|
|
procedure NewListLevel(Initial : Integer);
|
|
procedure declistlevel;
|
|
Procedure WriteUnderline(Const Msg : String; DoubleLine : Boolean);
|
|
// Linear documentation methods overrides;
|
|
procedure WriteLabel(Const S : String); override;
|
|
procedure WriteIndex(Const S : String); override;
|
|
Procedure WriteExampleFile(FN : String); override;
|
|
procedure StartUnitOverview(AModuleName,AModuleLabel : String);override;
|
|
procedure WriteUnitEntry(UnitRef : TPasType); override;
|
|
Procedure EndUnitOverview; override;
|
|
function GetLabel(AElement: TPasElement): String; override;
|
|
procedure StartListing(Frames: Boolean; const name: String); override;
|
|
procedure EndListing; override;
|
|
procedure WriteCommentLine; override;
|
|
procedure WriteComment(Comment : String);override;
|
|
procedure StartSection(SectionName : String);override;
|
|
procedure StartSubSection(SubSectionName : String);override;
|
|
procedure StartSubSubSection(SubSubSectionName : String);override;
|
|
procedure StartChapter(ChapterName : String); override;
|
|
procedure StartOverview(WithAccess : Boolean); override;
|
|
procedure EndOverview; override;
|
|
procedure WriteOverviewMember(const ALabel,AName,Access,ADescr : String); override;
|
|
procedure WriteOverviewMember(const ALabel,AName,ADescr : String); override;
|
|
Class Function FileNameExtension : String; override;
|
|
// Description node conversion
|
|
procedure DescrBeginBold; override;
|
|
procedure DescrEndBold; override;
|
|
procedure DescrBeginItalic; override;
|
|
procedure DescrEndItalic; override;
|
|
procedure DescrBeginEmph; override;
|
|
procedure DescrEndEmph; override;
|
|
procedure DescrWriteFileEl(const AText: DOMString); override;
|
|
procedure DescrWriteKeywordEl(const AText: DOMString); override;
|
|
procedure DescrWriteVarEl(const AText: DOMString); override;
|
|
procedure DescrBeginLink(const AId: DOMString); override;
|
|
procedure DescrEndLink; override;
|
|
procedure DescrWriteLinebreak; override;
|
|
procedure DescrBeginParagraph; override;
|
|
procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
|
|
procedure DescrWriteCodeLine(const ALine: String); override;
|
|
procedure DescrEndCode; override;
|
|
procedure DescrEndParagraph; override;
|
|
procedure DescrBeginOrderedList; override;
|
|
procedure DescrEndOrderedList; override;
|
|
procedure DescrBeginUnorderedList; override;
|
|
procedure DescrEndUnorderedList; override;
|
|
procedure DescrBeginDefinitionList; override;
|
|
procedure DescrEndDefinitionList; override;
|
|
procedure DescrBeginListItem; override;
|
|
procedure DescrEndListItem; override;
|
|
procedure DescrBeginDefinitionTerm; override;
|
|
procedure DescrEndDefinitionTerm; override;
|
|
procedure DescrBeginDefinitionEntry; override;
|
|
procedure DescrEndDefinitionEntry; override;
|
|
procedure DescrBeginSectionTitle; override;
|
|
procedure DescrBeginSectionBody; override;
|
|
procedure DescrEndSection; override;
|
|
procedure DescrBeginRemark; override;
|
|
procedure DescrEndRemark; override;
|
|
procedure DescrBeginTable(ColCount: Integer; HasBorder: Boolean); override;
|
|
procedure DescrEndTable; override;
|
|
procedure DescrBeginTableCaption; override;
|
|
procedure DescrEndTableCaption; override;
|
|
procedure DescrBeginTableHeadRow; override;
|
|
procedure DescrEndTableHeadRow; override;
|
|
procedure DescrBeginTableRow; override;
|
|
procedure DescrEndTableRow; override;
|
|
procedure DescrBeginTableCell; override;
|
|
procedure DescrEndTableCell; override;
|
|
Public
|
|
Constructor Create(APackage: TPasPackage; AEngine: TFPDocEngine); override;
|
|
Class Procedure Usage(List : TStrings) ; override;
|
|
Function InterpretOption(Const Cmd,Arg : String) : Boolean; override;
|
|
end;
|
|
|
|
|
|
procedure TTxtWriter.WriteUnderline(Const Msg : String; DoubleLine : Boolean);
|
|
|
|
Var
|
|
L : Integer;
|
|
|
|
begin
|
|
L:=Length(Msg);
|
|
Writeln(Msg);
|
|
WriteLine(L,DoubleLine);
|
|
end;
|
|
|
|
procedure TTxtWriter.WriteLine(DoubleLine : Boolean);
|
|
|
|
begin
|
|
Writeline(LineWidth,DoubleLine);
|
|
end;
|
|
|
|
Function FindSpace(Const S : String; P : Integer) : Integer;
|
|
|
|
Var
|
|
I,L : Integer;
|
|
|
|
begin
|
|
Result:=0;
|
|
I:=P;
|
|
L:=Length(S);
|
|
While (I>0) and (I<=L) and not (S[i] in [#10,#13,' ',#9]) do
|
|
Dec(i);
|
|
If (I=0) then
|
|
begin
|
|
I:=P;
|
|
While (I<=L) and not (S[i] in [#10,#13,' ',#9]) do
|
|
Inc(i);
|
|
end;
|
|
Result:=I;
|
|
end;
|
|
|
|
|
|
procedure TTXTWriter.Write(const s: String);
|
|
|
|
Var
|
|
N : String;
|
|
L : Integer;
|
|
|
|
begin
|
|
If Length(S)=0 then
|
|
exit;
|
|
N:=S;
|
|
Repeat
|
|
If ((FCurrentPos+Length(N))>LineWidth) then
|
|
begin
|
|
L:=FindSpace(N,LineWidth-FCurrentPos+1);
|
|
inherited Write(Copy(N,1,L-1));
|
|
inherited Write(LineEnding);
|
|
FCurrentPos:=0;
|
|
end
|
|
else
|
|
begin
|
|
L:=Length(N)+1;
|
|
inherited Write(Copy(N,1,L-1));
|
|
Inc(FCurrentPos,L);
|
|
If FCheckEOL then
|
|
If (L>=LEOL) then
|
|
If (Copy(N,L-LEOL,LEOL)=LineEnding) then
|
|
FCurrentPos:=0;
|
|
end;
|
|
Delete(N,1,L);
|
|
Until (Length(N)=0);
|
|
end;
|
|
|
|
procedure TTXTWriter.WriteLn(const s: String);
|
|
begin
|
|
FCheckEOL:=False;
|
|
Try
|
|
inherited WriteLn(s);
|
|
FCurrentPos:=0;
|
|
Finally
|
|
FCheckEOL:=False;
|
|
end;
|
|
end;
|
|
|
|
procedure TTxtWriter.NewLine;
|
|
|
|
begin
|
|
If Not FCurrentPos=0 then
|
|
Writeln('');
|
|
end;
|
|
|
|
procedure TTxtWriter.WriteLine(LineLength : Integer; DoubleLine : Boolean);
|
|
|
|
begin
|
|
NewLine;
|
|
If DoubleLine then
|
|
Writeln(StringOfChar('=',LineLength))
|
|
else
|
|
Writeln(StringOfChar('-',LineLength));
|
|
end;
|
|
|
|
|
|
function TTxtWriter.GetLabel(AElement: TPasElement): String;
|
|
|
|
begin
|
|
if AElement.ClassType = TPasUnresolvedTypeRef then
|
|
Result := Engine.ResolveLink(Module, AElement.Name)
|
|
else
|
|
begin
|
|
Result := AElement.PathName;
|
|
Result := LowerCase(Copy(Result, 2, Length(Result) - 1));
|
|
end;
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginBold;
|
|
begin
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndBold;
|
|
begin
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginItalic;
|
|
begin
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndItalic;
|
|
begin
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginEmph;
|
|
begin
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndEmph;
|
|
begin
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrWriteFileEl(const AText: DOMString);
|
|
begin
|
|
DescrWriteText(AText);
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrWriteKeywordEl(const AText: DOMString);
|
|
begin
|
|
DescrWriteText(AText);
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrWriteVarEl(const AText: DOMString);
|
|
begin
|
|
DescrWriteText(AText);
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginLink(const AId: DOMString);
|
|
begin
|
|
Write('[');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndLink;
|
|
begin
|
|
Write('] ');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrWriteLinebreak;
|
|
begin
|
|
WriteLn('');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginParagraph;
|
|
begin
|
|
// Do nothing
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndParagraph;
|
|
begin
|
|
WriteLn('');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginCode(HasBorder: Boolean;
|
|
const AHighlighterName: String);
|
|
begin
|
|
StartListing(HasBorder,'');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrWriteCodeLine(const ALine: String);
|
|
begin
|
|
WriteLn(ALine);
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndCode;
|
|
begin
|
|
EndListing
|
|
end;
|
|
|
|
procedure TTxtWriter.NewListLevel(Initial : Integer);
|
|
|
|
begin
|
|
Inc(FListLevel);
|
|
If (FListLevel<MaxListLevel) then
|
|
FLists[FListLevel]:=0;
|
|
end;
|
|
|
|
procedure TTxtWriter.DecListLevel;
|
|
|
|
begin
|
|
If (FListLevel>0) then
|
|
Dec(FListLevel)
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginOrderedList;
|
|
begin
|
|
NewListLevel(0);
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndOrderedList;
|
|
begin
|
|
DecListLevel;
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginUnorderedList;
|
|
begin
|
|
NewListLevel(-1);
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndUnorderedList;
|
|
begin
|
|
DecListLevel;
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginDefinitionList;
|
|
begin
|
|
NewListLevel(-2);
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndDefinitionList;
|
|
begin
|
|
DecListLevel;
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginListItem;
|
|
begin
|
|
If FLists[FListLevel]>=0 then
|
|
begin
|
|
Inc(FLists[FListLevel]);
|
|
WriteF('%d. ',[FLists[FListLevel]]);
|
|
end;
|
|
Write(' ');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndListItem;
|
|
begin
|
|
WriteLn('');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginDefinitionTerm;
|
|
begin
|
|
Write('<<');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndDefinitionTerm;
|
|
begin
|
|
WriteLn('>>:');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginDefinitionEntry;
|
|
begin
|
|
// Do nothing
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndDefinitionEntry;
|
|
begin
|
|
WriteLn('');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginSectionTitle;
|
|
begin
|
|
Inc(FSectionCount);
|
|
WritelnF('%s %d.%d: ',[SDocSection,FChapterCount,FSectionCount]);
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginSectionBody;
|
|
begin
|
|
WriteLn('');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndSection;
|
|
begin
|
|
// Do noting
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginRemark;
|
|
begin
|
|
WriteLn(SDocRemark+': ');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndRemark;
|
|
begin
|
|
WriteLn('');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
|
|
|
|
begin
|
|
WriteLine(False);
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndTable;
|
|
begin
|
|
WriteLine(False);
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginTableCaption;
|
|
begin
|
|
// Do nothing.
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndTableCaption;
|
|
begin
|
|
Inc(FTableCount);
|
|
WriteF('%s %d :',[SDoctable,FTableCount]);
|
|
TableCaptionWritten := True;
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginTableHeadRow;
|
|
begin
|
|
if not TableCaptionWritten then
|
|
DescrEndTableCaption;
|
|
TableRowStartFlag := True;
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndTableHeadRow;
|
|
begin
|
|
WriteLine(False);
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginTableRow;
|
|
begin
|
|
if not TableCaptionWritten then
|
|
DescrEndTableCaption;
|
|
TableRowStartFlag := True;
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndTableRow;
|
|
begin
|
|
WriteLn('');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrBeginTableCell;
|
|
begin
|
|
if TableRowStartFlag then
|
|
TableRowStartFlag := False
|
|
else
|
|
Write(' ');
|
|
end;
|
|
|
|
procedure TTxtWriter.DescrEndTableCell;
|
|
begin
|
|
// Do nothing
|
|
end;
|
|
|
|
constructor TTXTWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
|
|
begin
|
|
inherited Create(APackage, AEngine);
|
|
LineWidth:=DefaultLineWidth;
|
|
end;
|
|
|
|
class procedure TTXTWriter.Usage(List: TStrings);
|
|
begin
|
|
inherited Usage(List);
|
|
end;
|
|
|
|
function TTXTWriter.InterpretOption(const Cmd, Arg: String): Boolean;
|
|
begin
|
|
if cmd='--linewidth' then
|
|
begin
|
|
LineWidth:=StrToIntDef(Arg,DefaultLineWidth);
|
|
Result:=True;
|
|
end
|
|
else
|
|
Result:=inherited InterpretOption(Cmd, Arg);
|
|
end;
|
|
|
|
procedure TTxtWriter.WriteLabel(const s: String);
|
|
begin
|
|
end;
|
|
|
|
procedure TTxtWriter.WriteIndex(const s : String);
|
|
begin
|
|
end;
|
|
|
|
procedure TTxtWriter.StartListing(Frames: Boolean; const name: String);
|
|
begin
|
|
FInVerbatim:=True;
|
|
If (Name<>'') then
|
|
WritelnF('%s : %s',[SDocListing,Name]);
|
|
If Frames then
|
|
WriteLine(False)
|
|
else
|
|
WriteLn('');
|
|
end;
|
|
|
|
procedure TTxtWriter.EndListing;
|
|
begin
|
|
FInVerbatim:=False;
|
|
end;
|
|
|
|
procedure TTxtWriter.WriteCommentLine;
|
|
|
|
begin
|
|
end;
|
|
|
|
procedure TTxtWriter.WriteComment(Comment : String);
|
|
begin
|
|
end;
|
|
|
|
procedure TTxtWriter.StartChapter(ChapterName : String);
|
|
begin
|
|
Inc(FChapterCount);
|
|
FSectionCount:=0;
|
|
FSubSectionCount:=0;
|
|
Writeln('');
|
|
WriteLine(True);
|
|
WritelnF('%s %d : %s',[SDocChapter,FChapterCount,ChapterName]);
|
|
WriteLine(True);
|
|
Writeln('');
|
|
end;
|
|
|
|
procedure TTxtWriter.StartSection(SectionName : String);
|
|
begin
|
|
Inc(FSectionCount);
|
|
FSubSectionCount:=0;
|
|
Writeln('');
|
|
WriteLine(False);
|
|
WritelnF('%s %d.%d : %s',[SDocSection,FChapterCount,FSectionCount,SectionName]);
|
|
WriteLine(False);
|
|
Writeln('');
|
|
end;
|
|
|
|
procedure TTxtWriter.StartSubSection(SubSectionName : String);
|
|
begin
|
|
Inc(FSubSectionCount);
|
|
Writeln('');
|
|
WritelnF('%d.%d.%d : %s',[FChapterCount,FSectionCount,FSubSectionCount,SubSectionName]);
|
|
WriteLine(False);
|
|
Writeln('');
|
|
end;
|
|
|
|
procedure TTxtWriter.StartSubSubSection(SubSubSectionName : String);
|
|
begin
|
|
Writeln('');
|
|
Writeln(SubSubSectionName);
|
|
Writeln('');
|
|
end;
|
|
|
|
procedure CreateTxtDocForPackage(APackage: TPasPackage; AEngine: TFPDocEngine);
|
|
var
|
|
Writer: TTxtWriter;
|
|
begin
|
|
Writer := TTxtWriter.Create(APackage, AEngine);
|
|
try
|
|
Writer.WriteDoc;
|
|
finally
|
|
Writer.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TTxtWriter.WriteExampleFile(FN : String);
|
|
|
|
Var
|
|
L : TStringList;
|
|
I : Integer;
|
|
|
|
begin
|
|
Write(SDocExample);
|
|
Writeln(' '+ExtractFileName(FN));
|
|
If (FN<>'') and FileExists(FN) then
|
|
begin
|
|
WriteLine(False);
|
|
L:=TStringList.Create;
|
|
Try
|
|
L.LoadFromFile(FN);
|
|
For I:=0 to L.Count-1 do
|
|
Writeln(L[i]);
|
|
finally
|
|
L.Free;
|
|
end;
|
|
WriteLine(False);
|
|
end;
|
|
end;
|
|
|
|
procedure TTxtWriter.StartOverview(WithAccess : Boolean);
|
|
|
|
begin
|
|
If WithAccess then
|
|
WriteUnderLine(Format('%.30s %.10s %s',[EscapeText(SDocProperty), EscapeText(SDocAccess), EscapeText(SDocDescription)]),False)
|
|
else
|
|
WriteUnderLine(Format('%.30s %s',[EscapeText(SDocMethod), EscapeText(SDocDescription)]),False);
|
|
end;
|
|
|
|
procedure TTxtWriter.EndOverview;
|
|
|
|
begin
|
|
WriteLine(False);
|
|
end;
|
|
|
|
procedure TTxtWriter.WriteOverviewMember(const ALabel,AName,Access,ADescr : String);
|
|
|
|
begin
|
|
WriteLnF('%.30s %.10s %s',[AName,Access,ADescr]);
|
|
end;
|
|
|
|
procedure TTxtWriter.WriteOverviewMember(const ALabel,AName,ADescr : String);
|
|
|
|
begin
|
|
WriteLnF('%.30s %s ',[AName,ADescr]);
|
|
end;
|
|
|
|
class function TTxtWriter.FileNameExtension: String;
|
|
begin
|
|
Result:=TxtExtension;
|
|
end;
|
|
|
|
procedure TTxtWriter.StartUnitOverview(AModuleName,AModuleLabel : String);
|
|
|
|
begin
|
|
WriteUnderLine('Unit Name',False);
|
|
end;
|
|
|
|
procedure TTxtWriter.WriteUnitEntry(UnitRef : TPasType);
|
|
|
|
begin
|
|
Writeln(EscapeText(UnitRef.Name));
|
|
end;
|
|
|
|
procedure TTxtWriter.EndUnitOverview;
|
|
|
|
begin
|
|
Writeln('');
|
|
end;
|
|
|
|
|
|
initialization
|
|
// Do not localize.
|
|
RegisterWriter(TTXTWriter,'txt','Plain text.');
|
|
finalization
|
|
UnRegisterWriter('txt');
|
|
end.
|