dw_linrtf.pp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813
  1. {
  2. FPDoc - Free Pascal Documentation Tool
  3. Copyright (C) 2007 by the FPC team.
  4. * RTF output generator
  5. See the file COPYING, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. }
  11. {$mode objfpc}
  12. {$H+}
  13. unit dw_LinRTF;
  14. {$WARN 5024 off : Parameter "$1" not used}
  15. interface
  16. uses DOM, dGlobals, PasTree;
  17. const
  18. RTFHighLight : Boolean = False;
  19. RTFExtension : String = '.rtf';
  20. Procedure CreateRTFDocForPackage(APackage: TPasPackage; AEngine: TFPDocEngine);
  21. implementation
  22. uses fpdocstrs, SysUtils, Classes, dwLinear, dwriter;
  23. const
  24. Indent = 300;
  25. Type
  26. TEnvironmenttype = (etEnumerate, etItemize, etDescription);
  27. TEnvironment = class
  28. private
  29. fenvtype : TEnvironmenttype;
  30. fdeltaIndent,
  31. fdeltaMargin,
  32. fnextitem : integer;
  33. fprevious : TEnvironment;
  34. public
  35. property envtype : TEnvironmenttype read fenvtype;
  36. property deltaIndent : integer read fdeltaIndent;
  37. property deltaMargin : integer read fdeltaMargin;
  38. property nextitem : integer read fnextitem;
  39. property previous : TEnvironment read fprevious;
  40. end;
  41. type
  42. { TRTFWriter }
  43. TRTFWriter = class(TLinearWriter)
  44. protected
  45. // used
  46. FLink: String;
  47. FEnvironmentStack : TEnvironment;
  48. FLeftMargin, FParIndent : integer;
  49. FEnumDepth : byte;
  50. FBorderString : string;
  51. FEmphLevel : integer;
  52. Cchapters, Csections, Csubsections, Csubsubsections : integer;
  53. // not yet used
  54. FTableCount : Integer;
  55. FInVerbatim : Boolean;
  56. Inlist,
  57. TableRowStartFlag,
  58. TableCaptionWritten: Boolean;
  59. // helper procedures
  60. procedure PushEnvironment (atype:TEnvironmenttype; dmargin,dindent:integer);
  61. procedure PopEnvironment;
  62. function GetEnumNumber(depth, item : integer) : string;
  63. procedure Header(text:string; font:integer);
  64. // Linear documentation methods overrides;
  65. procedure WriteBeginDocument; override;
  66. procedure WriteEndDocument; override;
  67. procedure WriteLabel(Const S : String); override;
  68. procedure WriteIndex(Const S : String); override;
  69. Procedure WriteExampleFile(FN : String); override;
  70. Procedure StartProcedure; override;
  71. Procedure EndProcedure; override;
  72. Procedure StartProperty; override;
  73. Procedure EndProperty; override;
  74. Procedure StartSynopsis; override;
  75. Procedure StartDeclaration; override;
  76. Procedure StartVisibility; override;
  77. Procedure StartDescription; override;
  78. Procedure StartAccess; override;
  79. Procedure StartErrors; override;
  80. Procedure StartSeealso; override;
  81. Procedure EndSeealso; override;
  82. procedure StartUnitOverview(AModuleName,AModuleLabel : String);override;
  83. procedure WriteUnitEntry(UnitRef : TPasType); override;
  84. Procedure EndUnitOverview; override;
  85. function GetLabel(AElement: TPasElement): String; override;
  86. procedure StartListing(Frames: Boolean; const name: String); override;
  87. procedure EndListing; override;
  88. Function EscapeText(S : String) : String; override;
  89. Function StripText(S : String) : String; override;
  90. procedure WriteCommentLine; override;
  91. procedure WriteComment(Comment : String);override;
  92. procedure StartSection(SectionName : String);override;
  93. procedure StartSubSection(SubSectionName : String);override;
  94. procedure StartSubSubSection(SubSubSectionName : String);override;
  95. procedure StartChapter(ChapterName : String); override;
  96. procedure StartOverview(Const What : String; WithAccess : Boolean); override;
  97. procedure WriteOverviewMember(const ALabel,AName,Access,ADescr : String); override;
  98. procedure WriteOverviewMember(const ALabel,AName,ADescr : String); override;
  99. procedure EndOverview; override;
  100. // Description node conversion
  101. procedure DescrBeginBold; override;
  102. procedure DescrEndBold; override;
  103. procedure DescrBeginItalic; override;
  104. procedure DescrEndItalic; override;
  105. procedure DescrBeginEmph; override;
  106. procedure DescrEndEmph; override;
  107. procedure DescrBeginUnderline; override;
  108. procedure DescrEndUnderline; override;
  109. procedure DescrWriteFileEl(const AText: DOMString); override;
  110. procedure DescrWriteKeywordEl(const AText: DOMString); override;
  111. procedure DescrWriteVarEl(const AText: DOMString); override;
  112. procedure DescrBeginLink(const AId: DOMString); override;
  113. procedure DescrEndLink; override;
  114. procedure DescrWriteLinebreak; override;
  115. procedure DescrBeginParagraph; override;
  116. procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
  117. procedure DescrWriteCodeLine(const ALine: String); override;
  118. procedure DescrEndCode; override;
  119. procedure DescrEndParagraph; override;
  120. procedure DescrBeginOrderedList; override;
  121. procedure DescrEndOrderedList; override;
  122. procedure DescrBeginUnorderedList; override;
  123. procedure DescrEndUnorderedList; override;
  124. procedure DescrBeginDefinitionList; override;
  125. procedure DescrEndDefinitionList; override;
  126. procedure DescrBeginListItem; override;
  127. procedure DescrEndListItem; override;
  128. procedure DescrBeginDefinitionTerm; override;
  129. procedure DescrEndDefinitionTerm; override;
  130. procedure DescrBeginDefinitionEntry; override;
  131. procedure DescrEndDefinitionEntry; override;
  132. procedure DescrBeginSectionTitle; override;
  133. procedure DescrBeginSectionBody; override;
  134. procedure DescrEndSection; override;
  135. procedure DescrBeginRemark; override;
  136. procedure DescrEndRemark; override;
  137. procedure DescrBeginTable(ColCount: Integer; HasBorder: Boolean); override;
  138. procedure DescrEndTable; override;
  139. procedure DescrBeginTableCaption; override;
  140. procedure DescrEndTableCaption; override;
  141. procedure DescrBeginTableHeadRow; override;
  142. procedure DescrEndTableHeadRow; override;
  143. procedure DescrBeginTableRow; override;
  144. procedure DescrEndTableRow; override;
  145. procedure DescrBeginTableCell; override;
  146. procedure DescrEndTableCell; override;
  147. // TFPDocWriter class methods
  148. public
  149. Function InterPretOption(Const Cmd,Arg : String) : boolean; override;
  150. Class Function FileNameExtension : String; override;
  151. end;
  152. function TRTFWriter.GetLabel(AElement: TPasElement): String;
  153. var
  154. i: Integer;
  155. begin
  156. if AElement.ClassType = TPasUnresolvedTypeRef then
  157. Result := Engine.ResolveLink(Module, AElement.Name)
  158. else
  159. begin
  160. Result := AElement.PathName;
  161. Result := LowerCase(Copy(Result, 2, Length(Result) - 1));
  162. end;
  163. for i := 1 to Length(Result) do
  164. if Result[i] = '.' then
  165. Result[i] := ':';
  166. end;
  167. function TRTFWriter.EscapeText(S: String): String;
  168. var
  169. i: Integer;
  170. begin
  171. if FInVerBatim=True then
  172. Result:=S
  173. else
  174. begin
  175. SetLength(Result, 0);
  176. for i := 1 to Length(S) do
  177. case S[i] of
  178. '\','{','}': // Escape these characters
  179. Result := Result + '\' + S[i];
  180. else
  181. Result := Result + S[i];
  182. end;
  183. end;
  184. end;
  185. function TRTFWriter.StripText(S: String): String;
  186. var
  187. I: Integer;
  188. begin
  189. Result:='';
  190. for i := 1 to Length(S) do
  191. If not (S[i] in ['{','}','\']) then
  192. Result := Result + S[i];
  193. end;
  194. procedure TRTFWriter.PushEnvironment(atype: TEnvironmenttype; dmargin,dindent:integer);
  195. var e : TEnvironment;
  196. begin
  197. e := TEnvironment.Create;
  198. with e do
  199. begin
  200. fenvtype := atype;
  201. fnextitem := 1;
  202. fdeltaIndent := dIndent;
  203. fdeltaMargin := dMargin;
  204. fprevious := FEnvironmentStack;
  205. end;
  206. if atype = etEnumerate then
  207. inc (FEnumDepth);
  208. inc (FParIndent, dindent);
  209. inc (FLeftMargin, dmargin);
  210. FEnvironmentStack := e;
  211. end;
  212. procedure TRTFWriter.PopEnvironment;
  213. var e : TEnvironment;
  214. begin
  215. e := FEnvironmentStack.previous;
  216. with FEnvironmentStack do
  217. begin
  218. if envtype = etEnumerate then
  219. dec (FEnumDepth);
  220. dec (FParIndent, deltaIndent);
  221. dec (FLeftMargin, deltaMargin);
  222. end;
  223. FEnvironmentStack.Free;
  224. FEnvironmentStack := e;
  225. end;
  226. function Romanized (nr : integer) : string;
  227. const
  228. st : array[0..9] of string = ('','X','XX','XXX','XL','L','LX','LXX','LXXX','XC');
  229. se : array[0..9] of string = ('','I','II','III','IV','V','VI','VII','VIII','IX');
  230. var t,e : integer;
  231. begin
  232. t := (nr mod 100) div 10;
  233. e := nr mod 10;
  234. result := st[t] + se[e];
  235. end;
  236. function TRTFWriter.GetEnumNumber(depth, item: integer) : string;
  237. begin
  238. case depth of
  239. 1 : result := inttostr(item) + '.';
  240. 2 : result := '(' + char (ord('a')+item-1) + ')';
  241. 3 : result := Romanized(item);
  242. 4 : result := '(' + char (ord('A')+item-1) + ')';
  243. else result := '(' + inttostr(item) + ')';
  244. end;
  245. end;
  246. procedure TRTFWriter.WriteBeginDocument;
  247. begin
  248. write('{\rtf1');
  249. write('{\fonttbl');
  250. Write('{\f0\fswiss Helvetica{\*\falt Arial};}');
  251. write('{\f1\fmodern Courier{\*\falt Courier New};}');
  252. write('{\f2\froman Times{\*\falt Times New Roman};}');
  253. write('}{\stylesheet');
  254. write('{\s1\li0\fi0\ql\sb240\sa60\keepn\f2\b\fs32 Section Title;}');
  255. write('{\s2\ql\sb30\sa30\keepn\b0\i0\scaps1\f1\fs28 Table Title;}');
  256. write('{\s3\li0\fi0\qc\sb240\sa60\keepn\f2\b\scaps1\fs28 Listing Title;}');
  257. write('{\s4\li30\fi30\ql\f2\fs24 Listing Contents;}');
  258. write('{\s5\li0\fi0\ql\sb240\sa60\keepn\f2\b\fs40 Chapter;}');
  259. write('{\s6\li0\fi0\ql\sb240\sa60\keepn\f2\b\fs32 Section;}');
  260. write('{\s7\li0\fi0\ql\sb240\sa60\keepn\f2\b\fs28 Subsection;}');
  261. write('{\s8\li0\fi0\ql\sb240\sa60\keepn\f2\b\fs24 Subsubsection;}');
  262. write('{\s9\li30\fi10\ql\sb60\keepn\f2\fs24 Description titles;}');
  263. write('{\s10\li30\fi30\ql\fs24 Description;}');
  264. write('{\s11\li0\fi0\ql\fs24 Source Example;}');
  265. write ('}');
  266. FLeftMargin := 0;
  267. FParIndent := 0;
  268. FEnvironmentStack := nil;
  269. FEnumDepth := 0;
  270. Cchapters := 0;
  271. Csections := 0;
  272. Csubsections := 0;
  273. Csubsubsections := 0;
  274. end;
  275. procedure TRTFWriter.WriteEndDocument;
  276. begin
  277. write('}');
  278. end;
  279. procedure TRTFWriter.DescrBeginBold;
  280. begin
  281. Write('{\b ');
  282. end;
  283. procedure TRTFWriter.DescrEndBold;
  284. begin
  285. Write('}');
  286. end;
  287. procedure TRTFWriter.DescrBeginItalic;
  288. begin
  289. Write('{\i ');
  290. end;
  291. procedure TRTFWriter.DescrEndItalic;
  292. begin
  293. Write('}');
  294. end;
  295. procedure TRTFWriter.DescrBeginEmph;
  296. begin
  297. inc (FEmphLevel);
  298. if (FEmphLevel and 1) = 1 then
  299. Write('{\i ')
  300. else
  301. Write('{\i0 ');
  302. end;
  303. procedure TRTFWriter.DescrEndEmph;
  304. begin
  305. dec (FEmphLevel);
  306. Write('}')
  307. end;
  308. procedure TRTFWriter.DescrBeginUnderline;
  309. begin
  310. Write('{\ul ');
  311. end;
  312. procedure TRTFWriter.DescrEndUnderline;
  313. begin
  314. Write('}');
  315. end;
  316. procedure TRTFWriter.DescrWriteFileEl(const AText: DOMString);
  317. begin
  318. Write('{\f0 ');
  319. DescrWriteText(AText);
  320. Write('}');
  321. end;
  322. procedure TRTFWriter.DescrWriteKeywordEl(const AText: DOMString);
  323. begin
  324. Write('{\b\f1 ');
  325. DescrWriteText(AText);
  326. Write('}');
  327. end;
  328. procedure TRTFWriter.DescrWriteVarEl(const AText: DOMString);
  329. begin
  330. Write('{\f1 ');
  331. DescrWriteText(AText);
  332. Write('}');
  333. end;
  334. procedure TRTFWriter.DescrBeginLink(const AId: DOMString);
  335. begin
  336. FLink := Engine.ResolveLink(Module, Utf8Encode(AId));
  337. // System.WriteLn('Link "', AId, '" => ', FLink);
  338. end;
  339. procedure TRTFWriter.DescrEndLink;
  340. var s : string;
  341. begin
  342. s := StripText(Flink);
  343. WriteF('{\field{\*\fldinst{\lang1024 PAGEREF BM%s \\*MERGEFORMAT }}',[s]);
  344. WriteF('{\\fldrslt{%s}}}',[s]);
  345. end;
  346. procedure TRTFWriter.DescrWriteLinebreak;
  347. begin
  348. WriteLn('\line');
  349. end;
  350. procedure TRTFWriter.DescrBeginParagraph;
  351. begin
  352. // Do nothing
  353. end;
  354. procedure TRTFWriter.DescrEndParagraph;
  355. begin
  356. Write('\par ');
  357. end;
  358. procedure TRTFWriter.DescrBeginCode(HasBorder: Boolean;
  359. const AHighlighterName: String);
  360. begin
  361. StartListing(HasBorder,'');
  362. end;
  363. procedure TRTFWriter.DescrWriteCodeLine(const ALine: String);
  364. begin
  365. Write(ALine+'\line ');
  366. end;
  367. procedure TRTFWriter.DescrEndCode;
  368. begin
  369. EndListing;
  370. end;
  371. procedure TRTFWriter.DescrBeginOrderedList;
  372. begin
  373. PushEnvironment(etEnumerate, 2*Indent, -Indent);
  374. end;
  375. procedure TRTFWriter.DescrEndOrderedList;
  376. begin
  377. PopEnvironment;
  378. end;
  379. procedure TRTFWriter.DescrBeginUnorderedList;
  380. begin
  381. PushEnvironment(etItemize, 2*Indent, -Indent);
  382. end;
  383. procedure TRTFWriter.DescrEndUnorderedList;
  384. begin
  385. PopEnvironment;
  386. end;
  387. procedure TRTFWriter.DescrBeginDefinitionList;
  388. begin
  389. PushEnvironment(etDescription, Indent, -Indent);
  390. end;
  391. procedure TRTFWriter.DescrEndDefinitionList;
  392. begin
  393. PopEnvironment;
  394. end;
  395. procedure TRTFWriter.DescrBeginListItem;
  396. begin
  397. WriteF('{\pard\li%d\fi%d ',[FLeftMargin,FParIndent]);
  398. with FEnvironmentStack do
  399. if envtype = etItemize then
  400. write('\bullet\tab ')
  401. else
  402. begin
  403. WriteF('%s\tab ', [GetEnumNumber(fenumdepth,fnextitem)]);
  404. inc (fnextitem);
  405. end;
  406. end;
  407. procedure TRTFWriter.DescrEndListItem;
  408. begin
  409. WriteLn('}');
  410. end;
  411. procedure TRTFWriter.DescrBeginDefinitionTerm;
  412. begin
  413. WriteF('{\pard\li%d\fi%d{\b ',[FLeftMargin,FParIndent]);
  414. end;
  415. procedure TRTFWriter.DescrEndDefinitionTerm;
  416. begin
  417. Write('}');
  418. end;
  419. procedure TRTFWriter.DescrBeginDefinitionEntry;
  420. begin
  421. Write('\tab ');
  422. end;
  423. procedure TRTFWriter.DescrEndDefinitionEntry;
  424. begin
  425. WriteLn('}');
  426. end;
  427. procedure TRTFWriter.DescrBeginSectionTitle;
  428. begin
  429. write('{\pard\s1 ');
  430. end;
  431. procedure TRTFWriter.DescrBeginSectionBody;
  432. begin
  433. WriteLn('\par}');
  434. end;
  435. procedure TRTFWriter.DescrEndSection;
  436. begin
  437. write('\par ');
  438. end;
  439. procedure TRTFWriter.DescrBeginRemark;
  440. begin
  441. write ('\par ');
  442. write('{\b Remark:}\tab ');
  443. end;
  444. procedure TRTFWriter.DescrEndRemark;
  445. begin
  446. write ('\par ');
  447. end;
  448. procedure TRTFWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
  449. begin
  450. Write('\par{');
  451. if HasBorder then
  452. FBorderString := '\trbrdrl\brdrs\brdrw1\trbrdrr\brdrs\brdrw1'
  453. else
  454. FBorderString := ''
  455. end;
  456. procedure TRTFWriter.DescrEndTable;
  457. begin
  458. Write('}');
  459. end;
  460. procedure TRTFWriter.DescrBeginTableCaption;
  461. begin
  462. Write('\pard\s2 ');
  463. end;
  464. procedure TRTFWriter.DescrEndTableCaption;
  465. begin
  466. write('\par ');
  467. end;
  468. procedure TRTFWriter.DescrBeginTableHeadRow;
  469. begin
  470. write('{\b\trowd'+FBorderstring+'\trbrdrh\brdrs\trbrdrv\brdrs ');
  471. end;
  472. procedure TRTFWriter.DescrEndTableHeadRow;
  473. begin
  474. Write('\row}');
  475. end;
  476. procedure TRTFWriter.DescrBeginTableRow;
  477. begin
  478. write('\trowd'+FBorderstring+'\trbrdrh\brdrs\trbrdrv\brdrs ');
  479. end;
  480. procedure TRTFWriter.DescrEndTableRow;
  481. begin
  482. Write('\row ');
  483. end;
  484. procedure TRTFWriter.DescrBeginTableCell;
  485. begin
  486. write('\pard\intbl ');
  487. end;
  488. procedure TRTFWriter.DescrEndTableCell;
  489. begin
  490. write('\cell');
  491. end;
  492. procedure TRTFWriter.WriteLabel(const S: String);
  493. var b: string;
  494. begin
  495. b := LowerCase(StripText(s));
  496. WriteF('{\bkmkstart %s}{\bkmkend %s}', [b,b]);
  497. end;
  498. procedure TRTFWriter.WriteIndex(const S: String);
  499. begin
  500. Write('{\xe{\v '+EscapeText(s)+'}}');
  501. end;
  502. procedure TRTFWriter.StartListing(Frames: Boolean; const name: String);
  503. begin
  504. Write('\par');
  505. if name <> '' then
  506. Write('{\pard\s3 '+name+'\par}');
  507. Write('{\pard\s4 ');
  508. end;
  509. procedure TRTFWriter.EndListing;
  510. begin
  511. Writeln('}')
  512. end;
  513. procedure TRTFWriter.WriteCommentLine;
  514. begin
  515. // doesn't exist
  516. end;
  517. procedure TRTFWriter.WriteComment(Comment : String);
  518. begin
  519. // doesn't exist
  520. end;
  521. procedure TRTFWriter.StartChapter(ChapterName : String);
  522. begin
  523. inc (Cchapters);
  524. if Cchapters > 1 then
  525. Write('\par\page');
  526. WriteF('{\pard\s5 %d %s\par}', [Cchapters,EscapeText(ChapterName)]);
  527. Csubsubsections := 0;
  528. Csubsections := 0;
  529. Csections := 0;
  530. end;
  531. procedure TRTFWriter.StartSection(SectionName : String);
  532. begin
  533. inc (Csections);
  534. if Csections > 1 then
  535. Write('\par');
  536. WriteF('{\pard\s6 %d.%d %s\par}', [Cchapters,Csections,EscapeText(SectionName)]);
  537. Csubsubsections := 0;
  538. Csubsections := 0;
  539. end;
  540. procedure TRTFWriter.StartSubSection(SubSectionName : String);
  541. begin
  542. inc (Csubsections);
  543. if Csubsections > 1 then
  544. Write('\par');
  545. WriteF('{\pard\s7 %d.%d.%d %s\par}', [Cchapters,Csections,Csubsections,EscapeText(SubSectionName)]);
  546. Csubsubsections := 0;
  547. end;
  548. procedure TRTFWriter.StartSubSubSection(SubSubSectionName : String);
  549. begin
  550. inc (Csubsubsections);
  551. if Csubsubsections > 1 then
  552. Write('\par');
  553. WriteF('{\pard\s8 %d.%d.%d.%d %s\par}', [Cchapters,Csections,Csubsections,Csubsubsections,
  554. EscapeText(SubSubSectionName)]);
  555. end;
  556. procedure TRTFWriter.StartProcedure;
  557. begin
  558. Write('{\pard');
  559. end;
  560. procedure TRTFWriter.StartProperty;
  561. begin
  562. Write('{\pard');
  563. end;
  564. procedure TRTFWriter.Header(text: string; font: integer);
  565. begin
  566. WriteF('\par\s9 %s\pard\par\s10\f%d ',[text, font]);
  567. end;
  568. procedure TRTFWriter.StartSynopsis;
  569. begin
  570. Header(SDocSynopsis,2);
  571. end;
  572. procedure TRTFWriter.StartDeclaration;
  573. begin
  574. Header(SDocDeclaration,1);
  575. end;
  576. procedure TRTFWriter.StartVisibility;
  577. begin
  578. Header(SDocVisibility,2);
  579. end;
  580. procedure TRTFWriter.StartDescription;
  581. begin
  582. Header(SDocDescription,2);
  583. end;
  584. procedure TRTFWriter.StartErrors;
  585. begin
  586. Header(SDocErrors,2);
  587. end;
  588. procedure TRTFWriter.StartAccess;
  589. begin
  590. Header(SDocAccess,2)
  591. end;
  592. procedure TRTFWriter.EndProcedure;
  593. begin
  594. Write('}');
  595. end;
  596. procedure TRTFWriter.EndProperty;
  597. begin
  598. Write('}');
  599. end;
  600. procedure TRTFWriter.WriteExampleFile(FN : String);
  601. var s : TStringlist;
  602. begin
  603. If (FN<>'') then
  604. begin
  605. Write('\pard{\s4 Listing:} '+FN);
  606. Write('\pard{\f1 ');
  607. s := TStringlist.Create;
  608. try
  609. s.loadfromfile (FN);
  610. Write(s.Text);
  611. finally
  612. s.Free;
  613. end;
  614. Write('}');
  615. end;
  616. end;
  617. procedure TRTFWriter.StartOverview(const What: String; WithAccess: Boolean);
  618. begin
  619. If WithAccess then
  620. WriteF('\par\trowd\pard\intbl %s\cell\pard\intbl %s\cell\pard\intbl %s \cell\pard\intbl %s \cell\row',
  621. [EscapeText(SDocPage), EscapeText(What), EscapeText(SDocAccess), EscapeText(SDocDescription)])
  622. else
  623. WriteF('\par\trowd\pard\intbl %s\cell\pard\intbl %s\cell\pard\intbl %s\cell\row',
  624. [EscapeText(SDocPage), EscapeText(What), EscapeText(SDocDescription)]);
  625. end;
  626. procedure TRTFWriter.WriteOverviewMember(const ALabel,AName,Access,ADescr : String);
  627. begin
  628. //TODO: Translate Latex \pageref to RTF
  629. //WriteLnF('\pageref{%s} & %s & %s & %s \\',[ALabel,AName,Access,ADescr]);
  630. WriteF('\par\trowd\pard\intbl %s\cell\pard\intbl %s\cell\pard\intbl %s \cell\pard\intbl %s \cell\row',
  631. [ALabel,AName,Access,ADescr]);
  632. end;
  633. procedure TRTFWriter.WriteOverviewMember(const ALabel,AName,ADescr : String);
  634. begin
  635. //TODO: Translate Latex \pageref to RTF
  636. //WriteLnF('\pageref{%s} & %s & %s \\',[ALabel,AName,ADescr]);
  637. WriteF('\par\trowd\pard\intbl %s\cell\pard\intbl %s\cell\pard\intbl %s\cell\row',
  638. [ALabel,AName,ADescr]);
  639. end;
  640. procedure TRTFWriter.EndOverview;
  641. begin
  642. Write ('\par');
  643. end;
  644. procedure TRTFWriter.StartSeealso;
  645. begin
  646. Header(SDocSeeAlso, 2);
  647. end;
  648. procedure TRTFWriter.EndSeealso;
  649. begin
  650. end;
  651. procedure TRTFWriter.StartUnitOverview(AModuleName,AModuleLabel : String);
  652. begin
  653. WriteF ('\pard\qc\s3 %s', [Format(SDocUsedUnitsByUnitXY, [AModuleName])]);
  654. Write ('\par\trowd\pard\intbl Name\cell\pard\intbl Page\cell\row');
  655. end;
  656. procedure TRTFWriter.WriteUnitEntry(UnitRef : TPasType);
  657. begin
  658. WriteF('\par\trowd\pard\intbl %s\cell\pard\intbl %s\cell\row',
  659. [UnitRef.Name, 'Pageref to '+StripText(GetLabel(UnitRef))]);
  660. //WriteLnF('%s\index{unit!%s} & \pageref{%s} \\',
  661. // [UnitRef.Name, UnitRef.Name, StripText(GetLabel(UnitRef))]);
  662. end;
  663. procedure TRTFWriter.EndUnitOverview;
  664. begin
  665. Write('\par');
  666. end;
  667. procedure CreateRTFDocForPackage(APackage: TPasPackage; AEngine: TFPDocEngine);
  668. var
  669. Writer: TRTFWriter;
  670. begin
  671. Writer := TRTFWriter.Create(APackage, AEngine);
  672. try
  673. Writer.DoWriteDocumentation;
  674. finally
  675. Writer.Free;
  676. end;
  677. end;
  678. function TRTFWriter.InterPretOption(const Cmd, Arg: String): boolean;
  679. begin
  680. if Cmd = '--RTF-extension' then
  681. begin
  682. RTFExtension:=Arg;
  683. Result := true;
  684. end
  685. else
  686. Result:=False;
  687. end;
  688. class function TRTFWriter.FileNameExtension: String;
  689. begin
  690. Result:=RTFExtension;
  691. end;
  692. initialization
  693. // Do not localize.
  694. RegisterWriter(TRTFWriter,'rtf','RTF output.');
  695. finalization
  696. UnRegisterWriter('rtf');
  697. end.