dw_template.pp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002
  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. WriteExampleFile(S);
  500. DescrEndParaGraph;
  501. Repeat
  502. Example := TDomElement(Example.NextSibling);
  503. until (Example=Nil) or ((Example.NodeType=ELEMENT_NODE) and (Example.NodeName='example'));
  504. end;
  505. end;
  506. end;
  507. end;
  508. procedure TTemplateWriter.WriteExampleFile(FN : String);
  509. Var
  510. L : TStringList;
  511. I : Integer;
  512. begin
  513. // Template, change as needed.
  514. If (FN<>'') and FileExists(FN) then
  515. begin
  516. L:=TStringList.Create;
  517. Try
  518. L.LoadFromFile(FN);
  519. For I:=0 to L.Count-1 do
  520. DescrWriteCodeLine(L[i]);
  521. finally
  522. L.Free;
  523. end;
  524. end;
  525. end;
  526. { ---------------------------------------------------------------------
  527. Actual man page writing
  528. ---------------------------------------------------------------------}
  529. procedure TTemplateWriter.WriteDoc;
  530. var
  531. i : Integer;
  532. L : TstringList;
  533. DocNode : TDocNode;
  534. begin
  535. PackageName := LowerCase(Copy(Package.Name, 2, 255));
  536. WritePackagePage;
  537. L:=TStringList.Create;
  538. Try
  539. // Sort modules.
  540. For I:=0 to Package.Modules.Count-1 do
  541. L.AddObject(TPasModule(Package.Modules[i]).Name,TPasModule(Package.Modules[i]));
  542. L.Sorted:=True;
  543. for i:=0 to L.Count - 1 do
  544. ProcessModule(TPasModule(L.Objects[i]));
  545. Finally
  546. L.Free;
  547. end;
  548. end;
  549. { ---------------------------------------------------------------------
  550. Package man page
  551. ---------------------------------------------------------------------}
  552. Procedure TTemplateWriter.WritePackagePage;
  553. var
  554. DocNode: TDocNode;
  555. L : TStringList;
  556. begin
  557. DocNode:=Engine.FindDocNode(Package);
  558. // Write topics
  559. ProcessTopics(DocNode,True);
  560. end;
  561. { ---------------------------------------------------------------------
  562. Topic support
  563. ---------------------------------------------------------------------}
  564. Procedure TTemplateWriter.ProcessTopics(DocNode : TDocNode; Subs : Boolean);
  565. Var
  566. Node,SubNode : TDocNode;
  567. begin
  568. If Not Assigned(DocNode) then
  569. Exit;
  570. Node:=DocNode.FirstChild;
  571. While Assigned(Node) do
  572. begin
  573. If Node.TopicNode then
  574. begin
  575. WriteTopicPage(DocNode,Node);
  576. If Subs then
  577. begin
  578. SubNode:=DocNode.FirstChild;
  579. While Assigned(SubNode) do
  580. If SubNode.TopicNode then
  581. WriteTopicPage(Node,SubNode);
  582. end;
  583. end;
  584. Node:=Node.NextSibling;
  585. end;
  586. end;
  587. Procedure TTemplateWriter.WriteTopicPage(Parent,Node : TDocNode);
  588. Var
  589. Element : TTopicElement;
  590. begin
  591. Element:=FindTopicElement(Node);
  592. If Not Assigned(Element) then
  593. Exit;
  594. // Write topic here
  595. end;
  596. { ---------------------------------------------------------------------
  597. Module man pages
  598. ---------------------------------------------------------------------}
  599. procedure TTemplateWriter.ProcessModule(AModule : TPasModule);
  600. begin
  601. With AModule do
  602. begin
  603. Module:=AModule;
  604. ModuleName:=Name;
  605. With InterfaceSection do
  606. begin
  607. SortElementList(Declarations);
  608. SortElementList(Types);
  609. SortElementList(Consts);
  610. SortElementList(Classes);
  611. SortElementList(Functions);
  612. SortElementList(Variables);
  613. SortElementList(ResStrings);
  614. end;
  615. WriteUnitPage(AModule);
  616. WriteUnitResourceStrings(InterfaceSection);
  617. WriteUnitConsts(InterfaceSection);
  618. WriteUnitTypes(InterfaceSection);
  619. WriteUnitVars(InterfaceSection);
  620. WriteUnitFunctionsAndProcedures(InterfaceSection);
  621. WriteUnitClasses(InterfaceSection);
  622. end;
  623. end;
  624. procedure TTemplateWriter.WriteUnitPage(AModule : TPasModule);
  625. Var
  626. DocNode : TDocNode;
  627. begin
  628. DocNode:=Engine.FindDocNode(AModule);
  629. // Write unit stuff here.
  630. end;
  631. { ---------------------------------------------------------------------
  632. Classes man pages
  633. ---------------------------------------------------------------------}
  634. procedure TTemplateWriter.WriteUnitClasses(ASection: TPasSection);
  635. var
  636. i: Integer;
  637. begin
  638. if (ASection.Classes.Count > 0) then
  639. begin
  640. for i := 0 to ASection.Classes.Count - 1 do
  641. WriteClassPage(TPasClassType(ASection.Classes[i]));
  642. end;
  643. end;
  644. procedure TTemplateWriter.WriteClassPage(ClassDecl: TPasClassType);
  645. var
  646. DocNode: TDocNode;
  647. begin
  648. DocNode:=Engine.FindDocNode(ClassDecl);
  649. // Write class here.
  650. end;
  651. { ---------------------------------------------------------------------
  652. Resource strings man page
  653. ---------------------------------------------------------------------}
  654. procedure TTemplateWriter.WriteUnitResourceStrings(ASection: TPasSection);
  655. var
  656. I : Integer;
  657. ResStrDecl : TPasResString;
  658. DocNode: TDocNode;
  659. begin
  660. for i := 0 to ASection.ResStrings.Count - 1 do
  661. begin
  662. ResStrDecl := TPasResString(ASection.ResStrings[i]);
  663. DocNode:=Engine.FindDocNode(ResStrDecl);
  664. { Write docu for resource string.}
  665. end;
  666. end;
  667. { ---------------------------------------------------------------------
  668. Constants man page
  669. ---------------------------------------------------------------------}
  670. procedure TTemplateWriter.WriteUnitConsts(ASection: TPasSection);
  671. var
  672. i: Integer;
  673. ConstDecl: TPasConst;
  674. DocNode: TDocNode;
  675. begin
  676. for i := 0 to ASection.Consts.Count - 1 do
  677. begin
  678. ConstDecl := TPasConst(ASection.Consts[i]);
  679. DocNode:=Engine.FindDocNode(ConstDecl);
  680. { Write docu for constant }
  681. end;
  682. end;
  683. { ---------------------------------------------------------------------
  684. Types man page
  685. ---------------------------------------------------------------------}
  686. procedure TTemplateWriter.WriteUnitTypes(ASection: TPasSection);
  687. var
  688. i: Integer;
  689. TypeDecl: TPasType;
  690. DocNode : TDocNode;
  691. begin
  692. for i := 0 to ASection.Types.Count - 1 do
  693. begin
  694. TypeDecl := TPasType(ASection.Types[i]);
  695. DocNode:=Engine.FindDocNode(TypeDecl);
  696. { Write docu for type }
  697. end;
  698. end;
  699. procedure TTemplateWriter.WriteEnumElements(TypeDecl : TPasEnumType);
  700. Var
  701. EV : TPasEnumValue;
  702. I : Integer;
  703. DocNode : TDocNode;
  704. begin
  705. With TypeDecl do
  706. begin
  707. SortElementList(Values);
  708. For I:=0 to Values.Count-1 do
  709. begin
  710. EV:=TPasEnumValue(Values[i]);
  711. DocNode := Engine.FindDocNode(EV);
  712. { write docu per enumeration constant as needed }
  713. end;
  714. end;
  715. end;
  716. { ---------------------------------------------------------------------
  717. Variables man page
  718. ---------------------------------------------------------------------}
  719. procedure TTemplateWriter.WriteUnitVars(ASection: TPasSection);
  720. var
  721. VarDecl: TPasVariable;
  722. i: Integer;
  723. DocNode : TDocNode;
  724. begin
  725. for i := 0 to ASection.Variables.Count - 1 do
  726. begin
  727. VarDecl := TPasVariable(ASection.Variables[i]);
  728. DocNode:=Engine.FindDocNode(VarDecl);
  729. { Write docu for variable }
  730. end;
  731. end;
  732. { ---------------------------------------------------------------------
  733. Procedure/Function/Method man page
  734. ---------------------------------------------------------------------}
  735. procedure TTemplateWriter.WriteUnitFunctionsAndProcedures(ASection: TPasSection);
  736. var
  737. i : Integer;
  738. begin
  739. // Pages for all identifiers.
  740. for i := 0 to ASection.Functions.Count - 1 do
  741. WriteProcedurePage(TPasProcedure(ASection.Functions[i]));
  742. end;
  743. procedure TTemplateWriter.WriteProcedurePage(ProcDecl : TPasProcedureBase);
  744. var
  745. DocNode: TDocNode;
  746. OP : TPasOverloadedProc;
  747. i : integer;
  748. D,N : String;
  749. begin
  750. DocNode := Engine.FindDocNode(ProcDecl);
  751. // Write arguments, if any.
  752. AppendProcedureArgsSection(TPasProcedure(ProcDecl).ProcType);
  753. If ProcDecl is TPasFunction then
  754. AppendProcedureArgsSection(TPasFunction(ProcDecl).ProcType);
  755. // Examples, is present
  756. WriteExample(DocNode);
  757. end;
  758. procedure TTemplateWriter.AppendProcedureArgsSection(Element: TPasProcedureType);
  759. var
  760. DocNode: TDocNode;
  761. i: Integer;
  762. Arg: TPasArgument;
  763. begin
  764. If Not Assigned(Element) then
  765. exit;
  766. for i := 0 to Element.Args.Count - 1 do
  767. begin
  768. Arg := TPasArgument(Element.Args[i]);
  769. DocNode:=Engine.FindDocNode(Arg);
  770. // Write docu for argument.
  771. end;
  772. end;
  773. procedure TTemplateWriter.AppendFunctionResultSection(Element: TPasFunctionType);
  774. Var
  775. ResultEl: TPasResultElement;
  776. DocNode: TDocNode;
  777. begin
  778. If Not Assigned(Element) then
  779. exit;
  780. ResultEl := TPasFunctionType(Element).ResultEl;
  781. DocNode := Engine.FindDocNode(ResultEl);
  782. // Write docu for result.
  783. end;
  784. { ---------------------------------------------------------------------
  785. Property man page
  786. ---------------------------------------------------------------------}
  787. procedure TTemplateWriter.WritePropertyPage(PropDecl : TPasProperty);
  788. var
  789. DocNode: TDocNode;
  790. N,D: String;
  791. begin
  792. DocNode := Engine.FindDocNode(PropDecl);
  793. // Write docu for property.
  794. end;
  795. Function CompareElements(P1,P2 : Pointer) : Integer;
  796. begin
  797. Result:=CompareText(TPasElement(P1).Name,TPasElement(P2).Name);
  798. end;
  799. procedure TTemplateWriter.SortElementList(List : TList);
  800. begin
  801. List.Sort(@CompareElements);
  802. end;
  803. function TTemplateWriter.FileNameExtension: String;
  804. begin
  805. Result:=TTemplateExtension;
  806. end;
  807. Class procedure TTemplateWriter.Usage(List: TStrings);
  808. begin
  809. end;
  810. function TTemplateWriter.ElementToLabel(AElement : TPasElement) : String;
  811. begin
  812. // Convert AElement to a valid label for cross-referencing.
  813. end;
  814. initialization
  815. // Do not localize.
  816. RegisterWriter(TTemplateWriter,TemplateName,STemplateUsageWriterDescr);
  817. finalization
  818. UnRegisterWriter(TemplateName);
  819. end.