dw_txt.pp 15 KB

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