dw_ipf.pp 38 KB

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