dw_ipflin.pas 24 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010
  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. class function FileNameExtension: string; override;
  85. procedure DescrBeginURL(const AURL: DOMString); override;
  86. procedure DescrEndURL; override;
  87. // Description node conversion. Overrides for TFPDocWriter.
  88. procedure DescrBeginBold; override;
  89. procedure DescrEndBold; override;
  90. procedure DescrBeginItalic; override;
  91. procedure DescrEndItalic; override;
  92. procedure DescrBeginEmph; override;
  93. procedure DescrEndEmph; override;
  94. procedure DescrWriteText(const AText: DOMString); override;
  95. procedure DescrWriteFileEl(const AText: DOMString); override;
  96. procedure DescrWriteKeywordEl(const AText: DOMString); override;
  97. procedure DescrWriteVarEl(const AText: DOMString); override;
  98. procedure DescrBeginLink(const AId: DOMString); override;
  99. procedure DescrEndLink; override;
  100. procedure DescrWriteLinebreak; override;
  101. procedure DescrBeginParagraph; override;
  102. procedure DescrBeginCode(HasBorder: Boolean; const AHighlighterName: String); override;
  103. procedure DescrWriteCodeLine(const ALine: String); override;
  104. procedure DescrEndCode; override;
  105. procedure DescrEndParagraph; override;
  106. procedure DescrBeginOrderedList; override;
  107. procedure DescrEndOrderedList; override;
  108. procedure DescrBeginUnorderedList; override;
  109. procedure DescrEndUnorderedList; override;
  110. procedure DescrBeginDefinitionList; override;
  111. procedure DescrEndDefinitionList; override;
  112. procedure DescrBeginListItem; override;
  113. procedure DescrEndListItem; override;
  114. procedure DescrBeginDefinitionTerm; override;
  115. procedure DescrEndDefinitionTerm; override;
  116. procedure DescrBeginDefinitionEntry; override;
  117. procedure DescrEndDefinitionEntry; override;
  118. procedure DescrBeginSectionTitle; override;
  119. procedure DescrBeginSectionBody; override;
  120. procedure DescrEndSection; override;
  121. procedure DescrBeginRemark; override;
  122. procedure DescrEndRemark; override;
  123. procedure DescrBeginTable(ColCount: Integer; HasBorder: Boolean); override;
  124. procedure DescrEndTable; override;
  125. procedure DescrBeginTableCaption; override;
  126. procedure DescrEndTableCaption; override;
  127. procedure DescrBeginTableHeadRow; override;
  128. procedure DescrEndTableHeadRow; override;
  129. procedure DescrBeginTableRow; override;
  130. procedure DescrEndTableRow; override;
  131. procedure DescrBeginTableCell; override;
  132. procedure DescrEndTableCell; override;
  133. // TFPDocWriter class methods
  134. public
  135. constructor Create(APackage: TPasPackage; AEngine: TFPDocEngine); override;
  136. end;
  137. implementation
  138. uses
  139. SysUtils, dwriter;
  140. { TFPDocWriter overrides }
  141. procedure TIPFNewWriter.DescrBeginBold;
  142. begin
  143. { Start bold output }
  144. WriteLn(':hp2.');
  145. end;
  146. procedure TIPFNewWriter.DescrEndBold;
  147. begin
  148. { End bold output }
  149. WriteLn(':ehp2.');
  150. end;
  151. procedure TIPFNewWriter.DescrBeginItalic;
  152. begin
  153. { Start italic output }
  154. WriteLn(':hp1.');
  155. end;
  156. procedure TIPFNewWriter.DescrEndItalic;
  157. begin
  158. { End italic output }
  159. WriteLn(':ehp1.');
  160. end;
  161. procedure TIPFNewWriter.DescrBeginEmph;
  162. begin
  163. { Start emphasized output }
  164. Write(':hp1.');
  165. end;
  166. procedure TIPFNewWriter.DescrEndEmph;
  167. begin
  168. { End emphasized output }
  169. Write(':ehp1.');
  170. end;
  171. procedure TIPFNewWriter.DescrWriteText(const AText: DOMString);
  172. const
  173. cMax = 100;
  174. var
  175. sl: TStringlist;
  176. ns: string;
  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. { TLinearWriter overrides}
  442. class function TIPFNewWriter.FileNameExtension: String;
  443. begin
  444. Result := TIPFExtension;
  445. end;
  446. procedure TIPFNewWriter.DescrBeginURL(const AURL: DOMString);
  447. begin
  448. //Write(EscapeText(AURL));
  449. end;
  450. procedure TIPFNewWriter.DescrEndURL;
  451. begin
  452. // do nothing
  453. end;
  454. function TIPFNewWriter.GetLabel(AElement: TPasElement): String;
  455. var
  456. i: Integer;
  457. begin
  458. if AElement.ClassType = TPasUnresolvedTypeRef then
  459. Result := Engine.ResolveLink(Module, AElement.Name)
  460. else
  461. begin
  462. Result := AElement.PathName;
  463. Result := LowerCase(Copy(Result, 2, Length(Result) - 1)); // Remove # infront of eg: '#Corelib' string
  464. end;
  465. Result := StringReplace(Result, '.', '_', [rfReplaceAll]);
  466. Result := StringReplace(Result, ' ', '_', [rfReplaceAll]);
  467. end;
  468. Function TIPFNewWriter.EscapeText(S : String) : String;
  469. var
  470. i: Integer;
  471. begin
  472. SetLength(Result, 0);
  473. for i := 1 to Length(S) do
  474. case S[i] of
  475. '.': // Escape these characters
  476. Result := Result + '&per.';
  477. ':':
  478. Result := Result + '&colon.';
  479. ',':
  480. Result := Result + '&comma.';
  481. '&':
  482. Result := Result + '&amp.';
  483. // '_':
  484. // Result := Result + '&us.';
  485. '^':
  486. Result := Result + '&caret.';
  487. '''':
  488. Result := Result + '&apos.';
  489. '*':
  490. Result := Result + '&asterisk.';
  491. '@':
  492. Result := Result + '&atsign.';
  493. '\':
  494. Result := Result + '&bslash.';
  495. '"':
  496. Result := Result + '&cdq.';
  497. '-':
  498. Result := Result + '&hyphen.';
  499. //'°':
  500. // Result := Result + '&degree.';
  501. '$':
  502. Result := Result + '&dollar.';
  503. '=':
  504. Result := Result + '&eq.';
  505. '!':
  506. Result := Result + '&xclam.';
  507. '>':
  508. Result := Result + '&gt.';
  509. '(':
  510. Result := Result + '&lpar.';
  511. ')':
  512. Result := Result + '&rpar.';
  513. '+':
  514. Result := Result + '&plus.';
  515. '[':
  516. Result := Result + '&lbracket.';
  517. ']':
  518. Result := Result + '&rbracket.';
  519. else
  520. Result := Result + S[i];
  521. end;
  522. end;
  523. Function TIPFNewWriter.StripText(S : String) : String;
  524. var
  525. I,L: Integer;
  526. begin
  527. //Result := S;
  528. SetLength(Result, 0);
  529. for i := 1 to Length(S) do
  530. if not (S[i] in ['&','{','}','#'{,'_'},'$','%','''','~','^', '\', ' ', '<', '>']) then
  531. Result := Result + S[i];
  532. end;
  533. procedure TIPFNewWriter.Write(const s: String);
  534. begin
  535. if SuspendWriting then
  536. Exit;
  537. inherited Write(s);
  538. end;
  539. procedure TIPFNewWriter.WriteBeginDocument;
  540. begin
  541. fColCount := 0;
  542. Writeln(':userdoc.');
  543. WriteComment('This file has been created automatically by FPDoc');
  544. WriteComment('IPF output (c) 2010 by Graeme Geldenhuys ([email protected])');
  545. writeln('');
  546. Writeln(':docprof toc=12345.');
  547. WriteLn(':title.' + PackageName);
  548. writeln('');
  549. writeln('');
  550. writeln(':h1.' + PackageName);
  551. InPackageOverview := True;
  552. // inherited WriteBeginDocument;
  553. end;
  554. procedure TIPFNewWriter.WriteEndDocument;
  555. begin
  556. inherited WriteEndDocument;
  557. writeln('');
  558. writeln('');
  559. writeln(':euserdoc.');
  560. writeln('');
  561. end;
  562. procedure TIPFNewWriter.WriteLabel(const s: String);
  563. var
  564. x: String;
  565. begin
  566. x := StringReplace(s, ':', '_', [rfReplaceAll]);
  567. if InHeading and (x <> '') then
  568. begin
  569. WriteLnF(FInHeadingText, [ ' name=' + LowerCase(x)]); // LowerCase(StripTexT(x))]);
  570. Writeln('');
  571. FInHeadingText := '';
  572. InHeading := False;
  573. end
  574. else
  575. begin
  576. WriteLnF(FInHeadingText, [ '' ]);
  577. Writeln('');
  578. FInHeadingText := '';
  579. InHeading := False;
  580. end;
  581. end;
  582. procedure TIPFNewWriter.WriteIndex(const s : String);
  583. begin
  584. // writeln(':i1 id=' + s + '.');
  585. end;
  586. procedure TIPFNewWriter.WriteType(const s: string);
  587. begin
  588. writeln('');
  589. Writeln('.* -------------------------------------------------');
  590. WriteLnF(':h5 name=%s.%s', [lowercase(PackageName+'_'+ModuleName+'_'+s), s]);
  591. // inherited WriteType(s);
  592. end;
  593. procedure TIPFNewWriter.WriteVariable(const s: string);
  594. begin
  595. writeln('');
  596. Writeln('.* -------------------------------------------------');
  597. WriteLnF(':h5 name=%s.%s', [lowercase(PackageName+'_'+ModuleName+'_'+s), s]);
  598. end;
  599. procedure TIPFNewWriter.WriteConstant(const s: string);
  600. begin
  601. writeln('');
  602. Writeln('.* -------------------------------------------------');
  603. WriteLnF(':h5 name=%s.%s', [lowercase(PackageName+'_'+ModuleName+'_'+s), s]);
  604. end;
  605. procedure TIPFNewWriter.StartListing(Frames: Boolean; const name: String);
  606. begin
  607. // writeln('');
  608. writeln(':xmp.');
  609. end;
  610. procedure TIPFNewWriter.EndListing;
  611. begin
  612. writeln(':exmp.');
  613. end;
  614. procedure TIPFNewWriter.WriteCommentLine;
  615. begin
  616. Writeln('');
  617. Writeln('.* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%');
  618. end;
  619. procedure TIPFNewWriter.WriteComment(Comment : String);
  620. begin
  621. Writeln('.* ' + Comment);
  622. end;
  623. procedure TIPFNewWriter.StartChapter(ChapterName : String);
  624. begin
  625. InHeading := True;
  626. Writeln('');
  627. Writeln('');
  628. WriteCommentLine;
  629. WriteComment('Chapter: ' + ChapterName);
  630. WriteCommentLine;
  631. FInHeadingText := ':h2%s. ' + ChapterName;
  632. //Writeln(':h2.' + ChapterName);
  633. //Writeln('');
  634. end;
  635. procedure TIPFNewWriter.StartSection(SectionName : String);
  636. begin
  637. InHeading := True;
  638. Writeln('');
  639. Writeln('');
  640. WriteCommentLine;
  641. WriteComment('Section: ' + SectionName);
  642. WriteCommentLine;
  643. writeln('');
  644. if SameText(SectionName, SDocOverview) then
  645. begin
  646. writeln(':p.');
  647. writeln(':p.');
  648. writeln(':lm margin=1.');
  649. DescrBeginBold;
  650. WriteLn(SDocOverview);
  651. DescrEndBold;
  652. // writeln(':lm margin=3.');
  653. writeln('.br');
  654. end;
  655. if InPackageOverview then
  656. begin
  657. FInHeadingText := ':h2%s. ' + SectionName;
  658. // Writeln(':h2.' + SectionName);
  659. InPackageOverview := False;
  660. end
  661. else
  662. begin
  663. FInHeadingText := ':h3%s. ' + SectionName;
  664. // Writeln(':h3.' + SectionName);
  665. end;
  666. // Writeln('');
  667. end;
  668. procedure TIPFNewWriter.StartSubSection(SubSectionName : String);
  669. begin
  670. LastSubSection := Lowercase(SubSectionName);
  671. InHeading := True;
  672. Writeln('');
  673. WriteCommentLine;
  674. FInHeadingText := ':h4%s. ' + SubSectionName;
  675. //Writeln(':h4.' + SubSectionName);
  676. end;
  677. procedure TIPFNewWriter.StartSubSubSection(SubSubSectionName : String);
  678. begin
  679. InHeading := True;
  680. FInHeadingText := ':h5%s. ' + SubSubSectionName;
  681. //Writeln(':h5.' + SubSubSectionName);
  682. end;
  683. Procedure TIPFNewWriter.StartProcedure;
  684. begin
  685. //writeln('');
  686. //writeln(':ul.');
  687. end;
  688. Procedure TIPFNewWriter.EndProcedure;
  689. begin
  690. //writeln('');
  691. //writeln(':eul.');
  692. end;
  693. Procedure TIPFNewWriter.StartSynopsis;
  694. begin
  695. writeln('');
  696. writeln(':p.');
  697. writeln(':lm margin=1.');
  698. writeln(':hp2.' + SDocSynopsis + ':ehp2.');
  699. writeln('.br');
  700. writeln(':lm margin=3.');
  701. end;
  702. Procedure TIPFNewWriter.StartDeclaration;
  703. begin
  704. writeln('');
  705. writeln(':p.');
  706. writeln(':lm margin=1.');
  707. writeln(':hp2.' + SDocDeclaration + ':ehp2.');
  708. writeln(':lm margin=3.');
  709. end;
  710. Procedure TIPFNewWriter.StartVisibility;
  711. begin
  712. writeln('');
  713. writeln(':p.');
  714. writeln(':lm margin=1.');
  715. writeln(':hp2.' + SDocVisibility + ':ehp2.');
  716. writeln(':lm margin=3.');
  717. writeln('.br');
  718. end;
  719. Procedure TIPFNewWriter.StartDescription;
  720. begin
  721. writeln('');
  722. writeln(':p.');
  723. writeln(':lm margin=1.');
  724. writeln(':hp2.' + SDocDescription + ':ehp2.');
  725. writeln(':lm margin=3.');
  726. writeln('.br');
  727. end;
  728. Procedure TIPFNewWriter.StartErrors;
  729. begin
  730. writeln('');
  731. writeln(':p.');
  732. writeln(':lm margin=1.');
  733. writeln(':hp2.' + SDocErrors + ':ehp2.');
  734. writeln(':lm margin=3.');
  735. writeln('.br');
  736. end;
  737. procedure TIPFNewWriter.StartVersion;
  738. begin
  739. writeln('');
  740. writeln(':p.');
  741. writeln(':lm margin=1.');
  742. writeln(':hp2.' + SDocVersion +':ehp2.');
  743. writeln(':lm margin=3.');
  744. writeln('.br');
  745. end;
  746. Procedure TIPFNewWriter.StartAccess;
  747. begin
  748. writeln('');
  749. writeln(':p.');
  750. writeln(':lm margin=1.');
  751. writeln(':hp2.' + SDocAccess + ':ehp2.');
  752. writeln(':lm margin=3.');
  753. writeln('.br');
  754. end;
  755. Procedure TIPFNewWriter.StartProperty;
  756. begin
  757. //writeln('');
  758. //Writeln('.* here I am');
  759. //writeln(':ul.');
  760. end;
  761. Procedure TIPFNewWriter.EndProperty;
  762. begin
  763. //writeln('');
  764. //writeln(':eul.');
  765. end;
  766. procedure TIPFNewWriter.WriteExampleFile(FN : String);
  767. var
  768. sl: TStringList;
  769. i: integer;
  770. begin
  771. if (FN<>'') then
  772. begin
  773. writeln('');
  774. writeln('');
  775. Writeln(':p.');
  776. writeln(':lm margin=1.');
  777. Writeln(':hp2.Example:ehp2.');
  778. writeln(':lm margin=3.');
  779. writeln('.br');
  780. writeln('Filename&colon. :hp1.' + EscapeText(FN) + ':ehp1.');
  781. writeln(':p.');
  782. writeln(':xmp.');
  783. //writeln(':im ' + FN);
  784. sl := TStringList.Create;
  785. try
  786. sl.LoadFromFile(FN);
  787. for i := 0 to sl.Count-1 do
  788. Writeln(EscapeText(sl[i]));
  789. finally
  790. sl.Free;
  791. end;
  792. writeln(':exmp.');
  793. end;
  794. end;
  795. procedure TIPFNewWriter.StartOverview(WithAccess : Boolean);
  796. begin
  797. {
  798. If With access then it is a property overview.
  799. Otherwise it is a method/function overview.
  800. If tabular output is generated, the preferred output order is:
  801. With access:
  802. Col 1 : Page reference
  803. Col 2 : Property Name
  804. Col 3 : Accessibility (r/w)
  805. Col 4 : Description
  806. Without access:
  807. Col 1 : Page reference
  808. Col 2 : Method name
  809. Col 3 : Description
  810. (See the two WriteOverviewMember functions)
  811. }
  812. writeln('');
  813. writeln(':parml tsize=30 break=none compact.');
  814. // FlushBuffer;
  815. end;
  816. procedure TIPFNewWriter.EndOverview;
  817. begin
  818. { End of overview }
  819. writeln('');
  820. writeln(':eparml.');
  821. writeln(':p.');
  822. // FlushBuffer;
  823. end;
  824. procedure TIPFNewWriter.WriteOverviewMember(const ALabel,AName,Access,ADescr : String);
  825. var
  826. s1, s2: string;
  827. begin
  828. { Write one entry in property overview:
  829. ALabel : Label, as returned by GetLabel
  830. AName : Property name
  831. Access : Property acces (r/w/a)
  832. Descr : Description
  833. }
  834. s1 := StringReplace(ALabel, ':', '_', [rfReplaceAll]);
  835. s2 := StringReplace(AName, ':', '_', [rfReplaceAll]);
  836. WriteLn(Format(':pt. :link reftype=hd refid=%s.%s:elink. [%s]',[s1, s2, Access]));
  837. WriteLn(Format(':pd. %s', [ADescr]));
  838. end;
  839. procedure TIPFNewWriter.WriteOverviewMember(const ALabel,AName,ADescr : String);
  840. var
  841. s1, s2: string;
  842. begin
  843. { Write one entry in method overview:
  844. ALabel : Label, as returned by GetLabel
  845. AName : Method name
  846. Descr : Description
  847. }
  848. s1 := StringReplace(ALabel, ':', '_', [rfReplaceAll]);
  849. s2 := StringReplace(AName, ':', '_', [rfReplaceAll]);
  850. WriteLn(Format(':pt. :link reftype=hd refid=%s.%s :elink.',[s1, s2]));
  851. WriteLn(Format(':pd. %s', [ADescr]));
  852. end;
  853. Procedure TIPFNewWriter.StartSeeAlso;
  854. begin
  855. writeln('');
  856. writeln(':p.');
  857. writeln(':lm margin=1.');
  858. writeln(':hp2.See Also:ehp2.');
  859. writeln(':lm margin=3.');
  860. writeln('.br');
  861. end;
  862. procedure TIPFNewWriter.EndSeealso;
  863. begin
  864. writeln('');
  865. end;
  866. procedure TIPFNewWriter.StartUnitOverview(AModuleName,AModuleLabel : String);
  867. begin
  868. { Start of unit overview.
  869. AModuleName : Name of current unit.
  870. AModuleLabel : Label name of current unit.
  871. }
  872. writeln('');
  873. writeln(':p.');
  874. writeln(':lm margin=1.');
  875. DescrBeginBold;
  876. writeln(EscapeText(Format(SDocUsedUnitsByUnitXY, [AModuleName])));
  877. DescrEndBold;
  878. writeln(':lm margin=3.');
  879. writeln('.br');
  880. writeln(':p.');
  881. writeln(':ol.');
  882. end;
  883. procedure TIPFNewWriter.WriteUnitEntry(UnitRef : TPasType);
  884. begin
  885. { Write one unit entry }
  886. writeln(':li.' + EscapeText(UnitRef.Name));
  887. end;
  888. procedure TIPFNewWriter.EndUnitOverview;
  889. begin
  890. { end of unit overview }
  891. writeln(':eol.');
  892. end;
  893. initialization
  894. // Do not localize IPFWriterName
  895. RegisterWriter(TIPFNewWriter, IPFWriterName, SIPFUsageWriterDescr);
  896. finalization
  897. UnRegisterWriter(IPFWriterName);
  898. end.