123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886 |
- {
- $Id$
- FPDoc - Free Pascal Documentation Tool
- Copyright (C) 2000 - 2003 by
- Areca Systems GmbH / Sebastian Guenther, [email protected]
- * HTML/XHTML 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.
- }
- unit dw_HTML;
- interface
- uses Classes, DOM, DOM_HTML, dGlobals, PasTree, dWriter;
- const
- // Subpage indices for modules
- ResstrSubindex = 1;
- ConstsSubindex = 2;
- TypesSubindex = 3;
- ClassesSubindex = 4;
- ProcsSubindex = 5;
- VarsSubindex = 6;
- // Maybe needed later for topic overview ??
- TopicsSubIndex = 7;
-
- // Subpage indices for classes
- PropertiesByInheritanceSubindex = 1;
- PropertiesByNameSubindex = 2;
- MethodsByInheritanceSubindex = 3;
- MethodsByNameSubindex = 4;
- EventsByInheritanceSubindex = 5;
- EventsByNameSubindex = 6;
- type
- TFileAllocator = class
- public
- procedure AllocFilename(AElement: TPasElement; ASubindex: Integer); virtual;
- function GetFilename(AElement: TPasElement;
- ASubindex: Integer): String; virtual; abstract;
- function GetRelativePathToTop(AElement: TPasElement): String; virtual;
- function GetCSSFilename(ARelativeTo: TPasElement): DOMString; virtual;
- end;
- TShortNameFileAllocator = class(TFileAllocator)
- private
- FExtension: String;
- public
- constructor Create(const AExtension: String);
- procedure AllocFilename(AElement: TPasElement; ASubindex: Integer); override;
- property Extension: String read FExtension;
- end;
- TLongNameFileAllocator = class(TFileAllocator)
- private
- FExtension: String;
- public
- constructor Create(const AExtension: String);
- function GetFilename(AElement: TPasElement;
- ASubindex: Integer): String; override;
- function GetRelativePathToTop(AElement: TPasElement): String; override;
- property Extension: String read FExtension;
- end;
- TPageInfo = class
- Element: TPasElement;
- SubpageIndex: Integer;
- end;
- THTMLWriter = class(TFPDocWriter)
- private
- FAllocator: TFileAllocator;
- FPackage: TPasPackage;
- function GetPageCount: Integer;
- protected
- CurDirectory: String; // relative to curdir of process
- BaseDirectory: String; // relative path to package base directory
- PageInfos: TObjectList; // list of TPageInfo objects
- Doc: THTMLDocument;
- BodyElement, TitleElement: TDOMElement;
- Module: TPasModule;
- OutputNodeStack: TList;
- CurOutputNode: TDOMNode;
- InsideHeadRow, DoPasHighlighting: Boolean;
- HighlighterFlags: Byte;
- function ResolveLinkID(const Name: String): DOMString;
- function ResolveLinkWithinPackage(AElement: TPasElement;
- ASubpageIndex: Integer): String;
- // Helper functions for creating DOM elements
- function CreateEl(Parent: TDOMNode; const AName: DOMString): THTMLElement;
- function CreatePara(Parent: TDOMNode): THTMLElement;
- function CreateH1(Parent: TDOMNode): THTMLElement;
- function CreateH2(Parent: TDOMNode): THTMLElement;
- function CreateH3(Parent: TDOMNode): THTMLElement;
- function CreateTable(Parent: TDOMNode): THTMLElement;
- function CreateContentTable(Parent: TDOMNode): THTMLElement;
- function CreateTR(Parent: TDOMNode): THTMLElement;
- function CreateTD(Parent: TDOMNode): THTMLElement;
- function CreateTD_vtop(Parent: TDOMNode): THTMLElement;
- function CreateLink(Parent: TDOMNode; const AHRef: DOMString): THTMLElement;
- function CreateAnchor(Parent: TDOMNode; const AName: DOMString): THTMLElement;
- function CreateCode(Parent: TDOMNode): THTMLElement;
- function CreateWarning(Parent: TDOMNode): THTMLElement;
- // Description node conversion
- procedure PushOutputNode(ANode: TDOMNode);
- procedure PopOutputNode;
- procedure DescrWriteText(const AText: DOMString); override;
- 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 DescrEndParagraph; override;
- procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
- procedure DescrWriteCodeLine(const ALine: String); override;
- procedure DescrEndCode; 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;
- procedure AppendText(Parent: TDOMNode; const AText: DOMString);
- procedure AppendNbSp(Parent: TDOMNode; ACount: Integer);
- procedure AppendSym(Parent: TDOMNode; const AText: DOMString);
- procedure AppendKw(Parent: TDOMNode; const AText: DOMString);
- function AppendPasSHFragment(Parent: TDOMNode; const AText: String;
- AShFlags: Byte): Byte;
- Procedure AppendShortDescr(AContext : TPasElement;Parent: TDOMNode; DocNode : TDocNode);
- procedure AppendShortDescr(Parent: TDOMNode; Element: TPasElement);
- procedure AppendDescr(AContext: TPasElement; Parent: TDOMNode;
- DescrNode: TDOMElement; AutoInsertBlock: Boolean);
- procedure AppendDescrSection(AContext: TPasElement; Parent: TDOMNode;
- DescrNode: TDOMElement; const ATitle: DOMString);
- procedure AppendShortDescrCell(Parent: TDOMNode; Element: TPasElement);
- function AppendHyperlink(Parent: TDOMNode; Element: TPasElement): TDOMElement;
- function AppendType(CodeEl, TableEl: TDOMElement;
- Element: TPasType; Expanded: Boolean): TDOMElement;
- function AppendProcType(CodeEl, TableEl: TDOMElement;
- Element: TPasProcedureType; Indent: Integer): TDOMElement;
- procedure AppendProcExt(CodeEl: TDOMElement; Element: TPasProcedure);
- procedure AppendProcDecl(CodeEl, TableEl: TDOMElement;
- Element: TPasProcedureBase);
- procedure AppendProcArgsSection(Parent: TDOMNode;
- Element: TPasProcedureType);
- procedure AppendTitle(const AText: DOMString);
- procedure AppendMenuBar(ASubpageIndex: Integer);
- procedure AppendTopicMenuBar(Topic : TTopicElement);
- procedure AppendSourceRef(AElement: TPasElement);
- procedure FinishElementPage(AElement: TPasElement);
- Procedure AppendSeeAlsoSection(AElement : TPasElement;DocNode : TDocNode);
- Procedure AppendExampleSection(AElement : TPasElement;DocNode : TDocNode);
- procedure CreatePageBody(AElement: TPasElement; ASubpageIndex: Integer); virtual;
- procedure CreatePackagePageBody;
- Procedure CreateTopicPageBody(AElement : TTopicElement);
- procedure CreateModulePageBody(AModule: TPasModule; ASubpageIndex: Integer);
- procedure CreateConstPageBody(AConst: TPasConst);
- procedure CreateTypePageBody(AType: TPasType);
- procedure CreateClassPageBody(AClass: TPasClassType; ASubpageIndex: Integer);
- procedure CreateClassMemberPageBody(AElement: TPasElement);
- procedure CreateVarPageBody(AVar: TPasVariable);
- procedure CreateProcPageBody(AProc: TPasProcedureBase);
- Procedure CreateTopicLinks(Node : TDocNode; PasElement : TPasElement);
- public
- constructor Create(AEngine: TFPDocEngine; AAllocator: TFileAllocator;
- APackage: TPasPackage);
- destructor Destroy; override;
- // Single-page generation
- function CreateHTMLPage(AElement: TPasElement;
- ASubpageIndex: Integer): TXMLDocument;
- function CreateXHTMLPage(AElement: TPasElement;
- ASubpageIndex: Integer): TXMLDocument;
- // For producing complete package documentation
- procedure WriteHTMLPages;
- procedure WriteXHTMLPages;
- SearchPage: String;
- property Allocator: TFileAllocator read FAllocator;
- property Package: TPasPackage read FPackage;
- property PageCount: Integer read GetPageCount;
- property OnTest: TNotifyEvent;
- end;
- implementation
- uses SysUtils, XHTML, XMLWrite, HTMWrite, sh_pas;
- Function FixHTMLpath(S : String) : STring;
- begin
- Result:=StringReplace(S,'\','/',[rfReplaceAll]
- end;
- procedure TFileAllocator.AllocFilename(AElement: TPasElement;
- ASubindex: Integer);
- begin
- end;
- function TFileAllocator.GetRelativePathToTop(AElement: TPasElement): String;
- begin
- SetLength(Result, 0);
- end;
- function TFileAllocator.GetCSSFilename(ARelativeTo: TPasElement): DOMString;
- begin
- Result := GetRelativePathToTop(ARelativeTo) + 'fpdoc.css';
- end;
- constructor TShortNameFileAllocator.Create(const AExtension: String);
- begin
- inherited Create;
- FExtension := AExtension;
- end;
- procedure TShortNameFileAllocator.AllocFilename(AElement: TPasElement;
- ASubindex: Integer);
- begin
- // !!!: Add element to file list
- end;
- constructor TLongNameFileAllocator.Create(const AExtension: String);
- begin
- inherited Create;
- FExtension := AExtension;
- end;
- function TLongNameFileAllocator.GetFilename(AElement: TPasElement;
- ASubindex: Integer): String;
- var
- i: Integer;
- begin
- if AElement.ClassType = TPasPackage then
- Result := 'index'
- else if AElement.ClassType = TPasModule then
- Result := LowerCase(AElement.Name) + PathDelim + 'index'
- else
- begin
- Result := LowerCase(AElement.PathName);
- i := 1;
- if (Length(Result)>0) and (Result[1]='#') then
- begin
- while Result[i] <> '.' do
- Inc(i);
- Result:=Copy(Result,i+1,Length(Result));
- end;
- i := 1;
- while (I<=Length(Result)) and (Result[i]<>'.') do
- Inc(i);
- If (I<=Length(Result)) and (I>0) then
- Result[i]:= PathDelim;
- end;
- if ASubindex > 0 then
- Result := Result + '-' + IntToStr(ASubindex);
- Result := Result + Extension;
- end;
- function TLongNameFileAllocator.GetRelativePathToTop(AElement: TPasElement): String;
- begin
- if (AElement.ClassType=TPasPackage) then
- Result := ''
- else if (AElement.ClassType=TTopicElement) then
- begin
- If (AElement.Parent.ClassType=TTopicElement) then
- Result:='../'+GetRelativePathToTop(AElement.Parent)
- else if (AElement.Parent.ClassType=TPasPackage) then
- Result:=''
- else if (AElement.Parent.ClassType=TPasModule) then
- Result:='../';
- end
- else
- Result := '../';
- end;
- constructor THTMLWriter.Create(AEngine: TFPDocEngine; AAllocator: TFileAllocator;
- APackage: TPasPackage);
- procedure AddPage(AElement: TPasElement; ASubpageIndex: Integer);
- var
- PageInfo: TPageInfo;
- begin
- PageInfo := TPageInfo.Create;
- PageInfo.Element := AElement;
- PageInfo.SubpageIndex := ASubpageIndex;
- PageInfos.Add(PageInfo);
- Allocator.AllocFilename(AElement, ASubpageIndex);
- if ASubpageIndex = 0 then
- Engine.AddLink(AElement.PathName,
- Allocator.GetFilename(AElement, ASubpageIndex));
- end;
- procedure AddTopicPages(AElement: TPasElement);
- var
- PreviousTopic,
- TopicElement : TTopicElement;
- PageInfo : TPageInfo;
- DocNode,
- TopicNode : TDocNode;
- begin
- DocNode:=Engine.FindDocNode(AElement);
- If not Assigned(DocNode) then
- exit;
- TopicNode:=DocNode.FirstChild;
- PreviousTopic:=Nil;
- While Assigned(TopicNode) do
- begin
- If TopicNode.TopicNode then
- begin
- TopicElement:=TTopicElement.Create(TopicNode.Name,AElement);
- Topics.Add(TopicElement);
- TopicElement.TopicNode:=TopicNode;
- TopicElement.Previous:=PreviousTopic;
- If Assigned(PreviousTopic) then
- PreviousTopic.Next:=TopicElement;
- PreviousTopic:=TopicElement;
- if AElement is TTopicElement then
- TTopicElement(AElement).SubTopics.Add(TopicElement);
- PageInfo := TPageInfo.Create;
- PageInfo.Element := TopicElement;
- PageInfo.SubpageIndex := 0;
- PageInfos.Add(PageInfo);
- Allocator.AllocFilename(TopicElement,0);
- Engine.AddLink(TopicElement.PathName, Allocator.GetFilename(TopicElement,0));
- if AElement is TTopicElement then
- TTopicElement(AElement).SubTopics.Add(TopicElement)
- else // Only one level of recursion.
- AddTopicPages(TopicElement);
- end;
- TopicNode:=TopicNode.NextSibling;
- end;
- end;
- procedure AddPages(AElement: TPasElement; ASubpageIndex: Integer;
- AList: TList);
- var
- i: Integer;
- begin
- if AList.Count > 0 then
- begin
- AddPage(AElement, ASubpageIndex);
- for i := 0 to AList.Count - 1 do
- AddPage(TPasElement(AList[i]), 0);
- end;
- end;
- procedure ScanModule(AModule: TPasModule);
- var
- i, j, k: Integer;
- s: String;
- ClassEl: TPasClassType;
- FPEl, AncestorMemberEl: TPasElement;
- DocNode: TDocNode;
- DidAutolink: Boolean;
- begin
- AddPage(AModule, 0);
- AddTopicPages(AModule);
- with AModule do
- begin
- if InterfaceSection.ResStrings.Count > 0 then
- begin
- AddPage(AModule, ResstrSubindex);
- s := Allocator.GetFilename(AModule, ResstrSubindex);
- for i := 0 to InterfaceSection.ResStrings.Count - 1 do
- with TPasResString(InterfaceSection.ResStrings[i]) do
- Engine.AddLink(PathName, s + '#' + LowerCase(Name));
- end;
- AddPages(AModule, ConstsSubindex, InterfaceSection.Consts);
- AddPages(AModule, TypesSubindex, InterfaceSection.Types);
- if InterfaceSection.Classes.Count > 0 then
- begin
- AddPage(AModule, ClassesSubindex);
- for i := 0 to InterfaceSection.Classes.Count - 1 do
- begin
- ClassEl := TPasClassType(InterfaceSection.Classes[i]);
- AddPage(ClassEl, 0);
- // !!!: Only add when there are items
- AddPage(ClassEl, PropertiesByInheritanceSubindex);
- AddPage(ClassEl, PropertiesByNameSubindex);
- AddPage(ClassEl, MethodsByInheritanceSubindex);
- AddPage(ClassEl, MethodsByNameSubindex);
- AddPage(ClassEl, EventsByInheritanceSubindex);
- AddPage(ClassEl, EventsByNameSubindex);
- for j := 0 to ClassEl.Members.Count - 1 do
- begin
- FPEl := TPasElement(ClassEl.Members[j]);
- if ((FPEl.Visibility = visPrivate) and Engine.HidePrivate) or
- ((FPEl.Visibility = visProtected) and Engine.HideProtected) then
- continue;
- DocNode := Engine.FindDocNode(FPEl);
- if not Assigned(DocNode) then
- begin
- DidAutolink := False;
- if Assigned(ClassEl.AncestorType) and
- (ClassEl.AncestorType.ClassType = TPasClassType) then
- begin
- for k := 0 to TPasClassType(ClassEl.AncestorType).Members.Count - 1 do
- begin
- AncestorMemberEl :=
- TPasElement(TPasClassType(ClassEl.AncestorType).Members[k]);
- if AncestorMemberEl.Name = FPEl.Name then
- begin
- DocNode := Engine.FindDocNode(AncestorMemberEl);
- if Assigned(DocNode) then
- begin
- DidAutolink := True;
- Engine.AddLink(FPEl.PathName,
- Engine.FindAbsoluteLink(AncestorMemberEl.PathName));
- break;
- end;
- end;
- end;
- end;
- if not DidAutolink then
- AddPage(FPEl, 0);
- end else
- AddPage(FPEl, 0);
- end;
- end;
- end;
- AddPages(AModule, ProcsSubindex, InterfaceSection.Functions);
- AddPages(AModule, VarsSubindex, InterfaceSection.Variables);
- end;
- end;
- var
- i: Integer;
- begin
- inherited Create(AEngine);
- FAllocator := AAllocator;
- FPackage := APackage;
- OutputNodeStack := TList.Create;
- PageInfos := TObjectList.Create;
- // Allocate page for the package itself, if a name is given (i.e. <> '#')
- if Length(Package.Name) > 1 then
- begin
- AddPage(Package, 0);
- AddTopicPages(Package);
- end;
- for i := 0 to Package.Modules.Count - 1 do
- ScanModule(TPasModule(Package.Modules[i]));
- end;
- destructor THTMLWriter.Destroy;
- begin
- PageInfos.Free;
- OutputNodeStack.Free;
- inherited Destroy;
- end;
- function THTMLWriter.CreateHTMLPage(AElement: TPasElement;
- ASubpageIndex: Integer): TXMLDocument;
- var
- HTMLEl: THTMLHtmlElement;
- HeadEl: THTMLHeadElement;
- El: TDOMElement;
- begin
- Doc := THTMLDocument.Create;
- Result := Doc;
- Doc.AppendChild(Doc.CreateProcessingInstruction(
- 'DOCTYPE', 'HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"'));
- HTMLEl := Doc.CreateHtmlElement;
- Doc.AppendChild(HTMLEl);
- HeadEl := Doc.CreateHeadElement;
- HTMLEl.AppendChild(HeadEl);
- El := Doc.CreateElement('meta');
- HeadEl.AppendChild(El);
- El['http-equiv'] := 'Content-Type';
- El['content'] := 'text/html; charset=iso8859-1';
- TitleElement := Doc.CreateElement('title');
- HeadEl.AppendChild(TitleElement);
- El := Doc.CreateElement('link');
- BodyElement := Doc.CreateElement('body');
- HTMLEl.AppendChild(BodyElement);
- CreatePageBody(AElement, ASubpageIndex);
- HeadEl.AppendChild(El);
- El['rel'] := 'stylesheet';
- El['type'] := 'text/css';
- El['href'] := FixHtmlPath(Allocator.GetCSSFilename(AElement));
- end;
- function THTMLWriter.CreateXHTMLPage(AElement: TPasElement;
- ASubpageIndex: Integer): TXMLDocument;
- begin
- Result := nil;
- end;
- procedure CreatePath(const AFilename: String);
- var
- EndIndex: Integer;
- Path: String;
- begin
- EndIndex := Length(AFilename);
- if EndIndex = 0 then
- exit;
- while not (AFilename[EndIndex] in DirSeparators) do
- begin
- Dec(EndIndex);
- if EndIndex = 0 then
- exit;
- end;
- Path := Copy(AFilename, 1, EndIndex - 1);
- if not FileExists(Path) then
- begin
- CreatePath(Path);
- MkDir(Path);
- end;
- end;
- procedure THTMLWriter.WriteHTMLPages;
- var
- i: Integer;
- PageDoc: TXMLDocument;
- Filename: String;
- begin
- if Engine.Output <> '' then
- Engine.Output := IncludeTrailingBackSlash(Engine.Output);
- for i := 0 to PageInfos.Count - 1 do
- with TPageInfo(PageInfos[i]) do
- begin
- PageDoc := CreateHTMLPage(Element, SubpageIndex);
- try
- Filename := Engine.Output + Allocator.GetFilename(Element, SubpageIndex);
- CreatePath(Filename);
- WriteHTMLFile(PageDoc, Filename);
- finally
- PageDoc.Free;
- end;
- end;
- end;
- procedure THTMLWriter.WriteXHTMLPages;
- begin
- end;
- {procedure THTMLWriter.CreateDoc(const ATitle: DOMString;
- AElement: TPasElement; const AFilename: String);
- var
- El: TDOMElement;
- DocInfo: TDocInfo;
- CSSName: String;
- begin
- Doc := TXHTMLDocument.Create;
- with TXHTMLDocument(Doc) do
- begin
- Encoding := 'ISO8859-1';
- CSSName := 'fpdoc.css';
- if Assigned(Module) then
- CSSName := '../' + CSSName;
- $IFNDEF ver1_0
- StylesheetType := 'text/css';
- StylesheetHRef := CSSName;
- $ENDIF
- CreateRoot(xhtmlStrict);
- with RequestHeadElement do
- begin
- AppendText(RequestTitleElement, ATitle);
- El := CreateElement('link');
- AppendChild(El);
- El['rel'] := 'stylesheet';
- El['type'] := 'text/css';
- El['href'] := FixHtmlPath(CSSName);
- end;
- Self.BodyElement := RequestBodyElement('en');
- end;
- if Length(AFilename) > 0 then
- begin
- DocInfo := TDocInfo.Create;
- DocInfos.Add(DocInfo);
- DocInfo.Element := AElement;
- DocInfo.Filename := AFilename;
- end;
- end;
- }
- { Used for:
- - <link> elements in descriptions
- - "see also" entries
- - AppendHyperlink (for unresolved parse tree element links)
- }
- function THTMLWriter.ResolveLinkID(const Name: String): DOMString;
- var
- i: Integer;
- ThisPackage: TLinkNode;
- begin
- if Length(Name) = 0 then
- begin
- SetLength(Result, 0);
- exit;
- end;
- if Name[1] = '#' then
- Result := Engine.FindAbsoluteLink(Name)
- else
- begin
- SetLength(Result, 0);
- { Try all packages }
- ThisPackage := Engine.RootLinkNode.FirstChild;
- while Assigned(ThisPackage) do
- begin
- Result := Engine.FindAbsoluteLink(ThisPackage.Name + '.' + Name);
- if Length(Result) = 0 then
- begin
- if Assigned(Module) then
- Result := Engine.FindAbsoluteLink(Module.PathName + '.' + Name);
- // WriteLn('Searching for ', Module.PathName + '.' + Name, ' => ', Result);
- if Length(Result) = 0 then
- for i := Length(Name) downto 1 do
- if Name[i] = '.' then
- begin
- Result := ResolveLinkID(Copy(Name, 1, i - 1));
- exit;
- end;
- end;
- ThisPackage := ThisPackage.NextSibling;
- end;
- end;
- if Length(Result) > 0 then
- if Copy(Result, 1, Length(CurDirectory) + 1) = CurDirectory + '/' then
- Result := Copy(Result, Length(CurDirectory) + 2, Length(Result))
- else
- Result := BaseDirectory + Result;
- end;
- function THTMLWriter.ResolveLinkWithinPackage(AElement: TPasElement;
- ASubpageIndex: Integer): String;
- var
- ParentEl: TPasElement;
- begin
- ParentEl := AElement;
- while Assigned(ParentEl) and not (ParentEl.ClassType = TPasPackage) do
- ParentEl := ParentEl.Parent;
- if Assigned(ParentEl) and (TPasPackage(ParentEl) = Engine.Package) then
- begin
- Result := Allocator.GetFilename(AElement, ASubpageIndex);
- if Copy(Result, 1, Length(CurDirectory) + 1) = CurDirectory + '/' then
- Result := Copy(Result, Length(CurDirectory) + 2, Length(Result))
- else
- Result := BaseDirectory + Result;
- end else
- SetLength(Result, 0);
- end;
- function THTMLWriter.CreateEl(Parent: TDOMNode;
- const AName: DOMString): THTMLElement;
- begin
- Result := Doc.CreateElement(AName);
- Parent.AppendChild(Result);
- end;
- function THTMLWriter.CreatePara(Parent: TDOMNode): THTMLElement;
- begin
- Result := CreateEl(Parent, 'p');
- end;
- function THTMLWriter.CreateH1(Parent: TDOMNode): THTMLElement;
- begin
- Result := CreateEl(Parent, 'h1');
- end;
- function THTMLWriter.CreateH2(Parent: TDOMNode): THTMLElement;
- begin
- Result := CreateEl(Parent, 'h2');
- end;
- function THTMLWriter.CreateH3(Parent: TDOMNode): THTMLElement;
- begin
- Result := CreateEl(Parent, 'h3');
- end;
- function THTMLWriter.CreateTable(Parent: TDOMNode): THTMLElement;
- begin
- Result := CreateEl(Parent, 'table');
- Result['cellspacing'] := '0';
- Result['cellpadding'] := '0';
- end;
- function THTMLWriter.CreateContentTable(Parent: TDOMNode): THTMLElement;
- begin
- Result := CreateEl(Parent, 'table');
- end;
- function THTMLWriter.CreateTR(Parent: TDOMNode): THTMLElement;
- begin
- Result := CreateEl(Parent, 'tr');
- end;
- function THTMLWriter.CreateTD(Parent: TDOMNode): THTMLElement;
- begin
- Result := CreateEl(Parent, 'td');
- end;
- function THTMLWriter.CreateTD_vtop(Parent: TDOMNode): THTMLElement;
- begin
- Result := CreateEl(Parent, 'td');
- Result['valign'] := 'top';
- end;
- function THTMLWriter.CreateLink(Parent: TDOMNode;
- const AHRef: DOMString): THTMLElement;
- begin
- Result := CreateEl(Parent, 'a');
- Result['href'] := FixHtmlPath(AHRef);
- end;
- function THTMLWriter.CreateAnchor(Parent: TDOMNode;
- const AName: DOMString): THTMLElement;
- begin
- Result := CreateEl(Parent, 'a');
- Result['name'] := AName;
- end;
- function THTMLWriter.CreateCode(Parent: TDOMNode): THTMLElement;
- begin
- Result := CreateEl(CreateEl(Parent, 'tt'), 'nobr');
- end;
- function THTMLWriter.CreateWarning(Parent: TDOMNode): THTMLElement;
- begin
- Result := CreateEl(Parent, 'span');
- Result['class'] := 'warning';
- end;
- procedure THTMLWriter.PushOutputNode(ANode: TDOMNode);
- begin
- OutputNodeStack.Add(CurOutputNode);
- CurOutputNode := ANode;
- end;
- procedure THTMLWriter.PopOutputNode;
- begin
- CurOutputNode := TDOMNode(OutputNodeStack[OutputNodeStack.Count - 1]);
- OutputNodeStack.Delete(OutputNodeStack.Count - 1);
- end;
- procedure THTMLWriter.DescrWriteText(const AText: DOMString);
- begin
- AppendText(CurOutputNode, AText);
- end;
- procedure THTMLWriter.DescrBeginBold;
- begin
- PushOutputNode(CreateEl(CurOutputNode, 'b'));
- end;
- procedure THTMLWriter.DescrEndBold;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginItalic;
- begin
- PushOutputNode(CreateEl(CurOutputNode, 'i'));
- end;
- procedure THTMLWriter.DescrEndItalic;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginEmph;
- begin
- PushOutputNode(CreateEl(CurOutputNode, 'em'));
- end;
- procedure THTMLWriter.DescrEndEmph;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrWriteFileEl(const AText: DOMString);
- var
- NewEl: TDOMElement;
- begin
- NewEl := CreateEl(CurOutputNode, 'span');
- NewEl['class'] := 'file';
- AppendText(NewEl, AText);
- end;
- procedure THTMLWriter.DescrWriteKeywordEl(const AText: DOMString);
- var
- NewEl: TDOMElement;
- begin
- NewEl := CreateEl(CurOutputNode, 'span');
- NewEl['class'] := 'kw';
- AppendText(NewEl, AText);
- end;
- procedure THTMLWriter.DescrWriteVarEl(const AText: DOMString);
- begin
- AppendText(CreateEl(CurOutputNode, 'var'), AText);
- end;
- procedure THTMLWriter.DescrBeginLink(const AId: DOMString);
- var
- a,s: String;
- begin
- a:=AId;
- s := ResolveLinkID(a);
- if Length(s) = 0 then
- begin
-
- WriteLn(Format(SErrUnknownLinkID, [a]));
- PushOutputNode(CreateEl(CurOutputNode, 'b'));
- end else
- PushOutputNode(CreateLink(CurOutputNode, s));
- end;
- procedure THTMLWriter.DescrEndLink;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrWriteLinebreak;
- begin
- CreateEl(CurOutputNode, 'br');
- end;
- procedure THTMLWriter.DescrBeginParagraph;
- begin
- PushOutputNode(CreatePara(CurOutputNode));
- end;
- procedure THTMLWriter.DescrEndParagraph;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String);
- begin
- DoPasHighlighting := (AHighlighterName = '') or (AHighlighterName = 'Pascal');
- HighlighterFlags := 0;
- PushOutputNode(CreateEl(CurOutputNode, 'pre'));
- end;
- procedure THTMLWriter.DescrWriteCodeLine(const ALine: String);
- begin
- if DoPasHighlighting then
- begin
- HighlighterFlags := AppendPasSHFragment(CurOutputNode, ALine,
- HighlighterFlags);
- AppendText(CurOutputNode, #10);
- end else
- AppendText(CurOutputNode, ALine + #10);
- end;
- procedure THTMLWriter.DescrEndCode;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginOrderedList;
- begin
- PushOutputNode(CreateEl(CurOutputNode, 'ol'));
- end;
- procedure THTMLWriter.DescrEndOrderedList;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginUnorderedList;
- begin
- PushOutputNode(CreateEl(CurOutputNode, 'ul'));
- end;
- procedure THTMLWriter.DescrEndUnorderedList;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginDefinitionList;
- begin
- PushOutputNode(CreateEl(CurOutputNode, 'dl'));
- end;
- procedure THTMLWriter.DescrEndDefinitionList;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginListItem;
- begin
- PushOutputNode(CreateEl(CurOutputNode, 'li'));
- end;
- procedure THTMLWriter.DescrEndListItem;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginDefinitionTerm;
- begin
- PushOutputNode(CreateEl(CurOutputNode, 'dt'));
- end;
- procedure THTMLWriter.DescrEndDefinitionTerm;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginDefinitionEntry;
- begin
- PushOutputNode(CreateEl(CurOutputNode, 'dd'));
- end;
- procedure THTMLWriter.DescrEndDefinitionEntry;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginSectionTitle;
- begin
- PushOutputNode(CreateEl(CurOutputNode, 'h3'));
- end;
- procedure THTMLWriter.DescrBeginSectionBody;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrEndSection;
- begin
- end;
- procedure THTMLWriter.DescrBeginRemark;
- var
- NewEl, TDEl: TDOMElement;
- begin
- NewEl := CreateEl(CurOutputNode, 'table');
- NewEl['width'] := '100%';
- NewEl['border'] := '0';
- NewEl['CellSpacing'] := '0';
- NewEl['class'] := 'remark';
- NewEl := CreateTR(NewEl);
- TDEl := CreateTD(NewEl);
- TDEl['valign'] := 'top';
- TDEl['class'] := 'pre';
- AppendText(CreateEl(TDEl, 'b'), SDocRemark);
- PushOutputNode(CreateTD(NewEl));
- end;
- procedure THTMLWriter.DescrEndRemark;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
- var
- Table: TDOMElement;
- begin
- Table := CreateEl(CurOutputNode, 'table');
- Table['border'] := IntToStr(Ord(HasBorder));
- PushOutputNode(Table);
- end;
- procedure THTMLWriter.DescrEndTable;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginTableCaption;
- begin
- PushOutputNode(CreateEl(CurOutputNode, 'caption'));
- end;
- procedure THTMLWriter.DescrEndTableCaption;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginTableHeadRow;
- begin
- PushOutputNode(CreateTr(CurOutputNode));
- InsideHeadRow := True;
- end;
- procedure THTMLWriter.DescrEndTableHeadRow;
- begin
- InsideHeadRow := False;
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginTableRow;
- begin
- PushOutputNode(CreateTR(CurOutputNode));
- end;
- procedure THTMLWriter.DescrEndTableRow;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.DescrBeginTableCell;
- begin
- if InsideHeadRow then
- PushOutputNode(CreateEl(CurOutputNode, 'th'))
- else
- PushOutputNode(CreateTD(CurOutputNode));
- end;
- procedure THTMLWriter.DescrEndTableCell;
- begin
- PopOutputNode;
- end;
- procedure THTMLWriter.AppendText(Parent: TDOMNode; const AText: DOMString);
- begin
- Parent.AppendChild(Doc.CreateTextNode(AText));
- end;
- procedure THTMLWriter.AppendNbSp(Parent: TDOMNode; ACount: Integer);
- begin
- while ACount > 0 do
- begin
- Parent.AppendChild(Doc.CreateEntityReference('nbsp'));
- Dec(ACount);
- end;
- end;
- procedure THTMLWriter.AppendSym(Parent: TDOMNode; const AText: DOMString);
- var
- El: TDOMElement;
- begin
- El := CreateEl(Parent, 'span');
- El['class'] := 'sym';
- AppendText(El, AText);
- end;
- procedure THTMLWriter.AppendKw(Parent: TDOMNode; const AText: DOMString);
- var
- El: TDOMElement;
- begin
- El := CreateEl(Parent, 'span');
- El['class'] := 'kw';
- AppendText(El, AText);
- end;
- function THTMLWriter.AppendPasSHFragment(Parent: TDOMNode;
- const AText: String; AShFlags: Byte): Byte;
- var
- CurParent: TDOMNode;
- Line, Last, p: PChar;
- IsInSpecial: Boolean;
- El: TDOMElement;
- begin
- GetMem(Line, Length(AText) * 3 + 4);
- DoPascalHighlighting(AShFlags, PChar(AText), Line);
- Result := AShFlags;
- CurParent := Parent;
- IsInSpecial := False;
- Last := Line;
- p := Line;
- while p[0] <> #0 do
- begin
- if p[0] = LF_ESCAPE then
- begin
- p[0] := #0;
- AppendText(CurParent, Last);
- if IsInSpecial then
- CurParent := Parent;
- case Ord(p[1]) of
- shDefault:
- IsInSpecial := False;
- shInvalid:
- begin
- El := CreateEl(CurParent, 'font');
- El['color'] := 'red';
- CurParent := El;
- IsInSpecial := True;
- end;
- shSymbol:
- begin
- El := CreateEl(CurParent, 'span');
- El['class'] := 'sym';
- CurParent := El;
- IsInSpecial := True;
- end;
- shKeyword:
- begin
- El := CreateEl(CurParent, 'span');
- El['class'] := 'kw';
- CurParent := El;
- IsInSpecial := True;
- end;
- shComment:
- begin
- El := CreateEl(CurParent, 'span');
- El['class'] := 'cmt';
- CurParent := El;
- IsInSpecial := True;
- end;
- shDirective:
- begin
- El := CreateEl(CurParent, 'span');
- El['class'] := 'dir';
- CurParent := El;
- IsInSpecial := True;
- end;
- shNumbers:
- begin
- El := CreateEl(CurParent, 'span');
- El['class'] := 'num';
- CurParent := El;
- IsInSpecial := True;
- end;
- shCharacters:
- begin
- El := CreateEl(CurParent, 'span');
- El['class'] := 'chr';
- CurParent := El;
- IsInSpecial := True;
- end;
- shStrings:
- begin
- El := CreateEl(CurParent, 'span');
- El['class'] := 'str';
- CurParent := El;
- IsInSpecial := True;
- end;
- shAssembler:
- begin
- El := CreateEl(CurParent, 'span');
- El['class'] := 'asm';
- CurParent := El;
- IsInSpecial := True;
- end;
- end;
- Last := p + 2;
- end;
- Inc(p);
- end;
- if Last <> p then
- AppendText(CurParent, Last);
- FreeMem(Line);
- end;
- Procedure THTMLWriter.AppendShortDescr(AContext: TPasElement; Parent: TDOMNode; DocNode : TDocNode);
- begin
- if Assigned(DocNode) and Assigned(DocNode.ShortDescr) then
- begin
- PushOutputNode(Parent);
- try
- if not ConvertShort(AContext,TDomElement(DocNode.ShortDescr)) then
- WriteLn(SErrInvalidShortDescr);
- finally
- PopOutputNode;
- end;
- end;
- end;
- procedure THTMLWriter.AppendShortDescr(Parent: TDOMNode; Element: TPasElement);
- begin
- AppendShortDescr(Element,Parent,Engine.FindDocNode(Element));
- end;
- procedure THTMLWriter.AppendDescr(AContext: TPasElement; Parent: TDOMNode;
- DescrNode: TDOMElement; AutoInsertBlock: Boolean);
- begin
- if Assigned(DescrNode) then
- begin
- PushOutputNode(Parent);
- try
- ConvertDescr(AContext, DescrNode, AutoInsertBlock);
- finally
- PopOutputNode;
- end;
- end;
- end;
- procedure THTMLWriter.AppendDescrSection(AContext: TPasElement;
- Parent: TDOMNode; DescrNode: TDOMElement; const ATitle: DOMString);
- begin
- if not IsDescrNodeEmpty(DescrNode) then
- begin
- If (ATitle<>'') then // Can be empty for topic.
- AppendText(CreateH2(Parent), ATitle);
- AppendDescr(AContext, Parent, DescrNode, True);
- end;
- end;
- procedure THTMLWriter.AppendShortDescrCell(Parent: TDOMNode;
- Element: TPasElement);
- var
- ParaEl: TDOMElement;
- begin
- if Assigned(Engine.FindShortDescr(Element)) then
- begin
- AppendNbSp(CreatePara(CreateTD(Parent)), 2);
- ParaEl := CreatePara(CreateTD(Parent));
- ParaEl['class'] := 'cmt';
- AppendShortDescr(ParaEl, Element);
- end;
- end;
- function THTMLWriter.AppendHyperlink(Parent: TDOMNode;
- Element: TPasElement): TDOMElement;
- var
- s: String;
- UnitList: TList;
- i: Integer;
- ThisPackage: TLinkNode;
- begin
- if Assigned(Element) then
- begin
- if Element.InheritsFrom(TPasUnresolvedTypeRef) then
- begin
- s := ResolveLinkID(Element.Name);
- if Length(s) = 0 then
- begin
- { Try all packages }
- ThisPackage := Engine.RootLinkNode.FirstChild;
- while Assigned(ThisPackage) do
- begin
- s := ResolveLinkID(ThisPackage.Name + '.' + Element.Name);
- if Length(s) > 0 then
- break;
- ThisPackage := ThisPackage.NextSibling;
- end;
- if Length(s) = 0 then
- begin
- { Okay, then we have to try all imported units of the current module }
- UnitList := Module.InterfaceSection.UsesList;
- for i := UnitList.Count - 1 downto 0 do
- begin
- { Try all packages }
- ThisPackage := Engine.RootLinkNode.FirstChild;
- while Assigned(ThisPackage) do
- begin
- s := ResolveLinkID(ThisPackage.Name + '.' +
- TPasType(UnitList[i]).Name + '.' + Element.Name);
- if Length(s) > 0 then
- break;
- ThisPackage := ThisPackage.NextSibling;
- end;
- if Length(s) > 0 then
- break;
- end;
- end;
- end;
- end else
- s := ResolveLinkID(Element.PathName);
- if Length(s) > 0 then
- begin
- Result := CreateLink(Parent, s);
- AppendText(Result, Element.Name);
- end else
- begin
- Result := nil;
- AppendText(Parent, Element.Name);
- end;
- end else
- begin
- Result := nil;
- AppendText(CreateWarning(Parent), '<NIL>');
- end;
- end;
- { Returns the new CodeEl, which will be the old CodeEl in most cases }
- function THTMLWriter.AppendType(CodeEl, TableEl: TDOMElement;
- Element: TPasType; Expanded: Boolean): TDOMElement;
- begin
- Result := CodeEl;
- if not Assigned(Element) then
- AppendText(CreateWarning(CodeEl), '<NIL>')
- else if (not Expanded) and (Length(Element.Name) > 0) then
- AppendHyperlink(CodeEl, Element)
- else
- // Array
- if Element.ClassType = TPasArrayType then
- begin
- AppendPasSHFragment(CodeEl,
- 'array [' + TPasArrayType(Element).IndexRange + '] of ', 0);
- Result := AppendType(CodeEl, TableEl, TPasArrayType(Element).ElType, False);
- end else
- // Procedure or funtion type
- if Element.InheritsFrom(TPasProcedureType) then
- begin
- AppendKw(CodeEl, TPasProcedureType(Element).TypeName);
- Result := AppendProcType(CodeEl, TableEl, TPasProcedureType(Element), 0)
- end else
- // Range type
- if Element.InheritsFrom(TPasRangeType) then
- AppendPasSHFragment(CodeEl, TPasRangeType(Element).RangeStart + '..' +
- TPasRangeType(Element).RangeEnd, 0)
- else
- // Other types
- AppendHyperlink(CodeEl, Element);
- end;
- function THTMLWriter.AppendProcType(CodeEl, TableEl: TDOMElement;
- Element: TPasProcedureType; Indent: Integer): TDOMElement;
- function CreateIndentedCodeEl(Indent: Integer): TDOMElement;
- begin
- Result := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
- AppendNbSp(Result, Indent);
- end;
- var
- i: Integer;
- Arg: TPasArgument;
- begin
- if Element.Args.Count > 0 then
- begin
- AppendSym(CodeEl, '(');
- for i := 0 to Element.Args.Count - 1 do
- begin
- Arg := TPasArgument(Element.Args[i]);
- CodeEl := CreateIndentedCodeEl(Indent + 2);
- case Arg.Access of
- argConst: AppendKw(CodeEl, 'const ');
- argVar: AppendKw(CodeEl, 'var ');
- argOut: AppendKw(CodeEl, 'out ');
- end;
- AppendText(CodeEl, Arg.Name);
- if Assigned(Arg.ArgType) then
- begin
- AppendSym(CodeEl, ': ');
- CodeEl := AppendType(CodeEl, TableEl, Arg.ArgType, False);
- end;
- if Length(Arg.Value) > 0 then
- AppendPasSHFragment(CodeEl, ' = ' + Arg.Value, 0);
- if i < Element.Args.Count - 1 then
- AppendSym(CodeEl, ';');
- end;
- if Element.InheritsFrom(TPasFunctionType) or Element.IsOfObject then
- begin
- CodeEl := CreateIndentedCodeEl(Indent);
- if Element.InheritsFrom(TPasFunctionType) then
- begin
- AppendSym(CodeEl, '):');
- AppendHyperlink(CodeEl, TPasFunctionType(Element).ResultEl.ResultType);
- end else
- AppendSym(CodeEl, ')');
- if Element.IsOfObject then
- begin
- AppendText(CodeEl, ' '); // Don't remove
- AppendKw(CodeEl, 'of object');
- end;
- end else
- if Indent > 0 then
- AppendSym(CodeEl, ')')
- else
- begin
- CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
- AppendSym(CodeEl, ')');
- end;
- end else
- begin
- { Procedure or function without arguments }
- if Element.InheritsFrom(TPasFunctionType) then
- begin
- AppendSym(CodeEl, ': ');
- AppendHyperlink(CodeEl, TPasFunctionType(Element).ResultEl.ResultType);
- end;
- if Element.IsOfObject then
- AppendKw(CodeEl, ' of object');
- end;
- Result := CodeEl;
- end;
- procedure THTMLWriter.AppendProcExt(CodeEl: TDOMElement;
- Element: TPasProcedure);
- procedure AppendExt(const Ext: String);
- begin
- AppendKw(CodeEl, ' ' + Ext);
- AppendSym(CodeEl, ';');
- end;
- begin
- if Element.IsVirtual then
- AppendExt('virtual');
- if Element.IsDynamic then
- AppendExt('dynamic');
- if Element.IsAbstract then
- AppendExt('abstract');
- if Element.IsOverride then
- AppendExt('override');
- if Element.IsOverload then
- AppendExt('overload');
- if Element.IsMessage then
- AppendExt('message');
- end;
- { Used in two places:
- - Page for the method of a class
- - Page for a tandalone procedure or function. }
- procedure THTMLWriter.AppendProcDecl(CodeEl, TableEl: TDOMElement;
- Element: TPasProcedureBase);
- procedure WriteVariant(AProc: TPasProcedure);
- begin
- AppendProcArgsSection(TableEl.ParentNode, AProc.ProcType);
- AppendKw(CodeEl, AProc.TypeName);
- if Element.Parent.ClassType = TPasClassType then
- begin
- AppendText(CodeEl, ' ');
- AppendHyperlink(CodeEl, Element.Parent);
- AppendSym(CodeEl, '.');
- AppendText(CodeEl, AProc.Name);
- end else
- AppendText(CodeEl, ' ' + AProc.FullName);
- CodeEl := AppendProcType(CodeEl, TableEl, AProc.ProcType, 0);
- AppendSym(CodeEl, ';');
- AppendProcExt(CodeEl, AProc);
- end;
- var
- i: Integer;
- begin
- if Element.ClassType = TPasOverloadedProc then
- for i := 0 to TPasOverloadedProc(Element).Overloads.Count - 1 do
- begin
- if i > 0 then
- begin
- CreateEl(CodeEl, 'br');
- CreateEl(CodeEl, 'br');
- end;
- WriteVariant(TPasProcedure(TPasOverloadedProc(Element).Overloads[i]));
- end
- else
- WriteVariant(TPasProcedure(Element));
- end;
- procedure THTMLWriter.AppendProcArgsSection(Parent: TDOMNode;
- Element: TPasProcedureType);
- var
- HasFullDescr, IsFirst: Boolean;
- ResultEl: TPasResultElement;
- ArgTableEl, TREl: TDOMElement;
- DocNode: TDocNode;
- i: Integer;
- Arg: TPasArgument;
- begin
- IsFirst := True;
- for i := 0 to Element.Args.Count - 1 do
- begin
- Arg := TPasArgument(Element.Args[i]);
- if IsDescrNodeEmpty(Engine.FindShortDescr(Arg)) then
- continue;
- if IsFirst then
- begin
- IsFirst := False;
- AppendText(CreateH2(Parent), SDocArguments);
- ArgTableEl := CreateTable(Parent);
- end;
- TREl := CreateTR(ArgTableEl);
- AppendText(CreateCode(CreatePara(CreateTD_vtop(TREl))), Arg.Name);
- AppendShortDescrCell(TREl, Arg);
- end;
- if Element.ClassType = TPasFunctionType then
- begin
- ResultEl := TPasFunctionType(Element).ResultEl;
- DocNode := Engine.FindDocNode(ResultEl);
- HasFullDescr := Assigned(DocNode) and not IsDescrNodeEmpty(DocNode.Descr);
- if HasFullDescr or
- (Assigned(DocNode) and not IsDescrNodeEmpty(DocNode.ShortDescr)) then
- begin
- AppendText(CreateH2(Parent), SDocFunctionResult);
- if HasFullDescr then
- AppendDescr(ResultEl, Parent, DocNode.Descr, True)
- else
- AppendDescr(ResultEl, CreatePara(Parent), DocNode.ShortDescr, False);
- end;
- end;
- end;
- procedure THTMLWriter.AppendTitle(const AText: DOMString);
- begin
- AppendText(TitleElement, AText);
- AppendText(CreateH1(BodyElement), AText);
- end;
- procedure THTMLWriter.AppendTopicMenuBar(Topic : TTopicElement);
- var
- TableEl, TREl, ParaEl, TitleEl: TDOMElement;
- procedure AddLink(El : TPasElement; const AName: String);
- begin
- AppendText(ParaEl, '[');
- AppendText(CreateLink(ParaEl, ResolveLinkWithinPackage(El,0)),AName);
- AppendText(ParaEl, ']');
- end;
- begin
- TableEl := CreateEl(BodyElement, 'table');
- TableEl['cellpadding'] := '4';
- TableEl['cellspacing'] := '0';
- TableEl['border'] := '0';
- TableEl['width'] := '100%';
- TableEl['class'] := 'bar';
- TREl := CreateTR(TableEl);
- ParaEl := CreateEl(CreateTD(TREl), 'b');
- If Assigned(Topic.Previous) then
- AddLink(Topic.Previous,SDocPrevious);
- If Assigned(Topic.Parent) then
- AddLink(Topic.Parent,SDocUp);
- if Assigned(Topic.Next) then
- AddLink(Topic.Next,SDocNext);
- if Length(SearchPage) > 0 then
- begin
- AppendText(ParaEl, '[');
- AppendText(CreateLink(ParaEl, SearchPage), SDocSearch);
- AppendText(ParaEl, ']');
- end;
- ParaEl := CreateTD(TREl);
- ParaEl['align'] := 'right';
- TitleEl := CreateEl(ParaEl, 'span');
- TitleEl['class'] := 'bartitle';
- if Assigned(Module) then
- AppendText(TitleEl, Format(SDocUnitTitle, [Module.Name]));
- if Assigned(Package) then
- begin
- AppendText(TitleEl, ' (');
- AppendHyperlink(TitleEl, Package);
- AppendText(TitleEl, ')');
- end;
- end;
- procedure THTMLWriter.AppendMenuBar(ASubpageIndex: Integer);
- var
- TableEl, TREl, ParaEl, TitleEl: TDOMElement;
- procedure AddLink(ALinkSubpageIndex: Integer; const AName: String);
- begin
- AppendText(ParaEl, '[');
- if ALinkSubpageIndex = ASubpageIndex then
- AppendText(ParaEl, AName)
- else
- AppendText(
- CreateLink(ParaEl, ResolveLinkWithinPackage(Module, ALinkSubpageIndex)),
- AName);
- AppendText(ParaEl, ']');
- end;
- begin
- TableEl := CreateEl(BodyElement, 'table');
- TableEl['cellpadding'] := '4';
- TableEl['cellspacing'] := '0';
- TableEl['border'] := '0';
- TableEl['width'] := '100%';
- TableEl['class'] := 'bar';
- TREl := CreateTR(TableEl);
- ParaEl := CreateEl(CreateTD(TREl), 'b');
- if Assigned(Module) then
- begin
- AddLink(0, SDocOverview);
- if Module.InterfaceSection.ResStrings.Count > 0 then
- AddLink(ResstrSubindex, SDocResStrings);
- if Module.InterfaceSection.Consts.Count > 0 then
- AddLink(ConstsSubindex, SDocConstants);
- if Module.InterfaceSection.Types.Count > 0 then
- AddLink(TypesSubindex, SDocTypes);
- if Module.InterfaceSection.Classes.Count > 0 then
- AddLink(ClassesSubindex, SDocClasses);
- if Module.InterfaceSection.Functions.Count > 0 then
- AddLink(ProcsSubindex, SDocProceduresAndFunctions);
- if Module.InterfaceSection.Variables.Count > 0 then
- AddLink(VarsSubindex, SDocVariables);
- end;
- if Length(SearchPage) > 0 then
- begin
- AppendText(ParaEl, '[');
- AppendText(CreateLink(ParaEl, SearchPage), SDocSearch);
- AppendText(ParaEl, ']');
- end;
- ParaEl := CreateTD(TREl);
- ParaEl['align'] := 'right';
- TitleEl := CreateEl(ParaEl, 'span');
- TitleEl['class'] := 'bartitle';
- if Assigned(Module) then
- AppendText(TitleEl, Format(SDocUnitTitle, [Module.Name]));
- if Assigned(Package) then
- begin
- AppendText(TitleEl, ' (');
- AppendHyperlink(TitleEl, Package);
- AppendText(TitleEl, ')');
- end;
- end;
- procedure THTMLWriter.AppendSourceRef(AElement: TPasElement);
- begin
- AppendText(CreatePara(BodyElement), Format(SDocSourcePosition,
- [ExtractFileName(AElement.SourceFilename), AElement.SourceLinenumber]));
- end;
- Procedure THTMLWriter.AppendSeeAlsoSection(AElement : TPasElement;DocNode : TDocNode);
- var
- Node: TDOMNode;
- TableEl, El, TREl, TDEl, ParaEl, NewEl, DescrEl: TDOMElement;
- l,s: String;
- f: Text;
- IsFirstSeeAlso : Boolean;
-
- begin
- if Not (Assigned(DocNode) and Assigned(DocNode.SeeAlso)) then
- Exit;
- IsFirstSeeAlso := True;
- Node:=DocNode.SeeAlso.FirstChild;
- While Assigned(Node) do
- begin
- if (Node.NodeType=ELEMENT_NODE) and (Node.NodeName='link') then
- begin
- if IsFirstSeeAlso then
- begin
- IsFirstSeeAlso := False;
- AppendText(CreateH2(BodyElement), SDocSeeAlso);
- TableEl := CreateTable(BodyElement);
- end;
- El:=TDOMElement(Node);
- TREl:=CreateTR(TableEl);
- ParaEl:=CreatePara(CreateTD_vtop(TREl));
- l:=El['id'];
- s:= ResolveLinkID(l);
- if Length(s)=0 then
- begin
- WriteLn(Format(SErrUnknownLinkID, [l]));
- NewEl := CreateEl(ParaEl,'b')
- end
- else
- NewEl := CreateLink(ParaEl,s);
- AppendText(NewEl,El['id']);
- l:=El['id'];
- DescrEl := Engine.FindShortDescr(AElement.GetModule,L);
- if Assigned(DescrEl) then
- begin
- AppendNbSp(CreatePara(CreateTD(TREl)), 2);
- ParaEl := CreatePara(CreateTD(TREl));
- ParaEl['class'] := 'cmt';
- PushOutputNode(ParaEl);
- try
- ConvertShort(AElement, DescrEl);
- finally
- PopOutputNode;
- end;
- end;
- end; // Link node
- Node := Node.NextSibling;
- end; // While
- end;
- Procedure THTMLWriter.AppendExampleSection(AElement : TPasElement;DocNode : TDocNode);
- var
- Node: TDOMNode;
- // TableEl, El, TREl, TDEl, ParaEl, NewEl, DescrEl: TDOMElement;
- s: String;
- f: Text;
-
- begin
- if not (Assigned(DocNode) and Assigned(DocNode.FirstExample)) then
- Exit;
- Node := DocNode.FirstExample;
- while Assigned(Node) do
- begin
- if (Node.NodeType = ELEMENT_NODE) and (Node.NodeName = 'example') then
- begin
- AppendText(CreateH2(BodyElement), SDocExample);
- try
- Assign(f, Engine.GetExampleFilename(TDOMElement(Node)));
- Reset(f);
- try
- PushOutputNode(BodyElement);
- DescrBeginCode(False, TDOMElement(Node)['highlighter']);
- while not EOF(f) do
- begin
- ReadLn(f, s);
- DescrWriteCodeLine(s);
- end;
- DescrEndCode;
- PopOutputNode;
- finally
- Close(f);
- end;
- except
- on e: Exception do
- begin
- e.Message := '[example] ' + e.Message;
- raise;
- end;
- end;
- end;
- Node := Node.NextSibling;
- end;
- end;
- procedure THTMLWriter.FinishElementPage(AElement: TPasElement);
- var
- DocNode: TDocNode;
- begin
- DocNode := Engine.FindDocNode(AElement);
- If Assigned(DocNode) then
- begin
- // Description
- if Assigned(DocNode.Descr) then
- AppendDescrSection(AElement, BodyElement, DocNode.Descr, SDocDescription);
- // Append "Errors" section
- if Assigned(DocNode.ErrorsDoc) then
- AppendDescrSection(AElement, BodyElement, DocNode.ErrorsDoc, SDocErrors);
- // Append "See also" section
- AppendSeeAlsoSection(AElement,DocNode);
- // Append examples, if present
- AppendExampleSection(AElement,DocNode);
- end;
- end;
- Procedure THTMLWriter.CreateTopicPageBody(AElement : TTopicElement);
- var
- DocNode: TDocNode;
- TableEl, TREl: TDOMElement;
- I : Integer;
- S : String;
-
- begin
- AppendTopicMenuBar(AElement);
- DocNode:=AElement.TopicNode;
- if Assigned(DocNode) then // should always be true, but we're being careful.
- begin
- AppendShortDescr(AElement,TitleElement, DocNode);
- AppendShortDescr(AElement,CreateH2(BodyElement), DocNode);
- if Assigned(DocNode.Descr) then
- AppendDescrSection(AElement, BodyElement, DocNode.Descr, '');
- AppendSeeAlsoSection(AElement,DocNode);
- CreateTopicLinks(DocNode,AElement);
- AppendExampleSection(AElement,DocNode);
- end;
- end;
- procedure THTMLWriter.CreatePageBody(AElement: TPasElement;
- ASubpageIndex: Integer);
- var
- i: Integer;
- Element: TPasElement;
- begin
- CurDirectory := Allocator.GetFilename(AElement, ASubpageIndex);
- i := Length(CurDirectory);
- while (i > 0) and not (CurDirectory[i] in DirSeparators) do
- Dec(i);
- CurDirectory := Copy(CurDirectory, 1, i);
- BaseDirectory := Allocator.GetRelativePathToTop(AElement);
- if AElement.ClassType = TPasPackage then
- CreatePackagePageBody
- else
- begin
- Element := AElement;
- while (Element<>Nil) and (Element.ClassType<>TPasModule) do
- Element := Element.Parent;
- Module := TPasModule(Element);
- if AElement.ClassType = TPasModule then
- CreateModulePageBody(TPasModule(AElement), ASubpageIndex)
- else if AElement.Parent.InheritsFrom(TPasClassType) then
- CreateClassMemberPageBody(AElement)
- else if AElement.ClassType = TPasConst then
- CreateConstPageBody(TPasConst(AElement))
- else if AElement.InheritsFrom(TPasClassType) then
- CreateClassPageBody(TPasClassType(AElement), ASubpageIndex)
- else if AElement.InheritsFrom(TPasType) then
- CreateTypePageBody(TPasType(AElement))
- else if AElement.ClassType = TPasVariable then
- CreateVarPageBody(TPasVariable(AElement))
- else if AElement.InheritsFrom(TPasProcedureBase) then
- CreateProcPageBody(TPasProcedure(AElement))
- else if AElement.ClassType = TTopicELement then
- CreateTopicPageBody(TTopicElement(AElement))
- end;
- end;
- procedure THTMLWriter.CreatePackagePageBody;
- var
- DocNode: TDocNode;
- TableEl, TREl: TDOMElement;
- i: Integer;
- ThisModule: TPasModule;
- L : TStringList;
-
- begin
- AppendMenuBar(0);
- AppendTitle(Format(SDocPackageTitle, [Copy(Package.Name, 2, 256)]));
- AppendShortDescr(CreatePara(BodyElement), Package);
- AppendText(CreateH2(BodyElement), SDocUnits);
- TableEl := CreateTable(BodyElement);
- L:=TStringList.Create;
- Try
- L.Sorted:=True;
- // Sort modules.
- For I:=0 to Package.Modules.Count-1 do
- L.AddObject(TPasModule(Package.Modules[i]).Name,TPasModule(Package.Modules[i]));
- // Now create table.
- for i:=0 to L.Count - 1 do
- begin
- ThisModule := TPasModule(L.Objects[i]);
- TREl := CreateTR(TableEl);
- AppendHyperlink(CreateCode(CreatePara(CreateTD_vtop(TREl))), ThisModule);
- AppendShortDescrCell(TREl, ThisModule);
- end;
- Finally
- L.Free;
- end;
- DocNode := Engine.FindDocNode(Package);
- if Assigned(DocNode) then
- begin
- if Assigned(DocNode.Descr) then
- AppendDescrSection(nil, BodyElement, DocNode.Descr, SDocDescription);
- CreateTopicLinks(DocNode,Package);
- end;
- end;
- Procedure THTMLWriter.CreateTopicLinks(Node : TDocNode; PasElement : TPasElement);
- var
- DocNode: TDocNode;
- TableEl, TREl: TDOMElement;
- First : Boolean;
- ThisTopic: TPasElement;
-
- begin
- DocNode:=Node.FirstChild;
- First:=True;
- While Assigned(DocNode) do
- begin
- If DocNode.TopicNode then
- begin
- if first then
- begin
- First:=False;
- AppendText(CreateH2(BodyElement), SDocRelatedTopics);
- TableEl := CreateTable(BodyElement);
- end;
- TREl := CreateTR(TableEl);
- ThisTopic:=FindTopicElement(DocNode);
- if Assigned(ThisTopic) then
- AppendHyperlink(CreateCode(CreatePara(CreateTD_vtop(TREl))), ThisTopic);
- AppendShortDescrCell(TREl, ThisTopic);
- end;
- DocNode:=DocNode.NextSibling;
- end;
- end;
- procedure THTMLWriter.CreateModulePageBody(AModule: TPasModule;
- ASubpageIndex: Integer);
- procedure CreateMainPage;
- var
- TableEl, TREl, TDEl, CodeEl: TDOMElement;
- i: Integer;
- UnitRef: TPasType;
- DocNode: TDocNode;
- begin
- AppendMenuBar(0);
- AppendTitle(Format(SDocUnitTitle, [AModule.Name]));
- AppendShortDescr(CreatePara(BodyElement), AModule);
- if AModule.InterfaceSection.UsesList.Count > 0 then
- begin
- TableEl := CreateTable(BodyElement);
- AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), 'uses');
- for i := 0 to AModule.InterfaceSection.UsesList.Count - 1 do
- begin
- UnitRef := TPasType(AModule.InterfaceSection.UsesList[i]);
- DocNode := Engine.FindDocNode(UnitRef);
- if Assigned(DocNode) and DocNode.IsSkipped then
- continue;
- TREl := CreateTR(TableEl);
- TDEl := CreateTD_vtop(TREl);
- CodeEl := CreateCode(CreatePara(TDEl));
- AppendNbSp(CodeEl, 2);
- AppendHyperlink(CodeEl, UnitRef);
- if i < AModule.InterfaceSection.UsesList.Count - 1 then
- AppendSym(CodeEl, ',')
- else
- AppendSym(CodeEl, ';');
- AppendText(CodeEl, ' '); // Space for descriptions
- AppendShortDescrCell(TREl, UnitRef);
- end;
- end;
- DocNode := Engine.FindDocNode(AModule);
- if Assigned(DocNode) then
- begin
- if Assigned(DocNode.Descr) then
- AppendDescrSection(AModule, BodyElement, DocNode.Descr, SDocOverview);
- CreateTopicLinks(DocNode,AModule);
- end;
- end;
- procedure CreateSimpleSubpage(const ATitle: DOMString; AList: TList);
- var
- TableEl, TREl, TDEl, CodeEl: TDOMElement;
- i, j: Integer;
- Decl: TPasElement;
- SortedList: TList;
- DocNode: TDocNode;
- S : String;
-
- begin
- AppendMenuBar(ASubpageIndex);
- S:=ATitle;
- AppendTitle(Format(SDocUnitTitle + ': %s', [AModule.Name, S]));
- SortedList := TList.Create;
- try
- for i := 0 to AList.Count - 1 do
- begin
- Decl := TPasElement(AList[i]);
- DocNode := Engine.FindDocNode(Decl);
- if (not Assigned(DocNode)) or (not DocNode.IsSkipped) then
- begin
- j := 0;
- while (j < SortedList.Count) and (CompareText(
- TPasElement(SortedList[j]).PathName, Decl.PathName) < 0) do
- Inc(j);
- SortedList.Insert(j, Decl);
- end;
- end;
- TableEl := CreateTable(BodyElement);
- for i := 0 to SortedList.Count - 1 do
- begin
- Decl := TPasElement(SortedList[i]);
- TREl := CreateTR(TableEl);
- CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
- AppendHyperlink(CodeEl, Decl);
- AppendShortDescrCell(TREl, Decl);
- end;
- finally
- SortedList.Free;
- end;
- end;
- procedure CreateResStringsPage;
- var
- ParaEl: TDOMElement;
- i, j: Integer;
- Decl: TPasResString;
- DocNode: TDocNode;
- begin
- AppendMenuBar(ResstrSubindex);
- AppendTitle(Format(SDocUnitTitle + ': %s', [AModule.Name, SDocResStrings]));
- for i := 0 to AModule.InterfaceSection.ResStrings.Count - 1 do
- begin
- Decl := TPasResString(AModule.InterfaceSection.ResStrings[i]);
- CreateEl(BodyElement, 'a')['name'] := LowerCase(Decl.Name);
- ParaEl := CreatePara(BodyElement);
- AppendText(CreateCode(ParaEl), Decl.Name);
- CreateEl(ParaEl, 'br');
- AppendText(ParaEl, Decl.Value);
- end;
- end;
- begin
- case ASubpageIndex of
- 0:
- CreateMainPage;
- ResstrSubindex:
- CreateResStringsPage;
- ConstsSubindex:
- CreateSimpleSubpage(SDocConstants, AModule.InterfaceSection.Consts);
- TypesSubindex:
- CreateSimpleSubpage(SDocTypes, AModule.InterfaceSection.Types);
- ClassesSubindex:
- CreateSimpleSubpage(SDocClasses, AModule.InterfaceSection.Classes);
- ProcsSubindex:
- CreateSimpleSubpage(SDocProceduresAndFunctions, AModule.InterfaceSection.Functions);
- VarsSubindex:
- CreateSimpleSubpage(SDocVariables, AModule.InterfaceSection.Variables);
- end;
- end;
- procedure THTMLWriter.CreateConstPageBody(AConst: TPasConst);
- var
- TableEl, CodeEl: TDOMElement;
- begin
- AppendMenuBar(-1);
- AppendTitle(AConst.Name);
- AppendShortDescr(CreatePara(BodyElement), AConst);
- AppendText(CreateH2(BodyElement), SDocDeclaration);
- AppendSourceRef(AConst);
- TableEl := CreateTable(BodyElement);
- CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
- AppendKw(CodeEl, 'const');
- AppendText(CodeEl, ' ' + AConst.Name);
- if Assigned(AConst.VarType) then
- begin
- AppendSym(CodeEl, ': ');
- AppendType(CodeEl, TableEl, AConst.VarType, False);
- end;
- AppendPasSHFragment(CodeEl, ' = ' + AConst.Value + ';', 0);
- FinishElementPage(AConst);
- end;
- procedure THTMLWriter.CreateTypePageBody(AType: TPasType);
- var
- TableEl, TREl, TDEl, CodeEl: TDOMElement;
- DocNode: TDocNode;
- i: Integer;
- s: String;
- EnumType: TPasEnumType;
- EnumValue: TPasEnumValue;
- Variable: TPasVariable;
- begin
- AppendMenuBar(-1);
- AppendTitle(AType.Name);
- AppendShortDescr(CreatePara(BodyElement), AType);
- AppendText(CreateH2(BodyElement), SDocDeclaration);
- AppendSourceRef(AType);
- TableEl := CreateTable(BodyElement);
- TREl := CreateTR(TableEl);
- TDEl := CreateTD(TREl);
- CodeEl := CreateCode(CreatePara(TDEl));
- AppendKw(CodeEl, 'type ');
- AppendText(CodeEl, AType.Name);
- AppendSym(CodeEl, ' = ');
- // Alias
- if AType.ClassType = TPasAliasType then
- begin
- if Assigned(TPasAliasType(AType).DestType) then
- AppendHyperlink(CodeEl, TPasAliasType(AType).DestType)
- else
- AppendText(CreateWarning(CodeEl), '<Destination type is NIL>');
- AppendSym(CodeEl, ';');
- end else
- // Class of
- if AType.ClassType = TPasClassOfType then
- begin
- AppendKw(CodeEl, 'class of ');
- AppendHyperlink(CodeEl, TPasClassOfType(AType).DestType);
- AppendSym(CodeEl, ';');
- end else
- // Enumeration
- if AType.ClassType = TPasEnumType then
- begin
- AppendSym(CodeEl, '(');
- for i := 0 to TPasEnumType(AType).Values.Count - 1 do
- begin
- EnumValue := TPasEnumValue(TPasEnumType(AType).Values[i]);
- TREl := CreateTR(TableEl);
- CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
- AppendShortDescrCell(TREl, EnumValue);
- AppendNbSp(CodeEl, 2);
- s := EnumValue.Name;
- if EnumValue.IsValueUsed then
- s := s + ' = ' + IntToStr(EnumValue.Value);
- if i < TPasEnumType(AType).Values.Count - 1 then
- s := s + ',';
- AppendPasSHFragment(CodeEl, s, 0);
- end;
- AppendSym(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), ');');
- end else
- // Pointer type
- if AType.ClassType = TPasPointerType then
- begin
- AppendSym(CodeEl, '^');
- if Assigned(TPasPointerType(AType).DestType) then
- AppendHyperlink(CodeEl, TPasPointerType(AType).DestType)
- else
- AppendText(CreateWarning(CodeEl), '<Destination type is NIL>');
- AppendSym(CodeEl, ';');
- end else
- if AType.InheritsFrom(TPasProcedureType) then
- begin
- AppendSym(AppendType(CodeEl, TableEl, TPasType(AType), True), ';');
- AppendProcArgsSection(BodyElement, TPasProcedureType(AType));
- end else
- // Record
- if AType.ClassType = TPasRecordType then
- begin
- if TPasRecordType(AType).IsPacked then
- AppendKw(CodeEl, 'packed record')
- else
- AppendKw(CodeEl, 'record');
- for i := 0 to TPasRecordType(AType).Members.Count - 1 do
- begin
- Variable := TPasVariable(TPasRecordType(AType).Members[i]);
- TREl := CreateTR(TableEl);
- CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
- AppendShortDescrCell(TREl, Variable);
- AppendNbSp(CodeEl, 2);
- AppendText(CodeEl, Variable.Name);
- AppendSym(CodeEl, ': ');
- AppendType(CodeEl, TableEl, Variable.VarType, False);
- AppendSym(CodeEl, ';');
- end;
- CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
- AppendText(CodeEl, ' '); // !!!: Dirty trick, necessary for current XML writer
- AppendKw(CodeEl, 'end');
- AppendSym(CodeEl, ';');
- end else
- // Set
- if AType.ClassType = TPasSetType then
- begin
- AppendKw(CodeEl, 'set of ');
- if TPasSetType(AType).EnumType.ClassType = TPasEnumType then
- begin
- AppendSym(CodeEl, '(');
- EnumType := TPasEnumType(TPasSetType(AType).EnumType);
- for i := 0 to EnumType.Values.Count - 1 do
- begin
- EnumValue := TPasEnumValue(EnumType.Values[i]);
- TREl := CreateTR(TableEl);
- CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
- AppendShortDescrCell(TREl, EnumValue);
- AppendNbSp(CodeEl, 2);
- s := EnumValue.Name;
- if EnumValue.IsValueUsed then
- s := s + ' = ' + IntToStr(EnumValue.Value);
- if i < EnumType.Values.Count - 1 then
- s := s + ',';
- AppendPasSHFragment(CodeEl, s, 0);
- end;
- AppendSym(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), ');');
- end else
- begin
- AppendHyperlink(CodeEl, TPasSetType(AType).EnumType);
- AppendSym(CodeEl, ';');
- end;
- end else
- // Type alias
- if AType.ClassType = TPasTypeAliasType then
- begin
- AppendKw(CodeEl, 'type ');
- AppendHyperlink(CodeEl, TPasTypeAliasType(AType).DestType);
- AppendSym(CodeEl, ';');
- end else
- // Probably one of the simple types, which allowed in other places as wel...
- AppendSym(AppendType(CodeEl, TableEl, TPasType(AType), True), ';');
- FinishElementPage(AType);
- end;
- function PropertyFilter(AMember: TPasElement): Boolean;
- begin
- Result := (AMember.ClassType = TPasProperty) and
- (Copy(AMember.Name, 1, 2) <> 'On');
- end;
- function MethodFilter(AMember: TPasElement): Boolean;
- begin
- Result := AMember.InheritsFrom(TPasProcedureBase);
- end;
- function EventFilter(AMember: TPasElement): Boolean;
- begin
- Result := (AMember.ClassType = TPasProperty) and
- (Copy(AMember.Name, 1, 2) = 'On');
- end;
- procedure THTMLWriter.CreateClassPageBody(AClass: TPasClassType;
- ASubpageIndex: Integer);
- type
- TMemberFilter = function(AMember: TPasElement): Boolean;
- var
- ParaEl: TDOMElement;
- procedure AppendMemberListLink(AListSubpageIndex: Integer;
- const AText: DOMString);
- var
- LinkEl: TDOMElement;
- begin
- AppendText(ParaEl, '[');
- LinkEl := CreateEl(ParaEl, 'a');
- LinkEl['href'] :=
- FixHtmlPath(ResolveLinkWithinPackage(AClass, AListSubpageIndex));
- LinkEl['onClick'] := 'window.open(''' + LinkEl['href'] + ''', ''list'', ' +
- '''dependent=yes,resizable=yes,scrollbars=yes,height=400,width=300''); return false;';
- AppendText(LinkEl, AText);
- AppendText(ParaEl, ' (');
- LinkEl := CreateEl(ParaEl, 'a');
- LinkEl['href'] :=
- FixHtmlPath(ResolveLinkWithinPackage(AClass, AListSubpageIndex + 1));
- LinkEl['onClick'] := 'window.open(''' + LinkEl['href'] + ''', ''list'', ' +
- '''dependent=yes,resizable=yes,scrollbars=yes,height=400,width=300''); return false;';
- AppendText(LinkEl, SDocByName);
- AppendText(ParaEl, ')');
- AppendText(ParaEl, '] ');
- end;
- procedure CreateMainPage;
- var
- TableEl, TREl, TDEl, CodeEl: TDOMElement;
- DocNode: TDocNode;
- Member: TPasElement;
- CurVisibility: TPasMemberVisibility;
- i: Integer;
- s: String;
- ThisClass: TPasClassType;
- HaveSeenTObject: Boolean;
- begin
- AppendMenuBar(-1);
- AppendTitle(AClass.Name);
- ParaEl := CreatePara(BodyElement);
- AppendMemberListLink(PropertiesByInheritanceSubindex, SDocProperties);
- AppendMemberListLink(MethodsByInheritanceSubindex, SDocMethods);
- AppendMemberListLink(EventsByInheritanceSubindex, SDocEvents);
- AppendShortDescr(CreatePara(BodyElement), AClass);
- AppendText(CreateH2(BodyElement), SDocDeclaration);
- AppendSourceRef(AClass);
- TableEl := CreateTable(BodyElement);
- TREl := CreateTR(TableEl);
- TDEl := CreateTD(TREl);
- CodeEl := CreateCode(CreatePara(TDEl));
- AppendKw(CodeEl, 'type');
- AppendText(CodeEl, ' ' + AClass.Name + ' ');
- AppendSym(CodeEl, '=');
- AppendText(CodeEl, ' ');
- AppendKw(CodeEl, ObjKindNames[AClass.ObjKind]);
- if Assigned(AClass.AncestorType) then
- begin
- AppendSym(CodeEl, '(');
- AppendHyperlink(CodeEl, AClass.AncestorType);
- AppendSym(CodeEl, ')');
- end;
- if AClass.Members.Count > 0 then
- begin
- CurVisibility := visDefault;
- for i := 0 to AClass.Members.Count - 1 do
- begin
- Member := TPasElement(AClass.Members[i]);
- if CurVisibility <> Member.Visibility then
- begin
- CurVisibility := Member.Visibility;
- if ((CurVisibility = visPrivate) and Engine.HidePrivate) or
- ((CurVisibility = visProtected) and Engine.HideProtected) then
- continue;
- case CurVisibility of
- visPrivate: s := 'private';
- visProtected: s := 'protected';
- visPublic: s := 'public';
- visPublished: s := 'published';
- visAutomated: s := 'automated';
- end;
- AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), s);
- end else
- if ((CurVisibility = visPrivate) and Engine.HidePrivate) or
- ((CurVisibility = visProtected) and Engine.HideProtected) then
- continue;
- TREl := CreateTR(TableEl);
- CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
- AppendNbSp(CodeEl, 2);
- AppendShortDescrCell(TREl, Member);
- if Member.InheritsFrom(TPasProcedureBase) then
- begin
- AppendKw(CodeEl, TPasProcedureBase(Member).TypeName + ' ');
- AppendHyperlink(CodeEl, Member);
- if (Member.ClassType = TPasOverloadedProc) or
- (TPasProcedure(Member).ProcType.Args.Count > 0) then
- AppendSym(CodeEl, '();')
- else
- AppendSym(CodeEl, ';');
- if Member.ClassType <> TPasOverloadedProc then
- AppendProcExt(CodeEl, TPasProcedure(Member));
- end else
- if Member.ClassType = TPasVariable then
- begin
- AppendHyperlink(CodeEl, Member);
- AppendSym(CodeEl, ': ');
- AppendHyperlink(CodeEl, TPasVariable(Member).VarType);
- AppendSym(CodeEl, ';');
- end else
- if Member.ClassType = TPasProperty then
- begin
- AppendKw(CodeEl, 'property ');
- AppendHyperlink(CodeEl, Member);
- if Assigned(TPasProperty(Member).VarType) then
- begin
- AppendSym(CodeEl, ': ');
- AppendHyperlink(CodeEl, TPasProperty(Member).VarType);
- end;
- AppendSym(CodeEl, ';');
- if TPasProperty(Member).IsDefault then
- begin
- AppendKw(CodeEl, ' default');
- AppendSym(CodeEl, ';');
- end;
- SetLength(s, 0);
- if Length(TPasProperty(Member).ReadAccessorName) > 0 then
- s := s + 'r';
- if Length(TPasProperty(Member).WriteAccessorName) > 0 then
- s := s + 'w';
- if Length(TPasProperty(Member).StoredAccessorName) > 0 then
- s := s + 's';
- if Length(s) > 0 then
- AppendText(CodeEl, ' [' + s + ']');
- end else
- AppendText(CreateWarning(CodeEl), '<' + Member.ClassName + '>');
- end;
- CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
- end;
- AppendText(CodeEl, ' '); // !!!: Dirty trick, necessary for current XML writer
- AppendKw(CodeEl, 'end');
- AppendSym(CodeEl, ';');
- AppendText(CreateH2(BodyElement), SDocInheritance);
- TableEl := CreateTable(BodyElement);
- HaveSeenTObject := AClass.ObjKind <> okClass;
- ThisClass := AClass;
- while True do
- begin
- TREl := CreateTR(TableEl);
- TDEl := CreateTD_vtop(TREl);
- TDEl['align'] := 'center';
- CodeEl := CreateCode(CreatePara(TDEl));
- AppendHyperlink(CodeEl, ThisClass);
- AppendShortDescrCell(TREl, ThisClass);
- if HaveSeenTObject or (CompareText(ThisClass.Name, 'TObject') = 0) then
- HaveSeenTObject := True
- else
- begin
- TDEl := CreateTD(CreateTR(TableEl));
- TDEl['align'] := 'center';
- AppendText(TDEl, '|');
- end;
- if Assigned(ThisClass.AncestorType) then
- begin
- if ThisClass.AncestorType.InheritsFrom(TPasClassType) then
- ThisClass := TPasClassType(ThisClass.AncestorType)
- else
- begin
- TDEl := CreateTD(CreateTR(TableEl));
- TDEl['align'] := 'center';
- AppendText(CreateCode(CreatePara(TDEl)), ThisClass.AncestorType.Name);
- if CompareText(ThisClass.AncestorType.Name, 'TObject') = 0 then
- HaveSeenTObject := True
- else
- begin
- TDEl := CreateTD(CreateTR(TableEl));
- TDEl['align'] := 'center';
- AppendText(TDEl, '?');
- end;
- break;
- end
- end else
- break;
- end;
- if not HaveSeenTObject then
- begin
- TDEl := CreateTD(CreateTR(TableEl));
- TDEl['align'] := 'center';
- AppendText(CreateCode(CreatePara(TDEl)), 'TObject');
- end;
- FinishElementPage(AClass);
- end;
- procedure CreateInheritanceSubpage(AFilter: TMemberFilter);
- var
- ThisClass: TPasClassType;
- i: Integer;
- Member: TPasElement;
- TableEl, TREl, TDEl, ParaEl, LinkEl: TDOMElement;
- begin
- TableEl := CreateTable(BodyElement);
- ThisClass := AClass;
- while True do
- begin
- TREl := CreateTR(TableEl);
- TDEl := CreateTD(TREl);
- TDEl['colspan'] := '3';
- CreateTD(TREl);
- LinkEl := AppendHyperlink(CreateEl(CreateCode(CreatePara(TDEl)), 'b'), ThisClass);
- if Assigned(LinkEl) then
- LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
- '''; return false;';
- for i := 0 to ThisClass.Members.Count - 1 do
- begin
- Member := TPasElement(ThisClass.Members[i]);
- if ((Member.Visibility = visPrivate) and Engine.HidePrivate) or
- ((Member.Visibility = visProtected) and Engine.HideProtected) or
- not AFilter(Member) then
- continue;
- TREl := CreateTR(TableEl);
- ParaEl := CreatePara(CreateTD(TREl));
- case Member.Visibility of
- visPrivate:
- AppendText(ParaEl, 'pv');
- visProtected:
- AppendText(ParaEl, 'pt');
- visPublished:
- AppendText(ParaEl, 'pl');
- end;
- AppendNbSp(ParaEl, 1);
- ParaEl := CreateTD(TREl);
- if (Member.ClassType = TPasProperty) and
- (Length(TPasProperty(Member).WriteAccessorName) = 0) then
- begin
- AppendText(ParaEl, 'ro');
- AppendNbSp(ParaEl, 1);
- end;
- LinkEl := AppendHyperlink(CreatePara(CreateTD(TREl)), Member);
- if Assigned(LinkEl) then
- LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
- '''; return false;';
- end;
- if (not Assigned(ThisClass.AncestorType)) or
- (not (ThisClass.AncestorType.ClassType = TPasClassType)) then
- break;
- ThisClass := TPasClassType(ThisClass.AncestorType);
- AppendNbSp(CreatePara(CreateTD(CreateTR(TableEl))), 1);
- end;
- end;
- procedure CreateSortedSubpage(AFilter: TMemberFilter);
- var
- List: TList;
- ThisClass: TPasClassType;
- i, j: Integer;
- Member: TPasElement;
- TableEl, TREl, TDEl, ParaEl, LinkEl: TDOMElement;
- begin
- List := TList.Create;
- try
- ThisClass := AClass;
- while True do
- begin
- for i := 0 to ThisClass.Members.Count - 1 do
- begin
- Member := TPasElement(ThisClass.Members[i]);
- if (not (((Member.Visibility = visPrivate) and Engine.HidePrivate) or
- ((Member.Visibility = visProtected) and Engine.HideProtected))) and
- AFilter(Member) then
- begin
- j := 0;
- while (j < List.Count) and
- (CompareText(TPasElement(List[j]).Name, Member.Name) < 0) do
- Inc(j);
- List.Insert(j, Member);
- end;
- end;
- if (not Assigned(ThisClass.AncestorType)) or
- (not (ThisClass.AncestorType.ClassType = TPasClassType)) then
- break;
- ThisClass := TPasClassType(ThisClass.AncestorType);
- end;
- TableEl := CreateTable(BodyElement);
- for i := 0 to List.Count - 1 do
- begin
- Member := TPasElement(List[i]);
- TREl := CreateTR(TableEl);
- ParaEl := CreatePara(CreateTD(TREl));
- case Member.Visibility of
- visPrivate:
- AppendText(ParaEl, 'pv');
- visProtected:
- AppendText(ParaEl, 'pt');
- visPublished:
- AppendText(ParaEl, 'pl');
- end;
- AppendNbSp(ParaEl, 1);
- ParaEl := CreatePara(CreateTD(TREl));
- if (Member.ClassType = TPasProperty) and
- (Length(TPasProperty(Member).WriteAccessorName) = 0) then
- begin
- AppendText(ParaEl, 'ro');
- AppendNbSp(ParaEl, 1);
- end;
- TDEl := CreateTD(TREl);
- TDEl['nowrap'] := 'nowrap';
- ParaEl := CreatePara(TDEl);
- LinkEl := AppendHyperlink(ParaEl, Member);
- if Assigned(LinkEl) then
- LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
- '''; return false;';
- AppendText(ParaEl, ' (');
- LinkEl := AppendHyperlink(ParaEl, Member.Parent);
- if Assigned(LinkEl) then
- LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
- '''; return false;';
- AppendText(ParaEl, ')');
- end;
- finally
- List.Free;
- end;
- end;
- begin
- case ASubpageIndex of
- 0:
- CreateMainPage;
- PropertiesByInheritanceSubindex:
- CreateInheritanceSubpage(@PropertyFilter);
- PropertiesByNameSubindex:
- CreateSortedSubpage(@PropertyFilter);
- MethodsByInheritanceSubindex:
- CreateInheritanceSubpage(@MethodFilter);
- MethodsByNameSubindex:
- CreateSortedSubpage(@MethodFilter);
- EventsByInheritanceSubindex:
- CreateInheritanceSubpage(@EventFilter);
- EventsByNameSubindex:
- CreateSortedSubpage(@EventFilter);
- end;
- end;
- procedure THTMLWriter.CreateClassMemberPageBody(AElement: TPasElement);
- var
- TableEl, TREl, CodeEl: TDOMElement;
- procedure CreateVarPage(Element: TPasVariable);
- begin
- AppendHyperlink(CodeEl, Element.Parent);
- AppendSym(CodeEl, '.');
- AppendText(CodeEl, Element.Name);
- if Assigned(Element.VarType) then
- begin
- AppendSym(CodeEl, ': ');
- AppendSym(AppendType(CodeEl, TableEl, Element.VarType, False), ';');
- end;
- end;
- procedure CreatePropertyPage(Element: TPasProperty);
- var
- NeedBreak: Boolean;
- begin
- AppendKw(CodeEl, 'property ');
- AppendHyperlink(CodeEl, Element.Parent);
- AppendSym(CodeEl, '.');
- AppendText(CodeEl, Element.Name);
- if Assigned(Element.VarType) then
- begin
- AppendSym(CodeEl, ': ');
- AppendType(CodeEl, TableEl, Element.VarType, False);
- end;
- NeedBreak := False;
- if Length(TPasProperty(Element).IndexValue) <> 0 then
- begin
- CreateEl(CodeEl, 'br');
- AppendNbsp(CodeEl, 2);
- AppendKw(CodeEl, 'index ');
- AppendPasSHFragment(CodeEl, TPasProperty(Element).IndexValue, 0);
- NeedBreak := True;
- end;
- if Length(TPasProperty(Element).ReadAccessorName) <> 0 then
- begin
- CreateEl(CodeEl, 'br');
- AppendNbsp(CodeEl, 2);
- AppendKw(CodeEl, 'read ');
- AppendText(CodeEl, TPasProperty(Element).ReadAccessorName);
- NeedBreak := True;
- end;
- if Length(TPasProperty(Element).WriteAccessorName) <> 0 then
- begin
- CreateEl(CodeEl, 'br');
- AppendNbsp(CodeEl, 2);
- AppendKw(CodeEl, 'write ');
- AppendText(CodeEl, TPasProperty(Element).WriteAccessorName);
- NeedBreak := True;
- end;
- if Length(TPasProperty(Element).StoredAccessorName) <> 0 then
- begin
- CreateEl(CodeEl, 'br');
- AppendNbsp(CodeEl, 2);
- AppendKw(CodeEl, 'stored ');
- AppendText(CodeEl, TPasProperty(Element).StoredAccessorName);
- NeedBreak := True;
- end;
- if Length(TPasProperty(Element).DefaultValue) <> 0 then
- begin
- CreateEl(CodeEl, 'br');
- AppendNbsp(CodeEl, 2);
- AppendKw(CodeEl, 'default ');
- AppendPasSHFragment(CodeEl, TPasProperty(Element).DefaultValue, 0);
- NeedBreak := True;
- end;
- AppendSym(CodeEl, ';');
- if TPasProperty(Element).IsDefault or TPasProperty(Element).IsNodefault then
- begin
- if NeedBreak then
- begin
- CreateEl(CodeEl, 'br');
- AppendNbsp(CodeEl, 2);
- end;
- if TPasProperty(Element).IsDefault then
- AppendKw(CodeEl, 'default')
- else
- AppendKw(CodeEl, 'nodefault');
- AppendSym(CodeEl, ';');
- end;
- end;
- var
- s: String;
- DocNode: TDocNode;
- begin
- AppendMenuBar(-1);
- AppendTitle(AElement.FullName);
- AppendShortDescr(CreatePara(BodyElement), AElement);
- AppendText(CreateH2(BodyElement), SDocDeclaration);
- AppendSourceRef(AElement);
- TableEl := CreateTable(BodyElement);
- TREl := CreateTR(TableEl);
- CodeEl := CreateCode(CreatePara(CreateTD(TREl)));
- AppendText(CodeEl, ' '); // !!!: Workaround for current HTML writer
- case AElement.Visibility of
- visPrivate: s := 'private';
- visProtected: s := 'protected';
- visPublic: s := 'public';
- visPublished: s := 'published';
- visAutomated: s := 'automated';
- else s := '';
- end;
- if Length(s) > 0 then
- AppendKw(CodeEl, s);
- AppendText(CodeEl, ' ');
- if AElement.ClassType = TPasVariable then
- CreateVarPage(TPasVariable(AElement))
- else if AElement.InheritsFrom(TPasProcedureBase) then
- AppendProcDecl(CodeEl, TableEl, TPasProcedureBase(AElement))
- else if AElement.ClassType = TPasProperty then
- CreatePropertyPage(TPasProperty(AElement))
- else
- AppendText(CreateWarning(BodyElement), '<' + AElement.ClassName + '>');
- FinishElementPage(AElement);
- end;
- procedure THTMLWriter.CreateVarPageBody(AVar: TPasVariable);
- var
- TableEl, TREl, TDEl, CodeEl, El: TDOMElement;
- DocNode: TDocNode;
- begin
- AppendMenuBar(-1);
- AppendTitle(AVar.FullName);
- AppendShortDescr(CreatePara(BodyElement), AVar);
- AppendText(CreateH2(BodyElement), SDocDeclaration);
- AppendSourceRef(AVar);
- TableEl := CreateTable(BodyElement);
- TREl := CreateTR(TableEl);
- TDEl := CreateTD(TREl);
- CodeEl := CreateCode(CreatePara(TDEl));
- AppendKw(CodeEl, 'var');
- AppendText(CodeEl, ' ' + AVar.Name);
- if Assigned(AVar.VarType) then
- begin
- AppendSym(CodeEl, ': ');
- El := AppendType(CodeEl, TableEl, AVar.VarType, False);
- end else
- El := CodeEl;
- if Length(AVar.Value) > 0 then
- AppendPasSHFragment(El, ' = ' + AVar.Value + ';', 0)
- else
- AppendSym(El, ';');
- FinishElementPage(AVar);
- end;
- procedure THTMLWriter.CreateProcPageBody(AProc: TPasProcedureBase);
- var
- TableEl, TREl, TDEl, CodeEl: TDOMElement;
- begin
- AppendMenuBar(-1);
- AppendTitle(AProc.Name);
- AppendShortDescr(CreatePara(BodyElement), AProc);
- AppendText(CreateH2(BodyElement), SDocDeclaration);
- AppendSourceRef(AProc);
- TableEl := CreateTable(BodyElement);
- TREl := CreateTR(TableEl);
- TDEl := CreateTD(TREl);
- CodeEl := CreateCode(CreatePara(TDEl));
- AppendProcDecl(CodeEl, TableEl, AProc);
- FinishElementPage(AProc);
- end;
- // private methods
- function THTMLWriter.GetPageCount: Integer;
- begin
- Result := PageInfos.Count;
- end;
- end.
- {
- $Log$
- Revision 1.11 2004-12-20 16:28:56 michael
- + Fixed HTML path
- Revision 1.10 2004/10/22 19:58:35 michael
- + Sort list of modules in package page
- Revision 1.9 2004/08/31 09:40:05 michael
- + Lookup using string, not widestring
- Revision 1.8 2004/08/28 18:04:49 michael
- + Added context to topic pages
- Revision 1.7 2004/07/25 22:40:13 michael
- + Strip path from sourcefilename in generated docs
- Revision 1.6 2004/06/06 10:53:02 michael
- + Added Topic support
- Revision 1.5 2003/11/28 12:51:37 sg
- * Added support for source references
- Revision 1.4 2003/04/22 00:00:05 sg
- * Fixed bug in path building for links to elements which don't have their
- own page, but their parent element has
- Revision 1.3 2003/04/17 14:15:24 sg
- * Added writing of array ranges
- 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.15 2003/03/13 22:02:13 sg
- * New version with many bugfixes and our own parser (now independent of the
- compiler source)
- Revision 1.14 2002/11/15 19:46:32 sg
- * Added support for classes and objects (formerly all objects have been
- written als classes)
- Revision 1.13 2002/05/24 00:13:22 sg
- * much improved new version, including many linking and output fixes
- Revision 1.12 2002/03/12 10:58:36 sg
- * reworked linking engine and internal structure
- Revision 1.11 2002/01/20 11:19:55 michael
- + Added link attribute and property to TFPElement
- Revision 1.10 2001/12/21 11:25:13 sg
- * The parser can now unget two tokens from the scanner
- * Added parsing and HTML output of range types
- * Procedure/function variable bugfixes
- Revision 1.9 2001/12/17 22:34:04 sg
- * Fixed typo in output for menu bar
- Revision 1.8 2001/12/17 13:41:17 jonas
- * OsPathSeparator -> PathDelim
- }
|