dw_ipflin.pas 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122
  1. {
  2. FPDoc IPF Writer
  3. Copyright (c) 2010 by Graeme Geldenhuys ([email protected])
  4. * Linear IPF output for use with fpGUI or OS/2's help systems.
  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. unit dw_ipflin;
  12. {$mode objfpc}{$H+}
  13. interface
  14. uses
  15. Classes, DOM, dGlobals, PasTree, dwLinear;
  16. const
  17. { Change this into the name of your writer}
  18. IPFWriterName = 'ipf';
  19. { Comprehensible description goes here:}
  20. SIPFUsageWriterDescr = 'Writes output in fpGUI and OS/2''s IPF help format';
  21. { Extension for the template }
  22. TIPFExtension = '.ipf';
  23. type
  24. TIPFNewWriter = class(TLinearWriter)
  25. private
  26. InPackageOverview: Boolean;
  27. InHeading: Boolean;
  28. FInHeadingText: string;
  29. OrderedList: boolean;
  30. TableRowStartFlag: Boolean;
  31. TableCaptionWritten: Boolean;
  32. InTableCell: Boolean;
  33. InTypesDeclaration: Boolean;
  34. SuspendWriting: Boolean;
  35. LastSubSection: String;
  36. protected
  37. FLink: String;
  38. FTableCount : Integer;
  39. FInVerbatim : Boolean;
  40. Inlist,
  41. fColCount: integer;
  42. // extras
  43. procedure Write(const s: String); override;
  44. procedure WriteBeginDocument; override;
  45. procedure WriteEndDocument; override;
  46. // Linear documentation methods overrides;
  47. procedure WriteLabel(Const S : String); override;
  48. procedure WriteIndex(Const S : String); override;
  49. procedure WriteType(const s: string); override;
  50. procedure WriteVariable(const s: string); override;
  51. procedure WriteConstant(const s: string); override;
  52. Procedure WriteExampleFile(FN : String); override;
  53. Procedure StartProcedure; override;
  54. Procedure EndProcedure; override;
  55. Procedure StartProperty; override;
  56. Procedure EndProperty; override;
  57. Procedure StartSynopsis; override;
  58. Procedure StartDeclaration; override;
  59. Procedure StartVisibility; override;
  60. Procedure StartDescription; override;
  61. Procedure StartAccess; override;
  62. Procedure StartErrors; override;
  63. Procedure StartVersion; override;
  64. Procedure StartSeealso; override;
  65. Procedure EndSeealso; override;
  66. procedure StartUnitOverview(AModuleName,AModuleLabel : String);override;
  67. procedure WriteUnitEntry(UnitRef : TPasType); override;
  68. Procedure EndUnitOverview; override;
  69. function GetLabel(AElement: TPasElement): String; override;
  70. procedure StartListing(Frames: Boolean; const name: String); override;
  71. procedure EndListing; override;
  72. Function EscapeText(S : String) : String; override;
  73. Function StripText(S : String) : String; override;
  74. procedure WriteCommentLine; override;
  75. procedure WriteComment(Comment : String);override;
  76. procedure StartSection(SectionName : String);override;
  77. procedure StartSubSection(SubSectionName : String);override;
  78. procedure StartSubSubSection(SubSubSectionName : String);override;
  79. procedure StartChapter(ChapterName : String); override;
  80. procedure StartOverview(WithAccess : Boolean); override;
  81. procedure EndOverview; override;
  82. procedure WriteOverviewMember(const ALabel,AName,Access,ADescr : String); override;
  83. procedure WriteOverviewMember(const ALabel,AName,ADescr : String); override;
  84. procedure DescrBeginURL(const AURL: DOMString); override;
  85. procedure DescrEndURL; override;
  86. // Description node conversion. Overrides for TFPDocWriter.
  87. procedure DescrBeginBold; override;
  88. procedure DescrEndBold; override;
  89. procedure DescrBeginItalic; override;
  90. procedure DescrEndItalic; override;
  91. procedure DescrBeginEmph; override;
  92. procedure DescrEndEmph; override;
  93. procedure DescrWriteText(const AText: DOMString); override;
  94. procedure DescrWriteFileEl(const AText: DOMString); override;
  95. procedure DescrWriteKeywordEl(const AText: DOMString); override;
  96. procedure DescrWriteVarEl(const AText: DOMString); override;
  97. procedure DescrBeginLink(const AId: DOMString); override;
  98. procedure DescrEndLink; override;
  99. procedure DescrWriteLinebreak; override;
  100. procedure DescrBeginParagraph; override;
  101. procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
  102. procedure DescrWriteCodeLine(const ALine: String); override;
  103. procedure DescrEndCode; override;
  104. procedure DescrEndParagraph; override;
  105. procedure DescrBeginOrderedList; override;
  106. procedure DescrEndOrderedList; override;
  107. procedure DescrBeginUnorderedList; override;
  108. procedure DescrEndUnorderedList; override;
  109. procedure DescrBeginDefinitionList; override;
  110. procedure DescrEndDefinitionList; override;
  111. procedure DescrBeginListItem; override;
  112. procedure DescrEndListItem; override;
  113. procedure DescrBeginDefinitionTerm; override;
  114. procedure DescrEndDefinitionTerm; override;
  115. procedure DescrBeginDefinitionEntry; override;
  116. procedure DescrEndDefinitionEntry; override;
  117. procedure DescrBeginSectionTitle; override;
  118. procedure DescrBeginSectionBody; override;
  119. procedure DescrEndSection; override;
  120. procedure DescrBeginRemark; override;
  121. procedure DescrEndRemark; override;
  122. procedure DescrBeginTable(ColCount: Integer; HasBorder: Boolean); override;
  123. procedure DescrEndTable; override;
  124. procedure DescrBeginTableCaption; override;
  125. procedure DescrEndTableCaption; override;
  126. procedure DescrBeginTableHeadRow; override;
  127. procedure DescrEndTableHeadRow; override;
  128. procedure DescrBeginTableRow; override;
  129. procedure DescrEndTableRow; override;
  130. procedure DescrBeginTableCell; override;
  131. procedure DescrEndTableCell; override;
  132. // TFPDocWriter class methods
  133. public
  134. constructor Create(APackage: TPasPackage; AEngine: TFPDocEngine); override;
  135. class function FileNameExtension: string; override;
  136. procedure WriteClassInheritanceOverview(ClassDecl: TPasClassType); override;
  137. end;
  138. implementation
  139. uses
  140. SysUtils, dwriter, dbugintf;
  141. { TFPDocWriter overrides }
  142. procedure TIPFNewWriter.DescrBeginBold;
  143. begin
  144. { Start bold output }
  145. WriteLn(':hp2.');
  146. end;
  147. procedure TIPFNewWriter.DescrEndBold;
  148. begin
  149. { End bold output }
  150. WriteLn(':ehp2.');
  151. end;
  152. procedure TIPFNewWriter.DescrBeginItalic;
  153. begin
  154. { Start italic output }
  155. WriteLn(':hp1.');
  156. end;
  157. procedure TIPFNewWriter.DescrEndItalic;
  158. begin
  159. { End italic output }
  160. WriteLn(':ehp1.');
  161. end;
  162. procedure TIPFNewWriter.DescrBeginEmph;
  163. begin
  164. { Start emphasized output }
  165. Write(':hp1.');
  166. end;
  167. procedure TIPFNewWriter.DescrEndEmph;
  168. begin
  169. { End emphasized output }
  170. Write(':ehp1.');
  171. end;
  172. procedure TIPFNewWriter.DescrWriteText(const AText: DOMString);
  173. const
  174. cMax = 100;
  175. var
  176. sl: TStringlist;
  177. i: integer;
  178. lText: string;
  179. begin
  180. // IPF has an imposed line length limit.
  181. if (Length(AText) > cMax) then // then we need to wrap the text.
  182. begin
  183. lText := WrapText(AText, LineEnding, [' ', '-', #9], cMax);
  184. sl := TStringlist.Create;
  185. try
  186. sl.Text := lText;
  187. for i := 0 to sl.Count-1 do
  188. inherited DescrWriteText(sl.Strings[i] + LineEnding);
  189. finally
  190. sl.Free;
  191. end;
  192. end
  193. else
  194. inherited DescrWriteText(AText);
  195. end;
  196. procedure TIPFNewWriter.DescrWriteFileEl(const AText: DOMString);
  197. begin
  198. { format as file name }
  199. Write(':hp3.');
  200. DescrWriteText(AText);
  201. Write(':ehp3.');
  202. end;
  203. procedure TIPFNewWriter.DescrWriteKeywordEl(const AText: DOMString);
  204. begin
  205. { Format as keyword }
  206. Write(':hp1.');
  207. DescrWriteText(AText);
  208. Write(':ehp1.');
  209. end;
  210. procedure TIPFNewWriter.DescrWriteVarEl(const AText: DOMString);
  211. begin
  212. { Format as variable }
  213. Write(':hp1.');
  214. DescrWriteText(AText);
  215. Write(':ehp1.');
  216. end;
  217. procedure TIPFNewWriter.DescrBeginLink(const AId: DOMString);
  218. begin
  219. { Start link to label ID - links are never nested.}
  220. FLink := Engine.ResolveLink(Module, AId);
  221. FLink := StringReplace(FLink, ':', '_', [rfReplaceAll]);
  222. FLink := StringReplace(FLink, '.', '_', [rfReplaceAll]);
  223. WriteF(':link reftype=hd refid=%s.', [flink]);
  224. end;
  225. procedure TIPFNewWriter.DescrEndLink;
  226. begin
  227. { End link to label ID}
  228. Write(':elink.');
  229. end;
  230. procedure TIPFNewWriter.DescrWriteLinebreak;
  231. begin
  232. { Start a new line. }
  233. WriteLn('');
  234. WriteLn('.br'); // must be at the beginning of a line, hence the previous writeln call
  235. end;
  236. procedure TIPFNewWriter.DescrBeginParagraph;
  237. begin
  238. { Start a new paragraph }
  239. Writeln(':p.');
  240. end;
  241. procedure TIPFNewWriter.DescrEndParagraph;
  242. begin
  243. { End current paragraph }
  244. writeln('');
  245. end;
  246. procedure TIPFNewWriter.DescrBeginCode(HasBorder: Boolean;
  247. const AHighlighterName: String);
  248. begin
  249. { Start block of code }
  250. StartListing(HasBorder,'');
  251. end;
  252. procedure TIPFNewWriter.DescrWriteCodeLine(const ALine: String);
  253. begin
  254. { Write line of code }
  255. DescrWriteText(ALine + LineEnding);
  256. // writeln(EscapeText(ALine));
  257. end;
  258. procedure TIPFNewWriter.DescrEndCode;
  259. begin
  260. { End block of code }
  261. EndListing;
  262. end;
  263. procedure TIPFNewWriter.DescrBeginOrderedList;
  264. begin
  265. { Start numbered list }
  266. OrderedList := True;
  267. writeln('');
  268. writeln(':ol.');
  269. end;
  270. procedure TIPFNewWriter.DescrEndOrderedList;
  271. begin
  272. { End numbered list }
  273. writeln('');
  274. writeln(':eol.');
  275. // writeln(':p.');
  276. end;
  277. procedure TIPFNewWriter.DescrBeginUnorderedList;
  278. begin
  279. { Start bulleted list }
  280. OrderedList := False;
  281. writeln('');
  282. if not InTableCell then
  283. writeln(':ul.')
  284. else
  285. writeln(':lines.');
  286. end;
  287. procedure TIPFNewWriter.DescrEndUnorderedList;
  288. begin
  289. { End bulleted list }
  290. writeln('');
  291. if not InTableCell then
  292. writeln(':eul.')
  293. else
  294. writeln(':elines.');
  295. end;
  296. procedure TIPFNewWriter.DescrBeginDefinitionList;
  297. begin
  298. { Start definition list }
  299. writeln('');
  300. writeln(':dl tsize=25 compact.');
  301. end;
  302. procedure TIPFNewWriter.DescrEndDefinitionList;
  303. begin
  304. { End definition list }
  305. writeln('');
  306. writeln(':edl.');
  307. // writeln(':p.');
  308. end;
  309. procedure TIPFNewWriter.DescrBeginListItem;
  310. begin
  311. { Start list item (both bulleted/numbered) }
  312. if not InTableCell then
  313. write(':li.');
  314. end;
  315. procedure TIPFNewWriter.DescrEndListItem;
  316. begin
  317. { End list item (both bulleted/numbered) }
  318. writeln('');
  319. end;
  320. procedure TIPFNewWriter.DescrBeginDefinitionTerm;
  321. begin
  322. { Start definition term }
  323. writeln(':dt.');
  324. end;
  325. procedure TIPFNewWriter.DescrEndDefinitionTerm;
  326. begin
  327. { End definition term }
  328. writeln('');
  329. end;
  330. procedure TIPFNewWriter.DescrBeginDefinitionEntry;
  331. begin
  332. { start definition explanation }
  333. writeln(':dd.');
  334. end;
  335. procedure TIPFNewWriter.DescrEndDefinitionEntry;
  336. begin
  337. { End definition explanation }
  338. writeln('');
  339. end;
  340. procedure TIPFNewWriter.DescrBeginSectionTitle;
  341. begin
  342. { Start section title }
  343. end;
  344. procedure TIPFNewWriter.DescrBeginSectionBody;
  345. begin
  346. { Start section body }
  347. end;
  348. procedure TIPFNewWriter.DescrEndSection;
  349. begin
  350. { End section body }
  351. end;
  352. procedure TIPFNewWriter.DescrBeginRemark;
  353. begin
  354. { Start remark paragraph }
  355. writeln('');
  356. writeln(':nt text=''Remark: ''.');
  357. end;
  358. procedure TIPFNewWriter.DescrEndRemark;
  359. begin
  360. { End remark paragraph }
  361. writeln('');
  362. writeln(':ent.');
  363. end;
  364. procedure TIPFNewWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
  365. var
  366. i: integer;
  367. cols: string;
  368. f: string;
  369. begin
  370. { Start table with ColCount columns, and with border }
  371. cols := '';
  372. for i := 0 to ColCount-1 do
  373. begin
  374. if i = 0 then
  375. cols := cols + '35 ' // first colum is 30 characters
  376. else
  377. cols := cols + '50 '; // every other colum is 50 characters each
  378. end;
  379. if HasBorder then
  380. f := ' frame=box.'
  381. else
  382. f := ' frame=none.';
  383. writeln(':table cols=''' + Trim(cols) + ''' rules=both' + f);
  384. end;
  385. procedure TIPFNewWriter.DescrEndTable;
  386. begin
  387. writeln(':etable.');
  388. end;
  389. procedure TIPFNewWriter.DescrBeginTableCaption;
  390. begin
  391. //writeln('.* GG');
  392. SuspendWriting := True;
  393. // do nothing
  394. // TableCaptionWritten := False;
  395. end;
  396. procedure TIPFNewWriter.DescrEndTableCaption;
  397. begin
  398. // do nothing
  399. SuspendWriting := False;
  400. writeln('');
  401. end;
  402. procedure TIPFNewWriter.DescrBeginTableHeadRow;
  403. begin
  404. // TableCaptionWritten := True;
  405. SuspendWriting := False;
  406. writeln(':row.');
  407. end;
  408. procedure TIPFNewWriter.DescrEndTableHeadRow;
  409. begin
  410. // do nothing
  411. end;
  412. procedure TIPFNewWriter.DescrBeginTableRow;
  413. begin
  414. // TableCaptionWritten := True;
  415. SuspendWriting := False;
  416. writeln(':row.');
  417. end;
  418. procedure TIPFNewWriter.DescrEndTableRow;
  419. begin
  420. writeln('');
  421. end;
  422. procedure TIPFNewWriter.DescrBeginTableCell;
  423. begin
  424. write(':c.');
  425. InTableCell := True;
  426. end;
  427. procedure TIPFNewWriter.DescrEndTableCell;
  428. begin
  429. // do nothing
  430. writeln('');
  431. InTableCell := False;
  432. end;
  433. constructor TIPFNewWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
  434. begin
  435. inherited Create(APackage, AEngine);
  436. TableCaptionWritten := True;
  437. SuspendWriting := False;
  438. InTableCell := False;
  439. InTypesDeclaration := False;
  440. end;
  441. procedure TIPFNewWriter.WriteClassInheritanceOverview(ClassDecl: TPasClassType);
  442. var
  443. DocNode: TDocNode;
  444. ancestor: TPasClassType;
  445. ancestor2: TPasType;
  446. List: TStringList;
  447. i: integer;
  448. indent: integer;
  449. procedure WriteDescription(const Idx: integer);
  450. var
  451. s: string;
  452. o: TPasClassType;
  453. t: string;
  454. begin
  455. if List.Objects[i] <> nil then
  456. begin
  457. o := List.Objects[i] as TPasClassType;
  458. DocNode := Engine.FindDocNode(o);
  459. if Assigned(DocNode) then
  460. begin
  461. s := ExtractFileName(o.SourceFilename);
  462. t := ExtractFileExt(s);
  463. s := StringReplace(s, t, '', []);
  464. s := s + '.' + o.Name;
  465. DescrBeginLink(s);
  466. Write(o.Name);
  467. DescrEndLink;
  468. writeln('');
  469. end
  470. else
  471. begin
  472. writeln(List[i]);
  473. end;
  474. end
  475. else
  476. begin
  477. { we only have text for it. }
  478. Writeln(List[i]);
  479. end;
  480. end;
  481. begin
  482. List := TStringList.Create;
  483. List.Sorted := False;
  484. { add the initial class }
  485. List.AddObject(ClassDecl.Name, ClassDecl);
  486. ancestor := nil;
  487. if Assigned(ClassDecl.AncestorType) and ClassDecl.AncestorType.InheritsFrom(TPasClassType) then
  488. { all is well, we have our first ancestor to get us started with the hierarchy traversal }
  489. ancestor := TPasClassType(ClassDecl.AncestorType)
  490. else
  491. begin
  492. { here we only have one history item to output - and not part of fpdoc hierarchy data }
  493. if Assigned(ClassDecl.AncestorType) then
  494. begin
  495. ancestor2 := ClassDecl.AncestorType;
  496. if Assigned(ancestor2) then
  497. begin
  498. List.AddObject(ancestor2.Name, nil);
  499. ancestor2 := nil; { prevent any further attempts at traversal }
  500. end;
  501. end;
  502. end;
  503. while Assigned(ancestor) do
  504. begin
  505. List.AddObject(ancestor.Name, ancestor);
  506. if Assigned(ancestor.AncestorType) and ancestor.AncestorType.InheritsFrom(TPasClassType) then
  507. ancestor := TPasClassType(ancestor.AncestorType)
  508. else
  509. begin
  510. { we hit the end of the road }
  511. ancestor2 := ancestor.AncestorType;
  512. if Assigned(ancestor2) then
  513. List.AddObject(ancestor2.Name, nil);
  514. ancestor := nil; { prevent any further attempts at traversal }
  515. end;
  516. end;
  517. if List.Count > 1 then
  518. begin
  519. { output a title }
  520. Writeln(':p.');
  521. writeln(':lm margin=1.');
  522. DescrBeginBold;
  523. WriteLn(SDocInheritanceHierarchy);
  524. DescrEndBold;
  525. { now output the hierarchy }
  526. indent := 3;
  527. { we go from least significant to most, hence the reversed loop }
  528. for i := List.Count-1 downto 0 do
  529. begin
  530. Write(Format(':lm margin=%d.', [indent]));
  531. { each level is indented 2 character positions more than the previous one }
  532. if (indent > 3) then
  533. begin
  534. writeln('|');
  535. write('+--');
  536. end
  537. else
  538. write(':xmp.');
  539. WriteDescription(i);
  540. inc(indent, 2);
  541. end;
  542. WriteLn(':lm margin=1.:exmp.');
  543. end;
  544. List.Free;
  545. end;
  546. { TLinearWriter overrides}
  547. class function TIPFNewWriter.FileNameExtension: String;
  548. begin
  549. Result := TIPFExtension;
  550. end;
  551. procedure TIPFNewWriter.DescrBeginURL(const AURL: DOMString);
  552. begin
  553. //Write(EscapeText(AURL));
  554. end;
  555. procedure TIPFNewWriter.DescrEndURL;
  556. begin
  557. // do nothing
  558. end;
  559. function TIPFNewWriter.GetLabel(AElement: TPasElement): String;
  560. begin
  561. if AElement.ClassType = TPasUnresolvedTypeRef then
  562. Result := Engine.ResolveLink(Module, AElement.Name)
  563. else
  564. begin
  565. Result := AElement.PathName;
  566. Result := LowerCase(Copy(Result, 2, Length(Result) - 1)); // Remove # infront of eg: '#Corelib' string
  567. end;
  568. Result := StringReplace(Result, '.', '_', [rfReplaceAll]);
  569. Result := StringReplace(Result, ' ', '_', [rfReplaceAll]);
  570. end;
  571. Function TIPFNewWriter.EscapeText(S : String) : String;
  572. var
  573. i: Integer;
  574. begin
  575. SetLength(Result, 0);
  576. for i := 1 to Length(S) do
  577. case S[i] of
  578. '.': // Escape these characters
  579. Result := Result + '&per.';
  580. ':':
  581. Result := Result + '&colon.';
  582. ',':
  583. Result := Result + '&comma.';
  584. '&':
  585. Result := Result + '&amp.';
  586. // '_':
  587. // Result := Result + '&us.';
  588. '^':
  589. Result := Result + '&caret.';
  590. '''':
  591. Result := Result + '&apos.';
  592. '*':
  593. Result := Result + '&asterisk.';
  594. '@':
  595. Result := Result + '&atsign.';
  596. '\':
  597. Result := Result + '&bslash.';
  598. '"':
  599. Result := Result + '&cdq.';
  600. '-':
  601. Result := Result + '&hyphen.';
  602. //'°':
  603. // Result := Result + '&degree.';
  604. '$':
  605. Result := Result + '&dollar.';
  606. '=':
  607. Result := Result + '&eq.';
  608. '!':
  609. Result := Result + '&xclam.';
  610. '>':
  611. Result := Result + '&gt.';
  612. '(':
  613. Result := Result + '&lpar.';
  614. ')':
  615. Result := Result + '&rpar.';
  616. '+':
  617. Result := Result + '&plus.';
  618. '[':
  619. Result := Result + '&lbracket.';
  620. ']':
  621. Result := Result + '&rbracket.';
  622. else
  623. Result := Result + S[i];
  624. end;
  625. end;
  626. Function TIPFNewWriter.StripText(S : String) : String;
  627. var
  628. I: Integer;
  629. begin
  630. //Result := S;
  631. SetLength(Result, 0);
  632. for i := 1 to Length(S) do
  633. if not (S[i] in ['&','{','}','#'{,'_'},'$','%','''','~','^', '\', ' ', '<', '>']) then
  634. Result := Result + S[i];
  635. end;
  636. procedure TIPFNewWriter.Write(const s: String);
  637. begin
  638. if SuspendWriting then
  639. Exit;
  640. inherited Write(s);
  641. end;
  642. procedure TIPFNewWriter.WriteBeginDocument;
  643. begin
  644. fColCount := 0;
  645. Writeln(':userdoc.');
  646. WriteComment('This file has been created automatically by FPDoc');
  647. WriteComment('IPF output (c) 2010-2012 by Graeme Geldenhuys ([email protected])');
  648. writeln('');
  649. Writeln(':docprof toc=12345.');
  650. WriteLn(':title.' + PackageName);
  651. writeln('');
  652. writeln('');
  653. writeln(':h1.' + PackageName);
  654. InPackageOverview := True;
  655. // inherited WriteBeginDocument;
  656. end;
  657. procedure TIPFNewWriter.WriteEndDocument;
  658. begin
  659. inherited WriteEndDocument;
  660. writeln('');
  661. writeln('');
  662. writeln(':euserdoc.');
  663. writeln('');
  664. end;
  665. procedure TIPFNewWriter.WriteLabel(const s: String);
  666. var
  667. x: String;
  668. begin
  669. x := StringReplace(s, ':', '_', [rfReplaceAll]);
  670. if InHeading and (x <> '') then
  671. begin
  672. WriteLnF(FInHeadingText, [ ' name=' + LowerCase(x)]); // LowerCase(StripTexT(x))]);
  673. Writeln('');
  674. FInHeadingText := '';
  675. InHeading := False;
  676. end
  677. else
  678. begin
  679. WriteLnF(FInHeadingText, [ '' ]);
  680. Writeln('');
  681. FInHeadingText := '';
  682. InHeading := False;
  683. end;
  684. end;
  685. procedure TIPFNewWriter.WriteIndex(const s : String);
  686. begin
  687. // writeln(':i1 id=' + s + '.');
  688. end;
  689. procedure TIPFNewWriter.WriteType(const s: string);
  690. begin
  691. writeln('');
  692. Writeln('.* -------------------------------------------------');
  693. WriteLnF(':h5 name=%s.%s', [lowercase(PackageName+'_'+ModuleName+'_'+s), s]);
  694. // inherited WriteType(s);
  695. end;
  696. procedure TIPFNewWriter.WriteVariable(const s: string);
  697. begin
  698. writeln('');
  699. Writeln('.* -------------------------------------------------');
  700. WriteLnF(':h5 name=%s.%s', [lowercase(PackageName+'_'+ModuleName+'_'+s), s]);
  701. end;
  702. procedure TIPFNewWriter.WriteConstant(const s: string);
  703. begin
  704. writeln('');
  705. Writeln('.* -------------------------------------------------');
  706. WriteLnF(':h5 name=%s.%s', [lowercase(PackageName+'_'+ModuleName+'_'+s), s]);
  707. end;
  708. procedure TIPFNewWriter.StartListing(Frames: Boolean; const name: String);
  709. begin
  710. // writeln('');
  711. writeln(':xmp.');
  712. end;
  713. procedure TIPFNewWriter.EndListing;
  714. begin
  715. writeln(':exmp.');
  716. end;
  717. procedure TIPFNewWriter.WriteCommentLine;
  718. begin
  719. Writeln('');
  720. Writeln('.* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%');
  721. end;
  722. procedure TIPFNewWriter.WriteComment(Comment : String);
  723. begin
  724. Writeln('.* ' + Comment);
  725. end;
  726. procedure TIPFNewWriter.StartChapter(ChapterName : String);
  727. begin
  728. InHeading := True;
  729. Writeln('');
  730. Writeln('');
  731. WriteCommentLine;
  732. WriteComment('Chapter: ' + ChapterName);
  733. WriteCommentLine;
  734. FInHeadingText := ':h2%s. ' + ChapterName;
  735. //Writeln(':h2.' + ChapterName);
  736. //Writeln('');
  737. end;
  738. procedure TIPFNewWriter.StartSection(SectionName : String);
  739. begin
  740. InHeading := True;
  741. Writeln('');
  742. Writeln('');
  743. WriteCommentLine;
  744. WriteComment('Section: ' + SectionName);
  745. WriteCommentLine;
  746. writeln('');
  747. if SameText(SectionName, SDocOverview) then
  748. begin
  749. writeln(':p.');
  750. writeln(':p.');
  751. writeln(':lm margin=1.');
  752. DescrBeginBold;
  753. WriteLn(SDocOverview);
  754. DescrEndBold;
  755. // writeln(':lm margin=3.');
  756. writeln('.br');
  757. end
  758. else if InPackageOverview then
  759. begin
  760. FInHeadingText := ':h2%s. ' + SectionName;
  761. // Writeln(':h2.' + SectionName);
  762. InPackageOverview := False;
  763. end
  764. else
  765. begin
  766. FInHeadingText := ':h3%s. ' + SectionName;
  767. // Writeln(':h3.' + SectionName);
  768. InPackageOverview := False;
  769. end;
  770. // Writeln('');
  771. end;
  772. procedure TIPFNewWriter.StartSubSection(SubSectionName : String);
  773. begin
  774. LastSubSection := Lowercase(SubSectionName);
  775. InHeading := True;
  776. Writeln('');
  777. WriteCommentLine;
  778. FInHeadingText := ':h4%s. ' + SubSectionName;
  779. //Writeln(':h4.' + SubSectionName);
  780. end;
  781. procedure TIPFNewWriter.StartSubSubSection(SubSubSectionName : String);
  782. begin
  783. InHeading := True;
  784. FInHeadingText := ':h5%s. ' + SubSubSectionName;
  785. //Writeln(':h5.' + SubSubSectionName);
  786. end;
  787. Procedure TIPFNewWriter.StartProcedure;
  788. begin
  789. //writeln('');
  790. //writeln(':ul.');
  791. end;
  792. Procedure TIPFNewWriter.EndProcedure;
  793. begin
  794. //writeln('');
  795. //writeln(':eul.');
  796. end;
  797. Procedure TIPFNewWriter.StartSynopsis;
  798. begin
  799. writeln('');
  800. writeln(':p.');
  801. writeln(':lm margin=1.');
  802. writeln(':hp2.' + SDocSynopsis + ':ehp2.');
  803. writeln('.br');
  804. writeln(':lm margin=3.');
  805. end;
  806. Procedure TIPFNewWriter.StartDeclaration;
  807. begin
  808. writeln('');
  809. writeln(':p.');
  810. writeln(':lm margin=1.');
  811. writeln(':hp2.' + SDocDeclaration + ':ehp2.');
  812. writeln(':lm margin=3.');
  813. end;
  814. Procedure TIPFNewWriter.StartVisibility;
  815. begin
  816. writeln('');
  817. writeln(':p.');
  818. writeln(':lm margin=1.');
  819. writeln(':hp2.' + SDocVisibility + ':ehp2.');
  820. writeln(':lm margin=3.');
  821. writeln('.br');
  822. end;
  823. Procedure TIPFNewWriter.StartDescription;
  824. begin
  825. writeln('');
  826. writeln(':p.');
  827. writeln(':lm margin=1.');
  828. writeln(':hp2.' + SDocDescription + ':ehp2.');
  829. writeln(':lm margin=3.');
  830. writeln('.br');
  831. end;
  832. Procedure TIPFNewWriter.StartErrors;
  833. begin
  834. writeln('');
  835. writeln(':p.');
  836. writeln(':lm margin=1.');
  837. writeln(':hp2.' + SDocErrors + ':ehp2.');
  838. writeln(':lm margin=3.');
  839. writeln('.br');
  840. end;
  841. procedure TIPFNewWriter.StartVersion;
  842. begin
  843. writeln('');
  844. writeln(':p.');
  845. writeln(':lm margin=1.');
  846. writeln(':hp2.' + SDocVersion +':ehp2.');
  847. writeln(':lm margin=3.');
  848. writeln('.br');
  849. end;
  850. Procedure TIPFNewWriter.StartAccess;
  851. begin
  852. writeln('');
  853. writeln(':p.');
  854. writeln(':lm margin=1.');
  855. writeln(':hp2.' + SDocAccess + ':ehp2.');
  856. writeln(':lm margin=3.');
  857. writeln('.br');
  858. end;
  859. Procedure TIPFNewWriter.StartProperty;
  860. begin
  861. //writeln('');
  862. //Writeln('.* here I am');
  863. //writeln(':ul.');
  864. end;
  865. Procedure TIPFNewWriter.EndProperty;
  866. begin
  867. //writeln('');
  868. //writeln(':eul.');
  869. end;
  870. procedure TIPFNewWriter.WriteExampleFile(FN : String);
  871. var
  872. sl: TStringList;
  873. i: integer;
  874. begin
  875. if (FN<>'') then
  876. begin
  877. writeln('');
  878. writeln('');
  879. Writeln(':p.');
  880. writeln(':lm margin=1.');
  881. Writeln(':hp2.Example:ehp2.');
  882. writeln(':lm margin=3.');
  883. writeln('.br');
  884. writeln('Filename&colon. :hp1.' + EscapeText(FN) + ':ehp1.');
  885. writeln(':p.');
  886. writeln(':xmp.');
  887. //writeln(':im ' + FN);
  888. sl := TStringList.Create;
  889. try
  890. sl.LoadFromFile(FN);
  891. for i := 0 to sl.Count-1 do
  892. Writeln(EscapeText(sl[i]));
  893. finally
  894. sl.Free;
  895. end;
  896. writeln(':exmp.');
  897. end;
  898. end;
  899. procedure TIPFNewWriter.StartOverview(WithAccess : Boolean);
  900. begin
  901. {
  902. If With access then it is a property overview.
  903. Otherwise it is a method/function overview.
  904. If tabular output is generated, the preferred output order is:
  905. With access:
  906. Col 1 : Page reference
  907. Col 2 : Property Name
  908. Col 3 : Accessibility (r/w)
  909. Col 4 : Description
  910. Without access:
  911. Col 1 : Page reference
  912. Col 2 : Method name
  913. Col 3 : Description
  914. (See the two WriteOverviewMember functions)
  915. }
  916. writeln('');
  917. writeln(':parml tsize=30 break=none compact.');
  918. // FlushBuffer;
  919. end;
  920. procedure TIPFNewWriter.EndOverview;
  921. begin
  922. { End of overview }
  923. writeln('');
  924. writeln(':eparml.');
  925. writeln(':p.');
  926. // FlushBuffer;
  927. end;
  928. procedure TIPFNewWriter.WriteOverviewMember(const ALabel,AName,Access,ADescr : String);
  929. var
  930. s1, s2: string;
  931. begin
  932. { Write one entry in property overview:
  933. ALabel : Label, as returned by GetLabel
  934. AName : Property name
  935. Access : Property acces (r/w/a)
  936. Descr : Description
  937. }
  938. s1 := StringReplace(ALabel, ':', '_', [rfReplaceAll]);
  939. s2 := StringReplace(AName, ':', '_', [rfReplaceAll]);
  940. WriteLn(Format(':pt. :link reftype=hd refid=%s.%s:elink. [%s]',[s1, s2, Access]));
  941. WriteLn(Format(':pd. %s', [ADescr]));
  942. end;
  943. procedure TIPFNewWriter.WriteOverviewMember(const ALabel,AName,ADescr : String);
  944. var
  945. s1, s2: string;
  946. begin
  947. { Write one entry in method overview:
  948. ALabel : Label, as returned by GetLabel
  949. AName : Method name
  950. Descr : Description
  951. }
  952. s1 := StringReplace(ALabel, ':', '_', [rfReplaceAll]);
  953. s2 := StringReplace(AName, ':', '_', [rfReplaceAll]);
  954. WriteLn(Format(':pt. :link reftype=hd refid=%s.%s :elink.',[s1, s2]));
  955. WriteLn(Format(':pd. %s', [ADescr]));
  956. end;
  957. Procedure TIPFNewWriter.StartSeeAlso;
  958. begin
  959. writeln('');
  960. writeln(':p.');
  961. writeln(':lm margin=1.');
  962. writeln(':hp2.See Also:ehp2.');
  963. writeln(':lm margin=3.');
  964. writeln('.br');
  965. end;
  966. procedure TIPFNewWriter.EndSeealso;
  967. begin
  968. writeln('');
  969. end;
  970. procedure TIPFNewWriter.StartUnitOverview(AModuleName,AModuleLabel : String);
  971. begin
  972. { Start of unit overview.
  973. AModuleName : Name of current unit.
  974. AModuleLabel : Label name of current unit.
  975. }
  976. writeln('');
  977. writeln(':p.');
  978. writeln(':lm margin=1.');
  979. DescrBeginBold;
  980. writeln(EscapeText(Format(SDocUsedUnitsByUnitXY, [AModuleName])));
  981. DescrEndBold;
  982. writeln(':lm margin=3.');
  983. writeln('.br');
  984. writeln(':p.');
  985. writeln(':ol.');
  986. end;
  987. procedure TIPFNewWriter.WriteUnitEntry(UnitRef : TPasType);
  988. begin
  989. { Write one unit entry }
  990. writeln(':li.' + EscapeText(UnitRef.Name));
  991. end;
  992. procedure TIPFNewWriter.EndUnitOverview;
  993. begin
  994. { end of unit overview }
  995. writeln(':eol.');
  996. end;
  997. initialization
  998. // Do not localize IPFWriterName
  999. RegisterWriter(TIPFNewWriter, IPFWriterName, SIPFUsageWriterDescr);
  1000. finalization
  1001. UnRegisterWriter(IPFWriterName);
  1002. end.