dw_txt.pp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693
  1. {
  2. FPDoc - Free Pascal Documentation Tool
  3. Copyright (C) 2005 by Michael Van Canneyt
  4. * Text 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_txt;
  14. {$WARN 5024 off : Parameter "$1" not used}
  15. interface
  16. uses DOM, dGlobals, PasTree, dwriter;
  17. const
  18. TxtHighLight : Boolean = False;
  19. TxtExtension : String = '.txt';
  20. Procedure CreateTxtDocForPackage(APackage: TPasPackage; AEngine: TFPDocEngine);
  21. implementation
  22. uses fpdocstrs, SysUtils, Classes, dwLinear;
  23. Const
  24. MaxListLevel = 10;
  25. DefaultLineWidth = 72;
  26. Type
  27. { TTxtWriter }
  28. TTXTWriter = class(TLinearWriter)
  29. protected
  30. LineWidth : Integer;
  31. FCheckEOL : Boolean;
  32. FCurrentPos : Integer;
  33. FListLevel,
  34. FChapterCount,
  35. FSectionCount,
  36. FSubSectionCount,
  37. FSubSubSectionCount,
  38. FTableCount : Integer;
  39. FInVerbatim : Boolean;
  40. FLists : Array [0..MaxListLevel] of integer;
  41. Inlist,
  42. TableRowStartFlag,
  43. TableCaptionWritten: Boolean;
  44. procedure Write(const s: String); override;
  45. procedure WriteLn(const s: String); override;
  46. procedure NewLine;
  47. // Private methods
  48. procedure WriteLine(LineLength : Integer; DoubleLine : Boolean);
  49. Procedure WriteLine(DoubleLine : Boolean);
  50. procedure NewListLevel(Initial : Integer);
  51. procedure declistlevel;
  52. Procedure WriteUnderline(Const Msg : String; DoubleLine : Boolean);
  53. // Linear documentation methods overrides;
  54. procedure WriteLabel(Const S : String); override;
  55. procedure WriteIndex(Const S : String); override;
  56. Procedure WriteExampleFile(FN : String); override;
  57. procedure StartUnitOverview(AModuleName,AModuleLabel : String);override;
  58. procedure WriteUnitEntry(UnitRef : TPasType); override;
  59. Procedure EndUnitOverview; override;
  60. function GetLabel(AElement: TPasElement): String; override;
  61. procedure StartListing(Frames: Boolean; const name: String); override;
  62. procedure EndListing; override;
  63. procedure WriteCommentLine; override;
  64. procedure WriteComment(Comment : String);override;
  65. procedure StartSection(SectionName : String);override;
  66. procedure StartSubSection(SubSectionName : String);override;
  67. procedure StartSubSubSection(SubSubSectionName : String);override;
  68. procedure StartChapter(ChapterName : String); override;
  69. procedure StartOverview(Const What : String;WithAccess : Boolean); override;
  70. procedure EndOverview; override;
  71. procedure WriteOverviewMember(const ALabel,AName,Access,ADescr : String); override;
  72. procedure WriteOverviewMember(const ALabel,AName,ADescr : String); override;
  73. // Description node conversion
  74. procedure DescrBeginBold; override;
  75. procedure DescrEndBold; override;
  76. procedure DescrBeginItalic; override;
  77. procedure DescrEndItalic; override;
  78. procedure DescrBeginEmph; override;
  79. procedure DescrEndEmph; override;
  80. procedure DescrBeginUnderline; override;
  81. procedure DescrEndUnderline; override;
  82. procedure DescrWriteFileEl(const AText: DOMString); override;
  83. procedure DescrWriteKeywordEl(const AText: DOMString); override;
  84. procedure DescrWriteVarEl(const AText: DOMString); override;
  85. procedure DescrBeginLink(const AId: DOMString); override;
  86. procedure DescrEndLink; override;
  87. procedure DescrWriteLinebreak; override;
  88. procedure DescrBeginParagraph; override;
  89. procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
  90. procedure DescrWriteCodeLine(const ALine: String); override;
  91. procedure DescrEndCode; override;
  92. procedure DescrEndParagraph; override;
  93. procedure DescrBeginOrderedList; override;
  94. procedure DescrEndOrderedList; override;
  95. procedure DescrBeginUnorderedList; override;
  96. procedure DescrEndUnorderedList; override;
  97. procedure DescrBeginDefinitionList; override;
  98. procedure DescrEndDefinitionList; override;
  99. procedure DescrBeginListItem; override;
  100. procedure DescrEndListItem; override;
  101. procedure DescrBeginDefinitionTerm; override;
  102. procedure DescrEndDefinitionTerm; override;
  103. procedure DescrBeginDefinitionEntry; override;
  104. procedure DescrEndDefinitionEntry; override;
  105. procedure DescrBeginSectionTitle; override;
  106. procedure DescrBeginSectionBody; override;
  107. procedure DescrEndSection; override;
  108. procedure DescrBeginRemark; override;
  109. procedure DescrEndRemark; override;
  110. procedure DescrBeginTable(ColCount: Integer; HasBorder: Boolean); override;
  111. procedure DescrEndTable; override;
  112. procedure DescrBeginTableCaption; override;
  113. procedure DescrEndTableCaption; override;
  114. procedure DescrBeginTableHeadRow; override;
  115. procedure DescrEndTableHeadRow; override;
  116. procedure DescrBeginTableRow; override;
  117. procedure DescrEndTableRow; override;
  118. procedure DescrBeginTableCell; override;
  119. procedure DescrEndTableCell; override;
  120. Public
  121. Constructor Create(APackage: TPasPackage; AEngine: TFPDocEngine); override;
  122. Class Function FileNameExtension : String; override;
  123. Class Procedure Usage(List : TStrings) ; override;
  124. Function InterpretOption(Const Cmd,Arg : String) : Boolean; override;
  125. end;
  126. procedure TTXTWriter.WriteUnderline(const Msg: String; DoubleLine: Boolean);
  127. Var
  128. L : Integer;
  129. begin
  130. L:=Length(Msg);
  131. Writeln(Msg);
  132. WriteLine(L,DoubleLine);
  133. end;
  134. procedure TTXTWriter.WriteLine(DoubleLine: Boolean);
  135. begin
  136. Writeline(LineWidth,DoubleLine);
  137. end;
  138. Function FindSpace(Const S : String; P : Integer) : Integer;
  139. Var
  140. I,L : Integer;
  141. SP: set of char;
  142. begin
  143. Result:=0;
  144. SP := [#10,#13,' ',#9];
  145. I:=P;
  146. L:=Length(S);
  147. While (I>0) and (I<=L) and not (S[i] in SP) do
  148. Dec(I);
  149. If (I=0) then
  150. begin
  151. Inc(I);
  152. While (I<=L) and not (S[I] in SP) do
  153. Inc(I);
  154. end;
  155. Result:=I;
  156. end;
  157. procedure TTXTWriter.Write(const s: String);
  158. Var
  159. N : String;
  160. L : Integer;
  161. begin
  162. If Length(S)=0 then
  163. exit;
  164. N:=S;
  165. Repeat
  166. If ((FCurrentPos+Length(N)+1)>LineWidth) then
  167. begin
  168. L:=FindSpace(N,LineWidth-FCurrentPos+1);
  169. inherited Write(Copy(N,1,L-1));
  170. inherited Write(LineEnding);
  171. FCurrentPos:=0;
  172. end
  173. else
  174. begin
  175. L:=Length(N);
  176. inherited Write(Copy(N,1,L));
  177. Inc(FCurrentPos,L);
  178. If FCheckEOL then
  179. If (L>=LEOL) then
  180. If (Copy(N,L-LEOL,LEOL)=LineEnding) then
  181. FCurrentPos:=0;
  182. end;
  183. Delete(N,1,L);
  184. Until (Length(N)=0);
  185. end;
  186. procedure TTXTWriter.WriteLn(const s: String);
  187. begin
  188. FCheckEOL:=False;
  189. Try
  190. inherited WriteLn(s);
  191. FCurrentPos:=0;
  192. Finally
  193. FCheckEOL:=False;
  194. end;
  195. end;
  196. procedure TTXTWriter.NewLine;
  197. begin
  198. If Not FCurrentPos=0 then
  199. Writeln('');
  200. end;
  201. procedure TTXTWriter.WriteLine(LineLength: Integer; DoubleLine: Boolean);
  202. begin
  203. NewLine;
  204. If DoubleLine then
  205. Writeln(StringOfChar('=',LineLength))
  206. else
  207. Writeln(StringOfChar('-',LineLength));
  208. end;
  209. function TTXTWriter.GetLabel(AElement: TPasElement): String;
  210. begin
  211. if AElement.ClassType = TPasUnresolvedTypeRef then
  212. Result := Engine.ResolveLink(Module, AElement.Name)
  213. else
  214. begin
  215. Result := AElement.PathName;
  216. Result := LowerCase(Copy(Result, 2, Length(Result) - 1));
  217. end;
  218. end;
  219. procedure TTXTWriter.DescrBeginBold;
  220. begin
  221. end;
  222. procedure TTXTWriter.DescrEndBold;
  223. begin
  224. end;
  225. procedure TTXTWriter.DescrBeginItalic;
  226. begin
  227. end;
  228. procedure TTXTWriter.DescrEndItalic;
  229. begin
  230. end;
  231. procedure TTXTWriter.DescrBeginEmph;
  232. begin
  233. end;
  234. procedure TTXTWriter.DescrEndEmph;
  235. begin
  236. end;
  237. procedure TTXTWriter.DescrBeginUnderline;
  238. begin
  239. end;
  240. procedure TTXTWriter.DescrEndUnderline;
  241. begin
  242. end;
  243. procedure TTXTWriter.DescrWriteFileEl(const AText: DOMString);
  244. begin
  245. DescrWriteText(AText);
  246. end;
  247. procedure TTXTWriter.DescrWriteKeywordEl(const AText: DOMString);
  248. begin
  249. DescrWriteText(AText);
  250. end;
  251. procedure TTXTWriter.DescrWriteVarEl(const AText: DOMString);
  252. begin
  253. DescrWriteText(AText);
  254. end;
  255. procedure TTXTWriter.DescrBeginLink(const AId: DOMString);
  256. begin
  257. Write('[');
  258. end;
  259. procedure TTXTWriter.DescrEndLink;
  260. begin
  261. Write('] ');
  262. end;
  263. procedure TTXTWriter.DescrWriteLinebreak;
  264. begin
  265. WriteLn('');
  266. end;
  267. procedure TTXTWriter.DescrBeginParagraph;
  268. begin
  269. // Do nothing
  270. end;
  271. procedure TTXTWriter.DescrEndParagraph;
  272. begin
  273. WriteLn('');
  274. end;
  275. procedure TTXTWriter.DescrBeginCode(HasBorder: Boolean;
  276. const AHighlighterName: String);
  277. begin
  278. StartListing(HasBorder,'');
  279. end;
  280. procedure TTXTWriter.DescrWriteCodeLine(const ALine: String);
  281. begin
  282. WriteLn(ALine);
  283. end;
  284. procedure TTXTWriter.DescrEndCode;
  285. begin
  286. EndListing
  287. end;
  288. procedure TTXTWriter.NewListLevel(Initial: Integer);
  289. begin
  290. Inc(FListLevel);
  291. If (FListLevel<MaxListLevel) then
  292. FLists[FListLevel]:=0;
  293. end;
  294. procedure TTXTWriter.declistlevel;
  295. begin
  296. If (FListLevel>0) then
  297. Dec(FListLevel)
  298. end;
  299. procedure TTXTWriter.DescrBeginOrderedList;
  300. begin
  301. NewListLevel(0);
  302. end;
  303. procedure TTXTWriter.DescrEndOrderedList;
  304. begin
  305. DecListLevel;
  306. end;
  307. procedure TTXTWriter.DescrBeginUnorderedList;
  308. begin
  309. NewListLevel(-1);
  310. end;
  311. procedure TTXTWriter.DescrEndUnorderedList;
  312. begin
  313. DecListLevel;
  314. end;
  315. procedure TTXTWriter.DescrBeginDefinitionList;
  316. begin
  317. NewListLevel(-2);
  318. end;
  319. procedure TTXTWriter.DescrEndDefinitionList;
  320. begin
  321. DecListLevel;
  322. end;
  323. procedure TTXTWriter.DescrBeginListItem;
  324. begin
  325. If FLists[FListLevel]>=0 then
  326. begin
  327. Inc(FLists[FListLevel]);
  328. WriteF('%d. ',[FLists[FListLevel]]);
  329. end;
  330. Write(' ');
  331. end;
  332. procedure TTXTWriter.DescrEndListItem;
  333. begin
  334. WriteLn('');
  335. end;
  336. procedure TTXTWriter.DescrBeginDefinitionTerm;
  337. begin
  338. Write('<<');
  339. end;
  340. procedure TTXTWriter.DescrEndDefinitionTerm;
  341. begin
  342. WriteLn('>>:');
  343. end;
  344. procedure TTXTWriter.DescrBeginDefinitionEntry;
  345. begin
  346. // Do nothing
  347. end;
  348. procedure TTXTWriter.DescrEndDefinitionEntry;
  349. begin
  350. WriteLn('');
  351. end;
  352. procedure TTXTWriter.DescrBeginSectionTitle;
  353. begin
  354. Inc(FSectionCount);
  355. WritelnF('%s %d.%d: ',[SDocSection,FChapterCount,FSectionCount]);
  356. end;
  357. procedure TTXTWriter.DescrBeginSectionBody;
  358. begin
  359. WriteLn('');
  360. end;
  361. procedure TTXTWriter.DescrEndSection;
  362. begin
  363. // Do noting
  364. end;
  365. procedure TTXTWriter.DescrBeginRemark;
  366. begin
  367. WriteLn(SDocRemark+': ');
  368. end;
  369. procedure TTXTWriter.DescrEndRemark;
  370. begin
  371. WriteLn('');
  372. end;
  373. procedure TTXTWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
  374. begin
  375. WriteLine(False);
  376. end;
  377. procedure TTXTWriter.DescrEndTable;
  378. begin
  379. WriteLine(False);
  380. end;
  381. procedure TTXTWriter.DescrBeginTableCaption;
  382. begin
  383. // Do nothing.
  384. end;
  385. procedure TTXTWriter.DescrEndTableCaption;
  386. begin
  387. Inc(FTableCount);
  388. WriteF('%s %d :',[SDoctable,FTableCount]);
  389. TableCaptionWritten := True;
  390. end;
  391. procedure TTXTWriter.DescrBeginTableHeadRow;
  392. begin
  393. if not TableCaptionWritten then
  394. DescrEndTableCaption;
  395. TableRowStartFlag := True;
  396. end;
  397. procedure TTXTWriter.DescrEndTableHeadRow;
  398. begin
  399. WriteLine(False);
  400. end;
  401. procedure TTXTWriter.DescrBeginTableRow;
  402. begin
  403. if not TableCaptionWritten then
  404. DescrEndTableCaption;
  405. TableRowStartFlag := True;
  406. end;
  407. procedure TTXTWriter.DescrEndTableRow;
  408. begin
  409. WriteLn('');
  410. end;
  411. procedure TTXTWriter.DescrBeginTableCell;
  412. begin
  413. if TableRowStartFlag then
  414. TableRowStartFlag := False
  415. else
  416. Write(' ');
  417. end;
  418. procedure TTXTWriter.DescrEndTableCell;
  419. begin
  420. // Do nothing
  421. end;
  422. constructor TTXTWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
  423. begin
  424. inherited Create(APackage, AEngine);
  425. LineWidth:=DefaultLineWidth;
  426. end;
  427. class procedure TTXTWriter.Usage(List: TStrings);
  428. begin
  429. inherited Usage(List);
  430. end;
  431. function TTXTWriter.InterpretOption(const Cmd, Arg: String): Boolean;
  432. begin
  433. if cmd='--linewidth' then
  434. begin
  435. LineWidth:=StrToIntDef(Arg,DefaultLineWidth);
  436. Result:=True;
  437. end
  438. else
  439. Result:=inherited InterpretOption(Cmd, Arg);
  440. end;
  441. procedure TTXTWriter.WriteLabel(const S: String);
  442. begin
  443. end;
  444. procedure TTXTWriter.WriteIndex(const S: String);
  445. begin
  446. end;
  447. procedure TTXTWriter.StartListing(Frames: Boolean; const name: String);
  448. begin
  449. FInVerbatim:=True;
  450. If (Name<>'') then
  451. WritelnF('%s : %s',[SDocListing,Name]);
  452. If Frames then
  453. WriteLine(False)
  454. else
  455. WriteLn('');
  456. end;
  457. procedure TTXTWriter.EndListing;
  458. begin
  459. FInVerbatim:=False;
  460. end;
  461. procedure TTXTWriter.WriteCommentLine;
  462. begin
  463. end;
  464. procedure TTXTWriter.WriteComment(Comment: String);
  465. begin
  466. end;
  467. procedure TTXTWriter.StartChapter(ChapterName: String);
  468. begin
  469. Inc(FChapterCount);
  470. FSectionCount:=0;
  471. FSubSectionCount:=0;
  472. Writeln('');
  473. WriteLine(True);
  474. WritelnF('%s %d : %s',[SDocChapter,FChapterCount,ChapterName]);
  475. WriteLine(True);
  476. Writeln('');
  477. end;
  478. procedure TTXTWriter.StartSection(SectionName: String);
  479. begin
  480. Inc(FSectionCount);
  481. FSubSectionCount:=0;
  482. Writeln('');
  483. WriteLine(False);
  484. WritelnF('%s %d.%d : %s',[SDocSection,FChapterCount,FSectionCount,SectionName]);
  485. WriteLine(False);
  486. Writeln('');
  487. end;
  488. procedure TTXTWriter.StartSubSection(SubSectionName: String);
  489. begin
  490. Inc(FSubSectionCount);
  491. Writeln('');
  492. WritelnF('%d.%d.%d : %s',[FChapterCount,FSectionCount,FSubSectionCount,SubSectionName]);
  493. WriteLine(False);
  494. Writeln('');
  495. end;
  496. procedure TTXTWriter.StartSubSubSection(SubSubSectionName: String);
  497. begin
  498. Writeln('');
  499. Writeln(SubSubSectionName);
  500. Writeln('');
  501. end;
  502. procedure CreateTxtDocForPackage(APackage: TPasPackage; AEngine: TFPDocEngine);
  503. var
  504. Writer: TTxtWriter;
  505. begin
  506. Writer := TTxtWriter.Create(APackage, AEngine);
  507. try
  508. Writer.DoWriteDocumentation;
  509. finally
  510. Writer.Free;
  511. end;
  512. end;
  513. procedure TTXTWriter.WriteExampleFile(FN: String);
  514. Var
  515. L : TStringList;
  516. I : Integer;
  517. begin
  518. Write(SDocExample);
  519. Writeln(' '+ExtractFileName(FN));
  520. If (FN<>'') and FileExists(FN) then
  521. begin
  522. WriteLine(False);
  523. L:=TStringList.Create;
  524. Try
  525. L.LoadFromFile(FN);
  526. For I:=0 to L.Count-1 do
  527. Writeln(L[i]);
  528. finally
  529. L.Free;
  530. end;
  531. WriteLine(False);
  532. end;
  533. end;
  534. procedure TTXTWriter.StartOverview(const What: String; WithAccess: Boolean);
  535. begin
  536. If WithAccess then
  537. WriteUnderLine(Format('%.30s %.10s %s',[EscapeText(What), EscapeText(SDocAccess), EscapeText(SDocDescription)]),False)
  538. else
  539. WriteUnderLine(Format('%.30s %s',[EscapeText(What), EscapeText(SDocDescription)]),False);
  540. end;
  541. procedure TTXTWriter.EndOverview;
  542. begin
  543. WriteLine(False);
  544. end;
  545. procedure TTXTWriter.WriteOverviewMember(const ALabel, AName, Access,
  546. ADescr: String);
  547. begin
  548. WriteLnF('%.30s %.10s %s',[AName,Access,ADescr]);
  549. end;
  550. procedure TTXTWriter.WriteOverviewMember(const ALabel, AName, ADescr: String);
  551. begin
  552. WriteLnF('%.30s %s ',[AName,ADescr]);
  553. end;
  554. class function TTXTWriter.FileNameExtension: String;
  555. begin
  556. Result:=TxtExtension;
  557. end;
  558. procedure TTXTWriter.StartUnitOverview(AModuleName, AModuleLabel: String);
  559. begin
  560. WriteUnderLine('Unit Name',False);
  561. end;
  562. procedure TTXTWriter.WriteUnitEntry(UnitRef: TPasType);
  563. begin
  564. Writeln(EscapeText(UnitRef.Name));
  565. end;
  566. procedure TTXTWriter.EndUnitOverview;
  567. begin
  568. Writeln('');
  569. end;
  570. initialization
  571. // Do not localize.
  572. RegisterWriter(TTXTWriter,'txt','Plain text.');
  573. finalization
  574. UnRegisterWriter('txt');
  575. end.