dw_latex.pp 34 KB

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