dw_template.pp 25 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004
  1. {
  2. $Id$
  3. FPDoc - Free Pascal Documentation Tool
  4. Copyright (C) 2005 by Michael Van Canneyt
  5. * Template 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. {
  13. Usage: change the constants below. Do a search&replace where TTemplateWriter
  14. is changed to TMyFormatWriter (replace MyFormat with whatever you need)
  15. and fill in all methods.
  16. If your format is linear (i.e. not some hyperlinked format, split in several
  17. output files), you should take the dw_lintmpl template instead. It will take
  18. care of all needed structure.
  19. }
  20. {$mode objfpc}
  21. {$H+}
  22. unit dw_template;
  23. interface
  24. uses
  25. Classes, SysUtils, DGlobals, dWriter, pastree, dom;
  26. Const
  27. { Change this into the name of your writer}
  28. TemplateName = 'template';
  29. { Comprehensible description goes here:}
  30. STemplateUsageWriterDescr = 'Writes output in template format';
  31. { Extension for the template }
  32. TTemplateExtension = '.tpl';
  33. Type
  34. { TTemplateWriter }
  35. TTemplateWriter = Class(TFPDocWriter)
  36. ModuleName, // Current module name
  37. PackageName: String; // Package name
  38. FStream : TStream; // Current output stream.
  39. Module: TPasModule; // Current module.
  40. Protected
  41. // Writing support.
  42. { various routines to Write to stream. }
  43. procedure Write(const s: String);
  44. procedure WriteF(const s: String; const Args: array of const);
  45. procedure WriteLn(const s: String);
  46. procedure WriteLnF(const s: String; const Args: array of const);
  47. { Replace current write stream with S, return current stream. }
  48. Function PushWriteContext(S : TStream) : TStream;
  49. { Replace current write stream with S }
  50. Procedure PopWriteContext(S : TSTream);
  51. { make sure text is interpretable: escape all special characters in some way.}
  52. Function EscapeText(const s : String) : String;
  53. { Sort a list of TPasElements }
  54. procedure SortElementList(List : TList);
  55. { Writes a description node to a stream, returns the result as a string }
  56. Function GetDescrString(AContext: TPasElement; DescrNode: TDOMElement) : String;
  57. { Determine value for constant }
  58. function ConstValue(ConstDecl: TPasConst): String; virtual;
  59. { Write the contents of an example file }
  60. Procedure WriteExampleFile(FN : String); virtual;
  61. { Write all example files, found in ADocNode. }
  62. procedure WriteExample(ADocNode: TDocNode);
  63. { Convert a TPasElement to a valid label for this backend }
  64. function ElementToLabel(AElement : TPasElement) : String;
  65. Public
  66. Constructor Create(APackage: TPasPackage; AEngine: TFPDocEngine); override;
  67. procedure WriteDoc; override;
  68. // Documentation writing methods.
  69. // Package
  70. Procedure WritePackagePage;
  71. // Topic refs
  72. Procedure ProcessTopics(DocNode : TDocNode; Subs : Boolean);
  73. // Single topic page.
  74. Procedure WriteTopicPage(Parent,Node : TDocNode);
  75. // Process a Module (=unit)
  76. procedure ProcessModule(AModule: TPasModule);
  77. // Write Unit description.
  78. procedure WriteUnitPage(AModule: TPasModule);
  79. // Do all resource strings in a unit.
  80. procedure WriteUnitResourceStrings(ASection: TPasSection);
  81. // Do all constants in a unit.
  82. procedure WriteUnitConsts(ASection: TPasSection);
  83. // Do all types in a unit.
  84. procedure WriteUnitTypes(ASection: TPasSection);
  85. // Do all variables in a unit.
  86. procedure WriteUnitVars(ASection: TPasSection);
  87. // Do all classes in a unit.
  88. procedure WriteUnitClasses(ASection: TPasSection);
  89. // Do all functions and procedures in a unit.
  90. procedure WriteUnitFunctionsAndProcedures(ASection: TPasSection);
  91. // Write elements of an enumeration type
  92. procedure WriteEnumElements(TypeDecl : TPasEnumType);
  93. // Write class documentation
  94. procedure WriteClassPage(ClassDecl: TPasClassType);
  95. // Write procedure/function documentation
  96. procedure WriteProcedurePage(ProcDecl: TPasProcedureBase);
  97. // Write procedure/function arguments documentation
  98. procedure AppendProcedureArgsSection(Element: TPasProcedureType);
  99. // Write function result documentation
  100. procedure AppendFunctionResultSection(Element: TPasFunctionType);
  101. // Write class property documentation
  102. procedure WritePropertyPage(PropDecl: TPasProperty);
  103. // To be Overriden from fpdocwriter;
  104. procedure DescrWriteText(const AText: DOMString); override;
  105. procedure DescrBeginBold; override;
  106. procedure DescrEndBold; override;
  107. procedure DescrBeginItalic; override;
  108. procedure DescrEndItalic; override;
  109. procedure DescrBeginEmph; override;
  110. procedure DescrEndEmph; override;
  111. procedure DescrWriteFileEl(const AText: DOMString); override;
  112. procedure DescrWriteKeywordEl(const AText: DOMString); override;
  113. procedure DescrWriteVarEl(const AText: DOMString); override;
  114. procedure DescrBeginLink(const AId: DOMString); override;
  115. procedure DescrEndLink; override;
  116. procedure DescrWriteLinebreak; override;
  117. procedure DescrBeginParagraph; override;
  118. procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
  119. procedure DescrWriteCodeLine(const ALine: String); override;
  120. procedure DescrEndCode; override;
  121. procedure DescrEndParagraph; override;
  122. procedure DescrBeginOrderedList; override;
  123. procedure DescrEndOrderedList; override;
  124. procedure DescrBeginUnorderedList; override;
  125. procedure DescrEndUnorderedList; override;
  126. procedure DescrBeginDefinitionList; override;
  127. procedure DescrEndDefinitionList; override;
  128. procedure DescrBeginListItem; override;
  129. procedure DescrEndListItem; override;
  130. procedure DescrBeginDefinitionTerm; override;
  131. procedure DescrEndDefinitionTerm; override;
  132. procedure DescrBeginDefinitionEntry; override;
  133. procedure DescrEndDefinitionEntry; override;
  134. procedure DescrBeginSectionTitle; override;
  135. procedure DescrBeginSectionBody; override;
  136. procedure DescrEndSection; override;
  137. procedure DescrBeginRemark; override;
  138. procedure DescrEndRemark; override;
  139. procedure DescrBeginTable(ColCount: Integer; HasBorder: Boolean); override;
  140. procedure DescrEndTable; override;
  141. procedure DescrBeginTableCaption; override;
  142. procedure DescrEndTableCaption; override;
  143. procedure DescrBeginTableHeadRow; override;
  144. procedure DescrEndTableHeadRow; override;
  145. procedure DescrBeginTableRow; override;
  146. procedure DescrEndTableRow; override;
  147. procedure DescrBeginTableCell; override;
  148. procedure DescrEndTableCell; override;
  149. // Handle options.
  150. Function InterPretOption(Const Cmd,Arg : String) : boolean; override;
  151. // Provide feedback about usage of this backend.
  152. Class procedure Usage(List: TStrings); override;
  153. // For info only. See linear writer for an example.
  154. Class Function FileNameExtension : String;virtual;
  155. end;
  156. implementation
  157. { TTemplateWriter }
  158. constructor TTemplateWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
  159. procedure AddLabel(AElement: TPasElement);
  160. begin
  161. Engine.AddLink(AElement.PathName, ElementToLabel(AElement));
  162. end;
  163. procedure AddList(AElement: TPasElement; AList: TList);
  164. var
  165. i: Integer;
  166. begin
  167. for i := 0 to AList.Count - 1 do
  168. AddLabel(TPasElement(AList[i]));
  169. end;
  170. procedure AddTopicPages(AElement: TPasElement);
  171. var
  172. PreviousTopic,
  173. TopicElement : TTopicElement;
  174. DocNode,
  175. TopicNode : TDocNode;
  176. begin
  177. DocNode:=Engine.FindDocNode(AElement);
  178. If not Assigned(DocNode) then
  179. exit;
  180. TopicNode:=DocNode.FirstChild;
  181. PreviousTopic:=Nil;
  182. While Assigned(TopicNode) do
  183. begin
  184. If TopicNode.TopicNode then
  185. begin
  186. TopicElement:=TTopicElement.Create(TopicNode.Name,AElement);
  187. Topics.Add(TopicElement);
  188. TopicElement.TopicNode:=TopicNode;
  189. TopicElement.Previous:=PreviousTopic;
  190. If Assigned(PreviousTopic) then
  191. PreviousTopic.Next:=TopicElement;
  192. PreviousTopic:=TopicElement;
  193. if AElement is TTopicElement then
  194. TTopicElement(AElement).SubTopics.Add(TopicElement);
  195. Engine.AddLink(TopicElement.PathName, ElementToLabel(TopicElement));
  196. if AElement is TTopicElement then
  197. TTopicElement(AElement).SubTopics.Add(TopicElement)
  198. else // Only one level of recursion.
  199. AddTopicPages(TopicElement);
  200. end;
  201. TopicNode:=TopicNode.NextSibling;
  202. end;
  203. end;
  204. procedure ScanModule(AModule: TPasModule);
  205. var
  206. i, j, k: Integer;
  207. ClassEl: TPasClassType;
  208. FPEl, AncestorMemberEl: TPasElement;
  209. DocNode: TDocNode;
  210. DidAutolink: Boolean;
  211. begin
  212. AddLabel(AModule);
  213. AddTopicPages(AModule);
  214. with AModule do
  215. begin
  216. AddList(AModule, InterfaceSection.ResStrings);
  217. AddList(AModule, InterfaceSection.Consts);
  218. AddList(AModule, InterfaceSection.Types);
  219. if InterfaceSection.Classes.Count > 0 then
  220. begin
  221. for i := 0 to InterfaceSection.Classes.Count - 1 do
  222. begin
  223. ClassEl := TPasClassType(InterfaceSection.Classes[i]);
  224. AddLabel(ClassEl);
  225. for j := 0 to ClassEl.Members.Count - 1 do
  226. begin
  227. FPEl := TPasElement(ClassEl.Members[j]);
  228. if ((FPEl.Visibility = visPrivate) and Engine.HidePrivate) or
  229. ((FPEl.Visibility = visProtected) and Engine.HideProtected) then
  230. continue;
  231. DocNode := Engine.FindDocNode(FPEl);
  232. if not Assigned(DocNode) then
  233. begin
  234. DidAutolink := False;
  235. if Assigned(ClassEl.AncestorType) and
  236. (ClassEl.AncestorType.ClassType = TPasClassType) then
  237. begin
  238. for k := 0 to TPasClassType(ClassEl.AncestorType).Members.Count - 1 do
  239. begin
  240. AncestorMemberEl :=
  241. TPasElement(TPasClassType(ClassEl.AncestorType).Members[k]);
  242. if AncestorMemberEl.Name = FPEl.Name then
  243. begin
  244. DocNode := Engine.FindDocNode(AncestorMemberEl);
  245. if Assigned(DocNode) then
  246. begin
  247. DidAutolink := True;
  248. Engine.AddLink(FPEl.PathName,
  249. Engine.FindAbsoluteLink(AncestorMemberEl.PathName));
  250. break;
  251. end;
  252. end;
  253. end;
  254. end;
  255. if not DidAutolink then
  256. AddLabel(FPEl);
  257. end else
  258. AddLabel(FPEl);
  259. end;
  260. end;
  261. end;
  262. AddList(AModule, InterfaceSection.Functions);
  263. AddList(AModule, InterfaceSection.Variables);
  264. end;
  265. end;
  266. var
  267. i: Integer;
  268. begin
  269. inherited;
  270. if Length(Package.Name) > 1 then
  271. AddTopicPages(Package);
  272. for i := 0 to Package.Modules.Count - 1 do
  273. ScanModule(TPasModule(Package.Modules[i]));
  274. end;
  275. { ---------------------------------------------------------------------
  276. Writing support
  277. ---------------------------------------------------------------------}
  278. Function TTemplateWriter.PushWriteContext(S : TStream) : TStream;
  279. begin
  280. Result:=FStream;
  281. FStream:=S;
  282. end;
  283. Procedure TTemplateWriter.PopWriteContext(S : TSTream);
  284. begin
  285. FStream:=S;
  286. end;
  287. function TTemplateWriter.EscapeText(const s: String): String;
  288. begin
  289. Result:=S;
  290. end;
  291. procedure TTemplateWriter.Write(const s: String);
  292. Var
  293. L : Integer;
  294. begin
  295. L:=Length(S);
  296. If (L>0) then
  297. FStream.Write(PChar(S)^,L);
  298. end;
  299. procedure TTemplateWriter.WriteF(const s: String; const Args: array of const);
  300. begin
  301. Write(Format(S,Args));
  302. end;
  303. procedure TTemplateWriter.WriteLn(const s: String);
  304. begin
  305. Write(S);
  306. Write(LineEnding);
  307. end;
  308. procedure TTemplateWriter.WriteLnF(const s: String; const Args: array of const);
  309. begin
  310. Write(Format(S,Args));
  311. Write(LineEnding);
  312. end;
  313. procedure TTemplateWriter.DescrWriteText(const AText: DOMString);
  314. begin
  315. Self.Write(EscapeText(AText));
  316. end;
  317. procedure TTemplateWriter.DescrBeginBold;
  318. begin
  319. end;
  320. procedure TTemplateWriter.DescrEndBold;
  321. begin
  322. end;
  323. procedure TTemplateWriter.DescrBeginItalic;
  324. begin
  325. end;
  326. procedure TTemplateWriter.DescrEndItalic;
  327. begin
  328. end;
  329. procedure TTemplateWriter.DescrBeginEmph;
  330. begin
  331. end;
  332. procedure TTemplateWriter.DescrEndEmph;
  333. begin
  334. end;
  335. procedure TTemplateWriter.DescrWriteFileEl(const AText: DOMString);
  336. begin
  337. end;
  338. procedure TTemplateWriter.DescrWriteKeywordEl(const AText: DOMString);
  339. begin
  340. end;
  341. procedure TTemplateWriter.DescrWriteVarEl(const AText: DOMString);
  342. begin
  343. end;
  344. procedure TTemplateWriter.DescrBeginLink(const AId: DOMString);
  345. begin
  346. end;
  347. procedure TTemplateWriter.DescrEndLink;
  348. begin
  349. end;
  350. procedure TTemplateWriter.DescrWriteLinebreak;
  351. begin
  352. end;
  353. procedure TTemplateWriter.DescrBeginParagraph;
  354. begin
  355. end;
  356. procedure TTemplateWriter.DescrBeginCode(HasBorder: Boolean;
  357. const AHighlighterName: String);
  358. begin
  359. end;
  360. procedure TTemplateWriter.DescrWriteCodeLine(const ALine: String);
  361. begin
  362. Writeln(ALine);
  363. DescrWriteLinebreak;
  364. end;
  365. procedure TTemplateWriter.DescrEndCode;
  366. begin
  367. end;
  368. procedure TTemplateWriter.DescrEndParagraph;
  369. begin
  370. end;
  371. procedure TTemplateWriter.DescrBeginOrderedList;
  372. begin
  373. end;
  374. procedure TTemplateWriter.DescrEndOrderedList;
  375. begin
  376. end;
  377. procedure TTemplateWriter.DescrBeginUnorderedList;
  378. begin
  379. end;
  380. procedure TTemplateWriter.DescrEndUnorderedList;
  381. begin
  382. end;
  383. procedure TTemplateWriter.DescrBeginDefinitionList;
  384. begin
  385. end;
  386. procedure TTemplateWriter.DescrEndDefinitionList;
  387. begin
  388. end;
  389. procedure TTemplateWriter.DescrBeginListItem;
  390. begin
  391. end;
  392. procedure TTemplateWriter.DescrEndListItem;
  393. begin
  394. end;
  395. procedure TTemplateWriter.DescrBeginDefinitionTerm;
  396. begin
  397. end;
  398. procedure TTemplateWriter.DescrEndDefinitionTerm;
  399. begin
  400. end;
  401. procedure TTemplateWriter.DescrBeginDefinitionEntry;
  402. begin
  403. end;
  404. procedure TTemplateWriter.DescrEndDefinitionEntry;
  405. begin
  406. end;
  407. procedure TTemplateWriter.DescrBeginSectionTitle;
  408. begin
  409. end;
  410. procedure TTemplateWriter.DescrBeginSectionBody;
  411. begin
  412. end;
  413. procedure TTemplateWriter.DescrEndSection;
  414. begin
  415. end;
  416. procedure TTemplateWriter.DescrBeginRemark;
  417. begin
  418. end;
  419. procedure TTemplateWriter.DescrEndRemark;
  420. begin
  421. end;
  422. procedure TTemplateWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
  423. begin
  424. end;
  425. procedure TTemplateWriter.DescrEndTable;
  426. begin
  427. end;
  428. procedure TTemplateWriter.DescrBeginTableCaption;
  429. begin
  430. end;
  431. procedure TTemplateWriter.DescrEndTableCaption;
  432. begin
  433. end;
  434. procedure TTemplateWriter.DescrBeginTableHeadRow;
  435. begin
  436. end;
  437. procedure TTemplateWriter.DescrEndTableHeadRow;
  438. begin
  439. end;
  440. procedure TTemplateWriter.DescrBeginTableRow;
  441. begin
  442. end;
  443. procedure TTemplateWriter.DescrEndTableRow;
  444. begin
  445. end;
  446. procedure TTemplateWriter.DescrBeginTableCell;
  447. begin
  448. end;
  449. procedure TTemplateWriter.DescrEndTableCell;
  450. begin
  451. end;
  452. function TTemplateWriter.InterPretOption(const Cmd, Arg: String): boolean;
  453. begin
  454. Result:=False;
  455. end;
  456. Function TTemplateWriter.GetDescrString(AContext: TPasElement; DescrNode: TDOMElement) : String;
  457. Var
  458. S : TStringStream;
  459. F : TStream;
  460. begin
  461. Result:='';
  462. if Assigned(DescrNode) then
  463. begin
  464. S:=TStringStream.Create('');
  465. Try
  466. F:=PushWriteContext(S);
  467. Try
  468. ConvertDescr(AContext, DescrNode, False);
  469. Result:=S.DataString;
  470. FInally
  471. PopWriteContext(F);
  472. end;
  473. finally
  474. S.FRee;
  475. end;
  476. end;
  477. end;
  478. function TTemplateWriter.ConstValue(ConstDecl: TPasConst): String;
  479. begin
  480. if Assigned(ConstDecl) then
  481. Result := ConstDecl.ClassName
  482. else
  483. Result := '<nil>';
  484. end;
  485. procedure TTemplateWriter.WriteExample(ADocNode: TDocNode);
  486. var
  487. Example: TDOMElement;
  488. S : string;
  489. begin
  490. // Template, change as needed.
  491. S:='';
  492. if Assigned(ADocNode) then
  493. begin
  494. Example := ADocNode.FirstExample;
  495. If Assigned(Example) then
  496. begin
  497. while Assigned(Example) do
  498. begin
  499. s:=Engine.GetExampleFileName(Example);
  500. WriteExampleFile(S);
  501. DescrEndParaGraph;
  502. Repeat
  503. Example := TDomElement(Example.NextSibling);
  504. until (Example=Nil) or ((Example.NodeType=ELEMENT_NODE) and (Example.NodeName='example'));
  505. end;
  506. end;
  507. end;
  508. end;
  509. procedure TTemplateWriter.WriteExampleFile(FN : String);
  510. Var
  511. L : TStringList;
  512. I : Integer;
  513. begin
  514. // Template, change as needed.
  515. If (FN<>'') and FileExists(FN) then
  516. begin
  517. L:=TStringList.Create;
  518. Try
  519. L.LoadFromFile(FN);
  520. For I:=0 to L.Count-1 do
  521. DescrWriteCodeLine(L[i]);
  522. finally
  523. L.Free;
  524. end;
  525. end;
  526. end;
  527. { ---------------------------------------------------------------------
  528. Actual man page writing
  529. ---------------------------------------------------------------------}
  530. procedure TTemplateWriter.WriteDoc;
  531. var
  532. i : Integer;
  533. L : TstringList;
  534. DocNode : TDocNode;
  535. begin
  536. PackageName := LowerCase(Copy(Package.Name, 2, 255));
  537. WritePackagePage;
  538. L:=TStringList.Create;
  539. Try
  540. // Sort modules.
  541. For I:=0 to Package.Modules.Count-1 do
  542. L.AddObject(TPasModule(Package.Modules[i]).Name,TPasModule(Package.Modules[i]));
  543. L.Sorted:=True;
  544. for i:=0 to L.Count - 1 do
  545. ProcessModule(TPasModule(L.Objects[i]));
  546. Finally
  547. L.Free;
  548. end;
  549. end;
  550. { ---------------------------------------------------------------------
  551. Package man page
  552. ---------------------------------------------------------------------}
  553. Procedure TTemplateWriter.WritePackagePage;
  554. var
  555. DocNode: TDocNode;
  556. L : TStringList;
  557. begin
  558. DocNode:=Engine.FindDocNode(Package);
  559. // Write topics
  560. ProcessTopics(DocNode,True);
  561. end;
  562. { ---------------------------------------------------------------------
  563. Topic support
  564. ---------------------------------------------------------------------}
  565. Procedure TTemplateWriter.ProcessTopics(DocNode : TDocNode; Subs : Boolean);
  566. Var
  567. Node,SubNode : TDocNode;
  568. begin
  569. If Not Assigned(DocNode) then
  570. Exit;
  571. Node:=DocNode.FirstChild;
  572. While Assigned(Node) do
  573. begin
  574. If Node.TopicNode then
  575. begin
  576. WriteTopicPage(DocNode,Node);
  577. If Subs then
  578. begin
  579. SubNode:=DocNode.FirstChild;
  580. While Assigned(SubNode) do
  581. If SubNode.TopicNode then
  582. WriteTopicPage(Node,SubNode);
  583. end;
  584. end;
  585. Node:=Node.NextSibling;
  586. end;
  587. end;
  588. Procedure TTemplateWriter.WriteTopicPage(Parent,Node : TDocNode);
  589. Var
  590. Element : TTopicElement;
  591. begin
  592. Element:=FindTopicElement(Node);
  593. If Not Assigned(Element) then
  594. Exit;
  595. // Write topic here
  596. end;
  597. { ---------------------------------------------------------------------
  598. Module man pages
  599. ---------------------------------------------------------------------}
  600. procedure TTemplateWriter.ProcessModule(AModule : TPasModule);
  601. begin
  602. With AModule do
  603. begin
  604. Module:=AModule;
  605. ModuleName:=Name;
  606. With InterfaceSection do
  607. begin
  608. SortElementList(Declarations);
  609. SortElementList(Types);
  610. SortElementList(Consts);
  611. SortElementList(Classes);
  612. SortElementList(Functions);
  613. SortElementList(Variables);
  614. SortElementList(ResStrings);
  615. end;
  616. WriteUnitPage(AModule);
  617. WriteUnitResourceStrings(InterfaceSection);
  618. WriteUnitConsts(InterfaceSection);
  619. WriteUnitTypes(InterfaceSection);
  620. WriteUnitVars(InterfaceSection);
  621. WriteUnitFunctionsAndProcedures(InterfaceSection);
  622. WriteUnitClasses(InterfaceSection);
  623. end;
  624. end;
  625. procedure TTemplateWriter.WriteUnitPage(AModule : TPasModule);
  626. Var
  627. DocNode : TDocNode;
  628. begin
  629. DocNode:=Engine.FindDocNode(AModule);
  630. // Write unit stuff here.
  631. end;
  632. { ---------------------------------------------------------------------
  633. Classes man pages
  634. ---------------------------------------------------------------------}
  635. procedure TTemplateWriter.WriteUnitClasses(ASection: TPasSection);
  636. var
  637. i: Integer;
  638. begin
  639. if (ASection.Classes.Count > 0) then
  640. begin
  641. for i := 0 to ASection.Classes.Count - 1 do
  642. WriteClassPage(TPasClassType(ASection.Classes[i]));
  643. end;
  644. end;
  645. procedure TTemplateWriter.WriteClassPage(ClassDecl: TPasClassType);
  646. var
  647. DocNode: TDocNode;
  648. begin
  649. DocNode:=Engine.FindDocNode(ClassDecl);
  650. // Write class here.
  651. end;
  652. { ---------------------------------------------------------------------
  653. Resource strings man page
  654. ---------------------------------------------------------------------}
  655. procedure TTemplateWriter.WriteUnitResourceStrings(ASection: TPasSection);
  656. var
  657. I : Integer;
  658. ResStrDecl : TPasResString;
  659. DocNode: TDocNode;
  660. begin
  661. for i := 0 to ASection.ResStrings.Count - 1 do
  662. begin
  663. ResStrDecl := TPasResString(ASection.ResStrings[i]);
  664. DocNode:=Engine.FindDocNode(ResStrDecl);
  665. { Write docu for resource string.}
  666. end;
  667. end;
  668. { ---------------------------------------------------------------------
  669. Constants man page
  670. ---------------------------------------------------------------------}
  671. procedure TTemplateWriter.WriteUnitConsts(ASection: TPasSection);
  672. var
  673. i: Integer;
  674. ConstDecl: TPasConst;
  675. DocNode: TDocNode;
  676. begin
  677. for i := 0 to ASection.Consts.Count - 1 do
  678. begin
  679. ConstDecl := TPasConst(ASection.Consts[i]);
  680. DocNode:=Engine.FindDocNode(ConstDecl);
  681. { Write docu for constant }
  682. end;
  683. end;
  684. { ---------------------------------------------------------------------
  685. Types man page
  686. ---------------------------------------------------------------------}
  687. procedure TTemplateWriter.WriteUnitTypes(ASection: TPasSection);
  688. var
  689. i: Integer;
  690. TypeDecl: TPasType;
  691. DocNode : TDocNode;
  692. begin
  693. for i := 0 to ASection.Types.Count - 1 do
  694. begin
  695. TypeDecl := TPasType(ASection.Types[i]);
  696. DocNode:=Engine.FindDocNode(TypeDecl);
  697. { Write docu for type }
  698. end;
  699. end;
  700. procedure TTemplateWriter.WriteEnumElements(TypeDecl : TPasEnumType);
  701. Var
  702. EV : TPasEnumValue;
  703. I : Integer;
  704. DocNode : TDocNode;
  705. begin
  706. With TypeDecl do
  707. begin
  708. SortElementList(Values);
  709. For I:=0 to Values.Count-1 do
  710. begin
  711. EV:=TPasEnumValue(Values[i]);
  712. DocNode := Engine.FindDocNode(EV);
  713. { write docu per enumeration constant as needed }
  714. end;
  715. end;
  716. end;
  717. { ---------------------------------------------------------------------
  718. Variables man page
  719. ---------------------------------------------------------------------}
  720. procedure TTemplateWriter.WriteUnitVars(ASection: TPasSection);
  721. var
  722. VarDecl: TPasVariable;
  723. i: Integer;
  724. DocNode : TDocNode;
  725. begin
  726. for i := 0 to ASection.Variables.Count - 1 do
  727. begin
  728. VarDecl := TPasVariable(ASection.Variables[i]);
  729. DocNode:=Engine.FindDocNode(VarDecl);
  730. { Write docu for variable }
  731. end;
  732. end;
  733. { ---------------------------------------------------------------------
  734. Procedure/Function/Method man page
  735. ---------------------------------------------------------------------}
  736. procedure TTemplateWriter.WriteUnitFunctionsAndProcedures(ASection: TPasSection);
  737. var
  738. i : Integer;
  739. begin
  740. // Pages for all identifiers.
  741. for i := 0 to ASection.Functions.Count - 1 do
  742. WriteProcedurePage(TPasProcedure(ASection.Functions[i]));
  743. end;
  744. procedure TTemplateWriter.WriteProcedurePage(ProcDecl : TPasProcedureBase);
  745. var
  746. DocNode: TDocNode;
  747. OP : TPasOverloadedProc;
  748. i : integer;
  749. D,N : String;
  750. begin
  751. DocNode := Engine.FindDocNode(ProcDecl);
  752. // Write arguments, if any.
  753. AppendProcedureArgsSection(TPasProcedure(ProcDecl).ProcType);
  754. If ProcDecl is TPasFunction then
  755. AppendProcedureArgsSection(TPasFunction(ProcDecl).ProcType);
  756. // Examples, is present
  757. WriteExample(DocNode);
  758. end;
  759. procedure TTemplateWriter.AppendProcedureArgsSection(Element: TPasProcedureType);
  760. var
  761. DocNode: TDocNode;
  762. i: Integer;
  763. Arg: TPasArgument;
  764. begin
  765. If Not Assigned(Element) then
  766. exit;
  767. for i := 0 to Element.Args.Count - 1 do
  768. begin
  769. Arg := TPasArgument(Element.Args[i]);
  770. DocNode:=Engine.FindDocNode(Arg);
  771. // Write docu for argument.
  772. end;
  773. end;
  774. procedure TTemplateWriter.AppendFunctionResultSection(Element: TPasFunctionType);
  775. Var
  776. ResultEl: TPasResultElement;
  777. DocNode: TDocNode;
  778. begin
  779. If Not Assigned(Element) then
  780. exit;
  781. ResultEl := TPasFunctionType(Element).ResultEl;
  782. DocNode := Engine.FindDocNode(ResultEl);
  783. // Write docu for result.
  784. end;
  785. { ---------------------------------------------------------------------
  786. Property man page
  787. ---------------------------------------------------------------------}
  788. procedure TTemplateWriter.WritePropertyPage(PropDecl : TPasProperty);
  789. var
  790. DocNode: TDocNode;
  791. N,D: String;
  792. begin
  793. DocNode := Engine.FindDocNode(PropDecl);
  794. // Write docu for property.
  795. end;
  796. Function CompareElements(P1,P2 : Pointer) : Integer;
  797. begin
  798. Result:=CompareText(TPasElement(P1).Name,TPasElement(P2).Name);
  799. end;
  800. procedure TTemplateWriter.SortElementList(List : TList);
  801. begin
  802. List.Sort(@CompareElements);
  803. end;
  804. function TTemplateWriter.FileNameExtension: String;
  805. begin
  806. Result:=TTemplateExtension;
  807. end;
  808. Class procedure TTemplateWriter.Usage(List: TStrings);
  809. begin
  810. end;
  811. function TTemplateWriter.ElementToLabel(AElement : TPasElement) : String;
  812. begin
  813. // Convert AElement to a valid label for cross-referencing.
  814. end;
  815. initialization
  816. // Do not localize.
  817. RegisterWriter(TTemplateWriter,TemplateName,STemplateUsageWriterDescr);
  818. finalization
  819. UnRegisterWriter(TemplateName);
  820. end.