dw_html.pp 102 KB

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