dw_html.pp 98 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513
  1. {
  2. FPDoc - Free Pascal Documentation Tool
  3. Copyright (C) 2000 - 2005 by
  4. Areca Systems GmbH / Sebastian Guenther, [email protected]
  5. * HTML/XHTML output generator
  6. See the file COPYING, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. }
  12. {$mode objfpc}
  13. {$H+}
  14. unit dw_HTML;
  15. interface
  16. uses Classes, contnrs, DOM, DOM_HTML, dGlobals, PasTree, dWriter, ChmWriter, ChmBase;
  17. const
  18. // Subpage indices for modules
  19. ResstrSubindex = 1;
  20. ConstsSubindex = 2;
  21. TypesSubindex = 3;
  22. ClassesSubindex = 4;
  23. ProcsSubindex = 5;
  24. VarsSubindex = 6;
  25. // Maybe needed later for topic overview ??
  26. TopicsSubIndex = 7;
  27. IndexSubIndex = 8;
  28. // Subpage indices for classes
  29. PropertiesByInheritanceSubindex = 1;
  30. PropertiesByNameSubindex = 2;
  31. MethodsByInheritanceSubindex = 3;
  32. MethodsByNameSubindex = 4;
  33. EventsByInheritanceSubindex = 5;
  34. EventsByNameSubindex = 6;
  35. type
  36. TFileAllocator = class
  37. public
  38. procedure AllocFilename(AElement: TPasElement; ASubindex: Integer); virtual;
  39. function GetFilename(AElement: TPasElement;
  40. ASubindex: Integer): String; virtual; abstract;
  41. function GetRelativePathToTop(AElement: TPasElement): String; virtual;
  42. function GetCSSFilename(ARelativeTo: TPasElement): DOMString; virtual;
  43. end;
  44. TShortNameFileAllocator = class(TFileAllocator)
  45. private
  46. FExtension: String;
  47. public
  48. constructor Create(const AExtension: String);
  49. procedure AllocFilename(AElement: TPasElement; ASubindex: Integer); override;
  50. property Extension: String read FExtension;
  51. end;
  52. TLongNameFileAllocator = class(TFileAllocator)
  53. private
  54. FExtension: String;
  55. public
  56. constructor Create(const AExtension: String);
  57. function GetFilename(AElement: TPasElement;
  58. ASubindex: Integer): String; override;
  59. function GetRelativePathToTop(AElement: TPasElement): String; override;
  60. property Extension: String read FExtension;
  61. end;
  62. TPageInfo = class
  63. Element: TPasElement;
  64. SubpageIndex: Integer;
  65. end;
  66. { THTMLWriter }
  67. THTMLWriter = class(TFPDocWriter)
  68. private
  69. FImageFileList: TStrings;
  70. FOnTest: TNotifyEvent;
  71. FPackage: TPasPackage;
  72. FCharSet : String;
  73. function GetPageCount: Integer;
  74. procedure SetOnTest(const AValue: TNotifyEvent);
  75. protected
  76. FCSSFile: String;
  77. FAllocator: TFileAllocator;
  78. CurDirectory: String; // relative to curdir of process
  79. BaseDirectory: String; // relative path to package base directory
  80. PageInfos: TObjectList; // list of TPageInfo objects
  81. Doc: THTMLDocument;
  82. BodyElement, TitleElement: TDOMElement;
  83. Module: TPasModule;
  84. OutputNodeStack: TList;
  85. CurOutputNode: TDOMNode;
  86. InsideHeadRow, DoPasHighlighting: Boolean;
  87. HighlighterFlags: Byte;
  88. FooterFile: string;
  89. FIDF : Boolean;
  90. FDateFormat: String;
  91. FIndexColCount : Integer;
  92. FSearchPage : String;
  93. FBaseImageURL : String;
  94. Procedure CreateAllocator; virtual;
  95. function ResolveLinkID(const Name: String): DOMString;
  96. function ResolveLinkIDInUnit(const Name,AUnitName: String): DOMString;
  97. function ResolveLinkWithinPackage(AElement: TPasElement;
  98. ASubpageIndex: Integer): String;
  99. // Helper functions for creating DOM elements
  100. function CreateEl(Parent: TDOMNode; const AName: DOMString): THTMLElement;
  101. function CreatePara(Parent: TDOMNode): THTMLElement;
  102. function CreateH1(Parent: TDOMNode): THTMLElement;
  103. function CreateH2(Parent: TDOMNode): THTMLElement;
  104. function CreateH3(Parent: TDOMNode): THTMLElement;
  105. function CreateTable(Parent: TDOMNode; const AClass: DOMString = ''): THTMLElement;
  106. function CreateContentTable(Parent: TDOMNode): THTMLElement;
  107. function CreateTR(Parent: TDOMNode): THTMLElement;
  108. function CreateTD(Parent: TDOMNode): THTMLElement;
  109. function CreateTD_vtop(Parent: TDOMNode): THTMLElement;
  110. function CreateLink(Parent: TDOMNode; const AHRef: DOMString): THTMLElement;
  111. function CreateAnchor(Parent: TDOMNode; const AName: DOMString): THTMLElement;
  112. function CreateCode(Parent: TDOMNode): THTMLElement;
  113. function CreateWarning(Parent: TDOMNode): THTMLElement;
  114. // Description node conversion
  115. Procedure DescrEmitNotesHeader(AContext : TPasElement); override;
  116. Procedure DescrEmitNotesFooter(AContext : TPasElement); override;
  117. procedure PushOutputNode(ANode: TDOMNode);
  118. procedure PopOutputNode;
  119. procedure DescrWriteText(const AText: DOMString); override;
  120. procedure DescrBeginBold; override;
  121. procedure DescrEndBold; override;
  122. procedure DescrBeginItalic; override;
  123. procedure DescrEndItalic; override;
  124. procedure DescrBeginEmph; override;
  125. procedure DescrEndEmph; override;
  126. procedure DescrWriteImageEl(const AFileName, ACaption, ALinkName : DOMString); override;
  127. procedure DescrWriteFileEl(const AText: DOMString); override;
  128. procedure DescrWriteKeywordEl(const AText: DOMString); override;
  129. procedure DescrWriteVarEl(const AText: DOMString); override;
  130. procedure DescrBeginLink(const AId: DOMString); override;
  131. procedure DescrEndLink; override;
  132. procedure DescrBeginURL(const AURL: DOMString); override;
  133. procedure DescrEndURL; override;
  134. procedure DescrWriteLinebreak; override;
  135. procedure DescrBeginParagraph; override;
  136. procedure DescrEndParagraph; override;
  137. procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
  138. procedure DescrWriteCodeLine(const ALine: String); override;
  139. procedure DescrEndCode; override;
  140. procedure DescrBeginOrderedList; override;
  141. procedure DescrEndOrderedList; override;
  142. procedure DescrBeginUnorderedList; override;
  143. procedure DescrEndUnorderedList; override;
  144. procedure DescrBeginDefinitionList; override;
  145. procedure DescrEndDefinitionList; override;
  146. procedure DescrBeginListItem; override;
  147. procedure DescrEndListItem; override;
  148. procedure DescrBeginDefinitionTerm; override;
  149. procedure DescrEndDefinitionTerm; override;
  150. procedure DescrBeginDefinitionEntry; override;
  151. procedure DescrEndDefinitionEntry; override;
  152. procedure DescrBeginSectionTitle; override;
  153. procedure DescrBeginSectionBody; override;
  154. procedure DescrEndSection; override;
  155. procedure DescrBeginRemark; override;
  156. procedure DescrEndRemark; override;
  157. procedure DescrBeginTable(ColCount: Integer; HasBorder: Boolean); override;
  158. procedure DescrEndTable; override;
  159. procedure DescrBeginTableCaption; override;
  160. procedure DescrEndTableCaption; override;
  161. procedure DescrBeginTableHeadRow; override;
  162. procedure DescrEndTableHeadRow; override;
  163. procedure DescrBeginTableRow; override;
  164. procedure DescrEndTableRow; override;
  165. procedure DescrBeginTableCell; override;
  166. procedure DescrEndTableCell; override;
  167. procedure AppendText(Parent: TDOMNode; const AText: DOMString);
  168. procedure AppendNbSp(Parent: TDOMNode; ACount: Integer);
  169. procedure AppendSym(Parent: TDOMNode; const AText: DOMString);
  170. procedure AppendKw(Parent: TDOMNode; const AText: DOMString);
  171. function AppendPasSHFragment(Parent: TDOMNode; const AText: String;
  172. AShFlags: Byte): Byte;
  173. Procedure AppendShortDescr(AContext : TPasElement;Parent: TDOMNode; DocNode : TDocNode);
  174. procedure AppendShortDescr(Parent: TDOMNode; Element: TPasElement);
  175. procedure AppendShortDescrCell(Parent: TDOMNode; Element: TPasElement);
  176. procedure AppendDescr(AContext: TPasElement; Parent: TDOMNode;
  177. DescrNode: TDOMElement; AutoInsertBlock: Boolean);
  178. procedure AppendDescrSection(AContext: TPasElement; Parent: TDOMNode;
  179. DescrNode: TDOMElement; const ATitle: DOMString);
  180. function AppendHyperlink(Parent: TDOMNode; Element: TPasElement): TDOMElement;
  181. function AppendType(CodeEl, TableEl: TDOMElement;
  182. Element: TPasType; Expanded: Boolean;
  183. NestingLevel: Integer = 0): TDOMElement;
  184. function AppendProcType(CodeEl, TableEl: TDOMElement;
  185. Element: TPasProcedureType; Indent: Integer): TDOMElement;
  186. procedure AppendProcExt(CodeEl: TDOMElement; Element: TPasProcedure);
  187. procedure AppendProcDecl(CodeEl, TableEl: TDOMElement;
  188. Element: TPasProcedureBase);
  189. procedure AppendProcArgsSection(Parent: TDOMNode;
  190. Element: TPasProcedureType);
  191. function AppendRecordType(CodeEl, TableEl: TDOMElement;
  192. Element: TPasRecordType; NestingLevel: Integer): TDOMElement;
  193. procedure AppendTitle(const AText: DOMString);
  194. procedure AppendMenuBar(ASubpageIndex: Integer);
  195. procedure AppendTopicMenuBar(Topic : TTopicElement);
  196. procedure AppendSourceRef(AElement: TPasElement);
  197. procedure FinishElementPage(AElement: TPasElement);
  198. Procedure AppendSeeAlsoSection(AElement : TPasElement;DocNode : TDocNode);
  199. Procedure AppendExampleSection(AElement : TPasElement;DocNode : TDocNode);
  200. procedure AppendFooter;
  201. procedure CreateIndexPage(L : TStringList);
  202. procedure CreateModuleIndexPage(AModule: TPasModule);
  203. procedure CreatePageBody(AElement: TPasElement; ASubpageIndex: Integer); virtual;
  204. procedure CreatePackagePageBody;
  205. procedure CreatePackageIndex;
  206. procedure AddModuleIdentifiers(AModule : TPasModule; L : TStrings);
  207. Procedure CreateTopicPageBody(AElement : TTopicElement);
  208. procedure CreateModulePageBody(AModule: TPasModule; ASubpageIndex: Integer);
  209. procedure CreateConstPageBody(AConst: TPasConst);
  210. procedure CreateTypePageBody(AType: TPasType);
  211. procedure CreateClassPageBody(AClass: TPasClassType; ASubpageIndex: Integer);
  212. procedure CreateClassMemberPageBody(AElement: TPasElement);
  213. procedure CreateVarPageBody(AVar: TPasVariable);
  214. procedure CreateProcPageBody(AProc: TPasProcedureBase);
  215. Procedure CreateTopicLinks(Node : TDocNode; PasElement : TPasElement);
  216. public
  217. constructor Create(APackage: TPasPackage; AEngine: TFPDocEngine); override;
  218. destructor Destroy; override;
  219. // Single-page generation
  220. function CreateHTMLPage(AElement: TPasElement;
  221. ASubpageIndex: Integer): TXMLDocument;
  222. function CreateXHTMLPage(AElement: TPasElement;
  223. ASubpageIndex: Integer): TXMLDocument;
  224. // For producing complete package documentation
  225. procedure WriteHTMLPages; virtual;
  226. procedure WriteXHTMLPages;
  227. Function InterPretOption(Const Cmd,Arg : String) : boolean; override;
  228. Procedure WriteDoc; override;
  229. Class Function FileNameExtension : String; override;
  230. class procedure Usage(List: TStrings); override;
  231. Property SearchPage: String Read FSearchPage Write FSearchPage;
  232. property Allocator: TFileAllocator read FAllocator;
  233. property Package: TPasPackage read FPackage;
  234. property PageCount: Integer read GetPageCount;
  235. Property IncludeDateInFooter : Boolean Read FIDF Write FIDF;
  236. Property DateFormat : String Read FDateFormat Write FDateFormat;
  237. property OnTest: TNotifyEvent read FOnTest write SetOnTest;
  238. Property CharSet : String Read FCharSet Write FCharSet;
  239. Property IndexColCount : Integer Read FIndexColCount write FIndexColCount;
  240. Property BaseImageURL : String Read FBaseImageURL Write FBaseImageURL;
  241. end;
  242. THTMWriter = class(THTMLWriter)
  243. Protected
  244. Procedure CreateAllocator; override;
  245. end;
  246. {$DEFINE chmInterface}
  247. {$I dw_htmlchm.inc}
  248. {$UNDEF chmInterface}
  249. implementation
  250. uses SysUtils, XHTML, XMLRead, XMLWrite, HTMWrite, sh_pas,chmsitemap;
  251. Function FixHTMLpath(S : String) : STring;
  252. begin
  253. Result:=StringReplace(S,'\','/',[rfReplaceAll]);
  254. end;
  255. {$I dw_htmlchm.inc}
  256. procedure TFileAllocator.AllocFilename(AElement: TPasElement;
  257. ASubindex: Integer);
  258. begin
  259. end;
  260. function TFileAllocator.GetRelativePathToTop(AElement: TPasElement): String;
  261. begin
  262. SetLength(Result, 0);
  263. end;
  264. function TFileAllocator.GetCSSFilename(ARelativeTo: TPasElement): DOMString;
  265. begin
  266. Result := GetRelativePathToTop(ARelativeTo) + 'fpdoc.css';
  267. end;
  268. constructor TShortNameFileAllocator.Create(const AExtension: String);
  269. begin
  270. inherited Create;
  271. FExtension := AExtension;
  272. end;
  273. procedure TShortNameFileAllocator.AllocFilename(AElement: TPasElement;
  274. ASubindex: Integer);
  275. begin
  276. // !!!: Add element to file list
  277. end;
  278. constructor TLongNameFileAllocator.Create(const AExtension: String);
  279. begin
  280. inherited Create;
  281. FExtension := AExtension;
  282. end;
  283. function TLongNameFileAllocator.GetFilename(AElement: TPasElement;
  284. ASubindex: Integer): String;
  285. var
  286. s: String;
  287. i: Integer;
  288. begin
  289. if AElement.ClassType = TPasPackage then
  290. Result := 'index'
  291. else if AElement.ClassType = TPasModule then
  292. Result := LowerCase(AElement.Name) + PathDelim + 'index'
  293. else
  294. begin
  295. if AElement is TPasOperator then
  296. begin
  297. Result := LowerCase(AElement.Parent.PathName) + '.op-';
  298. s := Copy(AElement.Name, Pos(' ', AElement.Name) + 1, Length(AElement.Name));
  299. s := Copy(s, 1, Pos('(', s) - 1);
  300. if s = ':=' then
  301. s := 'assign'
  302. else if s = '+' then
  303. s := 'add'
  304. else if s = '-' then
  305. s := 'sub'
  306. else if s = '*' then
  307. s := 'mul'
  308. else if s = '/' then
  309. s := 'div'
  310. else if s = '**' then
  311. s := 'power'
  312. else if s = '=' then
  313. s := 'equal'
  314. else if s = '<>' then
  315. s := 'unequal'
  316. else if s = '<' then
  317. s := 'less'
  318. else if s = '<=' then
  319. s := 'lessequal'
  320. else if s = '>' then
  321. s := 'greater'
  322. else if s = '>=' then
  323. s := 'greaterthan'
  324. else if s = '><' then
  325. s := 'symmetricdifference';
  326. Result := Result + s + '-';
  327. s := '';
  328. i := 1;
  329. while AElement.Name[i] <> '(' do
  330. Inc(i);
  331. Inc(i);
  332. while AElement.Name[i] <> ')' do
  333. begin
  334. if AElement.Name[i] = ',' then
  335. begin
  336. s := s + '-';
  337. Inc(i);
  338. end else
  339. s := s + AElement.Name[i];
  340. Inc(i);
  341. end;
  342. Result := Result + LowerCase(s) + '-' + LowerCase(Copy(AElement.Name,
  343. Pos('):', AElement.Name) + 3, Length(AElement.Name)));
  344. end else
  345. Result := LowerCase(AElement.PathName);
  346. i := 1;
  347. if (Length(Result) > 0) and (Result[1] = '#') then
  348. begin
  349. while Result[i] <> '.' do
  350. Inc(i);
  351. Result := Copy(Result, i + 1, Length(Result));
  352. end;
  353. i := 1;
  354. while (i <= Length(Result)) and (Result[i] <> '.') do
  355. Inc(i);
  356. if (i <= Length(Result)) and (i > 0) then
  357. Result[i] := PathDelim;
  358. end;
  359. if ASubindex > 0 then
  360. Result := Result + '-' + IntToStr(ASubindex);
  361. Result := Result + Extension;
  362. end;
  363. function TLongNameFileAllocator.GetRelativePathToTop(AElement: TPasElement): String;
  364. begin
  365. if (AElement.ClassType=TPasPackage) then
  366. Result := ''
  367. else if (AElement.ClassType=TTopicElement) then
  368. begin
  369. If (AElement.Parent.ClassType=TTopicElement) then
  370. Result:='../'+GetRelativePathToTop(AElement.Parent)
  371. else if (AElement.Parent.ClassType=TPasPackage) then
  372. Result:=''
  373. else if (AElement.Parent.ClassType=TPasModule) then
  374. Result:='../';
  375. end
  376. else
  377. Result := '../';
  378. end;
  379. Type
  380. { TLinkData }
  381. TLinkData = Class(TObject)
  382. FPathName,
  383. FLink,
  384. FModuleName : String;
  385. Constructor Create(Const APathName,ALink,AModuleName : string);
  386. end;
  387. { TLinkData }
  388. constructor TLinkData.Create(Const APathName, ALink, AModuleName: string);
  389. begin
  390. FPathName:=APathName;
  391. FLink:=ALink;
  392. FModuleName:=AModuleName;
  393. end;
  394. constructor THTMLWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
  395. procedure AddPage(AElement: TPasElement; ASubpageIndex: Integer);
  396. var
  397. PageInfo: TPageInfo;
  398. begin
  399. PageInfo := TPageInfo.Create;
  400. PageInfo.Element := AElement;
  401. PageInfo.SubpageIndex := ASubpageIndex;
  402. PageInfos.Add(PageInfo);
  403. Allocator.AllocFilename(AElement, ASubpageIndex);
  404. if ASubpageIndex = 0 then
  405. Engine.AddLink(AElement.PathName,
  406. Allocator.GetFilename(AElement, ASubpageIndex));
  407. end;
  408. procedure AddTopicPages(AElement: TPasElement);
  409. var
  410. PreviousTopic,
  411. TopicElement : TTopicElement;
  412. PageInfo : TPageInfo;
  413. DocNode,
  414. TopicNode : TDocNode;
  415. begin
  416. DocNode:=Engine.FindDocNode(AElement);
  417. If not Assigned(DocNode) then
  418. exit;
  419. TopicNode:=DocNode.FirstChild;
  420. PreviousTopic:=Nil;
  421. While Assigned(TopicNode) do
  422. begin
  423. If TopicNode.TopicNode then
  424. begin
  425. TopicElement:=TTopicElement.Create(TopicNode.Name,AElement);
  426. Topics.Add(TopicElement);
  427. TopicElement.TopicNode:=TopicNode;
  428. TopicElement.Previous:=PreviousTopic;
  429. If Assigned(PreviousTopic) then
  430. PreviousTopic.Next:=TopicElement;
  431. PreviousTopic:=TopicElement;
  432. if AElement is TTopicElement then
  433. TTopicElement(AElement).SubTopics.Add(TopicElement);
  434. PageInfo := TPageInfo.Create;
  435. PageInfo.Element := TopicElement;
  436. PageInfo.SubpageIndex := 0;
  437. PageInfos.Add(PageInfo);
  438. Allocator.AllocFilename(TopicElement,0);
  439. Engine.AddLink(TopicElement.PathName, Allocator.GetFilename(TopicElement,0));
  440. if AElement is TTopicElement then
  441. TTopicElement(AElement).SubTopics.Add(TopicElement)
  442. else // Only one level of recursion.
  443. AddTopicPages(TopicElement);
  444. end;
  445. TopicNode:=TopicNode.NextSibling;
  446. end;
  447. end;
  448. procedure AddPages(AElement: TPasElement; ASubpageIndex: Integer;
  449. AList: TFPList);
  450. var
  451. i: Integer;
  452. begin
  453. if AList.Count > 0 then
  454. begin
  455. AddPage(AElement, ASubpageIndex);
  456. for i := 0 to AList.Count - 1 do
  457. AddPage(TPasElement(AList[i]), 0);
  458. end;
  459. end;
  460. procedure ScanModule(AModule: TPasModule; LinkList : TObjectList);
  461. var
  462. i, j, k: Integer;
  463. s: String;
  464. ClassEl: TPasClassType;
  465. FPEl, AncestorMemberEl: TPasElement;
  466. DocNode: TDocNode;
  467. ALink : DOMString;
  468. DidAutolink: Boolean;
  469. begin
  470. AddPage(AModule, 0);
  471. AddPage(AModule,IndexSubIndex);
  472. AddTopicPages(AModule);
  473. with AModule do
  474. begin
  475. if InterfaceSection.ResStrings.Count > 0 then
  476. begin
  477. AddPage(AModule, ResstrSubindex);
  478. s := Allocator.GetFilename(AModule, ResstrSubindex);
  479. for i := 0 to InterfaceSection.ResStrings.Count - 1 do
  480. with TPasResString(InterfaceSection.ResStrings[i]) do
  481. Engine.AddLink(PathName, s + '#' + LowerCase(Name));
  482. end;
  483. AddPages(AModule, ConstsSubindex, InterfaceSection.Consts);
  484. AddPages(AModule, TypesSubindex, InterfaceSection.Types);
  485. if InterfaceSection.Classes.Count > 0 then
  486. begin
  487. AddPage(AModule, ClassesSubindex);
  488. for i := 0 to InterfaceSection.Classes.Count - 1 do
  489. begin
  490. ClassEl := TPasClassType(InterfaceSection.Classes[i]);
  491. AddPage(ClassEl, 0);
  492. // !!!: Only add when there are items
  493. AddPage(ClassEl, PropertiesByInheritanceSubindex);
  494. AddPage(ClassEl, PropertiesByNameSubindex);
  495. AddPage(ClassEl, MethodsByInheritanceSubindex);
  496. AddPage(ClassEl, MethodsByNameSubindex);
  497. AddPage(ClassEl, EventsByInheritanceSubindex);
  498. AddPage(ClassEl, EventsByNameSubindex);
  499. for j := 0 to ClassEl.Members.Count - 1 do
  500. begin
  501. FPEl := TPasElement(ClassEl.Members[j]);
  502. if ((FPEl.Visibility = visPrivate) and Engine.HidePrivate) or
  503. ((FPEl.Visibility = visProtected) and Engine.HideProtected) then
  504. continue;
  505. DocNode := Engine.FindDocNode(FPEl);
  506. if Assigned(DocNode) then
  507. begin
  508. if Assigned(DocNode.Node) then
  509. ALink:=DocNode.Node['link']
  510. else
  511. ALink:='';
  512. If (ALink<>'') then
  513. LinkList.Add(TLinkData.Create(FPEl.PathName,ALink,AModule.name))
  514. else
  515. AddPage(FPEl, 0);
  516. end
  517. else
  518. begin
  519. DidAutolink := False;
  520. if Assigned(ClassEl.AncestorType) and
  521. (ClassEl.AncestorType.ClassType = TPasClassType) then
  522. begin
  523. for k := 0 to TPasClassType(ClassEl.AncestorType).Members.Count - 1 do
  524. begin
  525. AncestorMemberEl :=
  526. TPasElement(TPasClassType(ClassEl.AncestorType).Members[k]);
  527. if AncestorMemberEl.Name = FPEl.Name then
  528. begin
  529. DocNode := Engine.FindDocNode(AncestorMemberEl);
  530. if Assigned(DocNode) then
  531. begin
  532. DidAutolink := True;
  533. Engine.AddLink(FPEl.PathName,
  534. Engine.FindAbsoluteLink(AncestorMemberEl.PathName));
  535. break;
  536. end;
  537. end;
  538. end;
  539. end;
  540. if not DidAutolink then
  541. AddPage(FPEl, 0);
  542. end;
  543. end;
  544. end;
  545. end;
  546. AddPages(AModule, ProcsSubindex, InterfaceSection.Functions);
  547. AddPages(AModule, VarsSubindex, InterfaceSection.Variables);
  548. end;
  549. end;
  550. var
  551. i: Integer;
  552. L : TObjectList;
  553. begin
  554. inherited ;
  555. IndexColCount:=3;
  556. Charset:='iso-8859-1';
  557. CreateAllocator;
  558. FPackage := APackage;
  559. OutputNodeStack := TList.Create;
  560. PageInfos := TObjectList.Create;
  561. FImageFileList := TStringList.Create;
  562. // Allocate page for the package itself, if a name is given (i.e. <> '#')
  563. if Length(Package.Name) > 1 then
  564. begin
  565. AddPage(Package, 0);
  566. AddPage(Package,IndexSubIndex);
  567. AddTopicPages(Package);
  568. end;
  569. L:=TObjectList.Create;
  570. try
  571. for i := 0 to Package.Modules.Count - 1 do
  572. ScanModule(TPasModule(Package.Modules[i]),L);
  573. // Resolve links
  574. For I:=0 to L.Count-1 do
  575. With TLinkData(L[i]) do
  576. Engine.AddLink(FPathName,ResolveLinkIDInUnit(FLink,FModuleName));
  577. finally
  578. L.Free;
  579. end;
  580. end;
  581. destructor THTMLWriter.Destroy;
  582. begin
  583. PageInfos.Free;
  584. OutputNodeStack.Free;
  585. FAllocator.Free;
  586. FImageFileList.Free;
  587. inherited Destroy;
  588. end;
  589. function THTMLWriter.CreateHTMLPage(AElement: TPasElement;
  590. ASubpageIndex: Integer): TXMLDocument;
  591. var
  592. HTMLEl: THTMLHtmlElement;
  593. HeadEl: THTMLHeadElement;
  594. El: TDOMElement;
  595. begin
  596. Doc := THTMLDocument.Create;
  597. Result := Doc;
  598. Doc.AppendChild(Doc.Impl.CreateDocumentType(
  599. 'HTML', '-//W3C//DTD HTML 4.01 Transitional//EN',
  600. 'http://www.w3.org/TR/html4/loose.dtd'));
  601. HTMLEl := Doc.CreateHtmlElement;
  602. Doc.AppendChild(HTMLEl);
  603. HeadEl := Doc.CreateHeadElement;
  604. HTMLEl.AppendChild(HeadEl);
  605. El := Doc.CreateElement('meta');
  606. HeadEl.AppendChild(El);
  607. El['http-equiv'] := 'Content-Type';
  608. El['content'] := 'text/html; charset=utf-8';
  609. TitleElement := Doc.CreateElement('title');
  610. HeadEl.AppendChild(TitleElement);
  611. El := Doc.CreateElement('link');
  612. BodyElement := Doc.CreateElement('body');
  613. HTMLEl.AppendChild(BodyElement);
  614. CreatePageBody(AElement, ASubpageIndex);
  615. AppendFooter;
  616. HeadEl.AppendChild(El);
  617. El['rel'] := 'stylesheet';
  618. El['type'] := 'text/css';
  619. El['href'] := FixHtmlPath(Allocator.GetCSSFilename(AElement));
  620. end;
  621. function THTMLWriter.CreateXHTMLPage(AElement: TPasElement;
  622. ASubpageIndex: Integer): TXMLDocument;
  623. begin
  624. Result := nil;
  625. end;
  626. procedure CreatePath(const AFilename: String);
  627. var
  628. EndIndex: Integer;
  629. Path: String;
  630. begin
  631. EndIndex := Length(AFilename);
  632. if EndIndex = 0 then
  633. exit;
  634. while not (AFilename[EndIndex] in AllowDirectorySeparators) do
  635. begin
  636. Dec(EndIndex);
  637. if EndIndex = 0 then
  638. exit;
  639. end;
  640. Path := Copy(AFilename, 1, EndIndex - 1);
  641. if not DirectoryExists(Path) then
  642. begin
  643. CreatePath(Path);
  644. MkDir(Path);
  645. end;
  646. end;
  647. procedure THTMLWriter.WriteHTMLPages;
  648. var
  649. i: Integer;
  650. PageDoc: TXMLDocument;
  651. Filename: String;
  652. TempStream: TMemoryStream;
  653. begin
  654. if Engine.Output <> '' then
  655. Engine.Output := IncludeTrailingBackSlash(Engine.Output);
  656. for i := 0 to PageInfos.Count - 1 do
  657. with TPageInfo(PageInfos[i]) do
  658. begin
  659. PageDoc := CreateHTMLPage(Element, SubpageIndex);
  660. try
  661. Filename := Engine.Output + Allocator.GetFilename(Element, SubpageIndex);
  662. try
  663. CreatePath(Filename);
  664. WriteHTMLFile(PageDoc, Filename);
  665. except
  666. on E: Exception do
  667. DoLog(SErrCouldNotCreateFile, [FileName, e.Message]);
  668. end;
  669. finally
  670. PageDoc.Free;
  671. end;
  672. end;
  673. if FCSSFile <> '' then
  674. begin
  675. if not FileExists(FCSSFile) Then
  676. begin
  677. DoLog('Can''t find CSS file "%s"',[FCSSFILE]);
  678. halt(1);
  679. end;
  680. TempStream := TMemoryStream.Create;
  681. TempStream.LoadFromFile(FCSSFile);
  682. TempStream.Position := 0;
  683. TempStream.SaveToFile(Engine.output+ExtractFileName(FCSSFile));
  684. TempStream.Free;
  685. end;
  686. end;
  687. procedure THTMLWriter.WriteXHTMLPages;
  688. begin
  689. end;
  690. {procedure THTMLWriter.CreateDoc(const ATitle: DOMString;
  691. AElement: TPasElement; const AFilename: String);
  692. var
  693. El: TDOMElement;
  694. DocInfo: TDocInfo;
  695. CSSName: String;
  696. begin
  697. Doc := TXHTMLDocument.Create;
  698. with TXHTMLDocument(Doc) do
  699. begin
  700. Encoding := 'ISO8859-1';
  701. CSSName := 'fpdoc.css';
  702. if Assigned(Module) then
  703. CSSName := '../' + CSSName;
  704. $IFNDEF ver1_0
  705. StylesheetType := 'text/css';
  706. StylesheetHRef := CSSName;
  707. $ENDIF
  708. CreateRoot(xhtmlStrict);
  709. with RequestHeadElement do
  710. begin
  711. AppendText(RequestTitleElement, ATitle);
  712. El := CreateElement('link');
  713. AppendChild(El);
  714. El['rel'] := 'stylesheet';
  715. El['type'] := 'text/css';
  716. El['href'] := FixHtmlPath(CSSName);
  717. end;
  718. Self.BodyElement := RequestBodyElement('en');
  719. end;
  720. if Length(AFilename) > 0 then
  721. begin
  722. DocInfo := TDocInfo.Create;
  723. DocInfos.Add(DocInfo);
  724. DocInfo.Element := AElement;
  725. DocInfo.Filename := AFilename;
  726. end;
  727. end;
  728. }
  729. { Used for:
  730. - <link> elements in descriptions
  731. - "see also" entries
  732. - AppendHyperlink (for unresolved parse tree element links)
  733. }
  734. function THTMLWriter.ResolveLinkIDInUnit(const Name,AUnitName: String): DOMString;
  735. begin
  736. Result:=ResolveLinkID(Name);
  737. If (Result='') and (AUnitName<>'') then
  738. Result:=ResolveLinkID(AUnitName+'.'+Name);
  739. end;
  740. function THTMLWriter.ResolveLinkID(const Name: String): DOMString;
  741. var
  742. i: Integer;
  743. ThisPackage: TLinkNode;
  744. begin
  745. if Length(Name) = 0 then
  746. begin
  747. SetLength(Result, 0);
  748. exit;
  749. end;
  750. if Name[1] = '#' then
  751. Result := Engine.FindAbsoluteLink(Name)
  752. else
  753. begin
  754. SetLength(Result, 0);
  755. { Try all packages }
  756. ThisPackage := Engine.RootLinkNode.FirstChild;
  757. while Assigned(ThisPackage) do
  758. begin
  759. Result := Engine.FindAbsoluteLink(ThisPackage.Name + '.' + Name);
  760. if Length(Result) = 0 then
  761. begin
  762. if Assigned(Module) then
  763. begin
  764. Result := Engine.FindAbsoluteLink(Module.PathName + '.' + Name);
  765. // WriteLn('Searching for ', Module.PathName + '.' + Name, ' => ', Result);
  766. end;
  767. if Length(Result) = 0 then
  768. for i := Length(Name) downto 1 do
  769. if Name[i] = '.' then
  770. begin
  771. Result := ResolveLinkID(Copy(Name, 1, i - 1));
  772. exit;
  773. end;
  774. end;
  775. ThisPackage := ThisPackage.NextSibling;
  776. end;
  777. end;
  778. if Length(Result) > 0 then
  779. if Copy(Result, 1, Length(CurDirectory) + 1) = CurDirectory + '/' then
  780. Result := Copy(Result, Length(CurDirectory) + 2, Length(Result))
  781. else if not IsLinkAbsolute(Result) then
  782. Result := BaseDirectory + Result;
  783. end;
  784. function THTMLWriter.ResolveLinkWithinPackage(AElement: TPasElement;
  785. ASubpageIndex: Integer): String;
  786. var
  787. ParentEl: TPasElement;
  788. begin
  789. ParentEl := AElement;
  790. while Assigned(ParentEl) and not (ParentEl.ClassType = TPasPackage) do
  791. ParentEl := ParentEl.Parent;
  792. if Assigned(ParentEl) and (TPasPackage(ParentEl) = Engine.Package) then
  793. begin
  794. Result := Allocator.GetFilename(AElement, ASubpageIndex);
  795. if Copy(Result, 1, Length(CurDirectory) + 1) = CurDirectory + '/' then
  796. Result := Copy(Result, Length(CurDirectory) + 2, Length(Result))
  797. else
  798. Result := BaseDirectory + Result;
  799. end else
  800. SetLength(Result, 0);
  801. end;
  802. function THTMLWriter.CreateEl(Parent: TDOMNode;
  803. const AName: DOMString): THTMLElement;
  804. begin
  805. Result := Doc.CreateElement(AName);
  806. Parent.AppendChild(Result);
  807. end;
  808. function THTMLWriter.CreatePara(Parent: TDOMNode): THTMLElement;
  809. begin
  810. Result := CreateEl(Parent, 'p');
  811. end;
  812. function THTMLWriter.CreateH1(Parent: TDOMNode): THTMLElement;
  813. begin
  814. Result := CreateEl(Parent, 'h1');
  815. end;
  816. function THTMLWriter.CreateH2(Parent: TDOMNode): THTMLElement;
  817. begin
  818. Result := CreateEl(Parent, 'h2');
  819. end;
  820. function THTMLWriter.CreateH3(Parent: TDOMNode): THTMLElement;
  821. begin
  822. Result := CreateEl(Parent, 'h3');
  823. end;
  824. function THTMLWriter.CreateTable(Parent: TDOMNode; const AClass: DOMString = ''): THTMLElement;
  825. begin
  826. Result := CreateEl(Parent, 'table');
  827. Result['cellspacing'] := '0';
  828. Result['cellpadding'] := '0';
  829. if AClass <> '' then
  830. Result['class'] := AClass;
  831. end;
  832. function THTMLWriter.CreateContentTable(Parent: TDOMNode): THTMLElement;
  833. begin
  834. Result := CreateEl(Parent, 'table');
  835. end;
  836. function THTMLWriter.CreateTR(Parent: TDOMNode): THTMLElement;
  837. begin
  838. Result := CreateEl(Parent, 'tr');
  839. end;
  840. function THTMLWriter.CreateTD(Parent: TDOMNode): THTMLElement;
  841. begin
  842. Result := CreateEl(Parent, 'td');
  843. end;
  844. function THTMLWriter.CreateTD_vtop(Parent: TDOMNode): THTMLElement;
  845. begin
  846. Result := CreateEl(Parent, 'td');
  847. Result['valign'] := 'top';
  848. end;
  849. function THTMLWriter.CreateLink(Parent: TDOMNode;
  850. const AHRef: DOMString): THTMLElement;
  851. begin
  852. Result := CreateEl(Parent, 'a');
  853. Result['href'] := FixHtmlPath(AHRef);
  854. end;
  855. function THTMLWriter.CreateAnchor(Parent: TDOMNode;
  856. const AName: DOMString): THTMLElement;
  857. begin
  858. Result := CreateEl(Parent, 'a');
  859. Result['name'] := AName;
  860. end;
  861. function THTMLWriter.CreateCode(Parent: TDOMNode): THTMLElement;
  862. begin
  863. Result := CreateEl(CreateEl(Parent, 'tt'), 'span');
  864. Result['class'] := 'code';
  865. end;
  866. function THTMLWriter.CreateWarning(Parent: TDOMNode): THTMLElement;
  867. begin
  868. Result := CreateEl(Parent, 'span');
  869. Result['class'] := 'warning';
  870. end;
  871. procedure THTMLWriter.DescrEmitNotesHeader(AContext: TPasElement);
  872. begin
  873. AppendText(CreateH2(BodyElement), SDocNotes);
  874. PushOutputNode(BodyElement);
  875. end;
  876. procedure THTMLWriter.DescrEmitNotesFooter(AContext: TPasElement);
  877. begin
  878. PopOutPutNode;
  879. end;
  880. procedure THTMLWriter.PushOutputNode(ANode: TDOMNode);
  881. begin
  882. OutputNodeStack.Add(CurOutputNode);
  883. CurOutputNode := ANode;
  884. end;
  885. procedure THTMLWriter.PopOutputNode;
  886. begin
  887. CurOutputNode := TDOMNode(OutputNodeStack[OutputNodeStack.Count - 1]);
  888. OutputNodeStack.Delete(OutputNodeStack.Count - 1);
  889. end;
  890. procedure THTMLWriter.DescrWriteText(const AText: DOMString);
  891. begin
  892. AppendText(CurOutputNode, AText);
  893. end;
  894. procedure THTMLWriter.DescrBeginBold;
  895. begin
  896. PushOutputNode(CreateEl(CurOutputNode, 'b'));
  897. end;
  898. procedure THTMLWriter.DescrEndBold;
  899. begin
  900. PopOutputNode;
  901. end;
  902. procedure THTMLWriter.DescrBeginItalic;
  903. begin
  904. PushOutputNode(CreateEl(CurOutputNode, 'i'));
  905. end;
  906. procedure THTMLWriter.DescrEndItalic;
  907. begin
  908. PopOutputNode;
  909. end;
  910. procedure THTMLWriter.DescrBeginEmph;
  911. begin
  912. PushOutputNode(CreateEl(CurOutputNode, 'em'));
  913. end;
  914. procedure THTMLWriter.DescrEndEmph;
  915. begin
  916. PopOutputNode;
  917. end;
  918. procedure THTMLWriter.DescrWriteImageEl(const AFileName, ACaption, ALinkName : DOMString);
  919. Var
  920. Pel,Cel,Lel : TDOMNode;
  921. El :TDomElement;
  922. D : String;
  923. L : Integer;
  924. begin
  925. // Determine parent node.
  926. If (ACaption='') then
  927. Pel:=CurOutputNode
  928. else
  929. begin
  930. Cel:=CreateTable(CurOutputNode, 'imagetable');
  931. Pel:=CreateTD(CreateTR(Cel));
  932. Cel:=CreateTD(CreateTR(Cel));
  933. El := CreateEl(Cel, 'span');
  934. El['class'] := 'imagecaption';
  935. Cel := El;
  936. If (ALinkName<>'') then
  937. Cel:=CreateAnchor(Cel,ALinkName);
  938. AppendText(Cel,ACaption);
  939. end;
  940. // Determine URL for image.
  941. If (Module=Nil) then
  942. D:=Allocator.GetRelativePathToTop(Package)
  943. else
  944. D:=Allocator.GetRelativePathToTop(Module);
  945. L:=Length(D);
  946. If (L>0) and (D[L]<>'/') then
  947. D:=D+'/';
  948. // Create image node.
  949. El:=CreateEl(Pel,'img');
  950. EL['src']:=D + BaseImageURL + AFileName;
  951. El['alt']:=ACaption;
  952. //cache image filename, so it can be used later (CHM)
  953. FImageFileList.Add(BaseImageURL + AFileName);
  954. end;
  955. procedure THTMLWriter.DescrWriteFileEl(const AText: DOMString);
  956. var
  957. NewEl: TDOMElement;
  958. begin
  959. NewEl := CreateEl(CurOutputNode, 'span');
  960. NewEl['class'] := 'file';
  961. AppendText(NewEl, AText);
  962. end;
  963. procedure THTMLWriter.DescrWriteKeywordEl(const AText: DOMString);
  964. var
  965. NewEl: TDOMElement;
  966. begin
  967. NewEl := CreateEl(CurOutputNode, 'span');
  968. NewEl['class'] := 'kw';
  969. AppendText(NewEl, AText);
  970. end;
  971. procedure THTMLWriter.DescrWriteVarEl(const AText: DOMString);
  972. begin
  973. AppendText(CreateEl(CurOutputNode, 'var'), AText);
  974. end;
  975. procedure THTMLWriter.DescrBeginLink(const AId: DOMString);
  976. var
  977. a,s: String;
  978. begin
  979. a:=AId;
  980. s := ResolveLinkID(a);
  981. if Length(s) = 0 then
  982. begin
  983. if assigned(module) then
  984. s:=module.name
  985. else
  986. s:='?';
  987. if a='' then a:='<empty>';
  988. DoLog(SErrUnknownLinkID, [s,a]);
  989. PushOutputNode(CreateEl(CurOutputNode, 'b'));
  990. end else
  991. PushOutputNode(CreateLink(CurOutputNode, s));
  992. end;
  993. procedure THTMLWriter.DescrEndLink;
  994. begin
  995. PopOutputNode;
  996. end;
  997. procedure THTMLWriter.DescrBeginURL(const AURL: DOMString);
  998. begin
  999. PushOutputNode(CreateLink(CurOutputNode, AURL));
  1000. end;
  1001. procedure THTMLWriter.DescrEndURL;
  1002. begin
  1003. PopOutputNode;
  1004. end;
  1005. procedure THTMLWriter.DescrWriteLinebreak;
  1006. begin
  1007. CreateEl(CurOutputNode, 'br');
  1008. end;
  1009. procedure THTMLWriter.DescrBeginParagraph;
  1010. begin
  1011. PushOutputNode(CreatePara(CurOutputNode));
  1012. end;
  1013. procedure THTMLWriter.DescrEndParagraph;
  1014. begin
  1015. PopOutputNode;
  1016. end;
  1017. procedure THTMLWriter.DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String);
  1018. begin
  1019. DoPasHighlighting := (AHighlighterName = '') or (AHighlighterName = 'Pascal');
  1020. HighlighterFlags := 0;
  1021. PushOutputNode(CreateEl(CurOutputNode, 'pre'));
  1022. end;
  1023. procedure THTMLWriter.DescrWriteCodeLine(const ALine: String);
  1024. begin
  1025. if DoPasHighlighting then
  1026. begin
  1027. HighlighterFlags := AppendPasSHFragment(CurOutputNode, ALine,
  1028. HighlighterFlags);
  1029. AppendText(CurOutputNode, #10);
  1030. end else
  1031. AppendText(CurOutputNode, ALine + #10);
  1032. end;
  1033. procedure THTMLWriter.DescrEndCode;
  1034. begin
  1035. PopOutputNode;
  1036. end;
  1037. procedure THTMLWriter.DescrBeginOrderedList;
  1038. begin
  1039. PushOutputNode(CreateEl(CurOutputNode, 'ol'));
  1040. end;
  1041. procedure THTMLWriter.DescrEndOrderedList;
  1042. begin
  1043. PopOutputNode;
  1044. end;
  1045. procedure THTMLWriter.DescrBeginUnorderedList;
  1046. begin
  1047. PushOutputNode(CreateEl(CurOutputNode, 'ul'));
  1048. end;
  1049. procedure THTMLWriter.DescrEndUnorderedList;
  1050. begin
  1051. PopOutputNode;
  1052. end;
  1053. procedure THTMLWriter.DescrBeginDefinitionList;
  1054. begin
  1055. PushOutputNode(CreateEl(CurOutputNode, 'dl'));
  1056. end;
  1057. procedure THTMLWriter.DescrEndDefinitionList;
  1058. begin
  1059. PopOutputNode;
  1060. end;
  1061. procedure THTMLWriter.DescrBeginListItem;
  1062. begin
  1063. PushOutputNode(CreateEl(CurOutputNode, 'li'));
  1064. end;
  1065. procedure THTMLWriter.DescrEndListItem;
  1066. begin
  1067. PopOutputNode;
  1068. end;
  1069. procedure THTMLWriter.DescrBeginDefinitionTerm;
  1070. begin
  1071. PushOutputNode(CreateEl(CurOutputNode, 'dt'));
  1072. end;
  1073. procedure THTMLWriter.DescrEndDefinitionTerm;
  1074. begin
  1075. PopOutputNode;
  1076. end;
  1077. procedure THTMLWriter.DescrBeginDefinitionEntry;
  1078. begin
  1079. PushOutputNode(CreateEl(CurOutputNode, 'dd'));
  1080. end;
  1081. procedure THTMLWriter.DescrEndDefinitionEntry;
  1082. begin
  1083. PopOutputNode;
  1084. end;
  1085. procedure THTMLWriter.DescrBeginSectionTitle;
  1086. begin
  1087. PushOutputNode(CreateEl(CurOutputNode, 'h3'));
  1088. end;
  1089. procedure THTMLWriter.DescrBeginSectionBody;
  1090. begin
  1091. PopOutputNode;
  1092. end;
  1093. procedure THTMLWriter.DescrEndSection;
  1094. begin
  1095. end;
  1096. procedure THTMLWriter.DescrBeginRemark;
  1097. var
  1098. NewEl, TDEl: TDOMElement;
  1099. begin
  1100. NewEl := CreateEl(CurOutputNode, 'table');
  1101. NewEl['width'] := '100%';
  1102. NewEl['border'] := '0';
  1103. NewEl['CellSpacing'] := '0';
  1104. NewEl['class'] := 'remark';
  1105. NewEl := CreateTR(NewEl);
  1106. TDEl := CreateTD(NewEl);
  1107. TDEl['valign'] := 'top';
  1108. TDEl['class'] := 'pre';
  1109. AppendText(CreateEl(TDEl, 'b'), SDocRemark);
  1110. PushOutputNode(CreateTD(NewEl));
  1111. end;
  1112. procedure THTMLWriter.DescrEndRemark;
  1113. begin
  1114. PopOutputNode;
  1115. end;
  1116. procedure THTMLWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
  1117. var
  1118. Table: TDOMElement;
  1119. begin
  1120. Table := CreateEl(CurOutputNode, 'table');
  1121. Table['border'] := IntToStr(Ord(HasBorder));
  1122. PushOutputNode(Table);
  1123. end;
  1124. procedure THTMLWriter.DescrEndTable;
  1125. begin
  1126. PopOutputNode;
  1127. end;
  1128. procedure THTMLWriter.DescrBeginTableCaption;
  1129. begin
  1130. PushOutputNode(CreateEl(CurOutputNode, 'caption'));
  1131. end;
  1132. procedure THTMLWriter.DescrEndTableCaption;
  1133. begin
  1134. PopOutputNode;
  1135. end;
  1136. procedure THTMLWriter.DescrBeginTableHeadRow;
  1137. begin
  1138. PushOutputNode(CreateTr(CurOutputNode));
  1139. InsideHeadRow := True;
  1140. end;
  1141. procedure THTMLWriter.DescrEndTableHeadRow;
  1142. begin
  1143. InsideHeadRow := False;
  1144. PopOutputNode;
  1145. end;
  1146. procedure THTMLWriter.DescrBeginTableRow;
  1147. begin
  1148. PushOutputNode(CreateTR(CurOutputNode));
  1149. end;
  1150. procedure THTMLWriter.DescrEndTableRow;
  1151. begin
  1152. PopOutputNode;
  1153. end;
  1154. procedure THTMLWriter.DescrBeginTableCell;
  1155. begin
  1156. if InsideHeadRow then
  1157. PushOutputNode(CreateEl(CurOutputNode, 'th'))
  1158. else
  1159. PushOutputNode(CreateTD(CurOutputNode));
  1160. end;
  1161. procedure THTMLWriter.DescrEndTableCell;
  1162. begin
  1163. PopOutputNode;
  1164. end;
  1165. procedure THTMLWriter.AppendText(Parent: TDOMNode; const AText: DOMString);
  1166. begin
  1167. Parent.AppendChild(Doc.CreateTextNode(AText));
  1168. end;
  1169. procedure THTMLWriter.AppendNbSp(Parent: TDOMNode; ACount: Integer);
  1170. begin
  1171. while ACount > 0 do
  1172. begin
  1173. Parent.AppendChild(Doc.CreateEntityReference('nbsp'));
  1174. Dec(ACount);
  1175. end;
  1176. end;
  1177. procedure THTMLWriter.AppendSym(Parent: TDOMNode; const AText: DOMString);
  1178. var
  1179. El: TDOMElement;
  1180. begin
  1181. El := CreateEl(Parent, 'span');
  1182. El['class'] := 'sym';
  1183. AppendText(El, AText);
  1184. end;
  1185. procedure THTMLWriter.AppendKw(Parent: TDOMNode; const AText: DOMString);
  1186. var
  1187. El: TDOMElement;
  1188. begin
  1189. El := CreateEl(Parent, 'span');
  1190. El['class'] := 'kw';
  1191. AppendText(El, AText);
  1192. end;
  1193. function THTMLWriter.AppendPasSHFragment(Parent: TDOMNode;
  1194. const AText: String; AShFlags: Byte): Byte;
  1195. var
  1196. Line, Last, p: PChar;
  1197. IsInSpecial: Boolean;
  1198. lastwasasm : boolean;
  1199. El: TDOMElement;
  1200. Procedure MaybeOutput;
  1201. Var
  1202. CurParent: TDomNode;
  1203. begin
  1204. If (Last<>Nil) then
  1205. begin
  1206. If (el<>Nil) then
  1207. CurParent:=El
  1208. else
  1209. CurParent:=Parent;
  1210. AppendText(CurParent,Last);
  1211. El:=Nil;
  1212. Last:=Nil;
  1213. end;
  1214. end;
  1215. Function NewEl(Const ElType,Attr,AttrVal : String) : TDomElement;
  1216. begin
  1217. Result:=CreateEl(Parent,ElType);
  1218. Result[Attr]:=AttrVal;
  1219. end;
  1220. Function NewSpan(Const AttrVal : String) : TDomElement;
  1221. begin
  1222. Result:=CreateEl(Parent,'span');
  1223. Result['class']:=AttrVal;
  1224. end;
  1225. begin
  1226. GetMem(Line, Length(AText) * 3 + 4);
  1227. Try
  1228. DoPascalHighlighting(AShFlags, PChar(AText), Line);
  1229. Result := AShFlags;
  1230. IsInSpecial := False;
  1231. Last := Nil;
  1232. p := Line;
  1233. el:=nil;
  1234. while p[0] <> #0 do
  1235. begin
  1236. if p[0] = LF_ESCAPE then
  1237. begin
  1238. p[0] := #0;
  1239. MaybeOutput;
  1240. case Ord(p[1]) of
  1241. shDefault: El:=Nil;
  1242. shInvalid: El:=newel('font','color','red');
  1243. shSymbol : El:=newspan('sym');
  1244. shKeyword: El:=newspan('kw');
  1245. shComment: El:=newspan('cmt');
  1246. shDirective: El:=newspan('dir');
  1247. shNumbers: El:=newspan('num');
  1248. shCharacters: El:=newspan('chr');
  1249. shStrings: El:=newspan('str');
  1250. shAssembler: El:=newspan('asm');
  1251. end;
  1252. Inc(P);
  1253. end
  1254. else If (Last=Nil) then
  1255. Last:=P;
  1256. Inc(p);
  1257. end;
  1258. MaybeOutput;
  1259. Finally
  1260. FreeMem(Line);
  1261. end;
  1262. end;
  1263. Procedure THTMLWriter.AppendShortDescr(AContext: TPasElement; Parent: TDOMNode; DocNode : TDocNode);
  1264. Var
  1265. N : TDocNode;
  1266. begin
  1267. if Assigned(DocNode) then
  1268. begin
  1269. If (DocNode.Link<>'') then
  1270. begin
  1271. N:=Engine.FindLinkedNode(DocNode);
  1272. If (N<>Nil) then
  1273. DocNode:=N;
  1274. end;
  1275. If Assigned(DocNode.ShortDescr) then
  1276. begin
  1277. PushOutputNode(Parent);
  1278. try
  1279. if not ConvertShort(AContext,TDomElement(DocNode.ShortDescr)) then
  1280. Warning(AContext, SErrInvalidShortDescr)
  1281. finally
  1282. PopOutputNode;
  1283. end;
  1284. end;
  1285. end;
  1286. end;
  1287. procedure THTMLWriter.AppendShortDescr(Parent: TDOMNode; Element: TPasElement);
  1288. begin
  1289. AppendShortDescr(Element,Parent,Engine.FindDocNode(Element));
  1290. end;
  1291. procedure THTMLWriter.AppendShortDescrCell(Parent: TDOMNode;
  1292. Element: TPasElement);
  1293. var
  1294. ParaEl: TDOMElement;
  1295. begin
  1296. if Assigned(Engine.FindShortDescr(Element)) then
  1297. begin
  1298. AppendNbSp(CreatePara(CreateTD(Parent)), 2);
  1299. ParaEl := CreatePara(CreateTD(Parent));
  1300. ParaEl['class'] := 'cmt';
  1301. AppendShortDescr(ParaEl, Element);
  1302. end;
  1303. end;
  1304. procedure THTMLWriter.AppendDescr(AContext: TPasElement; Parent: TDOMNode;
  1305. DescrNode: TDOMElement; AutoInsertBlock: Boolean);
  1306. begin
  1307. if Assigned(DescrNode) then
  1308. begin
  1309. PushOutputNode(Parent);
  1310. try
  1311. ConvertDescr(AContext, DescrNode, AutoInsertBlock);
  1312. finally
  1313. PopOutputNode;
  1314. end;
  1315. end;
  1316. end;
  1317. procedure THTMLWriter.AppendDescrSection(AContext: TPasElement;
  1318. Parent: TDOMNode; DescrNode: TDOMElement; const ATitle: DOMString);
  1319. begin
  1320. if not IsDescrNodeEmpty(DescrNode) then
  1321. begin
  1322. If (ATitle<>'') then // Can be empty for topic.
  1323. AppendText(CreateH2(Parent), ATitle);
  1324. AppendDescr(AContext, Parent, DescrNode, True);
  1325. end;
  1326. end;
  1327. function THTMLWriter.AppendHyperlink(Parent: TDOMNode;
  1328. Element: TPasElement): TDOMElement;
  1329. var
  1330. s: String;
  1331. UnitList: TFPList;
  1332. i: Integer;
  1333. ThisPackage: TLinkNode;
  1334. begin
  1335. if Assigned(Element) then
  1336. begin
  1337. if Element.InheritsFrom(TPasUnresolvedTypeRef) then
  1338. begin
  1339. s := ResolveLinkID(Element.Name);
  1340. if Length(s) = 0 then
  1341. begin
  1342. { Try all packages }
  1343. ThisPackage := Engine.RootLinkNode.FirstChild;
  1344. while Assigned(ThisPackage) do
  1345. begin
  1346. s := ResolveLinkID(ThisPackage.Name + '.' + Element.Name);
  1347. if Length(s) > 0 then
  1348. break;
  1349. ThisPackage := ThisPackage.NextSibling;
  1350. end;
  1351. if Length(s) = 0 then
  1352. begin
  1353. { Okay, then we have to try all imported units of the current module }
  1354. UnitList := Module.InterfaceSection.UsesList;
  1355. for i := UnitList.Count - 1 downto 0 do
  1356. begin
  1357. { Try all packages }
  1358. ThisPackage := Engine.RootLinkNode.FirstChild;
  1359. while Assigned(ThisPackage) do
  1360. begin
  1361. s := ResolveLinkID(ThisPackage.Name + '.' +
  1362. TPasType(UnitList[i]).Name + '.' + Element.Name);
  1363. if Length(s) > 0 then
  1364. break;
  1365. ThisPackage := ThisPackage.NextSibling;
  1366. end;
  1367. if length(s)=0 then
  1368. s := ResolveLinkID('#rtl.System.' + Element.Name);
  1369. if Length(s) > 0 then
  1370. break;
  1371. end;
  1372. end;
  1373. end;
  1374. end else if Element is TPasEnumValue then
  1375. s := ResolveLinkID(Element.Parent.PathName)
  1376. else
  1377. s := ResolveLinkID(Element.PathName);
  1378. if Length(s) > 0 then
  1379. begin
  1380. Result := CreateLink(Parent, s);
  1381. AppendText(Result, Element.Name);
  1382. end else
  1383. begin
  1384. Result := nil;
  1385. AppendText(Parent, Element.Name);
  1386. end;
  1387. end else
  1388. begin
  1389. Result := nil;
  1390. AppendText(CreateWarning(Parent), '<NIL>');
  1391. end;
  1392. end;
  1393. { Returns the new CodeEl, which will be the old CodeEl in most cases }
  1394. function THTMLWriter.AppendType(CodeEl, TableEl: TDOMElement;
  1395. Element: TPasType; Expanded: Boolean; NestingLevel: Integer): TDOMElement;
  1396. Var
  1397. S : String;
  1398. begin
  1399. Result := CodeEl;
  1400. if not Assigned(Element) then
  1401. AppendText(CreateWarning(CodeEl), '<NIL>')
  1402. else if (not Expanded) and (Length(Element.Name) > 0) then
  1403. AppendHyperlink(CodeEl, Element)
  1404. else
  1405. // Array
  1406. if Element.ClassType = TPasArrayType then
  1407. begin
  1408. S:='array ';
  1409. If (TPasArrayType(Element).IndexRange<>'') then
  1410. S:=S+'[' + TPasArrayType(Element).IndexRange + '] ';
  1411. S:=S+'of ';
  1412. If (TPasArrayType(Element).ElType=Nil) then
  1413. S:=S+'Const';
  1414. AppendPasSHFragment(CodeEl,S,0);
  1415. If (TPasArrayType(Element).ElType<>Nil) then
  1416. Result := AppendType(CodeEl, TableEl, TPasArrayType(Element).ElType, False);
  1417. end else
  1418. // Procedure or funtion type
  1419. if Element.InheritsFrom(TPasProcedureType) then
  1420. begin
  1421. AppendKw(CodeEl, TPasProcedureType(Element).TypeName);
  1422. Result := AppendProcType(CodeEl, TableEl, TPasProcedureType(Element), 0)
  1423. end else
  1424. // Range type
  1425. if Element.InheritsFrom(TPasRangeType) then
  1426. AppendPasSHFragment(CodeEl, TPasRangeType(Element).RangeStart + '..' +
  1427. TPasRangeType(Element).RangeEnd, 0)
  1428. // Record type
  1429. else if Element.ClassType = TPasRecordType then
  1430. Result := AppendRecordType(CodeEl, TableEl, TPasRecordType(Element), NestingLevel)
  1431. else if (Element.ClassType = TPasFileType) and (TPasFileType(Element).elType=Nil) then
  1432. AppendPasSHFragment(CodeEl,'file',0)
  1433. else
  1434. // Other types
  1435. AppendHyperlink(CodeEl, Element);
  1436. end;
  1437. function THTMLWriter.AppendProcType(CodeEl, TableEl: TDOMElement;
  1438. Element: TPasProcedureType; Indent: Integer): TDOMElement;
  1439. function CreateIndentedCodeEl(Indent: Integer): TDOMElement;
  1440. begin
  1441. Result := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  1442. AppendNbSp(Result, Indent);
  1443. end;
  1444. var
  1445. i: Integer;
  1446. Arg: TPasArgument;
  1447. begin
  1448. if Element.Args.Count > 0 then
  1449. begin
  1450. AppendSym(CodeEl, '(');
  1451. for i := 0 to Element.Args.Count - 1 do
  1452. begin
  1453. Arg := TPasArgument(Element.Args[i]);
  1454. CodeEl := CreateIndentedCodeEl(Indent + 2);
  1455. case Arg.Access of
  1456. argConst: AppendKw(CodeEl, 'const ');
  1457. argVar: AppendKw(CodeEl, 'var ');
  1458. argOut: AppendKw(CodeEl, 'out ');
  1459. end;
  1460. AppendText(CodeEl, Arg.Name);
  1461. if Assigned(Arg.ArgType) then
  1462. begin
  1463. AppendSym(CodeEl, ': ');
  1464. CodeEl := AppendType(CodeEl, TableEl, Arg.ArgType, False);
  1465. end;
  1466. if Length(Arg.Value) > 0 then
  1467. AppendPasSHFragment(CodeEl, ' = ' + Arg.Value, 0);
  1468. if i < Element.Args.Count - 1 then
  1469. AppendSym(CodeEl, ';');
  1470. end;
  1471. if Element.InheritsFrom(TPasFunctionType) or Element.IsOfObject then
  1472. begin
  1473. CodeEl := CreateIndentedCodeEl(Indent);
  1474. if Element.InheritsFrom(TPasFunctionType) then
  1475. begin
  1476. AppendSym(CodeEl, '):');
  1477. AppendHyperlink(CodeEl, TPasFunctionType(Element).ResultEl.ResultType);
  1478. end else
  1479. AppendSym(CodeEl, ')');
  1480. if Element.IsOfObject then
  1481. begin
  1482. AppendText(CodeEl, ' '); // Don't remove
  1483. AppendKw(CodeEl, 'of object');
  1484. end;
  1485. end else
  1486. if Indent > 0 then
  1487. AppendSym(CodeEl, ')')
  1488. else
  1489. begin
  1490. CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  1491. AppendSym(CodeEl, ')');
  1492. end;
  1493. end else
  1494. begin
  1495. { Procedure or function without arguments }
  1496. if Element.InheritsFrom(TPasFunctionType) then
  1497. begin
  1498. AppendSym(CodeEl, ': ');
  1499. AppendHyperlink(CodeEl, TPasFunctionType(Element).ResultEl.ResultType);
  1500. end;
  1501. if Element.IsOfObject then
  1502. AppendKw(CodeEl, ' of object');
  1503. end;
  1504. Result := CodeEl;
  1505. end;
  1506. procedure THTMLWriter.AppendProcExt(CodeEl: TDOMElement;
  1507. Element: TPasProcedure);
  1508. procedure AppendExt(const Ext: String);
  1509. begin
  1510. AppendKw(CodeEl, ' ' + Ext);
  1511. AppendSym(CodeEl, ';');
  1512. end;
  1513. begin
  1514. if Element.IsVirtual then
  1515. AppendExt('virtual');
  1516. if Element.IsDynamic then
  1517. AppendExt('dynamic');
  1518. if Element.IsAbstract then
  1519. AppendExt('abstract');
  1520. if Element.IsOverride then
  1521. AppendExt('override');
  1522. if Element.IsOverload then
  1523. AppendExt('overload');
  1524. if Element.IsMessage then
  1525. AppendExt('message');
  1526. end;
  1527. { Used in two places:
  1528. - Page for the method of a class
  1529. - Page for a tandalone procedure or function. }
  1530. procedure THTMLWriter.AppendProcDecl(CodeEl, TableEl: TDOMElement;
  1531. Element: TPasProcedureBase);
  1532. procedure WriteVariant(AProc: TPasProcedure);
  1533. begin
  1534. AppendProcArgsSection(TableEl.ParentNode, AProc.ProcType);
  1535. AppendKw(CodeEl, AProc.TypeName);
  1536. if Element.Parent.ClassType = TPasClassType then
  1537. begin
  1538. AppendText(CodeEl, ' ');
  1539. AppendHyperlink(CodeEl, Element.Parent);
  1540. AppendSym(CodeEl, '.');
  1541. AppendText(CodeEl, AProc.Name);
  1542. end else
  1543. AppendText(CodeEl, ' ' + AProc.FullName);
  1544. CodeEl := AppendProcType(CodeEl, TableEl, AProc.ProcType, 0);
  1545. AppendSym(CodeEl, ';');
  1546. AppendProcExt(CodeEl, AProc);
  1547. end;
  1548. var
  1549. i: Integer;
  1550. begin
  1551. if Element.ClassType = TPasOverloadedProc then
  1552. for i := 0 to TPasOverloadedProc(Element).Overloads.Count - 1 do
  1553. begin
  1554. if i > 0 then
  1555. begin
  1556. CreateEl(CodeEl, 'br');
  1557. CreateEl(CodeEl, 'br');
  1558. end;
  1559. WriteVariant(TPasProcedure(TPasOverloadedProc(Element).Overloads[i]));
  1560. end
  1561. else
  1562. WriteVariant(TPasProcedure(Element));
  1563. end;
  1564. procedure THTMLWriter.AppendProcArgsSection(Parent: TDOMNode;
  1565. Element: TPasProcedureType);
  1566. var
  1567. HasFullDescr, IsFirst: Boolean;
  1568. ResultEl: TPasResultElement;
  1569. ArgTableEl, TREl: TDOMElement;
  1570. DocNode: TDocNode;
  1571. i: Integer;
  1572. Arg: TPasArgument;
  1573. begin
  1574. IsFirst := True;
  1575. for i := 0 to Element.Args.Count - 1 do
  1576. begin
  1577. Arg := TPasArgument(Element.Args[i]);
  1578. if IsDescrNodeEmpty(Engine.FindShortDescr(Arg)) then
  1579. continue;
  1580. if IsFirst then
  1581. begin
  1582. IsFirst := False;
  1583. AppendText(CreateH2(Parent), SDocArguments);
  1584. ArgTableEl := CreateTable(Parent);
  1585. end;
  1586. TREl := CreateTR(ArgTableEl);
  1587. AppendText(CreateCode(CreatePara(CreateTD_vtop(TREl))), Arg.Name);
  1588. AppendShortDescrCell(TREl, Arg);
  1589. end;
  1590. if Element.ClassType = TPasFunctionType then
  1591. begin
  1592. ResultEl := TPasFunctionType(Element).ResultEl;
  1593. DocNode := Engine.FindDocNode(ResultEl);
  1594. HasFullDescr := Assigned(DocNode) and not IsDescrNodeEmpty(DocNode.Descr);
  1595. if HasFullDescr or
  1596. (Assigned(DocNode) and not IsDescrNodeEmpty(DocNode.ShortDescr)) then
  1597. begin
  1598. AppendText(CreateH2(Parent), SDocFunctionResult);
  1599. if HasFullDescr then
  1600. AppendDescr(ResultEl, Parent, DocNode.Descr, True)
  1601. else
  1602. AppendDescr(ResultEl, CreatePara(Parent), DocNode.ShortDescr, False);
  1603. end;
  1604. end;
  1605. end;
  1606. function THTMLWriter.AppendRecordType(CodeEl, TableEl: TDOMElement;
  1607. Element: TPasRecordType; NestingLevel: Integer): TDOMElement;
  1608. var
  1609. i, j: Integer;
  1610. Variable: TPasVariable;
  1611. TREl, TDEl: TDOMElement;
  1612. CurVariant: TPasVariant;
  1613. begin
  1614. if not (Element.Parent is TPasVariant) then
  1615. if Element.IsPacked then
  1616. If Element.IsBitPacked then
  1617. AppendKw(CodeEl, 'bitpacked record')
  1618. else
  1619. AppendKW(CodeEl, 'packed record')
  1620. else
  1621. AppendKw(CodeEl, 'record');
  1622. for i := 0 to Element.Members.Count - 1 do
  1623. begin
  1624. Variable := TPasVariable(Element.Members[i]);
  1625. TREl := CreateTR(TableEl);
  1626. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  1627. AppendShortDescrCell(TREl, Variable);
  1628. AppendNbSp(CodeEl, NestingLevel * 2 + 2);
  1629. AppendText(CodeEl, Variable.Name);
  1630. AppendSym(CodeEl, ': ');
  1631. CodeEl := AppendType(CodeEl, TableEl, Variable.VarType, False, NestingLevel + 1);
  1632. AppendSym(CodeEl, ';');
  1633. end;
  1634. if Assigned(Element.VariantType) then
  1635. begin
  1636. TREl := CreateTR(TableEl);
  1637. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  1638. AppendNbSp(CodeEl, NestingLevel * 2 + 2);
  1639. AppendKw(CodeEl, 'case ');
  1640. if TPasRecordType(Element).VariantName <> '' then
  1641. begin
  1642. AppendText(CodeEl, TPasRecordType(Element).VariantName);
  1643. AppendSym(CodeEl, ': ');
  1644. end;
  1645. CodeEl := AppendType(CodeEl, TableEl, TPasRecordType(Element).VariantType, True);
  1646. AppendKw(CodeEl, ' of');
  1647. for i := 0 to TPasRecordType(Element).Variants.Count - 1 do
  1648. begin
  1649. CurVariant := TPasVariant(Element.Variants[i]);
  1650. TREl := CreateTR(TableEl);
  1651. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  1652. AppendNbSp(CodeEl, NestingLevel * 2 + 4);
  1653. for j := 0 to CurVariant.Values.Count - 1 do
  1654. begin
  1655. if j > 0 then
  1656. AppendSym(CodeEl, ', ');
  1657. AppendPasSHFragment(CodeEl, CurVariant.Values[j], 0);
  1658. end;
  1659. AppendSym(CodeEl, ': (');
  1660. AppendType(CodeEl, TableEl, CurVariant.Members, True, NestingLevel + 3);
  1661. CodeEl := CreateCode(CreatePara(CreateTD_vtop(CreateTR(TableEl))));
  1662. AppendNbSp(CodeEl, NestingLevel * 2 + 6);
  1663. AppendSym(CodeEl, ');');
  1664. end;
  1665. end;
  1666. if not (Element.Parent is TPasVariant) then
  1667. begin
  1668. CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  1669. AppendText(CodeEl, ' '); // !!!: Dirty trick, necessary for current XML writer
  1670. AppendNbSp(CodeEl, NestingLevel * 2);
  1671. AppendKw(CodeEl, 'end');
  1672. end;
  1673. Result := CodeEl;
  1674. end;
  1675. procedure THTMLWriter.AppendTitle(const AText: DOMString);
  1676. begin
  1677. AppendText(TitleElement, AText);
  1678. AppendText(CreateH1(BodyElement), AText);
  1679. end;
  1680. procedure THTMLWriter.AppendTopicMenuBar(Topic : TTopicElement);
  1681. var
  1682. TableEl, TREl, ParaEl, TitleEl: TDOMElement;
  1683. procedure AddLink(El : TPasElement; const AName: String);
  1684. begin
  1685. AppendText(ParaEl, '[');
  1686. AppendText(CreateLink(ParaEl, ResolveLinkWithinPackage(El,0)),AName);
  1687. AppendText(ParaEl, ']');
  1688. end;
  1689. begin
  1690. TableEl := CreateEl(BodyElement, 'table');
  1691. TableEl['cellpadding'] := '4';
  1692. TableEl['cellspacing'] := '0';
  1693. TableEl['border'] := '0';
  1694. TableEl['width'] := '100%';
  1695. TableEl['class'] := 'bar';
  1696. TREl := CreateTR(TableEl);
  1697. ParaEl := CreateEl(CreateTD(TREl), 'b');
  1698. If Assigned(Topic.Previous) then
  1699. AddLink(Topic.Previous,SDocPrevious);
  1700. If Assigned(Topic.Parent) then
  1701. AddLink(Topic.Parent,SDocUp);
  1702. if Assigned(Topic.Next) then
  1703. AddLink(Topic.Next,SDocNext);
  1704. if Length(SearchPage) > 0 then
  1705. begin
  1706. AppendText(ParaEl, '[');
  1707. AppendText(CreateLink(ParaEl, SearchPage), SDocSearch);
  1708. AppendText(ParaEl, ']');
  1709. end;
  1710. ParaEl := CreateTD(TREl);
  1711. ParaEl['align'] := 'right';
  1712. TitleEl := CreateEl(ParaEl, 'span');
  1713. TitleEl['class'] := 'bartitle';
  1714. if Assigned(Module) then
  1715. AppendText(TitleEl, Format(SDocUnitTitle, [Module.Name]));
  1716. if Assigned(Package) then
  1717. begin
  1718. AppendText(TitleEl, ' (');
  1719. AppendHyperlink(TitleEl, Package);
  1720. AppendText(TitleEl, ')');
  1721. end;
  1722. end;
  1723. procedure THTMLWriter.AppendMenuBar(ASubpageIndex: Integer);
  1724. var
  1725. TableEl, TREl, ParaEl, TitleEl: TDOMElement;
  1726. procedure AddLink(ALinkSubpageIndex: Integer; const AName: String);
  1727. begin
  1728. AppendText(ParaEl, '[');
  1729. if ALinkSubpageIndex = ASubpageIndex then
  1730. AppendText(ParaEl, AName)
  1731. else
  1732. AppendText(
  1733. CreateLink(ParaEl, ResolveLinkWithinPackage(Module, ALinkSubpageIndex)),
  1734. AName);
  1735. AppendText(ParaEl, ']');
  1736. end;
  1737. begin
  1738. TableEl := CreateEl(BodyElement, 'table');
  1739. TableEl['cellpadding'] := '4';
  1740. TableEl['cellspacing'] := '0';
  1741. TableEl['border'] := '0';
  1742. TableEl['width'] := '100%';
  1743. TableEl['class'] := 'bar';
  1744. TREl := CreateTR(TableEl);
  1745. ParaEl := CreateEl(CreateTD(TREl), 'b');
  1746. if Assigned(Module) then
  1747. begin
  1748. AddLink(0, SDocOverview);
  1749. if Module.InterfaceSection.ResStrings.Count > 0 then
  1750. AddLink(ResstrSubindex, SDocResStrings);
  1751. if Module.InterfaceSection.Consts.Count > 0 then
  1752. AddLink(ConstsSubindex, SDocConstants);
  1753. if Module.InterfaceSection.Types.Count > 0 then
  1754. AddLink(TypesSubindex, SDocTypes);
  1755. if Module.InterfaceSection.Classes.Count > 0 then
  1756. AddLink(ClassesSubindex, SDocClasses);
  1757. if Module.InterfaceSection.Functions.Count > 0 then
  1758. AddLink(ProcsSubindex, SDocProceduresAndFunctions);
  1759. if Module.InterfaceSection.Variables.Count > 0 then
  1760. AddLink(VarsSubindex, SDocVariables);
  1761. AddLink(IndexSubIndex,SDocIdentifierIndex);
  1762. end
  1763. else
  1764. begin
  1765. // Manually add link for package page
  1766. AppendText(ParaEl, '[');
  1767. if (IndexSubIndex = ASubpageIndex) then
  1768. AppendText(ParaEl, SDocIdentifierIndex)
  1769. else
  1770. AppendText(
  1771. CreateLink(ParaEl, ResolveLinkWithinPackage(Package, IndexSubIndex)),
  1772. SDocIdentifierIndex);
  1773. AppendText(ParaEl, ']');
  1774. end;
  1775. if Length(SearchPage) > 0 then
  1776. begin
  1777. AppendText(ParaEl, '[');
  1778. AppendText(CreateLink(ParaEl, SearchPage), SDocSearch);
  1779. AppendText(ParaEl, ']');
  1780. end;
  1781. ParaEl := CreateTD(TREl);
  1782. ParaEl['align'] := 'right';
  1783. TitleEl := CreateEl(ParaEl, 'span');
  1784. TitleEl['class'] := 'bartitle';
  1785. if Assigned(Module) then
  1786. AppendText(TitleEl, Format(SDocUnitTitle, [Module.Name]));
  1787. if Assigned(Package) then
  1788. begin
  1789. AppendText(TitleEl, ' (');
  1790. AppendHyperlink(TitleEl, Package);
  1791. AppendText(TitleEl, ')');
  1792. end;
  1793. end;
  1794. procedure THTMLWriter.AppendSourceRef(AElement: TPasElement);
  1795. begin
  1796. AppendText(CreatePara(BodyElement), Format(SDocSourcePosition,
  1797. [ExtractFileName(AElement.SourceFilename), AElement.SourceLinenumber]));
  1798. end;
  1799. Procedure THTMLWriter.AppendSeeAlsoSection(AElement : TPasElement;DocNode : TDocNode);
  1800. var
  1801. Node: TDOMNode;
  1802. TableEl, El, TREl, TDEl, ParaEl, NewEl, DescrEl: TDOMElement;
  1803. l,s: String;
  1804. f: Text;
  1805. IsFirstSeeAlso : Boolean;
  1806. begin
  1807. if Not (Assigned(DocNode) and Assigned(DocNode.SeeAlso)) then
  1808. Exit;
  1809. IsFirstSeeAlso := True;
  1810. Node:=DocNode.SeeAlso.FirstChild;
  1811. While Assigned(Node) do
  1812. begin
  1813. if (Node.NodeType=ELEMENT_NODE) and (Node.NodeName='link') then
  1814. begin
  1815. if IsFirstSeeAlso then
  1816. begin
  1817. IsFirstSeeAlso := False;
  1818. AppendText(CreateH2(BodyElement), SDocSeeAlso);
  1819. TableEl := CreateTable(BodyElement);
  1820. end;
  1821. El:=TDOMElement(Node);
  1822. TREl:=CreateTR(TableEl);
  1823. ParaEl:=CreatePara(CreateTD_vtop(TREl));
  1824. l:=El['id'];
  1825. s:= ResolveLinkID(l);
  1826. if Length(s)=0 then
  1827. begin
  1828. if assigned(module) then
  1829. s:=module.name
  1830. else
  1831. s:='?';
  1832. if l='' then l:='<empty>';
  1833. DoLog(SErrUnknownLinkID, [s,l]);
  1834. NewEl := CreateEl(ParaEl,'b')
  1835. end
  1836. else
  1837. NewEl := CreateLink(ParaEl,s);
  1838. if Not IsDescrNodeEmpty(El) then
  1839. begin
  1840. PushOutputNode(NewEl);
  1841. Try
  1842. ConvertBaseShortList(AElement, El, True)
  1843. Finally
  1844. PopOutputNode;
  1845. end;
  1846. end
  1847. else
  1848. AppendText(NewEl,El['id']);
  1849. l:=El['id'];
  1850. DescrEl := Engine.FindShortDescr(AElement.GetModule,L);
  1851. if Assigned(DescrEl) then
  1852. begin
  1853. AppendNbSp(CreatePara(CreateTD(TREl)), 2);
  1854. ParaEl := CreatePara(CreateTD(TREl));
  1855. ParaEl['class'] := 'cmt';
  1856. PushOutputNode(ParaEl);
  1857. try
  1858. ConvertShort(AElement, DescrEl);
  1859. finally
  1860. PopOutputNode;
  1861. end;
  1862. end;
  1863. end; // Link node
  1864. Node := Node.NextSibling;
  1865. end; // While
  1866. end;
  1867. Procedure THTMLWriter.AppendExampleSection(AElement : TPasElement;DocNode : TDocNode);
  1868. var
  1869. Node: TDOMNode;
  1870. // TableEl, El, TREl, TDEl, ParaEl, NewEl, DescrEl: TDOMElement;
  1871. fn,s: String;
  1872. f: Text;
  1873. begin
  1874. if not (Assigned(DocNode) and Assigned(DocNode.FirstExample)) then
  1875. Exit;
  1876. Node := DocNode.FirstExample;
  1877. while Assigned(Node) do
  1878. begin
  1879. if (Node.NodeType = ELEMENT_NODE) and (Node.NodeName = 'example') then
  1880. begin
  1881. fn:=Engine.GetExampleFilename(TDOMElement(Node));
  1882. If (fn<>'') then
  1883. begin
  1884. AppendText(CreateH2(BodyElement), SDocExample);
  1885. try
  1886. Assign(f, FN);
  1887. Reset(f);
  1888. try
  1889. PushOutputNode(BodyElement);
  1890. DescrBeginCode(False, TDOMElement(Node)['highlighter']);
  1891. while not EOF(f) do
  1892. begin
  1893. ReadLn(f, s);
  1894. DescrWriteCodeLine(s);
  1895. end;
  1896. DescrEndCode;
  1897. PopOutputNode;
  1898. finally
  1899. Close(f);
  1900. end;
  1901. except
  1902. on e: Exception do
  1903. begin
  1904. e.Message := '[example] ' + e.Message;
  1905. raise;
  1906. end;
  1907. end;
  1908. end;
  1909. end;
  1910. Node := Node.NextSibling;
  1911. end;
  1912. end;
  1913. procedure THTMLWriter.AppendFooter;
  1914. Var
  1915. S : String;
  1916. F : TDomElement;
  1917. begin
  1918. if FooterFile<>'' then
  1919. ReadXMLFragment(BodyElement, FooterFile)
  1920. else if IncludeDateInFooter then
  1921. begin
  1922. CreateEl(BodyElement, 'hr');
  1923. F:=CreateEl(BodyElement,'span');
  1924. F['class']:='footer';
  1925. If (FDateFormat='') then
  1926. S:=DateToStr(Date)
  1927. else
  1928. S:=FormatDateTime(FDateFormat,Date);
  1929. AppendText(F,Format(SDocDateGenerated,[S]));
  1930. end;
  1931. end;
  1932. procedure THTMLWriter.FinishElementPage(AElement: TPasElement);
  1933. var
  1934. DocNode: TDocNode;
  1935. begin
  1936. DocNode := Engine.FindDocNode(AElement);
  1937. If Assigned(DocNode) then
  1938. begin
  1939. // Description
  1940. if Assigned(DocNode.Descr) then
  1941. AppendDescrSection(AElement, BodyElement, DocNode.Descr, SDocDescription);
  1942. // Append "Errors" section
  1943. if Assigned(DocNode.ErrorsDoc) then
  1944. AppendDescrSection(AElement, BodyElement, DocNode.ErrorsDoc, SDocErrors);
  1945. // Append Version info
  1946. if Assigned(DocNode.Version) then
  1947. AppendDescrSection(AElement, BodyElement, DocNode.Version, SDocVersion);
  1948. // Append "See also" section
  1949. AppendSeeAlsoSection(AElement,DocNode);
  1950. // Append examples, if present
  1951. AppendExampleSection(AElement,DocNode);
  1952. // Append notes, if present
  1953. ConvertNotes(AElement,DocNode.Notes);
  1954. end;
  1955. end;
  1956. Procedure THTMLWriter.CreateTopicPageBody(AElement : TTopicElement);
  1957. var
  1958. DocNode: TDocNode;
  1959. TableEl, TREl: TDOMElement;
  1960. I : Integer;
  1961. S : String;
  1962. begin
  1963. AppendTopicMenuBar(AElement);
  1964. DocNode:=AElement.TopicNode;
  1965. if Assigned(DocNode) then // should always be true, but we're being careful.
  1966. begin
  1967. AppendShortDescr(AElement,TitleElement, DocNode);
  1968. AppendShortDescr(AElement,CreateH2(BodyElement), DocNode);
  1969. if Assigned(DocNode.Descr) then
  1970. AppendDescrSection(AElement, BodyElement, DocNode.Descr, '');
  1971. AppendSeeAlsoSection(AElement,DocNode);
  1972. CreateTopicLinks(DocNode,AElement);
  1973. AppendExampleSection(AElement,DocNode);
  1974. ConvertNotes(AElement,DocNode.Notes);
  1975. end;
  1976. end;
  1977. procedure THTMLWriter.CreatePageBody(AElement: TPasElement;
  1978. ASubpageIndex: Integer);
  1979. var
  1980. i: Integer;
  1981. Element: TPasElement;
  1982. begin
  1983. CurDirectory := Allocator.GetFilename(AElement, ASubpageIndex);
  1984. i := Length(CurDirectory);
  1985. while (i > 0) and not (CurDirectory[i] in AllowDirectorySeparators) do
  1986. Dec(i);
  1987. CurDirectory := Copy(CurDirectory, 1, i);
  1988. BaseDirectory := Allocator.GetRelativePathToTop(AElement);
  1989. if AElement.ClassType = TPasPackage then
  1990. begin
  1991. Module:=Nil;
  1992. If (ASubPageIndex=0) then
  1993. CreatePackagePageBody
  1994. else if ASubPageIndex=IndexSubIndex then
  1995. CreatePackageIndex
  1996. end
  1997. else
  1998. begin
  1999. Element := AElement;
  2000. while (Element<>Nil) and (Element.ClassType<>TPasModule) do
  2001. Element := Element.Parent;
  2002. Module := TPasModule(Element);
  2003. if AElement.ClassType = TPasModule then
  2004. CreateModulePageBody(TPasModule(AElement), ASubpageIndex)
  2005. else if AElement.Parent.InheritsFrom(TPasClassType) then
  2006. CreateClassMemberPageBody(AElement)
  2007. else if AElement.ClassType = TPasConst then
  2008. CreateConstPageBody(TPasConst(AElement))
  2009. else if AElement.InheritsFrom(TPasClassType) then
  2010. CreateClassPageBody(TPasClassType(AElement), ASubpageIndex)
  2011. else if AElement.InheritsFrom(TPasType) then
  2012. CreateTypePageBody(TPasType(AElement))
  2013. else if AElement.ClassType = TPasVariable then
  2014. CreateVarPageBody(TPasVariable(AElement))
  2015. else if AElement.InheritsFrom(TPasProcedureBase) then
  2016. CreateProcPageBody(TPasProcedure(AElement))
  2017. else if AElement.ClassType = TTopicELement then
  2018. CreateTopicPageBody(TTopicElement(AElement))
  2019. end;
  2020. end;
  2021. procedure THTMLWriter.CreateIndexPage(L : TStringList);
  2022. Var
  2023. Lists : Array['A'..'Z'] of TStringList;
  2024. LOther : TStringList;
  2025. CL : TStringList;
  2026. TableEl, TREl, EL: TDOMElement;
  2027. E : TPasElement;
  2028. I,Rows,J,Index : Integer;
  2029. S : String;
  2030. C : Char;
  2031. begin
  2032. For C:='A' to 'Z' do
  2033. Lists[C]:=Nil;
  2034. L.Sort;
  2035. Cl:=Nil;
  2036. // Divide over alphabet
  2037. For I:=0 to L.Count-1 do
  2038. begin
  2039. S:=L[i];
  2040. E:=TPasElement(L.Objects[i]);
  2041. If not (E is TPasUnresolvedTypeRef) then
  2042. begin
  2043. If (S<>'') then
  2044. begin
  2045. C:=Upcase(S[1]);
  2046. If C='_' then
  2047. C:='A';
  2048. If (C in ['A'..'Z']) and (Lists[C]=Nil) then
  2049. begin
  2050. CL:=TStringList.Create;
  2051. Lists[C]:=CL;
  2052. end;
  2053. end;
  2054. if assigned(cl) then
  2055. CL.AddObject(S,E);
  2056. end;
  2057. end;
  2058. Try
  2059. // Create a quick jump table to all available letters.
  2060. TableEl := CreateTable(BodyElement);
  2061. TableEl['border']:='1';
  2062. TableEl['width']:='50%';
  2063. TREl := CreateTR(TableEl);
  2064. for C:='A' to 'Z' do
  2065. If (Lists[C]<>Nil) then
  2066. begin
  2067. El:=CreateTD_vtop(TREl);
  2068. AppendText(CreateLink(El,'#SECTION'+C),C);
  2069. If C<>'Z' then
  2070. AppendNBsp(El,1);
  2071. end;
  2072. // Now emit all identifiers.
  2073. TableEl:=Nil;
  2074. For C:='A' to 'Z' do
  2075. begin
  2076. CL:=Lists[C];
  2077. If CL<>Nil then
  2078. begin
  2079. El:=CreateH2(BodyElement);
  2080. AppendText(El,C);
  2081. CreateAnchor(El,'SECTION'+C);
  2082. TableEl := CreateTable(BodyElement);
  2083. TableEl['Width']:='80%';
  2084. // Determine number of rows needed
  2085. Rows:=(CL.Count div IndexColCount);
  2086. If ((CL.Count Mod IndexColCount)<>0) then
  2087. Inc(Rows);
  2088. // Fill rows
  2089. For I:=0 to Rows-1 do
  2090. begin
  2091. TREl := CreateTR(TableEl);
  2092. For J:=0 to IndexColCount-1 do
  2093. begin
  2094. El:=CreateTD_vtop(TREl);
  2095. Index:=(J*Rows)+I;
  2096. If (Index<CL.Count) then
  2097. begin
  2098. S:=CL[Index];
  2099. E:=TPasElement(CL.Objects[Index]);
  2100. AppendHyperlink(El,E);
  2101. end;
  2102. end;
  2103. end;
  2104. end; // have List
  2105. end; // For C:=
  2106. Finally
  2107. for C:='A' to 'Z' do
  2108. FreeAndNil(Lists[C]);
  2109. end;
  2110. end;
  2111. procedure THTMLWriter.AddModuleIdentifiers(AModule : TPasModule; L : TStrings);
  2112. Procedure AddElementsFromList(L : TStrings; List : TFPList);
  2113. Var
  2114. I : Integer;
  2115. El : TPasElement;
  2116. begin
  2117. For I:=0 to List.Count-1 do
  2118. begin
  2119. El:=TPasElement(List[I]);
  2120. L.AddObject(El.Name,El);
  2121. If el is TPasEnumType then
  2122. AddElementsFromList(L,TPasEnumType(el).Values);
  2123. end;
  2124. end;
  2125. begin
  2126. AddElementsFromList(L,AModule.InterfaceSection.Consts);
  2127. AddElementsFromList(L,AModule.InterfaceSection.Types);
  2128. AddElementsFromList(L,AModule.InterfaceSection.Functions);
  2129. AddElementsFromList(L,AModule.InterfaceSection.Classes);
  2130. AddElementsFromList(L,AModule.InterfaceSection.Variables);
  2131. AddElementsFromList(L,AModule.InterfaceSection.ResStrings);
  2132. end;
  2133. procedure THTMLWriter.CreatePackageIndex;
  2134. Var
  2135. L : TStringList;
  2136. I : Integer;
  2137. M : TPasModule;
  2138. E : TPasElement;
  2139. S : String;
  2140. begin
  2141. L:=TStringList.Create;
  2142. try
  2143. L.Capacity:=PageInfos.Count; // Too much, but that doesn't hurt.
  2144. For I:=0 to Package.Modules.Count-1 do
  2145. begin
  2146. M:=TPasModule(Package.Modules[i]);
  2147. L.AddObject(M.Name,M);
  2148. AddModuleIdentifiers(M,L);
  2149. end;
  2150. AppendMenuBar(IndexSubIndex);
  2151. S:=Package.Name;
  2152. If Length(S)>0 then
  2153. Delete(S,1,1);
  2154. AppendTitle(Format(SDocPackageIndex, [S]));
  2155. CreateIndexPage(L);
  2156. Finally
  2157. L.Free;
  2158. end;
  2159. end;
  2160. procedure THTMLWriter.CreatePackagePageBody;
  2161. var
  2162. DocNode: TDocNode;
  2163. TableEl, TREl: TDOMElement;
  2164. i: Integer;
  2165. ThisModule: TPasModule;
  2166. L : TStringList;
  2167. begin
  2168. AppendMenuBar(0);
  2169. AppendTitle(Format(SDocPackageTitle, [Copy(Package.Name, 2, 256)]));
  2170. AppendShortDescr(CreatePara(BodyElement), Package);
  2171. AppendText(CreateH2(BodyElement), SDocUnits);
  2172. TableEl := CreateTable(BodyElement);
  2173. L:=TStringList.Create;
  2174. Try
  2175. L.Sorted:=True;
  2176. // Sort modules.
  2177. For I:=0 to Package.Modules.Count-1 do
  2178. L.AddObject(TPasModule(Package.Modules[i]).Name,TPasModule(Package.Modules[i]));
  2179. // Now create table.
  2180. for i:=0 to L.Count - 1 do
  2181. begin
  2182. ThisModule := TPasModule(L.Objects[i]);
  2183. TREl := CreateTR(TableEl);
  2184. AppendHyperlink(CreateCode(CreatePara(CreateTD_vtop(TREl))), ThisModule);
  2185. AppendShortDescrCell(TREl, ThisModule);
  2186. end;
  2187. Finally
  2188. L.Free;
  2189. end;
  2190. DocNode := Engine.FindDocNode(Package);
  2191. if Assigned(DocNode) then
  2192. begin
  2193. if Assigned(DocNode.Descr) then
  2194. AppendDescrSection(nil, BodyElement, DocNode.Descr, SDocDescription);
  2195. CreateTopicLinks(DocNode,Package);
  2196. end;
  2197. end;
  2198. Procedure THTMLWriter.CreateTopicLinks(Node : TDocNode; PasElement : TPasElement);
  2199. var
  2200. DocNode: TDocNode;
  2201. TableEl, TREl: TDOMElement;
  2202. First : Boolean;
  2203. ThisTopic: TPasElement;
  2204. begin
  2205. DocNode:=Node.FirstChild;
  2206. First:=True;
  2207. While Assigned(DocNode) do
  2208. begin
  2209. If DocNode.TopicNode then
  2210. begin
  2211. if first then
  2212. begin
  2213. First:=False;
  2214. AppendText(CreateH2(BodyElement), SDocRelatedTopics);
  2215. TableEl := CreateTable(BodyElement);
  2216. end;
  2217. TREl := CreateTR(TableEl);
  2218. ThisTopic:=FindTopicElement(DocNode);
  2219. if Assigned(ThisTopic) then
  2220. AppendHyperlink(CreateCode(CreatePara(CreateTD_vtop(TREl))), ThisTopic);
  2221. AppendShortDescrCell(TREl, ThisTopic);
  2222. end;
  2223. DocNode:=DocNode.NextSibling;
  2224. end;
  2225. end;
  2226. procedure THTMLWriter.CreateModuleIndexPage(AModule: TPasModule);
  2227. Var
  2228. L : TStringList;
  2229. begin
  2230. L:=TStringList.Create;
  2231. try
  2232. AddModuleIdentifiers(AModule,L);
  2233. AppendMenuBar(IndexSubIndex);
  2234. AppendTitle(Format(SDocModuleIndex, [AModule.Name]));
  2235. CreateIndexPage(L);
  2236. Finally
  2237. L.Free;
  2238. end;
  2239. end;
  2240. procedure THTMLWriter.CreateModulePageBody(AModule: TPasModule;
  2241. ASubpageIndex: Integer);
  2242. procedure CreateMainPage;
  2243. var
  2244. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  2245. i: Integer;
  2246. UnitRef: TPasType;
  2247. DocNode: TDocNode;
  2248. begin
  2249. AppendMenuBar(0);
  2250. AppendTitle(Format(SDocUnitTitle, [AModule.Name]));
  2251. AppendShortDescr(CreatePara(BodyElement), AModule);
  2252. if AModule.InterfaceSection.UsesList.Count > 0 then
  2253. begin
  2254. TableEl := CreateTable(BodyElement);
  2255. AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), 'uses');
  2256. for i := 0 to AModule.InterfaceSection.UsesList.Count - 1 do
  2257. begin
  2258. UnitRef := TPasType(AModule.InterfaceSection.UsesList[i]);
  2259. DocNode := Engine.FindDocNode(UnitRef);
  2260. if Assigned(DocNode) and DocNode.IsSkipped then
  2261. continue;
  2262. TREl := CreateTR(TableEl);
  2263. TDEl := CreateTD_vtop(TREl);
  2264. CodeEl := CreateCode(CreatePara(TDEl));
  2265. AppendNbSp(CodeEl, 2);
  2266. AppendHyperlink(CodeEl, UnitRef);
  2267. if i < AModule.InterfaceSection.UsesList.Count - 1 then
  2268. AppendSym(CodeEl, ',')
  2269. else
  2270. AppendSym(CodeEl, ';');
  2271. AppendText(CodeEl, ' '); // Space for descriptions
  2272. AppendShortDescrCell(TREl, UnitRef);
  2273. end;
  2274. end;
  2275. DocNode := Engine.FindDocNode(AModule);
  2276. if Assigned(DocNode) then
  2277. begin
  2278. if Assigned(DocNode.Descr) then
  2279. AppendDescrSection(AModule, BodyElement, DocNode.Descr, SDocOverview);
  2280. ConvertNotes(AModule,DocNode.Notes);
  2281. CreateTopicLinks(DocNode,AModule);
  2282. end;
  2283. end;
  2284. procedure CreateSimpleSubpage(const ATitle: DOMString; AList: TFPList);
  2285. var
  2286. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  2287. i, j: Integer;
  2288. Decl: TPasElement;
  2289. SortedList: TFPList;
  2290. DocNode: TDocNode;
  2291. S : String;
  2292. begin
  2293. AppendMenuBar(ASubpageIndex);
  2294. S:=ATitle;
  2295. AppendTitle(Format(SDocUnitTitle + ': %s', [AModule.Name, S]));
  2296. SortedList := TFPList.Create;
  2297. try
  2298. for i := 0 to AList.Count - 1 do
  2299. begin
  2300. Decl := TPasElement(AList[i]);
  2301. DocNode := Engine.FindDocNode(Decl);
  2302. if (not Assigned(DocNode)) or (not DocNode.IsSkipped) then
  2303. begin
  2304. j := 0;
  2305. while (j < SortedList.Count) and (CompareText(
  2306. TPasElement(SortedList[j]).PathName, Decl.PathName) < 0) do
  2307. Inc(j);
  2308. SortedList.Insert(j, Decl);
  2309. end;
  2310. end;
  2311. TableEl := CreateTable(BodyElement);
  2312. for i := 0 to SortedList.Count - 1 do
  2313. begin
  2314. Decl := TPasElement(SortedList[i]);
  2315. TREl := CreateTR(TableEl);
  2316. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  2317. AppendHyperlink(CodeEl, Decl);
  2318. AppendShortDescrCell(TREl, Decl);
  2319. end;
  2320. finally
  2321. SortedList.Free;
  2322. end;
  2323. end;
  2324. procedure CreateResStringsPage;
  2325. var
  2326. ParaEl: TDOMElement;
  2327. i, j: Integer;
  2328. Decl: TPasResString;
  2329. DocNode: TDocNode;
  2330. begin
  2331. AppendMenuBar(ResstrSubindex);
  2332. AppendTitle(Format(SDocUnitTitle + ': %s', [AModule.Name, SDocResStrings]));
  2333. for i := 0 to AModule.InterfaceSection.ResStrings.Count - 1 do
  2334. begin
  2335. Decl := TPasResString(AModule.InterfaceSection.ResStrings[i]);
  2336. CreateEl(BodyElement, 'a')['name'] := LowerCase(Decl.Name);
  2337. ParaEl := CreatePara(BodyElement);
  2338. AppendText(CreateCode(ParaEl), Decl.Name);
  2339. CreateEl(ParaEl, 'br');
  2340. AppendText(ParaEl, Decl.Expr.getDeclaration(true));
  2341. end;
  2342. end;
  2343. begin
  2344. case ASubpageIndex of
  2345. 0:
  2346. CreateMainPage;
  2347. ResstrSubindex:
  2348. CreateResStringsPage;
  2349. ConstsSubindex:
  2350. CreateSimpleSubpage(SDocConstants, AModule.InterfaceSection.Consts);
  2351. TypesSubindex:
  2352. CreateSimpleSubpage(SDocTypes, AModule.InterfaceSection.Types);
  2353. ClassesSubindex:
  2354. CreateSimpleSubpage(SDocClasses, AModule.InterfaceSection.Classes);
  2355. ProcsSubindex:
  2356. CreateSimpleSubpage(SDocProceduresAndFunctions, AModule.InterfaceSection.Functions);
  2357. VarsSubindex:
  2358. CreateSimpleSubpage(SDocVariables, AModule.InterfaceSection.Variables);
  2359. IndexSubIndex:
  2360. CreateModuleIndexPage(AModule);
  2361. end;
  2362. end;
  2363. procedure THTMLWriter.CreateConstPageBody(AConst: TPasConst);
  2364. var
  2365. TableEl, CodeEl: TDOMElement;
  2366. begin
  2367. AppendMenuBar(-1);
  2368. AppendTitle(AConst.Name);
  2369. AppendShortDescr(CreatePara(BodyElement), AConst);
  2370. AppendText(CreateH2(BodyElement), SDocDeclaration);
  2371. AppendSourceRef(AConst);
  2372. TableEl := CreateTable(BodyElement);
  2373. CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  2374. AppendKw(CodeEl, 'const');
  2375. AppendText(CodeEl, ' ' + AConst.Name);
  2376. if Assigned(AConst.VarType) then
  2377. begin
  2378. AppendSym(CodeEl, ': ');
  2379. AppendType(CodeEl, TableEl, AConst.VarType, False);
  2380. end;
  2381. AppendPasSHFragment(CodeEl, ' = ' + AConst.Expr.GetDeclaration(True) + ';', 0);
  2382. FinishElementPage(AConst);
  2383. end;
  2384. procedure THTMLWriter.CreateTypePageBody(AType: TPasType);
  2385. var
  2386. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  2387. DocNode: TDocNode;
  2388. i: Integer;
  2389. s: String;
  2390. EnumType: TPasEnumType;
  2391. EnumValue: TPasEnumValue;
  2392. Variable: TPasVariable;
  2393. begin
  2394. AppendMenuBar(-1);
  2395. AppendTitle(AType.Name);
  2396. AppendShortDescr(CreatePara(BodyElement), AType);
  2397. AppendText(CreateH2(BodyElement), SDocDeclaration);
  2398. AppendSourceRef(AType);
  2399. TableEl := CreateTable(BodyElement);
  2400. TREl := CreateTR(TableEl);
  2401. TDEl := CreateTD(TREl);
  2402. CodeEl := CreateCode(CreatePara(TDEl));
  2403. DocNode := Engine.FindDocNode(AType);
  2404. AppendKw(CodeEl, 'type ');
  2405. AppendText(CodeEl, AType.Name);
  2406. AppendSym(CodeEl, ' = ');
  2407. If Assigned(DocNode) and
  2408. Assigned(DocNode.Node) and
  2409. (Docnode.Node['opaque']='1') then
  2410. AppendText(CodeEl,SDocOpaque)
  2411. else
  2412. begin
  2413. // Alias
  2414. if AType.ClassType = TPasAliasType then
  2415. begin
  2416. if Assigned(TPasAliasType(AType).DestType) then
  2417. AppendHyperlink(CodeEl, TPasAliasType(AType).DestType)
  2418. else
  2419. AppendText(CreateWarning(CodeEl), '<Destination type is NIL>');
  2420. AppendSym(CodeEl, ';');
  2421. end else
  2422. // Class of
  2423. if AType.ClassType = TPasClassOfType then
  2424. begin
  2425. AppendKw(CodeEl, 'class of ');
  2426. AppendHyperlink(CodeEl, TPasClassOfType(AType).DestType);
  2427. AppendSym(CodeEl, ';');
  2428. end else
  2429. // Enumeration
  2430. if AType.ClassType = TPasEnumType then
  2431. begin
  2432. AppendSym(CodeEl, '(');
  2433. for i := 0 to TPasEnumType(AType).Values.Count - 1 do
  2434. begin
  2435. EnumValue := TPasEnumValue(TPasEnumType(AType).Values[i]);
  2436. TREl := CreateTR(TableEl);
  2437. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  2438. AppendShortDescrCell(TREl, EnumValue);
  2439. AppendNbSp(CodeEl, 2);
  2440. s := EnumValue.Name;
  2441. if EnumValue.AssignedValue<>'' then
  2442. s := s + ' = ' + EnumValue.AssignedValue;
  2443. if i < TPasEnumType(AType).Values.Count - 1 then
  2444. s := s + ',';
  2445. AppendPasSHFragment(CodeEl, s, 0);
  2446. end;
  2447. AppendSym(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), ');');
  2448. end else
  2449. // Pointer type
  2450. if AType.ClassType = TPasPointerType then
  2451. begin
  2452. AppendSym(CodeEl, '^');
  2453. if Assigned(TPasPointerType(AType).DestType) then
  2454. AppendHyperlink(CodeEl, TPasPointerType(AType).DestType)
  2455. else
  2456. AppendText(CreateWarning(CodeEl), '<Destination type is NIL>');
  2457. AppendSym(CodeEl, ';');
  2458. end else
  2459. if AType.InheritsFrom(TPasProcedureType) then
  2460. begin
  2461. AppendSym(AppendType(CodeEl, TableEl, TPasType(AType), True), ';');
  2462. AppendProcArgsSection(BodyElement, TPasProcedureType(AType));
  2463. end else
  2464. // Record
  2465. if AType.ClassType = TPasRecordType then
  2466. begin
  2467. CodeEl := AppendRecordType(CodeEl, TableEl, TPasRecordType(AType), 0);
  2468. AppendSym(CodeEl, ';');
  2469. end else
  2470. // Set
  2471. if AType.ClassType = TPasSetType then
  2472. begin
  2473. AppendKw(CodeEl, 'set of ');
  2474. if TPasSetType(AType).EnumType.ClassType = TPasEnumType then
  2475. begin
  2476. AppendSym(CodeEl, '(');
  2477. EnumType := TPasEnumType(TPasSetType(AType).EnumType);
  2478. for i := 0 to EnumType.Values.Count - 1 do
  2479. begin
  2480. EnumValue := TPasEnumValue(EnumType.Values[i]);
  2481. TREl := CreateTR(TableEl);
  2482. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  2483. AppendShortDescrCell(TREl, EnumValue);
  2484. AppendNbSp(CodeEl, 2);
  2485. s := EnumValue.Name;
  2486. if (EnumValue.AssignedValue<>'') then
  2487. s := s + ' = ' + EnumValue.AssignedValue;
  2488. if i < EnumType.Values.Count - 1 then
  2489. s := s + ',';
  2490. AppendPasSHFragment(CodeEl, s, 0);
  2491. end;
  2492. AppendSym(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), ');');
  2493. end else
  2494. begin
  2495. AppendHyperlink(CodeEl, TPasSetType(AType).EnumType);
  2496. AppendSym(CodeEl, ';');
  2497. end;
  2498. end else
  2499. // Type alias
  2500. if AType.ClassType = TPasTypeAliasType then
  2501. begin
  2502. AppendKw(CodeEl, 'type ');
  2503. AppendHyperlink(CodeEl, TPasTypeAliasType(AType).DestType);
  2504. AppendSym(CodeEl, ';');
  2505. end else
  2506. // Probably one of the simple types, which allowed in other places as wel...
  2507. AppendSym(AppendType(CodeEl, TableEl, TPasType(AType), True), ';');
  2508. end;
  2509. FinishElementPage(AType);
  2510. end;
  2511. function PropertyFilter(AMember: TPasElement): Boolean;
  2512. begin
  2513. Result := (AMember.ClassType = TPasProperty) and
  2514. (Copy(AMember.Name, 1, 2) <> 'On');
  2515. end;
  2516. function MethodFilter(AMember: TPasElement): Boolean;
  2517. begin
  2518. Result := AMember.InheritsFrom(TPasProcedureBase);
  2519. end;
  2520. function EventFilter(AMember: TPasElement): Boolean;
  2521. begin
  2522. Result := (AMember.ClassType = TPasProperty) and
  2523. (Copy(AMember.Name, 1, 2) = 'On');
  2524. end;
  2525. procedure THTMLWriter.CreateClassPageBody(AClass: TPasClassType;
  2526. ASubpageIndex: Integer);
  2527. type
  2528. TMemberFilter = function(AMember: TPasElement): Boolean;
  2529. var
  2530. ParaEl: TDOMElement;
  2531. procedure AppendMemberListLink(AListSubpageIndex: Integer;
  2532. const AText: DOMString);
  2533. var
  2534. LinkEl: TDOMElement;
  2535. begin
  2536. AppendText(ParaEl, '[');
  2537. LinkEl := CreateEl(ParaEl, 'a');
  2538. LinkEl['href'] :=
  2539. FixHtmlPath(ResolveLinkWithinPackage(AClass, AListSubpageIndex));
  2540. LinkEl['onClick'] := 'window.open(''' + LinkEl['href'] + ''', ''list'', ' +
  2541. '''dependent=yes,resizable=yes,scrollbars=yes,height=400,width=300''); return false;';
  2542. AppendText(LinkEl, AText);
  2543. AppendText(ParaEl, ' (');
  2544. LinkEl := CreateEl(ParaEl, 'a');
  2545. LinkEl['href'] :=
  2546. FixHtmlPath(ResolveLinkWithinPackage(AClass, AListSubpageIndex + 1));
  2547. LinkEl['onClick'] := 'window.open(''' + LinkEl['href'] + ''', ''list'', ' +
  2548. '''dependent=yes,resizable=yes,scrollbars=yes,height=400,width=300''); return false;';
  2549. AppendText(LinkEl, SDocByName);
  2550. AppendText(ParaEl, ')');
  2551. AppendText(ParaEl, '] ');
  2552. end;
  2553. procedure AppendGenericTypes(CodeEl : TDomElement; AList : TFPList; isSpecialize : Boolean);
  2554. Var
  2555. I : integer;
  2556. begin
  2557. for I:=0 to AList.Count-1 do
  2558. begin
  2559. if I=0 then
  2560. AppendSym(CodeEl, '<')
  2561. else
  2562. AppendSym(CodeEl, ',');
  2563. AppendText(CodeEl,TPasGenericTemplateType(AList[i]).Name);
  2564. end;
  2565. AppendSym(CodeEl, '>');
  2566. end;
  2567. procedure CreateMainPage;
  2568. var
  2569. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  2570. DocNode: TDocNode;
  2571. Member: TPasElement;
  2572. CurVisibility: TPasMemberVisibility;
  2573. i: Integer;
  2574. s: String;
  2575. ThisInterface,
  2576. ThisClass: TPasClassType;
  2577. HaveSeenTObject: Boolean;
  2578. begin
  2579. AppendMenuBar(-1);
  2580. AppendTitle(AClass.Name);
  2581. ParaEl := CreatePara(BodyElement);
  2582. AppendMemberListLink(PropertiesByInheritanceSubindex, SDocProperties);
  2583. AppendMemberListLink(MethodsByInheritanceSubindex, SDocMethods);
  2584. AppendMemberListLink(EventsByInheritanceSubindex, SDocEvents);
  2585. AppendShortDescr(CreatePara(BodyElement), AClass);
  2586. AppendText(CreateH2(BodyElement), SDocDeclaration);
  2587. AppendSourceRef(AClass);
  2588. TableEl := CreateTable(BodyElement);
  2589. TREl := CreateTR(TableEl);
  2590. TDEl := CreateTD(TREl);
  2591. CodeEl := CreateCode(CreatePara(TDEl));
  2592. AppendKw(CodeEl, 'type');
  2593. if AClass.ObjKind=okGeneric then
  2594. AppendKw(CodeEl, ' generic ');
  2595. AppendText(CodeEl, ' ' + AClass.Name + ' ');
  2596. if AClass.ObjKind=okGeneric then
  2597. AppendGenericTypes(CodeEl,AClass.GenericTemplateTypes,false);
  2598. AppendSym(CodeEl, '=');
  2599. AppendText(CodeEl, ' ');
  2600. if AClass.ObjKind<>okSpecialize then
  2601. AppendKw(CodeEl, ObjKindNames[AClass.ObjKind])
  2602. else
  2603. AppendKw(CodeEl, ' specialize ');
  2604. if Assigned(AClass.AncestorType) then
  2605. begin
  2606. if AClass.ObjKind=okSpecialize then
  2607. begin
  2608. AppendHyperlink(CodeEl, AClass.AncestorType);
  2609. AppendGenericTypes(CodeEl,AClass.GenericTemplateTypes,true)
  2610. end
  2611. else
  2612. begin
  2613. AppendSym(CodeEl, '(');
  2614. AppendHyperlink(CodeEl, AClass.AncestorType);
  2615. if AClass.Interfaces.count>0 Then
  2616. begin
  2617. for i:=0 to AClass.interfaces.count-1 do
  2618. begin
  2619. AppendSym(CodeEl, ', ');
  2620. AppendHyperlink(CodeEl,TPasClassType(AClass.Interfaces[i]));
  2621. end;
  2622. end;
  2623. AppendSym(CodeEl, ')');
  2624. end;
  2625. end;
  2626. if AClass.Members.Count > 0 then
  2627. begin
  2628. CurVisibility := visDefault;
  2629. for i := 0 to AClass.Members.Count - 1 do
  2630. begin
  2631. Member := TPasElement(AClass.Members[i]);
  2632. if CurVisibility <> Member.Visibility then
  2633. begin
  2634. CurVisibility := Member.Visibility;
  2635. if ((CurVisibility = visPrivate) and Engine.HidePrivate) or
  2636. ((CurVisibility = visProtected) and Engine.HideProtected) then
  2637. continue;
  2638. case CurVisibility of
  2639. visPrivate: s := 'private';
  2640. visProtected: s := 'protected';
  2641. visPublic: s := 'public';
  2642. visPublished: s := 'published';
  2643. visAutomated: s := 'automated';
  2644. end;
  2645. AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), s);
  2646. end else
  2647. if ((CurVisibility = visPrivate) and Engine.HidePrivate) or
  2648. ((CurVisibility = visProtected) and Engine.HideProtected) then
  2649. continue;
  2650. TREl := CreateTR(TableEl);
  2651. CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
  2652. AppendNbSp(CodeEl, 2);
  2653. AppendShortDescrCell(TREl, Member);
  2654. if Member.InheritsFrom(TPasProcedureBase) then
  2655. begin
  2656. AppendKw(CodeEl, TPasProcedureBase(Member).TypeName + ' ');
  2657. AppendHyperlink(CodeEl, Member);
  2658. if (Member.ClassType = TPasOverloadedProc) or
  2659. (TPasProcedure(Member).ProcType.Args.Count > 0) then
  2660. AppendSym(CodeEl, '();')
  2661. else
  2662. AppendSym(CodeEl, ';');
  2663. if Member.ClassType <> TPasOverloadedProc then
  2664. AppendProcExt(CodeEl, TPasProcedure(Member));
  2665. end else
  2666. if Member.ClassType = TPasVariable then
  2667. begin
  2668. AppendHyperlink(CodeEl, Member);
  2669. AppendSym(CodeEl, ': ');
  2670. AppendHyperlink(CodeEl, TPasVariable(Member).VarType);
  2671. AppendSym(CodeEl, ';');
  2672. end else
  2673. if Member.ClassType = TPasProperty then
  2674. begin
  2675. AppendKw(CodeEl, 'property ');
  2676. AppendHyperlink(CodeEl, Member);
  2677. if Assigned(TPasProperty(Member).VarType) then
  2678. begin
  2679. AppendSym(CodeEl, ': ');
  2680. AppendHyperlink(CodeEl, TPasProperty(Member).VarType);
  2681. end;
  2682. AppendSym(CodeEl, ';');
  2683. if TPasProperty(Member).IsDefault then
  2684. begin
  2685. AppendKw(CodeEl, ' default');
  2686. AppendSym(CodeEl, ';');
  2687. end;
  2688. if (TPasProperty(Member).ImplementsName<>'') then
  2689. begin
  2690. AppendKw(CodeEl, ' implements');
  2691. AppendText(CodeEl, ' '+TPasProperty(Member).ImplementsName);
  2692. AppendSym(CodeEl, ';');
  2693. end;
  2694. SetLength(s, 0);
  2695. if Length(TPasProperty(Member).ReadAccessorName) > 0 then
  2696. s := s + 'r';
  2697. if Length(TPasProperty(Member).WriteAccessorName) > 0 then
  2698. s := s + 'w';
  2699. if Length(TPasProperty(Member).StoredAccessorName) > 0 then
  2700. s := s + 's';
  2701. if Length(s) > 0 then
  2702. AppendText(CodeEl, ' [' + s + ']');
  2703. end else
  2704. AppendText(CreateWarning(CodeEl), '<' + Member.ClassName + '>');
  2705. end;
  2706. CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
  2707. end;
  2708. AppendText(CodeEl, ' '); // !!!: Dirty trick, necessary for current XML writer
  2709. if not AClass.IsShortDefinition then
  2710. AppendKw(CodeEl, 'end');
  2711. AppendSym(CodeEl, ';');
  2712. AppendText(CreateH2(BodyElement), SDocInheritance);
  2713. TableEl := CreateTable(BodyElement);
  2714. HaveSeenTObject := AClass.ObjKind <> okClass;
  2715. ThisClass := AClass;
  2716. while True do
  2717. begin
  2718. TREl := CreateTR(TableEl);
  2719. TDEl := CreateTD_vtop(TREl);
  2720. TDEl['align'] := 'center';
  2721. CodeEl := CreateCode(CreatePara(TDEl));
  2722. AppendHyperlink(CodeEl, ThisClass);
  2723. if ThisClass.Interfaces.count>0 then
  2724. begin
  2725. for i:=0 to ThisClass.interfaces.count-1 do
  2726. begin
  2727. ThisInterface:=TPasClassType(ThisClass.Interfaces[i]);
  2728. AppendText(CodeEl,',');
  2729. AppendHyperlink(CodeEl, ThisInterface);
  2730. end;
  2731. end;
  2732. AppendShortDescrCell(TREl, ThisClass);
  2733. if HaveSeenTObject or (CompareText(ThisClass.Name, 'TObject') = 0) then
  2734. HaveSeenTObject := True
  2735. else
  2736. begin
  2737. TDEl := CreateTD(CreateTR(TableEl));
  2738. TDEl['align'] := 'center';
  2739. AppendText(TDEl, '|');
  2740. end;
  2741. if Assigned(ThisClass.AncestorType) then
  2742. begin
  2743. if ThisClass.AncestorType.InheritsFrom(TPasClassType) then
  2744. ThisClass := TPasClassType(ThisClass.AncestorType)
  2745. else
  2746. begin
  2747. TDEl := CreateTD(CreateTR(TableEl));
  2748. TDEl['align'] := 'center';
  2749. AppendText(CreateCode(CreatePara(TDEl)), ThisClass.AncestorType.Name);
  2750. if CompareText(ThisClass.AncestorType.Name, 'TObject') = 0 then
  2751. HaveSeenTObject := True
  2752. else
  2753. begin
  2754. TDEl := CreateTD(CreateTR(TableEl));
  2755. TDEl['align'] := 'center';
  2756. AppendText(TDEl, '?');
  2757. end;
  2758. break;
  2759. end
  2760. end else
  2761. break;
  2762. end;
  2763. if not HaveSeenTObject then
  2764. begin
  2765. TDEl := CreateTD(CreateTR(TableEl));
  2766. TDEl['align'] := 'center';
  2767. AppendText(CreateCode(CreatePara(TDEl)), 'TObject');
  2768. end;
  2769. FinishElementPage(AClass);
  2770. end;
  2771. procedure CreateInheritanceSubpage(AFilter: TMemberFilter);
  2772. var
  2773. ThisClass: TPasClassType;
  2774. i: Integer;
  2775. Member: TPasElement;
  2776. TableEl, TREl, TDEl, ParaEl, LinkEl: TDOMElement;
  2777. begin
  2778. TableEl := CreateTable(BodyElement);
  2779. ThisClass := AClass;
  2780. while True do
  2781. begin
  2782. TREl := CreateTR(TableEl);
  2783. TDEl := CreateTD(TREl);
  2784. TDEl['colspan'] := '3';
  2785. CreateTD(TREl);
  2786. LinkEl := AppendHyperlink(CreateEl(CreateCode(CreatePara(TDEl)), 'b'), ThisClass);
  2787. if Assigned(LinkEl) then
  2788. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  2789. '''; return false;';
  2790. for i := 0 to ThisClass.Members.Count - 1 do
  2791. begin
  2792. Member := TPasElement(ThisClass.Members[i]);
  2793. if ((Member.Visibility = visPrivate) and Engine.HidePrivate) or
  2794. ((Member.Visibility = visProtected) and Engine.HideProtected) or
  2795. not AFilter(Member) then
  2796. continue;
  2797. TREl := CreateTR(TableEl);
  2798. ParaEl := CreatePara(CreateTD(TREl));
  2799. case Member.Visibility of
  2800. visPrivate:
  2801. AppendText(ParaEl, 'pv');
  2802. visProtected:
  2803. AppendText(ParaEl, 'pt');
  2804. visPublished:
  2805. AppendText(ParaEl, 'pl');
  2806. end;
  2807. AppendNbSp(ParaEl, 1);
  2808. ParaEl := CreateTD(TREl);
  2809. if (Member.ClassType = TPasProperty) and
  2810. (Length(TPasProperty(Member).WriteAccessorName) = 0) then
  2811. begin
  2812. AppendText(ParaEl, 'ro');
  2813. AppendNbSp(ParaEl, 1);
  2814. end;
  2815. LinkEl := AppendHyperlink(CreatePara(CreateTD(TREl)), Member);
  2816. if Assigned(LinkEl) then
  2817. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  2818. '''; return false;';
  2819. end;
  2820. if (not Assigned(ThisClass.AncestorType)) or
  2821. (not (ThisClass.AncestorType.ClassType = TPasClassType)) then
  2822. break;
  2823. ThisClass := TPasClassType(ThisClass.AncestorType);
  2824. AppendNbSp(CreatePara(CreateTD(CreateTR(TableEl))), 1);
  2825. end;
  2826. end;
  2827. procedure CreateSortedSubpage(AFilter: TMemberFilter);
  2828. var
  2829. List: TFPList;
  2830. ThisClass: TPasClassType;
  2831. i, j: Integer;
  2832. Member: TPasElement;
  2833. TableEl, TREl, TDEl, ParaEl, LinkEl: TDOMElement;
  2834. begin
  2835. List := TFPList.Create;
  2836. try
  2837. ThisClass := AClass;
  2838. while True do
  2839. begin
  2840. for i := 0 to ThisClass.Members.Count - 1 do
  2841. begin
  2842. Member := TPasElement(ThisClass.Members[i]);
  2843. if (not (((Member.Visibility = visPrivate) and Engine.HidePrivate) or
  2844. ((Member.Visibility = visProtected) and Engine.HideProtected))) and
  2845. AFilter(Member) then
  2846. begin
  2847. j := 0;
  2848. while (j < List.Count) and
  2849. (CompareText(TPasElement(List[j]).Name, Member.Name) < 0) do
  2850. Inc(j);
  2851. List.Insert(j, Member);
  2852. end;
  2853. end;
  2854. if (not Assigned(ThisClass.AncestorType)) or
  2855. (not (ThisClass.AncestorType.ClassType = TPasClassType)) then
  2856. break;
  2857. ThisClass := TPasClassType(ThisClass.AncestorType);
  2858. end;
  2859. TableEl := CreateTable(BodyElement);
  2860. for i := 0 to List.Count - 1 do
  2861. begin
  2862. Member := TPasElement(List[i]);
  2863. TREl := CreateTR(TableEl);
  2864. ParaEl := CreatePara(CreateTD(TREl));
  2865. case Member.Visibility of
  2866. visPrivate:
  2867. AppendText(ParaEl, 'pv');
  2868. visProtected:
  2869. AppendText(ParaEl, 'pt');
  2870. visPublished:
  2871. AppendText(ParaEl, 'pl');
  2872. end;
  2873. AppendNbSp(ParaEl, 1);
  2874. ParaEl := CreatePara(CreateTD(TREl));
  2875. if (Member.ClassType = TPasProperty) and
  2876. (Length(TPasProperty(Member).WriteAccessorName) = 0) then
  2877. begin
  2878. AppendText(ParaEl, 'ro');
  2879. AppendNbSp(ParaEl, 1);
  2880. end;
  2881. TDEl := CreateTD(TREl);
  2882. TDEl['nowrap'] := 'nowrap';
  2883. ParaEl := CreatePara(TDEl);
  2884. LinkEl := AppendHyperlink(ParaEl, Member);
  2885. if Assigned(LinkEl) then
  2886. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  2887. '''; return false;';
  2888. AppendText(ParaEl, ' (');
  2889. LinkEl := AppendHyperlink(ParaEl, Member.Parent);
  2890. if Assigned(LinkEl) then
  2891. LinkEl['onClick'] := 'opener.location.href = ''' + LinkEl['href'] +
  2892. '''; return false;';
  2893. AppendText(ParaEl, ')');
  2894. end;
  2895. finally
  2896. List.Free;
  2897. end;
  2898. end;
  2899. begin
  2900. case ASubpageIndex of
  2901. 0:
  2902. CreateMainPage;
  2903. PropertiesByInheritanceSubindex:
  2904. CreateInheritanceSubpage(@PropertyFilter);
  2905. PropertiesByNameSubindex:
  2906. CreateSortedSubpage(@PropertyFilter);
  2907. MethodsByInheritanceSubindex:
  2908. CreateInheritanceSubpage(@MethodFilter);
  2909. MethodsByNameSubindex:
  2910. CreateSortedSubpage(@MethodFilter);
  2911. EventsByInheritanceSubindex:
  2912. CreateInheritanceSubpage(@EventFilter);
  2913. EventsByNameSubindex:
  2914. CreateSortedSubpage(@EventFilter);
  2915. end;
  2916. end;
  2917. procedure THTMLWriter.CreateClassMemberPageBody(AElement: TPasElement);
  2918. var
  2919. TableEl, TREl, CodeEl: TDOMElement;
  2920. procedure CreateVarPage(Element: TPasVariable);
  2921. begin
  2922. AppendHyperlink(CodeEl, Element.Parent);
  2923. AppendSym(CodeEl, '.');
  2924. AppendText(CodeEl, Element.Name);
  2925. if Assigned(Element.VarType) then
  2926. begin
  2927. AppendSym(CodeEl, ': ');
  2928. AppendSym(AppendType(CodeEl, TableEl, Element.VarType, False), ';');
  2929. end;
  2930. end;
  2931. procedure CreatePropertyPage(Element: TPasProperty);
  2932. var
  2933. NeedBreak: Boolean;
  2934. begin
  2935. AppendKw(CodeEl, 'property ');
  2936. AppendHyperlink(CodeEl, Element.Parent);
  2937. AppendSym(CodeEl, '.');
  2938. AppendText(CodeEl, Element.Name);
  2939. if Assigned(Element.VarType) then
  2940. begin
  2941. AppendSym(CodeEl, ': ');
  2942. AppendType(CodeEl, TableEl, Element.VarType, False);
  2943. end;
  2944. NeedBreak := False;
  2945. if Length(TPasProperty(Element).IndexValue) <> 0 then
  2946. begin
  2947. CreateEl(CodeEl, 'br');
  2948. AppendNbsp(CodeEl, 2);
  2949. AppendKw(CodeEl, 'index ');
  2950. AppendPasSHFragment(CodeEl, TPasProperty(Element).IndexValue, 0);
  2951. NeedBreak := True;
  2952. end;
  2953. if Length(TPasProperty(Element).ReadAccessorName) <> 0 then
  2954. begin
  2955. CreateEl(CodeEl, 'br');
  2956. AppendNbsp(CodeEl, 2);
  2957. AppendKw(CodeEl, 'read ');
  2958. AppendText(CodeEl, TPasProperty(Element).ReadAccessorName);
  2959. NeedBreak := True;
  2960. end;
  2961. if Length(TPasProperty(Element).WriteAccessorName) <> 0 then
  2962. begin
  2963. CreateEl(CodeEl, 'br');
  2964. AppendNbsp(CodeEl, 2);
  2965. AppendKw(CodeEl, 'write ');
  2966. AppendText(CodeEl, TPasProperty(Element).WriteAccessorName);
  2967. NeedBreak := True;
  2968. end;
  2969. if Length(TPasProperty(Element).StoredAccessorName) <> 0 then
  2970. begin
  2971. CreateEl(CodeEl, 'br');
  2972. AppendNbsp(CodeEl, 2);
  2973. AppendKw(CodeEl, 'stored ');
  2974. AppendText(CodeEl, TPasProperty(Element).StoredAccessorName);
  2975. NeedBreak := True;
  2976. end;
  2977. if Length(TPasProperty(Element).DefaultValue) <> 0 then
  2978. begin
  2979. CreateEl(CodeEl, 'br');
  2980. AppendNbsp(CodeEl, 2);
  2981. AppendKw(CodeEl, 'default ');
  2982. AppendPasSHFragment(CodeEl, TPasProperty(Element).DefaultValue, 0);
  2983. NeedBreak := True;
  2984. end;
  2985. AppendSym(CodeEl, ';');
  2986. if TPasProperty(Element).IsDefault or TPasProperty(Element).IsNodefault then
  2987. begin
  2988. if NeedBreak then
  2989. begin
  2990. CreateEl(CodeEl, 'br');
  2991. AppendNbsp(CodeEl, 2);
  2992. end;
  2993. if TPasProperty(Element).IsDefault then
  2994. AppendKw(CodeEl, 'default')
  2995. else
  2996. AppendKw(CodeEl, 'nodefault');
  2997. AppendSym(CodeEl, ';');
  2998. end;
  2999. end;
  3000. var
  3001. s: String;
  3002. DocNode: TDocNode;
  3003. begin
  3004. AppendMenuBar(-1);
  3005. AppendTitle(AElement.FullName);
  3006. AppendShortDescr(CreatePara(BodyElement), AElement);
  3007. AppendText(CreateH2(BodyElement), SDocDeclaration);
  3008. AppendSourceRef(AElement);
  3009. TableEl := CreateTable(BodyElement);
  3010. TREl := CreateTR(TableEl);
  3011. CodeEl := CreateCode(CreatePara(CreateTD(TREl)));
  3012. AppendText(CodeEl, ' '); // !!!: Workaround for current HTML writer
  3013. case AElement.Visibility of
  3014. visPrivate: s := 'private';
  3015. visProtected: s := 'protected';
  3016. visPublic: s := 'public';
  3017. visPublished: s := 'published';
  3018. visAutomated: s := 'automated';
  3019. else s := '';
  3020. end;
  3021. if Length(s) > 0 then
  3022. AppendKw(CodeEl, s);
  3023. AppendText(CodeEl, ' ');
  3024. if AElement.ClassType = TPasVariable then
  3025. CreateVarPage(TPasVariable(AElement))
  3026. else if AElement.InheritsFrom(TPasProcedureBase) then
  3027. AppendProcDecl(CodeEl, TableEl, TPasProcedureBase(AElement))
  3028. else if AElement.ClassType = TPasProperty then
  3029. CreatePropertyPage(TPasProperty(AElement))
  3030. else
  3031. AppendText(CreateWarning(BodyElement), '<' + AElement.ClassName + '>');
  3032. FinishElementPage(AElement);
  3033. end;
  3034. procedure THTMLWriter.CreateVarPageBody(AVar: TPasVariable);
  3035. var
  3036. TableEl, TREl, TDEl, CodeEl, El: TDOMElement;
  3037. DocNode: TDocNode;
  3038. begin
  3039. AppendMenuBar(-1);
  3040. AppendTitle(AVar.FullName);
  3041. AppendShortDescr(CreatePara(BodyElement), AVar);
  3042. AppendText(CreateH2(BodyElement), SDocDeclaration);
  3043. AppendSourceRef(AVar);
  3044. TableEl := CreateTable(BodyElement);
  3045. TREl := CreateTR(TableEl);
  3046. TDEl := CreateTD(TREl);
  3047. CodeEl := CreateCode(CreatePara(TDEl));
  3048. AppendKw(CodeEl, 'var');
  3049. AppendText(CodeEl, ' ' + AVar.Name);
  3050. if Assigned(AVar.VarType) then
  3051. begin
  3052. AppendSym(CodeEl, ': ');
  3053. El := AppendType(CodeEl, TableEl, AVar.VarType, False);
  3054. end else
  3055. El := CodeEl;
  3056. if Length(AVar.Value) > 0 then
  3057. AppendPasSHFragment(El, ' = ' + AVar.Value + ';', 0)
  3058. else
  3059. AppendSym(El, ';');
  3060. FinishElementPage(AVar);
  3061. end;
  3062. procedure THTMLWriter.CreateProcPageBody(AProc: TPasProcedureBase);
  3063. var
  3064. TableEl, TREl, TDEl, CodeEl: TDOMElement;
  3065. begin
  3066. AppendMenuBar(-1);
  3067. AppendTitle(AProc.Name);
  3068. AppendShortDescr(CreatePara(BodyElement), AProc);
  3069. AppendText(CreateH2(BodyElement), SDocDeclaration);
  3070. AppendSourceRef(AProc);
  3071. TableEl := CreateTable(BodyElement);
  3072. TREl := CreateTR(TableEl);
  3073. TDEl := CreateTD(TREl);
  3074. CodeEl := CreateCode(CreatePara(TDEl));
  3075. AppendProcDecl(CodeEl, TableEl, AProc);
  3076. FinishElementPage(AProc);
  3077. end;
  3078. Function THTMLWriter.InterPretOption(Const Cmd,Arg : String) : boolean;
  3079. begin
  3080. Result:=True;
  3081. if Cmd = '--html-search' then
  3082. SearchPage := Arg
  3083. else if Cmd = '--footer' then
  3084. FooterFile := Arg
  3085. else if Cmd = '--charset' then
  3086. CharSet := Arg
  3087. else if Cmd = '--index-colcount' then
  3088. IndexColCount := StrToIntDef(Arg,IndexColCount)
  3089. else if Cmd = '--image-url' then
  3090. FBaseImageURL := Arg
  3091. else if Cmd = '--css-file' then
  3092. FCSSFile := arg
  3093. else if Cmd = '--footer-date' then
  3094. begin
  3095. FIDF:=True;
  3096. FDateFormat:=Arg;
  3097. end
  3098. else
  3099. Result:=False;
  3100. end;
  3101. procedure THTMLWriter.WriteDoc;
  3102. begin
  3103. DoLog(SWritingPages, [PageCount]);
  3104. WriteHTMLPages;
  3105. end;
  3106. class procedure THTMLWriter.Usage(List: TStrings);
  3107. begin
  3108. List.add('--footer');
  3109. List.Add(SHTMLUsageFooter);
  3110. List.Add('--footer-date[=Fmt]');
  3111. List.Add(SHTMLUsageFooterDate);
  3112. List.Add('--charset=set');
  3113. List.Add(SHTMLUsageCharset);
  3114. List.Add('--html-search=pagename');
  3115. List.Add(SHTMLHtmlSearch);
  3116. List.Add('--index-colcount=N');
  3117. List.Add(SHTMLIndexColcount);
  3118. List.Add('--image-url=url');
  3119. List.Add(SHTMLImageUrl);
  3120. end;
  3121. Class Function THTMLWriter.FileNameExtension : String;
  3122. begin
  3123. result:='';
  3124. end;
  3125. // private methods
  3126. function THTMLWriter.GetPageCount: Integer;
  3127. begin
  3128. Result := PageInfos.Count;
  3129. end;
  3130. procedure THTMLWriter.SetOnTest(const AValue: TNotifyEvent);
  3131. begin
  3132. if FOnTest=AValue then exit;
  3133. FOnTest:=AValue;
  3134. end;
  3135. procedure THTMLWriter.CreateAllocator;
  3136. begin
  3137. FAllocator:=TLongNameFileAllocator.Create('.html');
  3138. end;
  3139. procedure THTMWriter.CreateAllocator;
  3140. begin
  3141. FAllocator:=TShortNameFileAllocator.Create('.htm');
  3142. end;
  3143. initialization
  3144. // Do not localize.
  3145. RegisterWriter(THTMLWriter,'html','HTML output using fpdoc.css stylesheet.');
  3146. RegisterWriter(THTMWriter,'htm','HTM (8.3 filenames) output using fpdoc.css stylesheet.');
  3147. RegisterWriter(TCHMHTMLWriter,'chm','Compressed HTML file output using fpdoc.css stylesheet.');
  3148. finalization
  3149. UnRegisterWriter('html');
  3150. UnRegisterWriter('htm');
  3151. UnRegisterWriter('chm');
  3152. end.