* Added index page generation to html engine

git-svn-id: trunk@11145 -
This commit is contained in:
michael 2008-05-31 21:18:12 +00:00
parent a64bdeb9ef
commit cbe2bf359f
2 changed files with 212 additions and 9 deletions

View File

@ -46,7 +46,9 @@ resourcestring
SDocClasses = 'Classes';
SDocProceduresAndFunctions = 'Procedures and functions';
SDocVariables = 'Variables';
SDocIdentifierIndex = 'Index';
SDocModuleIndex = 'Index of all identifiers in unit ''%s''';
SDocPackageIndex = 'Index of all identifiers in package ''%s''';
SDocUnitOverview = 'Overview of unit ''%s''';
SDocOverview = 'Overview';
SDocSearch = 'Search';
@ -101,6 +103,9 @@ resourcestring
// HTML usage
SHTMLUsageFooter = 'Append xhtml from file as footer to html page';
SHTMLUsageFooterDate = 'Append footer with date. fmt is Optional format for FormatDateTime';
SHTMLUsageCharset = 'Set the HTML character set';
SHTMLHtmlSearch = 'Add search page with given name to the menu bar';
SHTMLIndexColcount = 'Use N columns in the identifier index pages';
// CHM usage
SCHMUsageTOC = 'Use [File] as the table of contents. Usually a .hhc file.';

View File

@ -31,6 +31,7 @@ const
VarsSubindex = 6;
// Maybe needed later for topic overview ??
TopicsSubIndex = 7;
IndexSubIndex = 8;
// Subpage indices for classes
PropertiesByInheritanceSubindex = 1;
@ -107,6 +108,8 @@ type
FooterFile: string;
FIDF : Boolean;
FDateFormat: String;
FIndexColCount : Integer;
FSearchPage : String;
function ResolveLinkID(const Name: String): DOMString;
function ResolveLinkIDInUnit(const Name,UnitName: String): DOMString;
function ResolveLinkWithinPackage(AElement: TPasElement;
@ -213,9 +216,12 @@ type
Procedure AppendSeeAlsoSection(AElement : TPasElement;DocNode : TDocNode);
Procedure AppendExampleSection(AElement : TPasElement;DocNode : TDocNode);
procedure AppendFooter;
procedure CreateIndexPage(L : TStringList);
procedure CreateModuleIndexPage(AModule: TPasModule);
procedure CreatePageBody(AElement: TPasElement; ASubpageIndex: Integer); virtual;
procedure CreatePackagePageBody;
procedure CreatePackageIndex;
procedure AddModuleIdentifiers(AModule : TPasModule; L : TStrings);
Procedure CreateTopicPageBody(AElement : TTopicElement);
procedure CreateModulePageBody(AModule: TPasModule; ASubpageIndex: Integer);
procedure CreateConstPageBody(AConst: TPasConst);
@ -239,7 +245,10 @@ type
procedure WriteHTMLPages; virtual;
procedure WriteXHTMLPages;
SearchPage: String;
Function InterPretOption(Const Cmd,Arg : String) : boolean; override;
Procedure WriteDoc; override;
class procedure Usage(List: TStrings); override;
Property SearchPage: String Read FSearchPage Write FSearchPage;
property Allocator: TFileAllocator read FAllocator;
property Package: TPasPackage read FPackage;
property PageCount: Integer read GetPageCount;
@ -247,9 +256,7 @@ type
Property DateFormat : String Read FDateFormat Write FDateFormat;
property OnTest: TNotifyEvent read FOnTest write SetOnTest;
Property CharSet : String Read FCharSet Write FCharSet;
Function InterPretOption(Const Cmd,Arg : String) : boolean; override;
Procedure WriteDoc; override;
class procedure Usage(List: TStrings); override;
Property IndexColCount : Integer Read FIndexColCount write FIndexColCount;
end;
THTMWriter = class(THTMLWriter)
@ -493,6 +500,7 @@ constructor THTMLWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
DidAutolink: Boolean;
begin
AddPage(AModule, 0);
AddPage(AModule,IndexSubIndex);
AddTopicPages(AModule);
with AModule do
begin
@ -574,6 +582,7 @@ var
i: Integer;
begin
inherited ;
IndexColCount:=3;
Charset:='iso-8859-1';
CreateAllocator;
FPackage := APackage;
@ -585,6 +594,7 @@ begin
if Length(Package.Name) > 1 then
begin
AddPage(Package, 0);
AddPage(Package,IndexSubIndex);
AddTopicPages(Package);
end;
@ -1815,7 +1825,7 @@ begin
ParaEl := CreateEl(CreateTD(TREl), 'b');
if Assigned(Module) then
begin
begin
AddLink(0, SDocOverview);
if Module.InterfaceSection.ResStrings.Count > 0 then
AddLink(ResstrSubindex, SDocResStrings);
@ -1829,7 +1839,20 @@ begin
AddLink(ProcsSubindex, SDocProceduresAndFunctions);
if Module.InterfaceSection.Variables.Count > 0 then
AddLink(VarsSubindex, SDocVariables);
end;
AddLink(IndexSubIndex,SDocIdentifierIndex);
end
else
begin
// Manually add link for package page
AppendText(ParaEl, '[');
if (IndexSubIndex = ASubpageIndex) then
AppendText(ParaEl, SDocIdentifierIndex)
else
AppendText(
CreateLink(ParaEl, ResolveLinkWithinPackage(Package, IndexSubIndex)),
SDocIdentifierIndex);
AppendText(ParaEl, ']');
end;
if Length(SearchPage) > 0 then
begin
@ -2055,7 +2078,13 @@ begin
BaseDirectory := Allocator.GetRelativePathToTop(AElement);
if AElement.ClassType = TPasPackage then
CreatePackagePageBody
begin
Module:=Nil;
If (ASubPageIndex=0) then
CreatePackagePageBody
else
CreatePackageIndex
end
else
begin
Element := AElement;
@ -2082,6 +2111,147 @@ begin
end;
end;
procedure THTMLWriter.CreateIndexPage(L : TStringList);
Var
Lists : Array['A'..'Z'] of TStringList;
CL : TStringList;
TableEl, TREl, EL: TDOMElement;
E : TPasElement;
I,Rows,J,Index : Integer;
S : String;
C : Char;
begin
For C:='A' to 'Z' do
Lists[C]:=Nil;
L.Sort;
// Divide over alphabet
For I:=0 to L.Count-1 do
begin
S:=L[i];
E:=TPasElement(L.Objects[i]);
If not (E is TPasUnresolvedTypeRef) then
begin
If (S<>'') then
begin
C:=Upcase(S[1]);
If Lists[C]=Nil then
begin
CL:=TStringList.Create;
Lists[C]:=CL;
end;
end;
CL.AddObject(S,E);
end;
end;
Try
// Create a quick jump table to all available letters.
TableEl := CreateTable(BodyElement);
TableEl['border']:='1';
TableEl['width']:='50%';
TREl := CreateTR(TableEl);
for C:='A' to 'Z' do
If (Lists[C]<>Nil) then
begin
El:=CreateTD_vtop(TREl);
AppendText(CreateLink(El,'#SECTION'+C),C);
If C<>'Z' then
AppendNBsp(El,1);
end;
// Now emit all identifiers.
TableEl:=Nil;
For C:='A' to 'Z' do
begin
CL:=Lists[C];
If CL<>Nil then
begin
El:=CreateH2(BodyElement);
AppendText(El,C);
CreateAnchor(El,'SECTION'+C);
TableEl := CreateTable(BodyElement);
TableEl['Width']:='80%';
// Determine number of rows needed
Rows:=(CL.Count div IndexColCount);
If ((CL.Count Mod IndexColCount)<>0) then
Inc(Rows);
// Fill rows
For I:=0 to Rows-1 do
begin
TREl := CreateTR(TableEl);
For J:=0 to IndexColCount-1 do
begin
El:=CreateTD_vtop(TREl);
Index:=(J*Rows)+I;
If (Index<CL.Count) then
begin
S:=CL[Index];
E:=TPasElement(CL.Objects[Index]);
AppendHyperlink(El,E);
end;
end;
end;
end; // have List
end; // For C:=
Finally
for C:='A' to 'Z' do
FreeAndNil(Lists[C]);
end;
end;
procedure THTMLWriter.AddModuleIdentifiers(AModule : TPasModule; L : TStrings);
Procedure AddElementsFromList(L : TStrings; List : TList);
Var
I : Integer;
El : TPasElement;
begin
For I:=0 to List.Count-1 do
begin
El:=TPasElement(List[I]);
L.AddObject(El.Name,El);
end;
end;
begin
AddElementsFromList(L,AModule.InterfaceSection.Consts);
AddElementsFromList(L,AModule.InterfaceSection.Types);
AddElementsFromList(L,AModule.InterfaceSection.Functions);
AddElementsFromList(L,AModule.InterfaceSection.Classes);
AddElementsFromList(L,AModule.InterfaceSection.Variables);
AddElementsFromList(L,AModule.InterfaceSection.ResStrings);
end;
procedure THTMLWriter.CreatePackageIndex;
Var
L : TStringList;
I : Integer;
M : TPasModule;
E : TPasElement;
begin
L:=TStringList.Create;
try
L.Capacity:=PageInfos.Count; // Too much, but that doesn't hurt.
For I:=0 to Package.Modules.Count-1 do
begin
M:=TPasModule(Package.Modules[i]);
L.AddObject(M.Name,M);
AddModuleIdentifiers(M,L);
end;
AppendMenuBar(IndexSubIndex);
AppendTitle(Format(SDocPackageIndex, [Copy(Package.Name, 2, 256)]));
CreateIndexPage(L);
Finally
L.Free;
end;
end;
procedure THTMLWriter.CreatePackagePageBody;
var
DocNode: TDocNode;
@ -2155,6 +2325,23 @@ begin
end;
end;
procedure THTMLWriter.CreateModuleIndexPage(AModule: TPasModule);
Var
L : TStringList;
begin
L:=TStringList.Create;
try
AddModuleIdentifiers(AModule,L);
AppendMenuBar(IndexSubIndex);
AppendTitle(Format(SDocModuleIndex, [AModule.Name]));
CreateIndexPage(L);
Finally
L.Free;
end;
end;
procedure THTMLWriter.CreateModulePageBody(AModule: TPasModule;
ASubpageIndex: Integer);
@ -2264,6 +2451,7 @@ procedure THTMLWriter.CreateModulePageBody(AModule: TPasModule;
AppendText(ParaEl, Decl.Value);
end;
end;
begin
case ASubpageIndex of
@ -2281,6 +2469,8 @@ begin
CreateSimpleSubpage(SDocProceduresAndFunctions, AModule.InterfaceSection.Functions);
VarsSubindex:
CreateSimpleSubpage(SDocVariables, AModule.InterfaceSection.Variables);
IndexSubIndex:
CreateModuleIndexPage(AModule);
end;
end;
@ -3012,6 +3202,8 @@ begin
FooterFile := Arg
else if Cmd = '--charset' then
CharSet := Arg
else if Cmd = '--index-colcount' then
IndexColCount := StrToIntDef(Arg,IndexColCount)
else if Cmd = '--footer-date' then
begin
FIDF:=True;
@ -3033,6 +3225,12 @@ begin
List.Add(SHTMLUsageFooter);
List.Add('--footer-date[=Fmt]');
List.Add(SHTMLUsageFooterDate);
List.Add('--charset=set');
List.Add(SHTMLUsageCharset);
List.Add('--html-search=pagename');
List.Add(SHTMLHtmlSearch);
List.Add('--index-colcount=N');
List.Add(SHTMLIndexColcount);
end;
// private methods