dw_html.pp 85 KB

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