dw_htmlchm.inc 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. {%mainunit dw_html}
  2. {$IFDEF chmInterface}
  3. type
  4. { TCHMHTMLWriter }
  5. TCHMHTMLWriter = class(THTMLWriter)
  6. private
  7. FOutChm: TStream;
  8. FChm: TChmWriter;
  9. FTempUncompressed: TStream;
  10. FTempUncompressedName: String;
  11. FChmTitle: String;
  12. FTOCName,
  13. FIndexName,
  14. FDefaultPage: String;
  15. FMakeSearchable,
  16. FNoBinToc,
  17. FNoBinIndex,
  18. FAutoTOC,
  19. FAutoIndex: Boolean;
  20. FOtherFiles: String;
  21. procedure ProcessOptions;
  22. function ResolveLinkIDAbs(const Name: String; Level : Integer = 0): DOMString;
  23. function RetrieveOtherFiles(const DataName: String; out PathInChm: String; out FileName: String; var Stream: TStream): Boolean;
  24. procedure LastFileAdded(Sender: TObject);
  25. procedure GenerateTOC;
  26. procedure GenerateIndex;
  27. public
  28. procedure WriteHTMLPages; override;
  29. function InterPretOption(const Cmd,Arg : String): boolean; override;
  30. class procedure Usage(List: TStrings); override;
  31. Class Function FileNameExtension : String; override;
  32. Class procedure SplitImport(var AFilename, ALinkPrefix: String); override;
  33. end;
  34. {$ELSE} // implementation
  35. { TCHMHTMLWriter }
  36. function TCHMHTMLWriter.ResolveLinkIDAbs(const Name: String; Level : Integer = 0): DOMString;
  37. begin
  38. Result:=FixHTMLpath(Engine.ResolveLink(Module,Name, True));
  39. // for global index: don't make it relative to the current document.
  40. end;
  41. procedure TCHMHTMLWriter.ProcessOptions;
  42. var
  43. TempStream: TMemoryStream;
  44. begin
  45. if FDefaultPage = '' then
  46. FDefaultPage := 'index.html'
  47. else
  48. begin
  49. DoLog('Note: --index-page not assigned. Using default "index.html"');
  50. end;
  51. if FCSSFile <> '' then
  52. begin
  53. if not FileExists(FCSSFile) Then
  54. Raise Exception.CreateFmt('Can''t find CSS file "%S"',[FCSSFILE]);
  55. TempStream := TMemoryStream.Create;
  56. TempStream.LoadFromFile(FCSSFile);
  57. TempStream.Position := 0;
  58. FChm.AddStreamToArchive('fpdoc.css', '/', TempStream, True);
  59. TempStream.Free;
  60. end;
  61. FChm.DefaultPage := FDefaultPage;
  62. if FOtherFiles <> '' then
  63. begin
  64. FChm.FilesToCompress.LoadFromFile(FOtherFiles);
  65. end;
  66. FChm.FullTextSearch := FMakeSearchable;
  67. end;
  68. function TCHMHTMLWriter.RetrieveOtherFiles(const DataName: String; out
  69. PathInChm: String; out FileName: String; var Stream: TStream): Boolean;
  70. var
  71. Dir: String;
  72. begin
  73. if Stream <> nil then
  74. Stream.Free;
  75. Stream := TMemoryStream.Create;
  76. TMemoryStream(Stream).LoadFromFile(DataName);
  77. FileName := ExtractFileName(DataName);
  78. if ExtractFileDir(DataName) <> '' then
  79. PathInChm := ExtractRelativepath(GetCurrentDir, ExtractFileDir(DataName))
  80. else
  81. PathInChm := '/';
  82. FixHTMLpath(PathInChm);
  83. Stream.Position := 0;
  84. end;
  85. procedure TCHMHTMLWriter.LastFileAdded(Sender: TObject);
  86. var
  87. TmpStream: TMemoryStream;
  88. begin
  89. TmpStream := TMemoryStream.Create;
  90. if FAutoTOC then
  91. GenerateTOC
  92. else
  93. if FTOCName <> '' then
  94. begin
  95. TmpStream.LoadFromFile(FTOCName);
  96. TmpStream.Position := 0;
  97. FChm.AppendTOC(TmpStream);
  98. TmpStream.Size := 0;
  99. end;
  100. if FAutoIndex then
  101. GenerateIndex
  102. else
  103. if FIndexName <> '' then
  104. begin
  105. TmpStream.LoadFromFile(FIndexName);
  106. TmpStream.Position := 0;
  107. FChm.AppendIndex(TmpStream);
  108. end;
  109. TmpStream.Free;
  110. DoLog('Finishing compressing...');
  111. end;
  112. function TOCSort(Item1, Item2: TChmSiteMapItem): Integer;
  113. begin
  114. Result := CompareText(LowerCase(Item1.Text), LowerCase(Item2.Text));
  115. end;
  116. function GetAlphaItem(AItems: TChmSiteMapItems; AName: String): TChmSiteMapItem;
  117. var
  118. x: Integer;
  119. begin
  120. Result := nil;
  121. for x := 0 to AItems.Count-1 do
  122. begin
  123. if AItems.Item[x].Text = AName then
  124. Exit(AItems.Item[x]);
  125. end;
  126. Result := AItems.NewItem;
  127. Result.Text := AName;
  128. end;
  129. procedure TCHMHTMLWriter.GenerateTOC;
  130. var
  131. TOC: TChmSiteMap;
  132. Element: TPasElement;
  133. k: Integer;
  134. j: Integer;
  135. i: Integer;
  136. AModule: TPasModule;
  137. Member: TPasElement;
  138. Stream: TMemoryStream;
  139. TmpItem: TChmSiteMapItem;
  140. ObjByUnitItem,
  141. AlphaObjItem,
  142. ObjUnitItem,
  143. RoutinesByUnitItem,
  144. RoutinesUnitItem,
  145. AlphaRoutinesItem: TChmSiteMapItem;
  146. begin
  147. DoLog('Generating Table of contents...');
  148. if Assigned(Package) then
  149. begin
  150. Toc := TChmSiteMap.Create(stTOC);
  151. Stream := TMemoryStream.Create;
  152. ObjByUnitItem := TOC.Items.NewItem;
  153. ObjByUnitItem.Text := 'Classes and Objects, by Unit';
  154. AlphaObjItem := TOC.Items.NewItem;
  155. AlphaObjItem.Text := 'Alphabetical Classes and Objects List';
  156. RoutinesByUnitItem := TOC.Items.NewItem;
  157. RoutinesByUnitItem.Text := 'Routines, by Unit';
  158. AlphaRoutinesItem := TOC.Items.NewItem;
  159. AlphaRoutinesItem.Text := 'Alphabetical Routines List';
  160. // objects and classes
  161. for i := 0 to Package.Modules.Count - 1 do
  162. begin
  163. AModule := TPasModule(Package.Modules[i]);
  164. If not assigned(AModule.InterfaceSection) Then
  165. Continue;
  166. ObjUnitItem := ObjByUnitItem.Children.NewItem;
  167. ObjUnitItem.Text := AModule.Name;
  168. RoutinesUnitItem := RoutinesByUnitItem.Children.NewItem;
  169. RoutinesUnitItem.Text := AModule.Name;
  170. for j := 0 to AModule.InterfaceSection.Classes.Count-1 do
  171. begin
  172. Element := TPasClassType(AModule.InterfaceSection.Classes[j]);
  173. // by unit
  174. TmpItem := ObjUnitItem.Children.NewItem;
  175. TmpItem.Text := Element.Name;
  176. TmpItem.Local := FixHTMLpath(Allocator.GetFilename(Element, 0));
  177. //alpha
  178. TmpItem := GetAlphaItem(AlphaObjItem.Children, UpperCase(Copy(Element.Name, 1, 2))).Children.NewItem;
  179. TmpItem.Text := Element.Name;
  180. TmpItem.Local := FixHTMLpath(Allocator.GetFilename(Element, 0));
  181. end;
  182. // non object procedures and functions
  183. for j := 0 to AModule.InterfaceSection.Functions.Count-1 do
  184. begin
  185. Element := TPasFunctionType(AModule.InterfaceSection.Functions[j]);
  186. // by unit
  187. TmpItem := RoutinesUnitItem.Children.NewItem;
  188. TmpItem.Text := Element.Name;
  189. TmpItem.Local := FixHTMLpath(Allocator.GetFilename(Element, 0));
  190. // alpha
  191. TmpItem := GetAlphaItem(AlphaRoutinesItem.Children, UpperCase(Element.Name[1])).Children.NewItem;
  192. TmpItem.Text := Element.Name;
  193. TmpItem.Local := FixHTMLpath(Allocator.GetFilename(Element, 0));
  194. end;
  195. end;
  196. end;
  197. // cleanup
  198. for i := ObjByUnitItem.Children.Count-1 downto 0 do
  199. begin
  200. if ObjByUnitItem.Children.Item[i].Children.Count = 0 then
  201. ObjByUnitItem.Children.Delete(i);
  202. end;
  203. for i := RoutinesByUnitItem.Children.Count-1 downto 0 do
  204. begin
  205. if RoutinesByUnitItem.Children.Item[i].Children.Count = 0 then
  206. RoutinesByUnitItem.Children.Delete(i);
  207. end;
  208. for i := TOC.Items.Count-1 downto 0 do
  209. begin
  210. if TOC.Items.Item[i].Children.Count = 0 then
  211. TOC.Items.Delete(i);
  212. end;
  213. // Sort
  214. for i := 0 to TOC.Items.Count-1 do
  215. begin
  216. TOC.Items.Item[i].Children.Sort(TListSortCompare(@TOCSort));
  217. for j := 0 to TOC.Items.Item[i].Children.Count-1 do
  218. begin
  219. TOC.Items.Item[i].Children.Item[j].Children.Sort(TListSortCompare(@TOCSort));
  220. end;
  221. end;
  222. if not fnobintoc then
  223. fchm.AppendBinaryTOCFromSiteMap(Toc);
  224. TOC.SaveToStream(Stream);
  225. TOC.Free;
  226. fchm.AppendTOC(Stream);
  227. Stream.Free;
  228. end;
  229. type
  230. TClassMemberType = (cmtProcedure, cmtFunction, cmtConstructor, cmtDestructor,
  231. cmtInterface, cmtProperty, cmtVariable, cmtUnknown);
  232. function ElementType(Element: TPasElement): TClassMemberType;
  233. var
  234. ETypeName: String;
  235. begin
  236. Result := cmtUnknown;
  237. ETypeName := Element.ElementTypeName;
  238. //overloaded we don't care
  239. if ETypeName[1] = 'o' then ETypeName := Copy(ETypeName, 11, Length(ETypeName));
  240. if ETypeName[1] = 'f' then Exit(cmtFunction);
  241. if ETypeName[1] = 'c' then Exit(cmtConstructor);
  242. if ETypeName[1] = 'v' then Exit(cmtVariable);
  243. if ETypeName[1] = 'i' then Exit(cmtInterface);
  244. // the p's
  245. if ETypeName[4] = 'c' then Exit(cmtProcedure);
  246. if ETypeName[4] = 'p' then Exit(cmtProperty);
  247. end;
  248. procedure TCHMHTMLWriter.GenerateIndex;
  249. var
  250. Index: TChmSiteMap;
  251. i, j, k: Integer;
  252. TmpItem: TChmSiteMapItem;
  253. ParentItem: TChmSiteMapItem;
  254. AModule: TPasModule;
  255. TmpElement: TPasElement;
  256. ParentElement: TPasElement;
  257. MemberItem: TChmSiteMapItem;
  258. Stream: TMemoryStream;
  259. s: string;
  260. begin
  261. DoLog('Generating Index...');
  262. if Assigned(Package) then
  263. begin
  264. Index := TChmSiteMap.Create(stIndex);
  265. Stream := TMemoryStream.Create;
  266. for i := 0 to Package.Modules.Count - 1 do
  267. begin
  268. AModule := TPasModule(Package.Modules[i]);
  269. if not assigned(AModule.InterfaceSection) then
  270. continue;
  271. ParentItem := Index.Items.NewItem;
  272. ParentItem.Text := AModule.Name;
  273. ParentItem.Local := FixHTMLpath(Allocator.GetFilename(AModule, 0));
  274. // classes
  275. for j := 0 to AModule.InterfaceSection.Classes.Count-1 do
  276. begin
  277. ParentElement := TPasClassType(AModule.InterfaceSection.Classes[j]);
  278. ParentItem := Index.Items.NewItem;
  279. ParentItem.Text := ParentELement.Name;
  280. ParentItem.Local := FixHTMLpath(Allocator.GetFilename(ParentElement, 0));
  281. for k := 0 to TPasClassType(ParentElement).Members.Count-1 do
  282. begin
  283. TmpElement := TPasElement(TPasClassType(ParentElement).Members.Items[k]);
  284. if TmpElement is TPasEnumValue then
  285. s := ResolveLinkIDAbs(tmpElement.Parent.PathName)
  286. else
  287. s := ResolveLinkIDAbs(tmpElement.PathName);
  288. if Engine.HidePrivate and(TmpElement.Visibility = visPrivate) then
  289. continue;
  290. if Engine.HideProtected and(TmpElement.Visibility = visProtected) then
  291. continue;
  292. TmpItem := ParentItem.Children.NewItem;
  293. case ElementType(TmpElement) of
  294. cmtProcedure : TmpItem.Text := TmpElement.Name + ' procedure';
  295. cmtFunction : TmpItem.Text := TmpElement.Name + ' function';
  296. cmtConstructor : TmpItem.Text := TmpElement.Name + ' constructor';
  297. cmtDestructor : TmpItem.Text := TmpElement.Name + ' destructor';
  298. cmtProperty : TmpItem.Text := TmpElement.Name + ' property';
  299. cmtVariable : TmpItem.Text := TmpElement.Name + ' variable';
  300. cmtInterface : TmpItem.Text := TmpElement.Name + ' interface';
  301. cmtUnknown : TmpItem.Text := TmpElement.Name;
  302. end;
  303. TmpItem.Local := FixHTMLpath(Allocator.GetFilename(TmpElement, 0));
  304. if (trim(s)<>'') and (tmpitem.local<>s) then
  305. begin
  306. writeln('Hint: Index: Resolved:',tmpitem.local,' to ',s);
  307. tmpitem.local:=s;
  308. end;
  309. {
  310. ParentElement = Class
  311. TmpElement = Member
  312. }
  313. MemberItem := nil;
  314. MemberItem := GetAlphaItem(Index.Items, TmpElement.Name);
  315. // ahh! if MemberItem.Local is empty MemberType is not shown!
  316. MemberItem.Local := FixHTMLpath(Allocator.GetFilename(TmpElement, 0));
  317. TmpItem := MemberItem.Children.NewItem;
  318. TmpItem.Text := ParentElement.Name;
  319. TmpITem.Local := FixHTMLpath(Allocator.GetFilename(TmpElement, 0));
  320. end;
  321. end;
  322. // routines
  323. for j := 0 to AModule.InterfaceSection.Functions.Count-1 do
  324. begin
  325. ParentElement := TPasProcedureType(AModule.InterfaceSection.Functions[j]);
  326. TmpItem := Index.Items.NewItem;
  327. TmpItem.Text := ParentElement.Name + ' ' + ParentElement.ElementTypeName;
  328. TmpItem.Local := FixHTMLpath(Allocator.GetFilename(ParentElement, 0));
  329. end;
  330. // consts
  331. for j := 0 to AModule.InterfaceSection.Consts.Count-1 do
  332. begin
  333. ParentElement := TPasElement(AModule.InterfaceSection.Consts[j]);
  334. TmpItem := Index.Items.NewItem;
  335. TmpItem.Text := ParentElement.Name;
  336. TmpItem.Local := FixHTMLpath(Allocator.GetFilename(ParentElement, 0));
  337. end;
  338. // types
  339. for j := 0 to AModule.InterfaceSection.Types.Count-1 do
  340. begin
  341. ParentElement := TPasType(AModule.InterfaceSection.Types[j]);
  342. TmpItem := Index.Items.NewItem;
  343. TmpItem.Text := ParentElement.Name;
  344. TmpItem.Local := FixHTMLpath(Allocator.GetFilename(ParentElement, 0));
  345. // enums
  346. if ParentELement is TPasEnumType then
  347. begin
  348. ParentItem := TmpItem;
  349. for k := 0 to TPasEnumType(ParentElement).Values.Count-1 do
  350. begin
  351. TmpElement := TPasType(TPasEnumType(ParentElement).Values.Items[k]);
  352. // subitem
  353. TmpItem := ParentItem.Children.NewItem;
  354. TmpItem.Text := TmpElement.Name;
  355. TmpItem.Local := ParentItem.Local;
  356. // root level
  357. TmpItem := Index.Items.NewItem;
  358. TmpItem.Text := TmpElement.Name;
  359. TmpItem.Local := ParentItem.Local;
  360. end;
  361. end;
  362. end;
  363. // variables
  364. for j := 0 to AModule.InterfaceSection.Variables.Count-1 do
  365. begin
  366. ParentElement := TPasElement(AModule.InterfaceSection.Variables[j]);
  367. TmpItem := Index.Items.NewItem;
  368. TmpItem.Text := ParentElement.Name + ' var';
  369. TmpItem.Local := FixHTMLpath(Allocator.GetFilename(ParentElement, 0));
  370. end;
  371. // declarations
  372. {
  373. for j := 0 to AModule.InterfaceSection.Declarations.Count-1 do
  374. begin
  375. ParentElement := TPasElement(AModule.InterfaceSection.Declarations[j]);
  376. TmpItem := Index.Items.NewItem;
  377. TmpItem.Text := ParentElement.Name;
  378. TmpItem.Local := FixHTMLpath(Allocator.GetFilename(ParentElement, 0));
  379. end;
  380. // resource strings
  381. for j := 0 to AModule.InterfaceSection.ResStrings.Count-1 do
  382. begin
  383. ParentElement := TPasElement(AModule.InterfaceSection.ResStrings[j]);
  384. TmpItem := Index.Items.NewItem;
  385. TmpItem.Text := ParentElement.Name;
  386. TmpItem.Local := FixHTMLpath(Allocator.GetFilename(ParentElement, 0));
  387. end;
  388. }
  389. end;
  390. // Sort
  391. Index.Items.Sort(TListSortCompare(@TOCSort));
  392. for i := 0 to Index.Items.Count-1 do
  393. begin
  394. Index.Items.Item[i].Children.Sort(TListSortCompare(@TOCSort));
  395. end;
  396. // save
  397. Index.SaveToStream(Stream);
  398. if not fnobinindex then
  399. fchm.AppendBinaryindexFromSitemap(index,false);
  400. Index.Free;
  401. Stream.Position :=0 ;
  402. FChm.AppendIndex(Stream);
  403. Stream.Free;
  404. end;
  405. end;
  406. procedure TCHMHTMLWriter.WriteHTMLPages;
  407. var
  408. i: Integer;
  409. PageDoc: TXMLDocument;
  410. FileStream: TMemoryStream;
  411. FileName: String;
  412. FilePath: String;
  413. begin
  414. FileName := Engine.Output;
  415. if FileName = '' then
  416. Raise Exception.Create('Error: no --output option used.');
  417. if ExtractFileExt(FileName) <> FileNameExtension then
  418. FileName := ChangeFileExt(FileName, FileNameExtension);
  419. FOutChm := TFileStream.Create(FileName, fmOpenReadWrite or fmCreate);
  420. FTempUncompressedName := GetTempFileName+IntToStr(GetProcessID) +'.raw';
  421. FTempUncompressed := TFileStream.Create(FTempUncompressedName, fmOpenReadWrite or fmCreate);
  422. FChm := TChmWriter.Create(FOutChm, False);
  423. FChm.Title := FChmTitle;
  424. FChm.TempRawStream := FTempUncompressed;
  425. FChm.OnGetFileData := @RetrieveOtherFiles;
  426. FChm.OnLastFile := @LastFileAdded;
  427. fchm.hasbinarytoc:=not fnobintoc;;
  428. fchm.hasbinaryindex:=not fnobinindex;
  429. ProcessOptions;
  430. FileStream := TMemoryStream.Create;
  431. for i := 0 to PageInfos.Count - 1 do
  432. with TPageInfo(PageInfos[i]) do
  433. begin
  434. PageDoc := CreateHTMLPage(Element, SubpageIndex);
  435. try
  436. FileName := ExtractFileName(Allocator.GetFilename(Element, SubpageIndex));
  437. FilePath := '/'+FixHTMLpath(ExtractFilePath(Allocator.GetFilename(Element, SubpageIndex)));
  438. try
  439. WriteHTMLFile(PageDoc, FileStream);
  440. FChm.AddStreamToArchive(FileName, FilePath, FileStream, True);
  441. except
  442. on E: Exception do
  443. DoLog(Format(SErrCouldNotCreateFile, [FileName, e.Message]));
  444. end;
  445. finally
  446. PageDoc.Free;
  447. FileStream.Size := 0;
  448. end;
  449. end;
  450. FileStream.Free;
  451. DoLog('HTML Files written. Collecting other files and compressing...this could take some time');
  452. //write any found images to CHM stream
  453. FileStream := TMemoryStream.Create;
  454. for i := 0 to FImageFileList.Count - 1 do
  455. begin
  456. {$ifdef imagetest} DoLog(' adding image: '+FImageFileList[i]); {$endif}
  457. if FileExists(FImageFileList[i]) then
  458. begin
  459. {$ifdef imagetest} DoLog(' - found'); {$endif}
  460. FileName := ExtractFileName(FImageFileList[i]);
  461. FilePath := '/'+FixHTMLpath(ExtractFilePath(FImageFileList[i]));
  462. FileStream.LoadFromFile(FImageFileList[i]);
  463. FChm.AddStreamToArchive(FileName, FilePath, FileStream, True);
  464. FileStream.Size := 0;
  465. end
  466. else
  467. {$ifdef imagetest} DoLog(' - not found'){$endif};
  468. end;
  469. FileStream.Free;
  470. FChm.Execute;
  471. FChm.Free;
  472. // we don't need to free FTempUncompressed
  473. // FTempUncompressed.Free;
  474. FOutChm.Free;
  475. DeleteFile(FTempUncompressedName);
  476. end;
  477. function TCHMHTMLWriter.InterPretOption(const Cmd, Arg: String): boolean;
  478. begin
  479. Result:=True;
  480. FNoBinToc:=False;
  481. FnoBinIndex:=False;
  482. if Cmd = '--toc-file' then
  483. FTOCName := arg
  484. else if Cmd = '--index-file' then
  485. FIndexName := arg
  486. else if Cmd = '--default-page' then
  487. FDefaultPage := arg
  488. else if Cmd = '--other-files' then
  489. FOtherFiles := arg
  490. else if Cmd = '--auto-index' then
  491. FAutoIndex := True
  492. else if Cmd = '--auto-toc' then
  493. FAutoTOC := True
  494. else if Cmd = '--no-bintoc' then
  495. FNoBinToc := True
  496. else if Cmd = '--no-binindex' then
  497. FNoBinIndex := True
  498. else if Cmd = '--make-searchable' then
  499. FMakeSearchable := True
  500. else if Cmd = '--chm-title' then
  501. FChmTitle := arg
  502. else
  503. Result:=inherited InterPretOption(Cmd, Arg);
  504. if Length(FChmTitle) = 0 then
  505. FChmTitle := Copy(Package.Name, 2, Length(Package.Name));
  506. end;
  507. class procedure TCHMHTMLWriter.Usage(List: TStrings);
  508. begin
  509. THTMLWriter.Usage(List);
  510. List.add('--default-page');
  511. List.Add(SCHMUsageDefPage);
  512. List.add('--toc-file');
  513. List.Add(SCHMUsageTOC);
  514. List.add('--index-file');
  515. List.Add(SCHMUsageIndex);
  516. List.add('--other-files');
  517. List.Add(SCHMUsageOtrFiles);
  518. List.add('--css-file');
  519. List.Add(SCHMUsageCSSFile);
  520. List.add('--auto-index');
  521. List.Add(SCHMUsageAutoIDX);
  522. List.add('--auto-toc');
  523. List.Add(SCHMUsageAutoTOC);
  524. List.add('--make-searchable');
  525. List.Add(SCHMUsageMakeSearch);
  526. List.Add('--chm-title');
  527. List.Add(SCHMUsageChmTitle);
  528. end;
  529. Class Function TCHMHTMLWriter.FileNameExtension : String;
  530. begin
  531. result:='.chm';
  532. end;
  533. class procedure TCHMHTMLWriter.SplitImport(var AFilename, ALinkPrefix: String);
  534. var
  535. i: integer;
  536. begin
  537. i := Pos(',', AFilename);
  538. if i > 0 then
  539. begin //split into filename and prefix
  540. ALinkPrefix := Copy(AFilename,i+1,Length(AFilename));
  541. SetLength(AFilename, i-1);
  542. end
  543. else if ALinkPrefix = '' then
  544. begin //synthesize outdir\pgk.xct, ms-its:pkg.chm::/
  545. ALinkPrefix := 'ms-its:' + ChangeFileExt(ExtractFileName(AFilename), '.chm') + '::/';
  546. AFilename := ChangeFileExt(AFilename, '.xct');
  547. end;
  548. end;
  549. {$ENDIF}