UIsxclassesParser.pas 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. unit UIsxclassesParser;
  2. interface
  3. uses
  4. Classes;
  5. type
  6. TIsxclassesParser = class
  7. private
  8. FLines: TStringList;
  9. FTypes: TStringList;
  10. public
  11. constructor Create();
  12. destructor Destroy(); override;
  13. procedure Parse(const FileName: String);
  14. procedure SaveXML(const HeaderFileName, HeaderFileName2, FooterFileName, OutputFileName: String);
  15. end;
  16. implementation
  17. uses
  18. Windows,
  19. SysUtils;
  20. constructor TIsxclassesParser.Create();
  21. begin
  22. inherited;
  23. FLines := TStringList.Create();
  24. FTypes := TStringList.Create();
  25. end;
  26. destructor TIsxclassesParser.Destroy();
  27. begin
  28. FTypes.Free();
  29. FLines.Free();
  30. inherited;
  31. end;
  32. procedure TIsxclassesParser.Parse(const FileName: String);
  33. var
  34. F: TextFile;
  35. S: String;
  36. P: Integer;
  37. begin
  38. AssignFile(F, FileName);
  39. Reset(F);
  40. try
  41. while not Eof(F) do begin
  42. ReadLn(F, S);
  43. FLines.Add(S);
  44. P := Pos('=', S);
  45. if P > 1 then
  46. FTypes.Add(Trim(Copy(S, 1, P-1)))
  47. end;
  48. finally
  49. CloseFile(F);
  50. end;
  51. end;
  52. procedure TIsxclassesParser.SaveXML(const HeaderFileName, HeaderFileName2, FooterFileName, OutputFileName: String);
  53. procedure FCopyFile(const SourceFileName, DestFileName: String; AppendToDestFile: Boolean);
  54. var
  55. F1, F2: TextFile;
  56. S: String;
  57. begin
  58. AssignFile(F1, SourceFileName);
  59. Reset(F1);
  60. try
  61. AssignFile(F2, DestFileName);
  62. if AppendToDestFile then begin
  63. if FileExists(DestFileName) then
  64. Append(F2)
  65. else
  66. Reset(F2);
  67. end else
  68. Rewrite(F2);
  69. try
  70. while not Eof(F1) do begin
  71. ReadLn(F1, S);
  72. WriteLn(F2, S);
  73. end;
  74. finally
  75. CloseFile(F2);
  76. end;
  77. finally
  78. CloseFile(F1);
  79. end;
  80. end;
  81. function FGetNextPart(var Text: PChar): String;
  82. var
  83. P: PChar;
  84. begin
  85. case Text^ of
  86. #0:
  87. begin
  88. Result := '';
  89. end;
  90. #1..#32:
  91. begin
  92. P := Text;
  93. Inc(Text);
  94. while CharInSet(Text^ , [#1..#32]) do
  95. Inc(Text);
  96. SetString(Result, P, Text - P);
  97. end;
  98. '(', ')', ',', '=', ':', ';', '[', ']':
  99. begin
  100. Result := Text^;
  101. Inc(Text);
  102. end;
  103. '0'..'9', 'A'..'Z', 'a'..'z', '_', '.':
  104. begin
  105. P := Text;
  106. Inc(Text);
  107. while CharInSet(Text^ , ['0'..'9', 'A'..'Z', 'a'..'z', '_', '.']) do
  108. Inc(Text);
  109. SetString(Result, P, Text - P);
  110. end;
  111. else
  112. raise Exception.CreateFmt('Invalid symbol ''%s'' found', [Text^]);
  113. end;
  114. end;
  115. function FLinkTypes(const S: String): String;
  116. var
  117. Text: PChar;
  118. NextPart: String;
  119. begin
  120. Result := '';
  121. Text := PChar(S);
  122. NextPart := FGetNextPart(Text);
  123. while NextPart <> '' do begin
  124. if FTypes.IndexOf(NextPart) >= 0 then begin
  125. if Result = '' then //start of line = object definition
  126. NextPart := '<a name="' + NextPart + '">' + NextPart + '</a>'
  127. else
  128. NextPart := '<anchorlink name="' + NextPart + '">' + NextPart + '</anchorlink>';
  129. end;
  130. Result := Result + NextPart;
  131. NextPart := FGetNextPart(Text);
  132. end;
  133. end;
  134. function FConvertLeadingSpacesToNbsp(const S: String): String;
  135. var
  136. I: Integer;
  137. begin
  138. Result := S;
  139. I := 1;
  140. while (I <= Length(Result)) and (Result[I] = ' ') do begin
  141. Delete(Result, I, 1);
  142. Insert('&nbsp;', Result, I);
  143. Inc(I, Length('&nbsp;'));
  144. end;
  145. end;
  146. var
  147. F: TextFile;
  148. I: Integer;
  149. S: String;
  150. begin
  151. FCopyFile(HeaderFileName, OutputFileName, False);
  152. AssignFile(F, OutputFileName);
  153. Append(F);
  154. try
  155. for I := 0 to FTypes.Count-1 do begin
  156. S := '<keyword value="' + FTypes[I] + '" anchor="' + FTypes[I] + '" />';
  157. WriteLn(F, S);
  158. end;
  159. WriteLn(F, '<keyword value="MainForm" />');
  160. WriteLn(F, '<keyword value="WizardForm" />');
  161. WriteLn(F, '<keyword value="UninstallProgressForm" />');
  162. finally
  163. CloseFile(F);
  164. end;
  165. FCopyFile(HeaderFileName2, OutputFileName, True);
  166. AssignFile(F, OutputFileName);
  167. Append(F);
  168. try
  169. WriteLn(F, '<p><br/><tt>');
  170. for I := 0 to FLines.Count-1 do begin
  171. S := FLinkTypes(FLines[I]);
  172. S := FConvertLeadingSpacesToNbsp(S);
  173. WriteLn(F, S, '<br/>');
  174. end;
  175. WriteLn(F, '</tt></p>');
  176. finally
  177. CloseFile(F);
  178. end;
  179. FCopyFile(FooterFileName, OutputFileName, True);
  180. end;
  181. end.