dw_txt.pp 15 KB

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