dw_html.pp 85 KB

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