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