dw_template.pp 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003
  1. {
  2. FPDoc - Free Pascal Documentation Tool
  3. Copyright (C) 2005 by Michael Van Canneyt
  4. * Template output generator
  5. See the file COPYING, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. }
  11. {
  12. Usage: change the constants below. Do a search&replace where TTemplateWriter
  13. is changed to TMyFormatWriter (replace MyFormat with whatever you need)
  14. and fill in all methods.
  15. If your format is linear (i.e. not some hyperlinked format, split in several
  16. output files), you should take the dw_lintmpl template instead. It will take
  17. care of all needed structure.
  18. }
  19. {$mode objfpc}
  20. {$H+}
  21. unit dw_template;
  22. interface
  23. uses
  24. Classes, SysUtils, DGlobals, dWriter, pastree, dom;
  25. Const
  26. { Change this into the name of your writer}
  27. TemplateName = 'template';
  28. { Comprehensible description goes here:}
  29. STemplateUsageWriterDescr = 'Writes output in template format';
  30. { Extension for the template }
  31. TTemplateExtension = '.tpl';
  32. Type
  33. { TTemplateWriter }
  34. TTemplateWriter = Class(TFPDocWriter)
  35. ModuleName, // Current module name
  36. PackageName: String; // Package name
  37. FStream : TStream; // Current output stream.
  38. Module: TPasModule; // Current module.
  39. Protected
  40. // Writing support.
  41. { various routines to Write to stream. }
  42. procedure Write(const s: String);
  43. procedure WriteF(const s: String; const Args: array of const);
  44. procedure WriteLn(const s: String);
  45. procedure WriteLnF(const s: String; const Args: array of const);
  46. { Replace current write stream with S, return current stream. }
  47. Function PushWriteContext(S : TStream) : TStream;
  48. { Replace current write stream with S }
  49. Procedure PopWriteContext(S : TSTream);
  50. { make sure text is interpretable: escape all special characters in some way.}
  51. Function EscapeText(const s : String) : String;
  52. { Sort a list of TPasElements }
  53. procedure SortElementList(List : TList);
  54. { Writes a description node to a stream, returns the result as a string }
  55. Function GetDescrString(AContext: TPasElement; DescrNode: TDOMElement) : String;
  56. { Determine value for constant }
  57. function ConstValue(ConstDecl: TPasConst): String; virtual;
  58. { Write the contents of an example file }
  59. Procedure WriteExampleFile(FN : String); virtual;
  60. { Write all example files, found in ADocNode. }
  61. procedure WriteExample(ADocNode: TDocNode);
  62. { Convert a TPasElement to a valid label for this backend }
  63. function ElementToLabel(AElement : TPasElement) : String;
  64. Public
  65. Constructor Create(APackage: TPasPackage; AEngine: TFPDocEngine); override;
  66. procedure WriteDoc; override;
  67. // Documentation writing methods.
  68. // Package
  69. Procedure WritePackagePage;
  70. // Topic refs
  71. Procedure ProcessTopics(DocNode : TDocNode; Subs : Boolean);
  72. // Single topic page.
  73. Procedure WriteTopicPage(Parent,Node : TDocNode);
  74. // Process a Module (=unit)
  75. procedure ProcessModule(AModule: TPasModule);
  76. // Write Unit description.
  77. procedure WriteUnitPage(AModule: TPasModule);
  78. // Do all resource strings in a unit.
  79. procedure WriteUnitResourceStrings(ASection: TPasSection);
  80. // Do all constants in a unit.
  81. procedure WriteUnitConsts(ASection: TPasSection);
  82. // Do all types in a unit.
  83. procedure WriteUnitTypes(ASection: TPasSection);
  84. // Do all variables in a unit.
  85. procedure WriteUnitVars(ASection: TPasSection);
  86. // Do all classes in a unit.
  87. procedure WriteUnitClasses(ASection: TPasSection);
  88. // Do all functions and procedures in a unit.
  89. procedure WriteUnitFunctionsAndProcedures(ASection: TPasSection);
  90. // Write elements of an enumeration type
  91. procedure WriteEnumElements(TypeDecl : TPasEnumType);
  92. // Write class documentation
  93. procedure WriteClassPage(ClassDecl: TPasClassType);
  94. // Write procedure/function documentation
  95. procedure WriteProcedurePage(ProcDecl: TPasProcedureBase);
  96. // Write procedure/function arguments documentation
  97. procedure AppendProcedureArgsSection(Element: TPasProcedureType);
  98. // Write function result documentation
  99. procedure AppendFunctionResultSection(Element: TPasFunctionType);
  100. // Write class property documentation
  101. procedure WritePropertyPage(PropDecl: TPasProperty);
  102. // To be Overriden from fpdocwriter;
  103. procedure DescrWriteText(const AText: DOMString); override;
  104. procedure DescrBeginBold; override;
  105. procedure DescrEndBold; override;
  106. procedure DescrBeginItalic; override;
  107. procedure DescrEndItalic; override;
  108. procedure DescrBeginEmph; override;
  109. procedure DescrEndEmph; override;
  110. procedure DescrWriteFileEl(const AText: DOMString); override;
  111. procedure DescrWriteKeywordEl(const AText: DOMString); override;
  112. procedure DescrWriteVarEl(const AText: DOMString); override;
  113. procedure DescrBeginLink(const AId: DOMString); override;
  114. procedure DescrEndLink; override;
  115. procedure DescrWriteLinebreak; override;
  116. procedure DescrBeginParagraph; override;
  117. procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
  118. procedure DescrWriteCodeLine(const ALine: String); override;
  119. procedure DescrEndCode; override;
  120. procedure DescrEndParagraph; override;
  121. procedure DescrBeginOrderedList; override;
  122. procedure DescrEndOrderedList; override;
  123. procedure DescrBeginUnorderedList; override;
  124. procedure DescrEndUnorderedList; override;
  125. procedure DescrBeginDefinitionList; override;
  126. procedure DescrEndDefinitionList; override;
  127. procedure DescrBeginListItem; override;
  128. procedure DescrEndListItem; override;
  129. procedure DescrBeginDefinitionTerm; override;
  130. procedure DescrEndDefinitionTerm; override;
  131. procedure DescrBeginDefinitionEntry; override;
  132. procedure DescrEndDefinitionEntry; override;
  133. procedure DescrBeginSectionTitle; override;
  134. procedure DescrBeginSectionBody; override;
  135. procedure DescrEndSection; override;
  136. procedure DescrBeginRemark; override;
  137. procedure DescrEndRemark; override;
  138. procedure DescrBeginTable(ColCount: Integer; HasBorder: Boolean); override;
  139. procedure DescrEndTable; override;
  140. procedure DescrBeginTableCaption; override;
  141. procedure DescrEndTableCaption; override;
  142. procedure DescrBeginTableHeadRow; override;
  143. procedure DescrEndTableHeadRow; override;
  144. procedure DescrBeginTableRow; override;
  145. procedure DescrEndTableRow; override;
  146. procedure DescrBeginTableCell; override;
  147. procedure DescrEndTableCell; override;
  148. // Handle options.
  149. Function InterPretOption(Const Cmd,Arg : String) : boolean; override;
  150. // Provide feedback about usage of this backend.
  151. Class procedure Usage(List: TStrings); override;
  152. // For info only. See linear writer for an example.
  153. Class Function FileNameExtension : String;virtual;
  154. end;
  155. implementation
  156. { TTemplateWriter }
  157. constructor TTemplateWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
  158. procedure AddLabel(AElement: TPasElement);
  159. begin
  160. Engine.AddLink(AElement.PathName, ElementToLabel(AElement));
  161. end;
  162. procedure AddList(AElement: TPasElement; AList: TList);
  163. var
  164. i: Integer;
  165. begin
  166. for i := 0 to AList.Count - 1 do
  167. AddLabel(TPasElement(AList[i]));
  168. end;
  169. procedure AddTopicPages(AElement: TPasElement);
  170. var
  171. PreviousTopic,
  172. TopicElement : TTopicElement;
  173. DocNode,
  174. TopicNode : TDocNode;
  175. begin
  176. DocNode:=Engine.FindDocNode(AElement);
  177. If not Assigned(DocNode) then
  178. exit;
  179. TopicNode:=DocNode.FirstChild;
  180. PreviousTopic:=Nil;
  181. While Assigned(TopicNode) do
  182. begin
  183. If TopicNode.TopicNode then
  184. begin
  185. TopicElement:=TTopicElement.Create(TopicNode.Name,AElement);
  186. Topics.Add(TopicElement);
  187. TopicElement.TopicNode:=TopicNode;
  188. TopicElement.Previous:=PreviousTopic;
  189. If Assigned(PreviousTopic) then
  190. PreviousTopic.Next:=TopicElement;
  191. PreviousTopic:=TopicElement;
  192. if AElement is TTopicElement then
  193. TTopicElement(AElement).SubTopics.Add(TopicElement);
  194. Engine.AddLink(TopicElement.PathName, ElementToLabel(TopicElement));
  195. if AElement is TTopicElement then
  196. TTopicElement(AElement).SubTopics.Add(TopicElement)
  197. else // Only one level of recursion.
  198. AddTopicPages(TopicElement);
  199. end;
  200. TopicNode:=TopicNode.NextSibling;
  201. end;
  202. end;
  203. procedure ScanModule(AModule: TPasModule);
  204. var
  205. i, j, k: Integer;
  206. ClassEl: TPasClassType;
  207. FPEl, AncestorMemberEl: TPasElement;
  208. DocNode: TDocNode;
  209. DidAutolink: Boolean;
  210. begin
  211. AddLabel(AModule);
  212. AddTopicPages(AModule);
  213. with AModule do
  214. begin
  215. AddList(AModule, InterfaceSection.ResStrings);
  216. AddList(AModule, InterfaceSection.Consts);
  217. AddList(AModule, InterfaceSection.Types);
  218. if InterfaceSection.Classes.Count > 0 then
  219. begin
  220. for i := 0 to InterfaceSection.Classes.Count - 1 do
  221. begin
  222. ClassEl := TPasClassType(InterfaceSection.Classes[i]);
  223. AddLabel(ClassEl);
  224. for j := 0 to ClassEl.Members.Count - 1 do
  225. begin
  226. FPEl := TPasElement(ClassEl.Members[j]);
  227. if ((FPEl.Visibility = visPrivate) and Engine.HidePrivate) or
  228. ((FPEl.Visibility = visProtected) and Engine.HideProtected) then
  229. continue;
  230. DocNode := Engine.FindDocNode(FPEl);
  231. if not Assigned(DocNode) then
  232. begin
  233. DidAutolink := False;
  234. if Assigned(ClassEl.AncestorType) and
  235. (ClassEl.AncestorType.ClassType = TPasClassType) then
  236. begin
  237. for k := 0 to TPasClassType(ClassEl.AncestorType).Members.Count - 1 do
  238. begin
  239. AncestorMemberEl :=
  240. TPasElement(TPasClassType(ClassEl.AncestorType).Members[k]);
  241. if AncestorMemberEl.Name = FPEl.Name then
  242. begin
  243. DocNode := Engine.FindDocNode(AncestorMemberEl);
  244. if Assigned(DocNode) then
  245. begin
  246. DidAutolink := True;
  247. Engine.AddLink(FPEl.PathName,
  248. Engine.FindAbsoluteLink(AncestorMemberEl.PathName));
  249. break;
  250. end;
  251. end;
  252. end;
  253. end;
  254. if not DidAutolink then
  255. AddLabel(FPEl);
  256. end else
  257. AddLabel(FPEl);
  258. end;
  259. end;
  260. end;
  261. AddList(AModule, InterfaceSection.Functions);
  262. AddList(AModule, InterfaceSection.Variables);
  263. end;
  264. end;
  265. var
  266. i: Integer;
  267. begin
  268. inherited;
  269. if Length(Package.Name) > 1 then
  270. AddTopicPages(Package);
  271. for i := 0 to Package.Modules.Count - 1 do
  272. ScanModule(TPasModule(Package.Modules[i]));
  273. end;
  274. { ---------------------------------------------------------------------
  275. Writing support
  276. ---------------------------------------------------------------------}
  277. Function TTemplateWriter.PushWriteContext(S : TStream) : TStream;
  278. begin
  279. Result:=FStream;
  280. FStream:=S;
  281. end;
  282. Procedure TTemplateWriter.PopWriteContext(S : TSTream);
  283. begin
  284. FStream:=S;
  285. end;
  286. function TTemplateWriter.EscapeText(const s: String): String;
  287. begin
  288. Result:=S;
  289. end;
  290. procedure TTemplateWriter.Write(const s: String);
  291. Var
  292. L : Integer;
  293. begin
  294. L:=Length(S);
  295. If (L>0) then
  296. FStream.Write(PChar(S)^,L);
  297. end;
  298. procedure TTemplateWriter.WriteF(const s: String; const Args: array of const);
  299. begin
  300. Write(Format(S,Args));
  301. end;
  302. procedure TTemplateWriter.WriteLn(const s: String);
  303. begin
  304. Write(S);
  305. Write(LineEnding);
  306. end;
  307. procedure TTemplateWriter.WriteLnF(const s: String; const Args: array of const);
  308. begin
  309. Write(Format(S,Args));
  310. Write(LineEnding);
  311. end;
  312. procedure TTemplateWriter.DescrWriteText(const AText: DOMString);
  313. begin
  314. Self.Write(EscapeText(AText));
  315. end;
  316. procedure TTemplateWriter.DescrBeginBold;
  317. begin
  318. end;
  319. procedure TTemplateWriter.DescrEndBold;
  320. begin
  321. end;
  322. procedure TTemplateWriter.DescrBeginItalic;
  323. begin
  324. end;
  325. procedure TTemplateWriter.DescrEndItalic;
  326. begin
  327. end;
  328. procedure TTemplateWriter.DescrBeginEmph;
  329. begin
  330. end;
  331. procedure TTemplateWriter.DescrEndEmph;
  332. begin
  333. end;
  334. procedure TTemplateWriter.DescrWriteFileEl(const AText: DOMString);
  335. begin
  336. end;
  337. procedure TTemplateWriter.DescrWriteKeywordEl(const AText: DOMString);
  338. begin
  339. end;
  340. procedure TTemplateWriter.DescrWriteVarEl(const AText: DOMString);
  341. begin
  342. end;
  343. procedure TTemplateWriter.DescrBeginLink(const AId: DOMString);
  344. begin
  345. end;
  346. procedure TTemplateWriter.DescrEndLink;
  347. begin
  348. end;
  349. procedure TTemplateWriter.DescrWriteLinebreak;
  350. begin
  351. end;
  352. procedure TTemplateWriter.DescrBeginParagraph;
  353. begin
  354. end;
  355. procedure TTemplateWriter.DescrBeginCode(HasBorder: Boolean;
  356. const AHighlighterName: String);
  357. begin
  358. end;
  359. procedure TTemplateWriter.DescrWriteCodeLine(const ALine: String);
  360. begin
  361. Writeln(ALine);
  362. DescrWriteLinebreak;
  363. end;
  364. procedure TTemplateWriter.DescrEndCode;
  365. begin
  366. end;
  367. procedure TTemplateWriter.DescrEndParagraph;
  368. begin
  369. end;
  370. procedure TTemplateWriter.DescrBeginOrderedList;
  371. begin
  372. end;
  373. procedure TTemplateWriter.DescrEndOrderedList;
  374. begin
  375. end;
  376. procedure TTemplateWriter.DescrBeginUnorderedList;
  377. begin
  378. end;
  379. procedure TTemplateWriter.DescrEndUnorderedList;
  380. begin
  381. end;
  382. procedure TTemplateWriter.DescrBeginDefinitionList;
  383. begin
  384. end;
  385. procedure TTemplateWriter.DescrEndDefinitionList;
  386. begin
  387. end;
  388. procedure TTemplateWriter.DescrBeginListItem;
  389. begin
  390. end;
  391. procedure TTemplateWriter.DescrEndListItem;
  392. begin
  393. end;
  394. procedure TTemplateWriter.DescrBeginDefinitionTerm;
  395. begin
  396. end;
  397. procedure TTemplateWriter.DescrEndDefinitionTerm;
  398. begin
  399. end;
  400. procedure TTemplateWriter.DescrBeginDefinitionEntry;
  401. begin
  402. end;
  403. procedure TTemplateWriter.DescrEndDefinitionEntry;
  404. begin
  405. end;
  406. procedure TTemplateWriter.DescrBeginSectionTitle;
  407. begin
  408. end;
  409. procedure TTemplateWriter.DescrBeginSectionBody;
  410. begin
  411. end;
  412. procedure TTemplateWriter.DescrEndSection;
  413. begin
  414. end;
  415. procedure TTemplateWriter.DescrBeginRemark;
  416. begin
  417. end;
  418. procedure TTemplateWriter.DescrEndRemark;
  419. begin
  420. end;
  421. procedure TTemplateWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
  422. begin
  423. end;
  424. procedure TTemplateWriter.DescrEndTable;
  425. begin
  426. end;
  427. procedure TTemplateWriter.DescrBeginTableCaption;
  428. begin
  429. end;
  430. procedure TTemplateWriter.DescrEndTableCaption;
  431. begin
  432. end;
  433. procedure TTemplateWriter.DescrBeginTableHeadRow;
  434. begin
  435. end;
  436. procedure TTemplateWriter.DescrEndTableHeadRow;
  437. begin
  438. end;
  439. procedure TTemplateWriter.DescrBeginTableRow;
  440. begin
  441. end;
  442. procedure TTemplateWriter.DescrEndTableRow;
  443. begin
  444. end;
  445. procedure TTemplateWriter.DescrBeginTableCell;
  446. begin
  447. end;
  448. procedure TTemplateWriter.DescrEndTableCell;
  449. begin
  450. end;
  451. function TTemplateWriter.InterPretOption(const Cmd, Arg: String): boolean;
  452. begin
  453. Result:=False;
  454. end;
  455. Function TTemplateWriter.GetDescrString(AContext: TPasElement; DescrNode: TDOMElement) : String;
  456. Var
  457. S : TStringStream;
  458. F : TStream;
  459. begin
  460. Result:='';
  461. if Assigned(DescrNode) then
  462. begin
  463. S:=TStringStream.Create('');
  464. Try
  465. F:=PushWriteContext(S);
  466. Try
  467. ConvertDescr(AContext, DescrNode, False);
  468. Result:=S.DataString;
  469. FInally
  470. PopWriteContext(F);
  471. end;
  472. finally
  473. S.FRee;
  474. end;
  475. end;
  476. end;
  477. function TTemplateWriter.ConstValue(ConstDecl: TPasConst): String;
  478. begin
  479. if Assigned(ConstDecl) then
  480. Result := ConstDecl.ClassName
  481. else
  482. Result := '<nil>';
  483. end;
  484. procedure TTemplateWriter.WriteExample(ADocNode: TDocNode);
  485. var
  486. Example: TDOMElement;
  487. S : string;
  488. begin
  489. // Template, change as needed.
  490. S:='';
  491. if Assigned(ADocNode) then
  492. begin
  493. Example := ADocNode.FirstExample;
  494. If Assigned(Example) then
  495. begin
  496. while Assigned(Example) do
  497. begin
  498. s:=Engine.GetExampleFileName(Example);
  499. if (s<>'') then
  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.