dw_html.pp 95 KB

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