dw_html.pp 99 KB

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