dw_linrtf.pp 19 KB

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