dw_linrtf.pp 19 KB

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