dw_html.pp 95 KB

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