dw_latex.pp 38 KB

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