dw_latex.pp 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504
  1. {
  2. $Id$
  3. FPDoc - Free Pascal Documentation Tool
  4. Copyright (C) 2000 - 2003 by
  5. Areca Systems GmbH / Sebastian Guenther, [email protected]
  6. * LaTeX output generator
  7. See the file COPYING, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. }
  13. unit dw_LaTeX;
  14. {$MODE objfpc}
  15. {$H+}
  16. interface
  17. uses DOM, dGlobals, PasTree;
  18. const
  19. LateXHighLight : Boolean = False;
  20. TexExtension : String = '.tex';
  21. procedure CreateLaTeXDocForPackage(APackage: TPasPackage; AEngine: TFPDocEngine);
  22. implementation
  23. uses SysUtils, Classes, dWriter;
  24. type
  25. TLabelType = (ltConst,ltVar,ltType,ltFunction,ltProcedure,ltClass,
  26. ltChapter,ltSection,ltSubsection,
  27. ltTable,ltFigure);
  28. TLaTeXWriter = class(TFPDocWriter)
  29. protected
  30. f: Text;
  31. FLink: String;
  32. Package: TPasPackage;
  33. PackageName: String;
  34. Module: TPasModule;
  35. ModuleName: String;
  36. FTableCount : Integer;
  37. FInVerbatim : Boolean;
  38. TableRowStartFlag, TableCaptionWritten: Boolean;
  39. function GetLabel(AElement: TPasElement): String;
  40. procedure Write(const s: String);
  41. procedure WriteF(const s: String; const Args: array of const);
  42. procedure WriteLn(const s: String);
  43. procedure WriteLnF(const s: String; const Args: array of const);
  44. // Tex functions
  45. procedure WriteLabel(El: TPasElement);
  46. procedure WriteLabel(const s: String);
  47. procedure WriteIndex(El: TPasElement);
  48. procedure WriteIndex(const s: String);
  49. procedure StartListing(Frames: Boolean; const name: String);
  50. procedure StartListing(Frames: Boolean);
  51. procedure EndListing;
  52. Function EscapeTex(S : String) : String;
  53. Function StripTex(S : String) : String;
  54. procedure WriteCommentLine;
  55. procedure WriteComment(Comment : String);
  56. procedure StartSection(SectionName : String; SectionLabel : String);
  57. procedure StartSection(SectionName : String);
  58. procedure StartSubSection(SubSectionName : String; SubSectionLabel : String);
  59. procedure StartSubSection(SubSectionName : String);
  60. procedure StartChapter(ChapterName : String; ChapterLabel : String);
  61. procedure StartChapter(ChapterName : String);
  62. // Description node conversion
  63. procedure DescrWriteText(const AText: DOMString); override;
  64. procedure DescrBeginBold; override;
  65. procedure DescrEndBold; override;
  66. procedure DescrBeginItalic; override;
  67. procedure DescrEndItalic; override;
  68. procedure DescrBeginEmph; override;
  69. procedure DescrEndEmph; override;
  70. procedure DescrWriteFileEl(const AText: DOMString); override;
  71. procedure DescrWriteKeywordEl(const AText: DOMString); override;
  72. procedure DescrWriteVarEl(const AText: DOMString); override;
  73. procedure DescrBeginLink(const AId: DOMString); override;
  74. procedure DescrEndLink; override;
  75. procedure DescrWriteLinebreak; override;
  76. procedure DescrBeginParagraph; override;
  77. procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
  78. procedure DescrWriteCodeLine(const ALine: String); override;
  79. procedure DescrEndCode; override;
  80. procedure DescrEndParagraph; override;
  81. procedure DescrBeginOrderedList; override;
  82. procedure DescrEndOrderedList; override;
  83. procedure DescrBeginUnorderedList; override;
  84. procedure DescrEndUnorderedList; override;
  85. procedure DescrBeginDefinitionList; override;
  86. procedure DescrEndDefinitionList; override;
  87. procedure DescrBeginListItem; override;
  88. procedure DescrEndListItem; override;
  89. procedure DescrBeginDefinitionTerm; override;
  90. procedure DescrEndDefinitionTerm; override;
  91. procedure DescrBeginDefinitionEntry; override;
  92. procedure DescrEndDefinitionEntry; override;
  93. procedure DescrBeginSectionTitle; override;
  94. procedure DescrBeginSectionBody; override;
  95. procedure DescrEndSection; override;
  96. procedure DescrBeginRemark; override;
  97. procedure DescrEndRemark; override;
  98. procedure DescrBeginTable(ColCount: Integer; HasBorder: Boolean); override;
  99. procedure DescrEndTable; override;
  100. procedure DescrBeginTableCaption; override;
  101. procedure DescrEndTableCaption; override;
  102. procedure DescrBeginTableHeadRow; override;
  103. procedure DescrEndTableHeadRow; override;
  104. procedure DescrBeginTableRow; override;
  105. procedure DescrEndTableRow; override;
  106. procedure DescrBeginTableCell; override;
  107. procedure DescrEndTableCell; override;
  108. procedure WriteDescr(Element: TPasElement);
  109. procedure WriteDescr(AContext: TPasElement; DescrNode: TDOMElement);
  110. function ConstValue(ConstDecl: TPasConst): String;
  111. procedure ProcessSection(ASection: TPasSection);
  112. // Documentation writing methods.
  113. procedure WriteResourceStrings(ASection: TPasSection);
  114. procedure WriteUnitOverview(ASection: TPasSection);
  115. procedure WriteVarsConstsTypes(ASection: TPasSection);
  116. procedure WriteConsts(ASection: TPasSection);
  117. procedure WriteTypes(ASection: TPasSection);
  118. procedure WriteEnumElements(TypeDecl : TPasEnumType);
  119. procedure WriteVars(ASection: TPasSection);
  120. procedure WriteFunctionsAndProcedures(ASection: TPasSection);
  121. procedure WriteProcedure(ProcDecl: TPasProcedureBase);
  122. procedure WriteClasses(ASection: TPasSection);
  123. procedure WriteClassDecl(ClassDecl: TPasClassType);
  124. procedure WriteClassMethodOverview(ClassDecl: TPasClassType);
  125. procedure WriteClassPropertyOverview(ClassDecl: TPasClassType);
  126. procedure WriteProperty(PropDecl: TPasProperty);
  127. procedure WriteExample(ADocNode: TDocNode);
  128. procedure WriteSeeAlso(ADocNode: TDocNode);
  129. procedure WriteSeeAlso(ADocNode: TDocNode; InList : Boolean);
  130. procedure SortElementList(List : TList);
  131. Function ShowMember(M : TPasElement) : boolean;
  132. Procedure ProcessPackage;
  133. Procedure ProcessTopics(DocNode : TDocNode; Alevel : Integer);
  134. Procedure WriteTopicNode(Node : TDocNode; Level : Integer);
  135. public
  136. constructor Create(APackage: TPasPackage; AEngine: TFPDocEngine);
  137. procedure WriteDoc;
  138. end;
  139. constructor TLaTeXWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
  140. procedure AddLabel(AElement: TPasElement);
  141. begin
  142. Engine.AddLink(AElement.PathName, GetLabel(AElement));
  143. end;
  144. procedure AddList(AElement: TPasElement; AList: TList);
  145. var
  146. i: Integer;
  147. begin
  148. for i := 0 to AList.Count - 1 do
  149. AddLabel(TPasElement(AList[i]));
  150. end;
  151. procedure AddTopicPages(AElement: TPasElement);
  152. var
  153. PreviousTopic,
  154. TopicElement : TTopicElement;
  155. DocNode,
  156. TopicNode : TDocNode;
  157. begin
  158. DocNode:=Engine.FindDocNode(AElement);
  159. If not Assigned(DocNode) then
  160. exit;
  161. TopicNode:=DocNode.FirstChild;
  162. PreviousTopic:=Nil;
  163. While Assigned(TopicNode) do
  164. begin
  165. If TopicNode.TopicNode then
  166. begin
  167. TopicElement:=TTopicElement.Create(TopicNode.Name,AElement);
  168. Topics.Add(TopicElement);
  169. TopicElement.TopicNode:=TopicNode;
  170. TopicElement.Previous:=PreviousTopic;
  171. If Assigned(PreviousTopic) then
  172. PreviousTopic.Next:=TopicElement;
  173. PreviousTopic:=TopicElement;
  174. if AElement is TTopicElement then
  175. TTopicElement(AElement).SubTopics.Add(TopicElement);
  176. Engine.AddLink(TopicElement.PathName, GetLabel(TopicElement));
  177. if AElement is TTopicElement then
  178. TTopicElement(AElement).SubTopics.Add(TopicElement)
  179. else // Only one level of recursion.
  180. AddTopicPages(TopicElement);
  181. end;
  182. TopicNode:=TopicNode.NextSibling;
  183. end;
  184. end;
  185. procedure ScanModule(AModule: TPasModule);
  186. var
  187. i, j, k: Integer;
  188. s: String;
  189. ClassEl: TPasClassType;
  190. FPEl, AncestorMemberEl: TPasElement;
  191. DocNode: TDocNode;
  192. DidAutolink: Boolean;
  193. begin
  194. AddLabel(AModule);
  195. AddTopicPages(AModule);
  196. with AModule do
  197. begin
  198. AddList(AModule, InterfaceSection.ResStrings);
  199. AddList(AModule, InterfaceSection.Consts);
  200. AddList(AModule, InterfaceSection.Types);
  201. if InterfaceSection.Classes.Count > 0 then
  202. begin
  203. for i := 0 to InterfaceSection.Classes.Count - 1 do
  204. begin
  205. ClassEl := TPasClassType(InterfaceSection.Classes[i]);
  206. AddLabel(ClassEl);
  207. for j := 0 to ClassEl.Members.Count - 1 do
  208. begin
  209. FPEl := TPasElement(ClassEl.Members[j]);
  210. if ((FPEl.Visibility = visPrivate) and Engine.HidePrivate) or
  211. ((FPEl.Visibility = visProtected) and Engine.HideProtected) then
  212. continue;
  213. DocNode := Engine.FindDocNode(FPEl);
  214. if not Assigned(DocNode) then
  215. begin
  216. DidAutolink := False;
  217. if Assigned(ClassEl.AncestorType) and
  218. (ClassEl.AncestorType.ClassType = TPasClassType) then
  219. begin
  220. for k := 0 to TPasClassType(ClassEl.AncestorType).Members.Count - 1 do
  221. begin
  222. AncestorMemberEl :=
  223. TPasElement(TPasClassType(ClassEl.AncestorType).Members[k]);
  224. if AncestorMemberEl.Name = FPEl.Name then
  225. begin
  226. DocNode := Engine.FindDocNode(AncestorMemberEl);
  227. if Assigned(DocNode) then
  228. begin
  229. DidAutolink := True;
  230. Engine.AddLink(FPEl.PathName,
  231. Engine.FindAbsoluteLink(AncestorMemberEl.PathName));
  232. break;
  233. end;
  234. end;
  235. end;
  236. end;
  237. if not DidAutolink then
  238. AddLabel(FPEl);
  239. end else
  240. AddLabel(FPEl);
  241. end;
  242. end;
  243. end;
  244. AddList(AModule, InterfaceSection.Functions);
  245. AddList(AModule, InterfaceSection.Variables);
  246. end;
  247. end;
  248. var
  249. i: Integer;
  250. begin
  251. inherited Create(AEngine);
  252. Package := APackage;
  253. { Allocate labels for all elements for which we are going to create
  254. documentation. This is needed for links to work correctly. }
  255. // Allocate label for the package itself, if a name is given (i.e. <> '#')
  256. if Length(Package.Name) > 1 then
  257. begin
  258. AddLabel(Package);
  259. AddTopicPages(Package);
  260. end;
  261. for i := 0 to Package.Modules.Count - 1 do
  262. ScanModule(TPasModule(Package.Modules[i]));
  263. end;
  264. Procedure TLatexWriter.ProcessPackage;
  265. var
  266. i: Integer;
  267. UnitRef: TPasType;
  268. DocNode: TDocNode;
  269. First : Boolean;
  270. begin
  271. DocNode:=Engine.FindDocNode(Package);
  272. if Assigned(DocNode) and not IsDescrNodeEmpty(DocNode.Descr) then
  273. begin
  274. WriteLnF('\section{%s}', [EscapeTex(SDocOverview)]);
  275. WriteDescr(Package, DocNode.Descr);
  276. Writeln('');
  277. end;
  278. WriteSeeAlso(DocNode,True);
  279. ProcessTopics(DocNode,1);
  280. end;
  281. Procedure TlatexWriter.ProcessTopics(DocNode : TDocNode; Alevel : Integer);
  282. Var
  283. Node : TDocNode;
  284. First : Boolean;
  285. begin
  286. If Not Assigned(DocNode) then
  287. Exit;
  288. Node:=DocNode.FirstChild;
  289. First:=True;
  290. While Assigned(Node) do
  291. begin
  292. If Node.TopicNode then
  293. begin
  294. WriteTopicNode(Node,ALevel);
  295. First:=False;
  296. end;
  297. Node:=Node.NextSibling;
  298. end;
  299. end;
  300. Procedure TLatexWriter.WriteTopicNode(Node : TDocNode; Level : Integer);
  301. Var
  302. Element : TTopicElement;
  303. SubNode : TDocNode;
  304. begin
  305. Element:=FindTopicElement(Node);
  306. If Not Assigned(Element) then
  307. Exit;
  308. Case Level of
  309. 1 : Write('\section{');
  310. 2 : Write('\subsection{');
  311. 3 : Write('\subsubsection{');
  312. end;
  313. WriteDescr(Element,Node.ShortDescr);
  314. Writeln('}');
  315. WriteLabel(Element);
  316. If Assigned(Node.Descr) then
  317. WriteDescr(Element,Node.Descr);
  318. WriteSeeAlso(Node,True);
  319. If Level<3 then
  320. begin
  321. SubNode:=Node.FirstChild;
  322. While Assigned(SubNode) do
  323. begin
  324. If SubNode.TopicNode then
  325. WriteTopicNode(SubNode,Level+1);
  326. SubNode:=SubNode.NextSibling;
  327. end;
  328. end;
  329. end;
  330. procedure TLaTeXWriter.WriteDoc;
  331. var
  332. i : Integer;
  333. DocNode : TDocNode;
  334. begin
  335. PackageName := LowerCase(Copy(Package.Name, 2, 255));
  336. If (Engine.OutPut='') then
  337. Engine.Output:=PackageName+TexExtension;
  338. Assign(f, Engine.Output);
  339. Rewrite(f);
  340. try
  341. WriteLn('% This file has been created automatically by FPDoc,');
  342. WriteLn('% (c) 2000-2003 by Areca Systems GmbH / Sebastian Guenther ([email protected])');
  343. ProcessPackage;
  344. for i := 0 to Package.Modules.Count - 1 do
  345. begin
  346. Module := TPasModule(Package.Modules[i]);
  347. ModuleName := LowerCase(Module.Name);
  348. WriteLn('');
  349. WriteLnF('\chapter{%s}', [EscapeTex(Format(SDocUnitTitle, [Module.Name]))]);
  350. WriteLabel(Module);
  351. DocNode:=Engine.FindDocNode(Module);
  352. If Assigned(DocNode) then
  353. ProcessTopics(DocNode,1);
  354. ProcessSection(Module.InterfaceSection);
  355. end;
  356. finally
  357. Close(f);
  358. end;
  359. end;
  360. function TLaTeXWriter.GetLabel(AElement: TPasElement): String;
  361. var
  362. i: Integer;
  363. begin
  364. if AElement.ClassType = TPasUnresolvedTypeRef then
  365. Result := Engine.ResolveLink(Module, AElement.Name)
  366. else
  367. begin
  368. Result := AElement.PathName;
  369. Result := LowerCase(Copy(Result, 2, Length(Result) - 1));
  370. end;
  371. for i := 1 to Length(Result) do
  372. if Result[i] = '.' then
  373. Result[i] := ':';
  374. end;
  375. procedure TLaTeXWriter.Write(const s: String);
  376. begin
  377. System.Write(f, s);
  378. end;
  379. procedure TLaTeXWriter.WriteF(const s: String; const Args: array of const);
  380. begin
  381. System.Write(f, Format(s, Args));
  382. end;
  383. procedure TLaTeXWriter.WriteLn(const s: String);
  384. begin
  385. System.WriteLn(f, s);
  386. end;
  387. procedure TLaTeXWriter.WriteLnF(const s: String; const Args: array of const);
  388. begin
  389. System.WriteLn(f, Format(s, Args));
  390. end;
  391. Function TLatexWriter.EscapeTex(S : String) : String;
  392. var
  393. i: Integer;
  394. begin
  395. if FInVerBatim=True then
  396. Result:=S
  397. else
  398. begin
  399. SetLength(Result, 0);
  400. for i := 1 to Length(S) do
  401. case S[i] of
  402. '&','{','}','#','_','$','%': // Escape these characters
  403. Result := Result + '\' + S[i];
  404. '~','^':
  405. Result := Result + '\'+S[i]+' ';
  406. '\':
  407. Result:=Result+'$\backslash$'
  408. else
  409. Result := Result + S[i];
  410. end;
  411. end;
  412. end;
  413. Function TLatexWriter.StripTex(S : String) : String;
  414. var
  415. I,L: Integer;
  416. begin
  417. SetLength(Result, 0);
  418. for i := 1 to Length(S) do
  419. If not (S[i] in ['&','{','}','#','_','$','%','''','~','^', '\']) then
  420. Result := Result + S[i];
  421. end;
  422. procedure TLaTeXWriter.DescrWriteText(const AText: DOMString);
  423. begin
  424. Write(EscapeTex(AText));
  425. end;
  426. procedure TLaTeXWriter.DescrBeginBold;
  427. begin
  428. Write('\textbf{');
  429. end;
  430. procedure TLaTeXWriter.DescrEndBold;
  431. begin
  432. Write('}');
  433. end;
  434. procedure TLaTeXWriter.DescrBeginItalic;
  435. begin
  436. Write('\textit{');
  437. end;
  438. procedure TLaTeXWriter.DescrEndItalic;
  439. begin
  440. Write('}');
  441. end;
  442. procedure TLaTeXWriter.DescrBeginEmph;
  443. begin
  444. Write('\emph{');
  445. end;
  446. procedure TLaTeXWriter.DescrEndEmph;
  447. begin
  448. Write('}');
  449. end;
  450. procedure TLaTeXWriter.DescrWriteFileEl(const AText: DOMString);
  451. begin
  452. Write('\file{');
  453. DescrWriteText(AText);
  454. Write('}');
  455. end;
  456. procedure TLaTeXWriter.DescrWriteKeywordEl(const AText: DOMString);
  457. begin
  458. Write('\textbf{\\ttfamily ');
  459. DescrWriteText(AText);
  460. Write('}');
  461. end;
  462. procedure TLaTeXWriter.DescrWriteVarEl(const AText: DOMString);
  463. begin
  464. Write('\var{');
  465. DescrWriteText(AText);
  466. Write('}');
  467. end;
  468. procedure TLaTeXWriter.DescrBeginLink(const AId: DOMString);
  469. var
  470. i: Integer;
  471. begin
  472. FLink := Engine.ResolveLink(Module, AId);
  473. // System.WriteLn('Link "', AId, '" => ', FLink);
  474. end;
  475. procedure TLaTeXWriter.DescrEndLink;
  476. begin
  477. WriteF(' (\pageref{%s})',[StripTex(Flink)]);
  478. end;
  479. procedure TLaTeXWriter.DescrWriteLinebreak;
  480. begin
  481. WriteLn('\\');
  482. end;
  483. procedure TLaTeXWriter.DescrBeginParagraph;
  484. begin
  485. // Do nothing
  486. end;
  487. procedure TLaTeXWriter.DescrEndParagraph;
  488. begin
  489. WriteLn('');
  490. WriteLn('');
  491. end;
  492. procedure TLaTeXWriter.DescrBeginCode(HasBorder: Boolean;
  493. const AHighlighterName: String);
  494. begin
  495. StartListing(HasBorder);
  496. end;
  497. procedure TLaTeXWriter.DescrWriteCodeLine(const ALine: String);
  498. begin
  499. WriteLn(ALine);
  500. end;
  501. procedure TLaTeXWriter.DescrEndCode;
  502. begin
  503. EndListing
  504. end;
  505. procedure TLaTeXWriter.DescrBeginOrderedList;
  506. begin
  507. WriteLn('\begin{enumerate}');
  508. end;
  509. procedure TLaTeXWriter.DescrEndOrderedList;
  510. begin
  511. WriteLn('\end{enumerate}');
  512. end;
  513. procedure TLaTeXWriter.DescrBeginUnorderedList;
  514. begin
  515. WriteLn('\begin{itemize}');
  516. end;
  517. procedure TLaTeXWriter.DescrEndUnorderedList;
  518. begin
  519. WriteLn('\end{itemize}');
  520. end;
  521. procedure TLaTeXWriter.DescrBeginDefinitionList;
  522. begin
  523. WriteLn('\begin{description');
  524. end;
  525. procedure TLaTeXWriter.DescrEndDefinitionList;
  526. begin
  527. WriteLn('\end{description}');
  528. end;
  529. procedure TLaTeXWriter.DescrBeginListItem;
  530. begin
  531. Write('\item ');
  532. end;
  533. procedure TLaTeXWriter.DescrEndListItem;
  534. begin
  535. WriteLn('');
  536. end;
  537. procedure TLaTeXWriter.DescrBeginDefinitionTerm;
  538. begin
  539. Write('\item[');
  540. end;
  541. procedure TLaTeXWriter.DescrEndDefinitionTerm;
  542. begin
  543. WriteLn(']');
  544. end;
  545. procedure TLaTeXWriter.DescrBeginDefinitionEntry;
  546. begin
  547. // Do nothing
  548. end;
  549. procedure TLaTeXWriter.DescrEndDefinitionEntry;
  550. begin
  551. WriteLn('');
  552. end;
  553. procedure TLaTeXWriter.DescrBeginSectionTitle;
  554. begin
  555. Write('\subsection{');
  556. end;
  557. procedure TLaTeXWriter.DescrBeginSectionBody;
  558. begin
  559. WriteLn('}');
  560. end;
  561. procedure TLaTeXWriter.DescrEndSection;
  562. begin
  563. // Do noting
  564. end;
  565. procedure TLaTeXWriter.DescrBeginRemark;
  566. begin
  567. WriteLn('\begin{remark}');
  568. end;
  569. procedure TLaTeXWriter.DescrEndRemark;
  570. begin
  571. WriteLn('\end{remark}');
  572. end;
  573. procedure TLaTeXWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
  574. var
  575. i: Integer;
  576. begin
  577. // !!!: How do we set the border?
  578. Write('\begin{FPCltable}{');
  579. for i := 1 to ColCount do
  580. Write('l');
  581. write('}{');
  582. TableCaptionWritten:=False;
  583. end;
  584. procedure TLaTeXWriter.DescrEndTable;
  585. begin
  586. WriteLn('\end{FPCltable}');
  587. end;
  588. procedure TLaTeXWriter.DescrBeginTableCaption;
  589. begin
  590. // Do nothing.
  591. end;
  592. procedure TLaTeXWriter.DescrEndTableCaption;
  593. begin
  594. Write('}{table');
  595. Inc(FTableCount);
  596. Write(IntToStr(FTableCount));
  597. Writeln('}');
  598. TableCaptionWritten := True;
  599. end;
  600. procedure TLaTeXWriter.DescrBeginTableHeadRow;
  601. begin
  602. if not TableCaptionWritten then
  603. DescrEndTableCaption;
  604. TableRowStartFlag := True;
  605. end;
  606. procedure TLaTeXWriter.DescrEndTableHeadRow;
  607. begin
  608. WriteLn('\\ \hline');
  609. end;
  610. procedure TLaTeXWriter.DescrBeginTableRow;
  611. begin
  612. if not TableCaptionWritten then
  613. DescrEndTableCaption;
  614. TableRowStartFlag := True;
  615. end;
  616. procedure TLaTeXWriter.DescrEndTableRow;
  617. begin
  618. WriteLn('\\');
  619. end;
  620. procedure TLaTeXWriter.DescrBeginTableCell;
  621. begin
  622. if TableRowStartFlag then
  623. TableRowStartFlag := False
  624. else
  625. Write(' & ');
  626. end;
  627. procedure TLaTeXWriter.DescrEndTableCell;
  628. begin
  629. // Do nothing
  630. end;
  631. procedure TLaTeXWriter.WriteDescr(Element: TPasElement);
  632. var
  633. DocNode: TDocNode;
  634. begin
  635. DocNode := Engine.FindDocNode(Element);
  636. if Assigned(DocNode) then
  637. begin
  638. if not IsDescrNodeEmpty(DocNode.Descr) then
  639. WriteDescr(Element, DocNode.Descr)
  640. else if not IsDescrNodeEmpty(DocNode.ShortDescr) then
  641. WriteDescr(Element, DocNode.ShortDescr);
  642. end;
  643. end;
  644. procedure TLaTeXWriter.WriteDescr(AContext: TPasElement; DescrNode: TDOMElement);
  645. begin
  646. if Assigned(DescrNode) then
  647. ConvertDescr(AContext, DescrNode, False);
  648. end;
  649. function TLaTeXWriter.ConstValue(ConstDecl: TPasConst): String;
  650. begin
  651. if Assigned(ConstDecl) then
  652. Result := ConstDecl.ClassName
  653. else
  654. Result := '<nil>';
  655. end;
  656. procedure TLaTexWriter.WriteUnitOverview(ASection: TPasSection);
  657. var
  658. i: Integer;
  659. UnitRef: TPasType;
  660. DocNode: TDocNode;
  661. begin
  662. if ASection.UsesList.Count > 0 then
  663. begin
  664. WriteLnF('\section{%s}', [SDocUsedUnits]);
  665. WriteLnF('\begin{FPCltable}{lr}{%s}{%s:0units}',
  666. [Format(SDocUsedUnitsByUnitXY, [Module.Name]), ModuleName]);
  667. WriteLn('Name & Page \\ \hline');
  668. for i := 0 to ASection.UsesList.Count - 1 do
  669. begin
  670. UnitRef := TPasType(ASection.UsesList[i]);
  671. WriteLnF('%s\index{unit!%s} & \pageref{%s} \\',
  672. [UnitRef.Name, UnitRef.Name, StripTex(GetLabel(UnitRef))]);
  673. end;
  674. WriteLn('\end{FPCltable}');
  675. end;
  676. DocNode := Engine.FindDocNode(ASection.Parent);
  677. if Assigned(DocNode) and not IsDescrNodeEmpty(DocNode.Descr) then
  678. begin
  679. WriteLnF('\section{%s}', [EscapeTex(SDocOverview)]);
  680. WriteDescr(ASection.Parent, DocNode.Descr);
  681. Writeln('');
  682. end;
  683. end;
  684. procedure TLaTeXWriter.WriteResourceStrings(ASection: TPasSection);
  685. var
  686. ResStrDecl: TPasResString;
  687. i: Integer;
  688. begin
  689. if ASection.ResStrings.Count > 0 then
  690. begin
  691. StartSubSection(SDocResStrings,ModuleName+'ResStrings');
  692. for i := 0 to ASection.ResStrings.Count - 1 do
  693. begin
  694. ResStrDecl := TPasResString(ASection.ResStrings[i]);
  695. StartListing(false, '');
  696. Writeln(ResStrDecl.GetDeclaration(True));
  697. EndListing;
  698. WriteLabel(ResStrDecl);
  699. WriteIndex(ResStrDecl);
  700. WriteDescr(ResStrDecl);
  701. Writeln('');
  702. end;
  703. end;
  704. end;
  705. procedure TLaTeXWriter.WriteConsts(ASection: TPasSection);
  706. var
  707. i: Integer;
  708. ConstDecl: TPasConst;
  709. begin
  710. if ASection.Consts.Count > 0 then
  711. begin
  712. WriteLnF('\subsection{%s}\label{suse:%sConstants}',
  713. [EscapeTex(SDocConstants), EscapeTex(ModuleName)]);
  714. for i := 0 to ASection.Consts.Count - 1 do
  715. begin
  716. ConstDecl := TPasConst(ASection.Consts[i]);
  717. StartListing(False);
  718. WriteLn(EscapeTex(ConstDecl.GetDeclaration(True)));
  719. EndListing;
  720. WriteLabel(ConstDecl);
  721. WriteIndex(ConstDecl);
  722. WriteDescr(ConstDecl);
  723. end;
  724. end;
  725. end;
  726. procedure TLaTeXWriter.WriteEnumElements(TypeDecl : TPasEnumType);
  727. Var
  728. EV : TPasEnumValue;
  729. I : Integer;
  730. DocNode : TDocNode;
  731. begin
  732. With TypeDecl do
  733. begin
  734. SortElementList(Values);
  735. DescrBeginTable(2,True);
  736. DescrBeginTableCaption;
  737. Writeln(EscapeTex(Format(SDocValuesForEnum,[TypeDecl.Name])));
  738. DescrEndTableCaption;
  739. DescrBeginTableHeadRow;
  740. DescrBeginTableCell;
  741. Writeln(EscapeTex(SDocValue));
  742. DescrEndTableCell;
  743. DescrBeginTableCell;
  744. Writeln(EscapeTex(SDocExplanation));
  745. DescrEndTableCell;
  746. DescrEndTableHeadRow;
  747. For I:=0 to Values.Count-1 do
  748. begin
  749. EV:=TPasEnumValue(Values[i]);
  750. DescrBeginTableRow;
  751. DescrBeginTableCell;
  752. Writeln(EscapeTex(EV.Name));
  753. DescrEndTableCell;
  754. DescrBeginTableCell;
  755. DocNode := Engine.FindDocNode(EV);
  756. if Assigned(DocNode) and (not IsDescrNodeEmpty(DocNode.ShortDescr)) then
  757. WriteDescr(EV,DocNode.ShortDescr);
  758. DescrEndTableCell;
  759. DescrEndTableRow;
  760. end;
  761. DescrEndTable;
  762. end;
  763. end;
  764. procedure TLaTeXWriter.WriteTypes(ASection: TPasSection);
  765. var
  766. i: Integer;
  767. TypeDecl: TPasType;
  768. begin
  769. if ASection.Types.Count > 0 then
  770. begin
  771. StartSubSection(SDocTypes,ModuleName+'Types');
  772. for i := 0 to ASection.Types.Count - 1 do
  773. begin
  774. TypeDecl := TPasType(ASection.Types[i]);
  775. StartListing(False);
  776. Writeln(EscapeTex(TypeDecl.GetDeclaration(True)));
  777. EndListing;
  778. WriteLabel(TypeDecl);
  779. WriteIndex(TypeDecl);
  780. If TypeDecl is TPasEnumType then
  781. begin
  782. WriteENumElements(TypeDecl as TPasEnumType);
  783. end;
  784. WriteDescr(TypeDecl);
  785. end;
  786. end;
  787. end;
  788. procedure TLaTeXWriter.WriteVars(ASection: TPasSection);
  789. var
  790. VarDecl: TPasVariable;
  791. i: Integer;
  792. begin
  793. if ASection.Variables.Count > 0 then
  794. begin
  795. StartSubsection(SDocVariables,ModuleName+'Variables');
  796. for i := 0 to ASection.Variables.Count - 1 do
  797. begin
  798. VarDecl := TPasVariable(ASection.Variables[i]);
  799. StartListing(False);
  800. WriteLn(EscapeTex(VarDecl.GetDeclaration(True)));
  801. EndListing;
  802. WriteLabel(VarDecl);
  803. WriteIndex(VarDecl);
  804. WriteDescr(VarDecl);
  805. end;
  806. end;
  807. end;
  808. procedure TLaTeXWriter.WriteVarsConstsTypes(ASection: TPasSection);
  809. begin
  810. With Asection do
  811. if (Consts.Count > 0) or
  812. (Types.Count > 0) or
  813. (Variables.Count > 0) or
  814. (ResStrings.Count>0) then
  815. begin
  816. StartSection(SDocConstsTypesVars, ModuleName+'ConstsTypesVars');
  817. WriteResourceStrings(ASection);
  818. WriteConsts(ASection);
  819. WriteTypes(ASection);
  820. WriteVars(ASection);
  821. end;
  822. end;
  823. const
  824. SVisibility: array[TPasMemberVisibility] of string =
  825. ('Default', 'Private', 'Protected', 'Public',
  826. 'Published', 'Automated');
  827. procedure TLatexWriter.WriteProcedure(ProcDecl : TPasProcedureBase);
  828. var
  829. DocNode: TDocNode;
  830. OP : TPasOverloadedProc;
  831. i : integer;
  832. begin
  833. With ProcDecl do
  834. begin
  835. if Not (Assigned(Parent) and Parent.InheritsFrom(TPasClassType)) then
  836. begin
  837. StartSubSection(Name);
  838. WriteLabel(ProcDecl);
  839. WriteIndex(ProcDecl);
  840. end
  841. else
  842. begin // Parent assigned and hence method.
  843. StartSubSection(Parent.Name+'.'+Name);
  844. WriteLabel(ProcDecl);
  845. WriteIndex(Parent.Name+'.'+Name);
  846. end;
  847. Writeln('\begin{FPCList}');
  848. DocNode := Engine.FindDocNode(ProcDecl);
  849. if Assigned(DocNode) and Assigned(DocNode.ShortDescr) then
  850. begin
  851. Writeln('\Synopsis');
  852. WriteDescr(ProcDecl, DocNode.ShortDescr);
  853. end;
  854. Writeln('\Declaration ');
  855. StartListing(False);
  856. if ClassType = TPasOverloadedProc then
  857. begin
  858. OP:=TPasOverloadedProc(ProcDecl);
  859. for i := 0 to OP.Overloads.Count - 1 do
  860. begin
  861. WriteLn(TPasProcedure(OP.Overloads[i]).GetDeclaration(True));
  862. end;
  863. end
  864. else
  865. WriteLn(GetDeclaration(True));
  866. EndListing;
  867. If Assigned(Parent) then
  868. begin
  869. Writeln('\Visibility');
  870. Writeln(VisibilityNames[Visibility])
  871. end;
  872. if Assigned(DocNode) and Assigned(DocNode.Descr) then
  873. begin
  874. Writeln('\Description');
  875. WriteDescr(ProcDecl);
  876. end;
  877. if Assigned(DocNode) and Assigned(DocNode.ErrorsDoc) then
  878. begin
  879. Writeln('\Errors');
  880. WriteDescr(ProcDecl, DocNode.ErrorsDoc);
  881. end;
  882. WriteSeeAlso(DocNode);
  883. Writeln('\end{FPCList}');
  884. WriteExample(DocNode);
  885. end;
  886. end;
  887. procedure TLaTeXWriter.WriteFunctionsAndProcedures(ASection: TPasSection);
  888. var
  889. i: Integer;
  890. begin
  891. if ASection.Functions.Count > 0 then
  892. begin
  893. StartSection(SDocProceduresAndFunctions,ModuleName+'Functions');
  894. for i := 0 to ASection.Functions.Count - 1 do
  895. WriteProcedure(TPasProcedureBase(ASection.Functions[i]));
  896. end;
  897. end;
  898. procedure TlatexWriter.WriteExample(ADocNode: TDocNode);
  899. var
  900. Example: TDOMElement;
  901. begin
  902. if Assigned(ADocNode) then
  903. begin
  904. Example := ADocNode.FirstExample;
  905. while Assigned(Example) do
  906. begin
  907. WritelnF('\FPCexample{%s}', [Engine.GetExampleFileName(Example)]);
  908. if Assigned(Example.NextSibling) then
  909. WriteLn('');
  910. Example := TDomElement(Example.NextSibling);
  911. end;
  912. end;
  913. end;
  914. procedure TLateXWriter.WriteSeeAlso(ADocNode: TDocNode);
  915. begin
  916. WriteSeeAlso(ADocNode,False);
  917. end;
  918. procedure TLateXWriter.WriteSeeAlso(ADocNode: TDocNode; InList : Boolean);
  919. var
  920. Node: TDOMNode;
  921. s: String;
  922. First : Boolean;
  923. begin
  924. if Not (Assigned(ADocNode) and Assigned(ADocNode.SeeAlso)) then
  925. Exit;
  926. Node := ADocNode.SeeAlso.FirstChild;
  927. First:=True;
  928. while Assigned(Node) do
  929. begin
  930. if (Node.NodeType = ELEMENT_NODE) and
  931. (Node.NodeName = 'link') then
  932. begin
  933. If First then
  934. begin
  935. If InList then
  936. begin
  937. Writeln('');
  938. Writeln('\begin{FPCList}');
  939. end;
  940. Writeln('\SeeAlso');
  941. First:=False;
  942. end
  943. else
  944. Writeln(',');
  945. S:=TDomElement(Node)['id'];
  946. DescrBeginLink(S);
  947. Writeln(S);
  948. DescrEndLink();
  949. end;
  950. Node:=Node.NextSibling;
  951. end;
  952. If Inlist and Not First then
  953. Writeln('\end{FPCList}');
  954. end;
  955. procedure TLaTeXWriter.WriteClasses(ASection: TPasSection);
  956. var
  957. i: Integer;
  958. begin
  959. if (ASection.Classes.Count > 0) then
  960. begin
  961. for i := 0 to ASection.Classes.Count - 1 do
  962. WriteClassDecl(TPasClassType(ASection.Classes[i]));
  963. end;
  964. end;
  965. procedure TLaTeXWriter.ProcessSection(ASection: TPasSection);
  966. begin
  967. With ASection do
  968. begin
  969. SortElementList(UsesList);
  970. SortElementList(Declarations);
  971. SortElementList(ResStrings);
  972. SortElementList(Types);
  973. SortElementList(Consts);
  974. SortElementList(Classes);
  975. SortElementList(Functions);
  976. SortElementList(Variables);
  977. end;
  978. WriteUnitOverView(ASection);
  979. WriteVarsConstsTypes(ASection);
  980. WriteFunctionsAndProcedures(ASection);
  981. WriteClasses(ASection);
  982. end;
  983. Function TLatexWriter.ShowMember(M : TPasElement) : boolean;
  984. begin
  985. Result:=not ((M.Visibility=visPrivate) and Engine.HidePrivate);
  986. If Result then
  987. Result:=Not ((M.Visibility=visProtected) and Engine.HideProtected)
  988. end;
  989. procedure TLatexWriter.WriteClassMethodOverview(ClassDecl : TPasClassType);
  990. var
  991. Member: TPasElement;
  992. i, j: Integer;
  993. s: String;
  994. Arg: TPasArgument;
  995. DocNode: TDocNode;
  996. List : TStringList;
  997. begin
  998. List:=TStringList.Create;
  999. Try
  1000. List.Sorted:=True;
  1001. for i := 0 to ClassDecl.Members.Count - 1 do
  1002. begin
  1003. Member := TPasElement(ClassDecl.Members[i]);
  1004. With Member do
  1005. if InheritsFrom(TPasProcedureBase) and ShowMember(Member) then
  1006. List.AddObject(Member.Name,Member);
  1007. end;
  1008. If List.Count>0 then
  1009. begin
  1010. StartSubSection(SDocMethodOverview);
  1011. WriteLabel(GetLabel(ClassDecl) + ':Methods');
  1012. WriteLn('\begin{tabularx}{\textwidth}{llX}');
  1013. WriteLnF('%s & %s & %s \\ \hline', [EscapeTex(SDocPage), EscapeTex(SDocMethod), EscapeTex(SDocDescription)]);
  1014. For I:=0 to List.Count-1 do
  1015. begin
  1016. Member:=TPasElement(List.Objects[i]);
  1017. DocNode := Engine.FindDocNode(Member);
  1018. WriteF('\pageref{%s} & %s & ',[StripTex(GetLabel(Member)), EscapeTex(Member.Name)]);
  1019. if Assigned(DocNode) and Assigned(DocNode.ShortDescr) then
  1020. WriteDescr(Member, DocNode.ShortDescr);
  1021. WriteLn('\\');
  1022. end;
  1023. WriteLn('\hline');
  1024. WriteLn('\end{tabularx}');
  1025. end;
  1026. Finally
  1027. List.Free;
  1028. end;
  1029. end;
  1030. procedure TLatexWriter.WriteClassPropertyOverview(ClassDecl : TPasClassType);
  1031. var
  1032. Member: TPasElement;
  1033. i, j: Integer;
  1034. s: String;
  1035. Arg: TPasArgument;
  1036. DocNode: TDocNode;
  1037. List : TStringList;
  1038. begin
  1039. // Write property overview
  1040. List:=TStringList.Create;
  1041. Try
  1042. List.Sorted:=True;
  1043. for i := 0 to ClassDecl.Members.Count - 1 do
  1044. begin
  1045. Member := TPasElement(ClassDecl.Members[i]);
  1046. With Member do
  1047. if InheritsFrom(TPasProperty) and SHowMember(Member) then
  1048. List.AddObject(Member.Name,Member)
  1049. end;
  1050. If (List.Count>0) then
  1051. begin
  1052. StartSubSection(SDocPropertyOverview);
  1053. WriteLabel(GetLabel(ClassDecl) + ':Properties');
  1054. WriteLn('\begin{tabularx}{\textwidth}{lllX}');
  1055. WriteLnF('%s & %s & %s & %s \\ \hline',
  1056. [EscapeTex(SDocPage), EscapeTex(SDocProperty), EscapeTex(SDocAccess), EscapeTex(SDocDescription)]);
  1057. For I:=0 to List.Count-1 do
  1058. begin
  1059. Member:=TPasElement(List.objects[i]);
  1060. WriteF('\pageref{%s} & %s & ', [StripTex(GetLabel(Member)), EscapeTex(Member.Name)]);
  1061. setlength(S,0);
  1062. if Length(TPasProperty(Member).ReadAccessorName) > 0 then
  1063. s := s + 'r';
  1064. if Length(TPasProperty(Member).WriteAccessorName) > 0 then
  1065. s := s + 'w';
  1066. if Length(TPasProperty(Member).StoredAccessorName) > 0 then
  1067. s := s + 's';
  1068. Write(s + ' & ');
  1069. DocNode := Engine.FindDocNode(Member);
  1070. if Assigned(DocNode) and Assigned(DocNode.ShortDescr) then
  1071. WriteDescr(Member, DocNode.ShortDescr);
  1072. WriteLn('\\');
  1073. end;
  1074. WriteLn('\hline');
  1075. WriteLn('\end{tabularx}');
  1076. end;
  1077. Finally
  1078. List.Free;
  1079. end;
  1080. end;
  1081. procedure TLaTeXWriter.WriteClassDecl(ClassDecl: TPasClassType);
  1082. var
  1083. DocNode: TDocNode;
  1084. Vis: TPasMemberVisibilities;
  1085. Member: TPasElement;
  1086. i: Integer;
  1087. begin
  1088. StartSection(ClassDecl.Name);
  1089. WriteLabel(ClassDecl);
  1090. WriteIndex(ClassDecl);
  1091. DocNode := Engine.FindDocNode(ClassDecl);
  1092. if Assigned(DocNode) and ((not IsDescrNodeEmpty(DocNode.Descr)) or
  1093. (not IsDescrNodeEmpty(DocNode.ShortDescr))) then
  1094. begin
  1095. StartSubSection(SDocDescription);
  1096. WriteDescr(ClassDecl);
  1097. end;
  1098. // Write method overview
  1099. WriteClassMethodOverView(ClassDecl);
  1100. // Write Property Overview;
  1101. WriteClassPropertyOverView(ClassDecl);
  1102. // Write method & property descriptions
  1103. // Determine visibilities
  1104. Vis := AllVisibilities;
  1105. if Engine.HidePrivate then
  1106. Exclude(Vis,visPrivate);
  1107. if Engine.HideProtected then
  1108. Exclude(Vis,visProtected);
  1109. for i := 0 to ClassDecl.Members.Count - 1 do
  1110. begin
  1111. Member := TPasElement(ClassDecl.Members[i]);
  1112. if ((Member.InheritsFrom(TPasProcedureBase)) and
  1113. (Member.Visibility in Vis)) then
  1114. WriteProcedure(TPasProcedureBase(Member));
  1115. end;
  1116. // properties.
  1117. for i := 0 to ClassDecl.Members.Count - 1 do
  1118. begin
  1119. Member := TPasElement(ClassDecl.Members[i]);
  1120. if ((Member.InheritsFrom(TPasProperty)) and
  1121. (Member.Visibility in Vis)) then
  1122. WriteProperty(TPasProperty(Member));
  1123. end;
  1124. end;
  1125. procedure TLaTexWriter.WriteProperty(PropDecl : TPasProperty);
  1126. var
  1127. DocNode: TDocNode;
  1128. S: String;
  1129. begin
  1130. With PropDecl do
  1131. begin
  1132. StartSubSection(Parent.Name+'.'+Name);
  1133. WriteLabel(PropDecl);
  1134. WriteIndex(Parent.Name+'.'+Name);
  1135. Writeln('\begin{FPCList}');
  1136. DocNode := Engine.FindDocNode(PropDecl);
  1137. if Assigned(DocNode) and Assigned(DocNode.ShortDescr) then
  1138. begin
  1139. Writeln('\Synopsis');
  1140. WriteDescr(PropDecl, DocNode.ShortDescr);
  1141. end;
  1142. Writeln('\Declaration ');
  1143. StartListing(False);
  1144. WriteLn('Property '+GetDeclaration(True));
  1145. EndListing;
  1146. If Assigned(Parent) then
  1147. begin
  1148. Writeln('\Visibility');
  1149. Writeln(VisibilityNames[Visibility])
  1150. end;
  1151. Writeln('\Access');
  1152. Setlength(S,0);
  1153. If Length(ReadAccessorName) > 0 then
  1154. S:='Read';
  1155. if Length(WriteAccessorName) > 0 then
  1156. begin
  1157. If S<>'' then
  1158. S:=S+',';
  1159. S:=S+'Write';
  1160. end;
  1161. Writeln(S);
  1162. if Assigned(DocNode) and Assigned(DocNode.Descr) then
  1163. begin
  1164. Writeln('\Description');
  1165. WriteDescr(PropDecl);
  1166. end;
  1167. if Assigned(DocNode) and Assigned(DocNode.ErrorsDoc) then
  1168. begin
  1169. Writeln('\Errors');
  1170. WriteDescr(PropDecl, DocNode.ErrorsDoc);
  1171. end;
  1172. WriteSeeAlso(DocNode);
  1173. Writeln('\end{FPCList}');
  1174. WriteExample(DocNode);
  1175. end;
  1176. end;
  1177. Function CompareElements(P1,P2 : Pointer) : Integer;
  1178. begin
  1179. Result:=CompareText(TPasElement(P1).Name,TPasElement(P2).Name);
  1180. end;
  1181. procedure TLaTeXWriter.SortElementList(List : TList);
  1182. begin
  1183. List.Sort(@CompareElements)
  1184. end;
  1185. procedure TLaTeXWriter.WriteLabel(El: TPasElement);
  1186. begin
  1187. WriteLabel(GetLabel(El));
  1188. end;
  1189. procedure TLaTeXWriter.WriteLabel(const s: String);
  1190. begin
  1191. WriteLnF('\label{%s}', [LowerCase(StripTex(s))]);
  1192. end;
  1193. procedure TLaTeXWriter.WriteIndex(El : TPasElement);
  1194. begin
  1195. WriteIndex(El.Name);
  1196. end;
  1197. procedure TLaTeXWriter.WriteIndex(const s : String);
  1198. begin
  1199. Write('\index{');
  1200. Write(EscapeTex(s));
  1201. Writeln('}');
  1202. end;
  1203. procedure TLaTeXWriter.StartListing(Frames: Boolean; const name: String);
  1204. begin
  1205. FInVerbatim:=True;
  1206. if Not LaTexHighLight then
  1207. begin
  1208. Writeln('');
  1209. Writeln('\begin{verbatim}');
  1210. end
  1211. else
  1212. if Frames then
  1213. Writelnf('\begin{lstlisting}{%s}',[StripTex(Name)])
  1214. else
  1215. Writelnf('\begin{lstlisting}[frame=]{%s}',[StripTex(Name)]);
  1216. end;
  1217. procedure TLaTeXWriter.StartListing(Frames : Boolean);
  1218. begin
  1219. StartListing(Frames,'');
  1220. end;
  1221. procedure TLaTeXWriter.EndListing;
  1222. begin
  1223. FInVerbatim:=False;
  1224. If LaTexHighLight then
  1225. Writeln('\end{lstlisting}')
  1226. else
  1227. Writeln('\end{verbatim}')
  1228. end;
  1229. procedure TLatexWriter.WriteCommentLine;
  1230. const
  1231. CommentLine =
  1232. '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';
  1233. begin
  1234. Writeln(CommentLine);
  1235. end;
  1236. procedure TLatexWriter.WriteComment(Comment : String);
  1237. begin
  1238. Write('% ');
  1239. Writeln(Comment);
  1240. end;
  1241. procedure TLatexWriter.StartSection(SectionName : String; SectionLabel : String);
  1242. begin
  1243. StartSection(SectionName);
  1244. WriteLabel(SectionLabel);
  1245. end;
  1246. procedure TLatexWriter.StartSection(SectionName : String);
  1247. begin
  1248. Writeln('');
  1249. WriteCommentLine;
  1250. WriteComment(SectionName);
  1251. Writeln('\section{'+EscapeTex(SectionName)+'}');
  1252. end;
  1253. procedure TLatexWriter.StartSubSection(SubSectionName : String; SubSectionLabel : String);
  1254. begin
  1255. StartSubSection(SubSectionName);
  1256. WriteLabel(SubsectionLabel);
  1257. end;
  1258. procedure TLatexWriter.StartSubSection(SubSectionName : String);
  1259. begin
  1260. Writeln('');
  1261. WriteComment(SubsectionName);
  1262. Writeln('\subsection{'+EscapeTex(SubSectionName)+'}');
  1263. end;
  1264. procedure TLatexWriter.StartChapter(ChapterName : String; ChapterLabel : String);
  1265. begin
  1266. StartChapter(ChapterName);
  1267. WriteLabel(ChapterLabel);
  1268. end;
  1269. procedure TLatexWriter.StartChapter(ChapterName : String);
  1270. begin
  1271. Writeln('');
  1272. WriteCommentLine;
  1273. WriteComment(ChapterName);
  1274. WriteCommentLine;
  1275. Writeln('\chapter{'+EscapeTex(ChapterName)+'}');
  1276. end;
  1277. procedure CreateLaTeXDocForPackage(APackage: TPasPackage; AEngine: TFPDocEngine);
  1278. var
  1279. Writer: TLaTeXWriter;
  1280. begin
  1281. Writer := TLaTeXWriter.Create(APackage, AEngine);
  1282. try
  1283. Writer.WriteDoc;
  1284. finally
  1285. Writer.Free;
  1286. end;
  1287. end;
  1288. end.
  1289. {
  1290. $Log$
  1291. Revision 1.6 2004-07-23 23:39:48 michael
  1292. + Some fixes in verbatim writing
  1293. Revision 1.5 2004/06/06 10:53:02 michael
  1294. + Added Topic support
  1295. Revision 1.4 2003/03/18 19:28:44 michael
  1296. + Some changes to output handling, more suitable for tex output
  1297. Revision 1.3 2003/03/18 19:12:29 michael
  1298. + More EscapeTex calls needed
  1299. Revision 1.2 2003/03/18 01:11:51 michael
  1300. + Some fixes to deal with illegal tex characters
  1301. Revision 1.1 2003/03/17 23:03:20 michael
  1302. + Initial import in CVS
  1303. Revision 1.13 2003/03/13 22:02:13 sg
  1304. * New version with many bugfixes and our own parser (now independent of the
  1305. compiler source)
  1306. Revision 1.12 2002/10/20 22:49:31 michael
  1307. + Sorted all overviews. Added table with enumeration values for enumerated types.
  1308. Revision 1.11 2002/05/24 00:13:22 sg
  1309. * much improved new version, including many linking and output fixes
  1310. Revision 1.10 2002/03/12 10:58:36 sg
  1311. * reworked linking engine and internal structure
  1312. Revision 1.9 2002/01/20 11:19:55 michael
  1313. + Added link attribute and property to TFPElement
  1314. Revision 1.8 2002/01/08 13:00:06 michael
  1315. + Added correct array handling and syntax highlighting is now optional
  1316. Revision 1.7 2002/01/08 08:22:40 michael
  1317. + Implemented latex writer
  1318. Revision 1.6 2001/12/17 14:41:42 michael
  1319. + Split out of latex writer
  1320. Revision 1.5 2001/12/17 13:41:18 jonas
  1321. * OsPathSeparator -> PathDelim
  1322. }