XHTMLProducer.pas 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. {
  2. Go trough every xml doc to be transformed and if some
  3. link is in TOC change it to html/somefile.html
  4. Add attrib ref to links - it means that link is targeted to
  5. reference documentation.
  6. Addd <producer> tag to xml files to be transformed and
  7. put this to it for XHTML:
  8. <script language="javascript">
  9. if (top.frames.length == 0)
  10. top.location = '../imaging.html';
  11. </script>
  12. }
  13. unit XHTMLProducer;
  14. {$I ImagingOptions.inc}
  15. interface
  16. uses
  17. SysUtils, Classes, Helpers, DemoUtils;
  18. const
  19. sHTMLStyleSheet = 'doc2html.xsl';
  20. sHTMLTOCStyleSheet = 'toc2html.xsl';
  21. sHTMLProjectStyleSheet = 'proj2html.xsl';
  22. sHTMLExt = 'html';
  23. sHTMLDir = 'html';
  24. sHTMLDelim = '/';
  25. sTempFile = 'temp.xml';
  26. sDocTempFile = 'doctemp.xsl';
  27. sTocTempFile = 'toctemp.xsl';
  28. type
  29. TXHTMLProducer = class(TDocProducer)
  30. private
  31. FOutDir: string;
  32. FRootDir: string;
  33. FProject: TDocProject;
  34. FTocTempPath: string;
  35. FDocTempPath: string;
  36. procedure CreateContentsFrame;
  37. procedure CreateMainPages;
  38. procedure ConvertPagesToHTML(Item: TContentItem);
  39. public
  40. constructor Create;
  41. procedure Process(Project: TDocProject; const OutDir: string); override;
  42. end;
  43. function CreateHTMLLinker: TLinkChecker;
  44. implementation
  45. function LowerCaseLink(const S, Context: string): string;
  46. begin
  47. Result := LowerCase(S);
  48. end;
  49. function CreateHTMLLinker: TLinkChecker;
  50. begin
  51. Result := TLinkChecker.Create;
  52. Result.StripDir := True;
  53. Result.Extension := sHTMLExt;
  54. Result.NewPathDelim := sHTMLDelim;
  55. Result.CustomConverter := LowerCaseLink;
  56. end;
  57. { TXHTMLProducer }
  58. constructor TXHTMLProducer.Create;
  59. begin
  60. inherited Create;
  61. FName := 'XHTML Doc Producer';
  62. end;
  63. procedure TXHTMLProducer.CreateContentsFrame;
  64. var
  65. Input, Style, Output: string;
  66. Linker: TLinkChecker;
  67. XSLLinker: TXSLLinker;
  68. begin
  69. Msg('Creating contents frame ...');
  70. Input := FProject.ContentsFile;
  71. Style := FProject.XslDir + PathDelim + sHTMLTOCStyleSheet;
  72. Output := LowerCase(FOutDir + PathDelim + sHTMLDir + PathDelim +
  73. ExtractFileName(ChangeFileExt(FProject.ContentsFile, '.' + sHTMLExt)));
  74. XSLLinker := TXSLLinker.Create;
  75. XSLLinker.IntendedOutput := Output;
  76. XSLLinker.CheckDocument(Style, FProject);
  77. XSLLinker.SaveResult(FTocTempPath);
  78. Linker := CreateHTMLLinker;
  79. Linker.CheckDocument(Input, FProject);
  80. Linker.SaveResult(FOutDir + PathDelim + sTempFile);
  81. TransformDoc(FOutDir + PathDelim + sTempFile, Output, FTocTempPath);
  82. Linker.DeleteResult;
  83. Linker.Free;
  84. XSLLinker.DeleteResult;
  85. XSLLinker.Free;
  86. end;
  87. procedure TXHTMLProducer.CreateMainPages;
  88. var
  89. Input, Style, Output: string;
  90. Linker: TLinkChecker;
  91. begin
  92. Msg('Creating main page ...');
  93. Input := FProject.ProjectFile;
  94. Style := FProject.XslDir + PathDelim + sHTMLProjectStyleSheet;
  95. Output := FOutDir + PathDelim + LowerCase(FProject.OutputFile) + '.' + sHTMLExt;
  96. Linker := CreateHTMLLinker;
  97. Linker.DestDir := sHTMLDir;
  98. Linker.CheckDocument(Input, FProject);
  99. Linker.SaveResult(FOutDir + PathDelim + sTempFile);
  100. TransformDoc(FOutDir + PathDelim + sTempFile, Output, Style);
  101. Linker.DeleteResult;
  102. Linker.Free;
  103. end;
  104. procedure TXHTMLProducer.ConvertPagesToHTML(Item: TContentItem);
  105. var
  106. I: LongInt;
  107. Input, Output: string;
  108. Linker: TLinkChecker;
  109. begin
  110. Input := ExpandFileTo(Item.URL, FRootDir);
  111. Output := LowerCase(FOutDir + PathDelim + sHTMLDir + PathDelim +
  112. ChangeFileExt(ExtractFileName(Item.URL), '.' + sHTMLExt));
  113. Linker := CreateHTMLLinker;
  114. Linker.IntendedOutput := Output;
  115. Linker.CheckDocument(Input, FProject);
  116. Linker.SaveResult(FOutDir + PathDelim + sTempFile);
  117. TransformDoc(FOutDir + PathDelim + sTempFile, Output, FDocTempPath);
  118. Linker.DeleteResult;
  119. Linker.Free;
  120. for I := 0 to Item.ChildCount - 1 do
  121. ConvertPagesToHTML(Item[I]);
  122. end;
  123. procedure TXHTMLProducer.Process(Project: TDocProject; const OutDir: string);
  124. var
  125. Style: string;
  126. Linker: TXSLLinker;
  127. begin
  128. FOutDir := LowerCase(OutDir);
  129. FProject := Project;
  130. FRootDir := LowerCase(ExtractFileDir(FProject.ProjectFile));
  131. if (not ForceDirectories(FOutDir)) or
  132. (not ForceDirectories(FOutDir + PathDelim + sHTMLDir)) then
  133. raise Exception.Create('Cannot create output directories.');
  134. FTocTempPath := FOutDir + PathDelim + sTocTempFile;
  135. FDocTempPath := FOutDir + PathDelim + sDocTempFile;
  136. CreateContentsFrame;
  137. CreateMainPages;
  138. Style := FProject.XslDir + PathDelim + sHTMLStyleSheet;
  139. Linker := TXSLLinker.Create;
  140. Linker.IntendedOutput := FOutDir + PathDelim + sHTMLDir + PathDelim + 'bla.blo';
  141. Linker.CheckDocument(Style, FProject);
  142. Linker.SaveResult(FDocTempPath);
  143. Msg('Converting pages to HTML ...');
  144. ConvertPagesToHTML(FProject.Contents);
  145. Linker.DeleteResult;
  146. Linker.Free;
  147. end;
  148. end.