cgutils.pp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2022 by the Free Pascal development team
  4. Original author: Michael van Canneyt
  5. Some helper routines for the CGI code generator app
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. unit cgutils;
  13. {$mode ObjFPC}{$H+}
  14. interface
  15. uses
  16. Classes, SysUtils, pascodegen, tstopas;
  17. Type
  18. TSettings = record
  19. basedir : string;
  20. cachefile : string;
  21. end;
  22. { TLoggingConverter }
  23. TLoggingConverter = Class(TTypescriptToPas)
  24. private
  25. FLogs: TStrings;
  26. procedure DoMyLog(Sender: TObject; LogType: TCodegenLogType; const Msg: String);
  27. Public
  28. Constructor Create(Aowner: TComponent); override;
  29. Property Logs : TStrings Read FLogs Write Flogs;
  30. end;
  31. Procedure GetDeclarationFileNames(const BaseDir,aDir : String; aList: TStrings);
  32. Procedure ConvertFile(Const BaseDir,aFileName,aUnitName : String; aOptions : TConversionOptions; aPascal,aLog : TStrings);
  33. Function GetOutputUnitName(Const aFileName,aUnitName : String) : string;
  34. Function GetInputFileName(Const BaseDir,aFileName : String) : string;
  35. Function GetSettings : TSettings;
  36. implementation
  37. uses inifiles;
  38. Function GetSettings : TSettings;
  39. begin
  40. Result.BaseDir:=ExtractFilePath(ParamStr(0));
  41. Result.CacheFile:=GetTempDir(True)+'definitelytypedcache.lst';
  42. With TIniFile.Create(GetAppConfigFile(True)) do
  43. try
  44. Result.BaseDir:=ReadString('Settings','BaseDir',Result.BaseDir);
  45. Result.cachefile:=ReadString('Settings','CacheDir',Result.CacheFile);
  46. finally
  47. Free;
  48. end;
  49. end;
  50. Procedure GetDeclarationFileNames(Const BaseDir,aDir : String; aList: TStrings);
  51. Var
  52. Info : TSearchRec;
  53. D,FN : string;
  54. begin
  55. D:=IncludeTrailingPathDelimiter(aDir);
  56. if FindFirst(D+'*.d.ts',0,Info)=0 then
  57. try
  58. Repeat
  59. FN:=Info.Name;
  60. if (FN<>'.') and (FN<>'..') then
  61. Alist.Add(ExtractRelativePath(BaseDir,D+FN));
  62. until FindNext(Info)<>0;
  63. finally
  64. FindClose(Info);
  65. end;
  66. if FindFirst(D+AllFilesMask,faDirectory,Info)=0 then
  67. try
  68. Repeat
  69. if (Info.Attr and faDirectory)<>0 then
  70. begin
  71. FN:=Info.Name;
  72. if (FN<>'.') and (FN<>'..') then
  73. GetDeclarationFileNames(BaseDir,D+FN,aList);
  74. end;
  75. until FindNext(Info)<>0;
  76. finally
  77. FindClose(Info);
  78. end;
  79. end;
  80. Function GetInputFileName(Const BaseDir,aFileName : String) : string;
  81. Var
  82. BD,FN : String;
  83. begin
  84. BD:=IncludeTrailingPathDelimiter(BaseDir);
  85. FN:=BD+aFileName;
  86. if Not FileExists(FN) then
  87. if Not DirectoryExists(BD+aFileName) then
  88. FN:=''
  89. else
  90. begin
  91. FN:=IncludeTrailingPathDelimiter(BD+aFileName)+'index.d.ts';
  92. if not FileExists(FN) then
  93. Fn:='';
  94. end;
  95. if FN='' then
  96. Raise ETSToPas.Create('No such file: '+aFileName);
  97. Result:=FN;
  98. end;
  99. Function GetOutputUnitName(Const aFileName,aUnitName : String) : string;
  100. Var
  101. UN : String;
  102. begin
  103. UN:=aUnitName;
  104. if aUnitName='' then
  105. begin
  106. UN:=ChangeFileExt(ChangeFileExt(ExtractFileName(aFilename),''),'');
  107. if UN='index' then
  108. UN:=ExtractFileName(ExcludeTrailingPathDelimiter(ExtractFilePath(aFileName)));
  109. end;
  110. Result:=UN;
  111. end;
  112. procedure AddWebAliases(S: Tstrings);
  113. begin
  114. With S do
  115. begin
  116. {$i web.inc}
  117. end;
  118. end;
  119. procedure AddJSAliases(S: Tstrings);
  120. begin
  121. With S do
  122. begin
  123. Add('Object=TJSObject');
  124. Add('Function=TJSFunction');
  125. Add('RegExp=TJSRegexp');
  126. Add('Promise=TJSPromise');
  127. Add('Date=TJSDate');
  128. Add('Array=TJSArray');
  129. Add('Iterator=TJSIterator');
  130. Add('IteratorResult=TJSIteratorResult');
  131. Add('AsyncIterator=TJSAsyncIterator');
  132. Add('ArrayBuffer=TJSArrayBuffer');
  133. Add('Set=TJSSet');
  134. Add('Map=TJSMap');
  135. Add('BufferSource=TJSBufferSource');
  136. Add('DataView=TJSDataView');
  137. Add('Int8Array=TJSInt8Array');
  138. Add('Int8ClampedArray=TJSInt8ClampedArray');
  139. Add('Int16Array=TJSInt16Array');
  140. Add('Int32Array=TJSInt32Array');
  141. Add('Uint8Array=TJSUInt8Array');
  142. Add('Uint8ClampedArray=TJSUInt8ClampedArray');
  143. Add('Uint16Array=TJSUInt16Array');
  144. Add('Uint32Array=TJSUInt32Array');
  145. Add('Float32Array=TJSFloat32Array');
  146. Add('Float64Array=TJSFloat64Array');
  147. Add('JSON=TJSJSON');
  148. Add('TextDecoder=TJSTextDecoder');
  149. Add('TextEncoder=TJSTextEncoder');
  150. Add('SyntaxError=TJSSyntaxError');
  151. Add('Error=TJSError');
  152. end;
  153. end;
  154. Procedure ConvertFile(Const BaseDir,aFileName,aUnitName : String; aOptions : TConversionOptions; aPascal,aLog : TStrings);
  155. Var
  156. L : TLoggingConverter;
  157. UN,Fn : String;
  158. begin
  159. FN:=GetInputFileName(BaseDir,aFileName);
  160. UN:=GetOutputUnitName(FN,aUnitName);
  161. L:=TLoggingConverter.Create(Nil);
  162. try
  163. L.Options:=aOptions;
  164. L.InputFileName:=FN;
  165. L.OutputUnitName:=UN;
  166. L.Logs:=aLog;
  167. AddJSAliases(L.TypeAliases);
  168. AddWebAliases(L.TypeAliases);
  169. L.Execute;
  170. aPascal.Assign(L.Source);
  171. finally
  172. L.Free;
  173. end;
  174. end;
  175. { TLoggingConverter }
  176. procedure TLoggingConverter.DoMyLog(Sender: TObject; LogType: TCodegenLogType; const Msg: String);
  177. Var
  178. S : String;
  179. begin
  180. Str(LogType,S);
  181. If Assigned(Flogs) then
  182. Flogs.Add('['+S+']: '+Msg);
  183. end;
  184. constructor TLoggingConverter.Create(Aowner: TComponent);
  185. begin
  186. inherited Create(Aowner);
  187. OnLog:=@DoMyLog;
  188. end;
  189. end.