dw_txt.pp 15 KB

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