2
0

cgutils.pp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  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, strutils;
  17. Type
  18. TSettings = record
  19. basedir : string;
  20. cachefile : string;
  21. rawcachefile : string;
  22. end;
  23. { TLoggingConverter }
  24. TLoggingConverter = Class(TTypescriptToPas)
  25. private
  26. FLogs: TStrings;
  27. procedure DoMyLog(Sender: TObject; LogType: TCodegenLogType; const Msg: String);
  28. Public
  29. Constructor Create(Aowner: TComponent); override;
  30. Property Logs : TStrings Read FLogs Write Flogs;
  31. end;
  32. Procedure GetDeclarationFileNames(const BaseDir,aDir : String; aList: TStrings);
  33. Procedure ConvertFile(Const BaseDir,aFileName,aUnitName,aliases,extraunits : String; Skipweb : Boolean; aOptions : TConversionOptions; aPascal,aLog : TStrings);
  34. Function GetOutputUnitName(Const aFileName,aUnitName : String) : string;
  35. Function GetInputFileName(Const BaseDir,aFileName : String) : string;
  36. Function GetSettings : TSettings;
  37. implementation
  38. uses inifiles;
  39. function GetSettings: TSettings;
  40. begin
  41. Result.BaseDir:=ExtractFilePath(ParamStr(0));
  42. Result.CacheFile:=GetTempDir(True)+'definitelytypedcache.lst';
  43. Result.RawCacheFile:=GetTempDir(True)+'definitelytypedrawcache.lst';
  44. With TIniFile.Create(GetAppConfigFile(True)) do
  45. try
  46. Result.BaseDir:=ReadString('Settings','BaseDir',Result.BaseDir);
  47. Result.cachefile:=ReadString('Settings','CacheDir',Result.CacheFile);
  48. Result.rawcachefile:=ReadString('Settings','RawCacheFile',Result.RawCacheFile);
  49. finally
  50. Free;
  51. end;
  52. With TStringList.Create do
  53. try
  54. Add(Result.BaseDir);
  55. Add(Result.cachefile);
  56. Add(Result.rawcachefile);
  57. SaveToFile('/tmp/settings.txt');
  58. finally
  59. Free;
  60. end;
  61. end;
  62. procedure GetDeclarationFileNames(const BaseDir, aDir: String; aList: TStrings);
  63. Var
  64. Info : TSearchRec;
  65. D,FN : string;
  66. begin
  67. D:=IncludeTrailingPathDelimiter(aDir);
  68. if FindFirst(D+'*.d.ts',0,Info)=0 then
  69. try
  70. Repeat
  71. FN:=Info.Name;
  72. if (FN<>'.') and (FN<>'..') then
  73. Alist.Add(ExtractRelativePath(BaseDir,D+FN));
  74. until FindNext(Info)<>0;
  75. finally
  76. FindClose(Info);
  77. end;
  78. if FindFirst(D+AllFilesMask,faDirectory,Info)=0 then
  79. try
  80. Repeat
  81. if (Info.Attr and faDirectory)<>0 then
  82. begin
  83. FN:=Info.Name;
  84. if (FN<>'.') and (FN<>'..') then
  85. GetDeclarationFileNames(BaseDir,D+FN,aList);
  86. end;
  87. until FindNext(Info)<>0;
  88. finally
  89. FindClose(Info);
  90. end;
  91. end;
  92. function GetInputFileName(const BaseDir, aFileName: String): string;
  93. Var
  94. BD,FN : String;
  95. begin
  96. BD:=IncludeTrailingPathDelimiter(BaseDir);
  97. FN:=BD+aFileName;
  98. if Not FileExists(FN) then
  99. if Not DirectoryExists(BD+aFileName) then
  100. FN:=''
  101. else
  102. begin
  103. FN:=IncludeTrailingPathDelimiter(BD+aFileName)+'index.d.ts';
  104. if not FileExists(FN) then
  105. Fn:='';
  106. end;
  107. if FN='' then
  108. Raise ETSToPas.Create('No such file: '+aFileName);
  109. Result:=FN;
  110. end;
  111. function GetOutputUnitName(const aFileName, aUnitName: String): string;
  112. Var
  113. UN : String;
  114. begin
  115. UN:=aUnitName;
  116. if aUnitName='' then
  117. begin
  118. UN:=ChangeFileExt(ChangeFileExt(ExtractFileName(aFilename),''),'');
  119. if UN='index' then
  120. UN:=ExtractFileName(ExcludeTrailingPathDelimiter(ExtractFilePath(aFileName)));
  121. end;
  122. Result:=UN;
  123. end;
  124. procedure AddWebAliases(S: Tstrings);
  125. begin
  126. With S do
  127. begin
  128. {$i web.inc}
  129. end;
  130. end;
  131. procedure AddJSAliases(S: Tstrings);
  132. begin
  133. With S do
  134. begin
  135. Add('Object=TJSObject');
  136. Add('Function=TJSFunction');
  137. Add('RegExp=TJSRegexp');
  138. Add('Promise=TJSPromise');
  139. Add('Date=TJSDate');
  140. Add('Array=TJSArray');
  141. Add('Iterator=TJSIterator');
  142. Add('IteratorResult=TJSIteratorResult');
  143. Add('AsyncIterator=TJSAsyncIterator');
  144. Add('ArrayBuffer=TJSArrayBuffer');
  145. Add('Set=TJSSet');
  146. Add('Map=TJSMap');
  147. Add('BufferSource=TJSBufferSource');
  148. Add('DataView=TJSDataView');
  149. Add('Int8Array=TJSInt8Array');
  150. Add('Int8ClampedArray=TJSInt8ClampedArray');
  151. Add('Int16Array=TJSInt16Array');
  152. Add('Int32Array=TJSInt32Array');
  153. Add('Uint8Array=TJSUInt8Array');
  154. Add('Uint8ClampedArray=TJSUInt8ClampedArray');
  155. Add('Uint16Array=TJSUInt16Array');
  156. Add('Uint32Array=TJSUInt32Array');
  157. Add('Float32Array=TJSFloat32Array');
  158. Add('Float64Array=TJSFloat64Array');
  159. Add('JSON=TJSJSON');
  160. Add('TextDecoder=TJSTextDecoder');
  161. Add('TextEncoder=TJSTextEncoder');
  162. Add('SyntaxError=TJSSyntaxError');
  163. Add('Error=TJSError');
  164. end;
  165. end;
  166. procedure ConvertFile(const BaseDir, aFileName, aUnitName, aliases, extraunits: String; Skipweb: Boolean;
  167. aOptions: TConversionOptions; aPascal, aLog: TStrings);
  168. Var
  169. L : TLoggingConverter;
  170. S,UN,Fn : String;
  171. begin
  172. FN:=GetInputFileName(BaseDir,aFileName);
  173. UN:=GetOutputUnitName(FN,aUnitName);
  174. L:=TLoggingConverter.Create(Nil);
  175. try
  176. L.Options:=aOptions;
  177. L.InputFileName:=FN;
  178. L.OutputUnitName:=UN;
  179. L.Logs:=aLog;
  180. L.ExtraUnits:=extraunits;
  181. for S in SplitString(Aliases,', ') do
  182. L.TypeAliases.Add(S);
  183. AddJSAliases(L.TypeAliases);
  184. if not SkipWeb then
  185. AddWebAliases(L.TypeAliases);
  186. L.Execute;
  187. aPascal.Assign(L.Source);
  188. finally
  189. L.Free;
  190. end;
  191. end;
  192. { TLoggingConverter }
  193. procedure TLoggingConverter.DoMyLog(Sender: TObject; LogType: TCodegenLogType; const Msg: String);
  194. Var
  195. S : String;
  196. begin
  197. Str(LogType,S);
  198. If Assigned(Flogs) then
  199. Flogs.Add('['+S+']: '+Msg);
  200. end;
  201. constructor TLoggingConverter.Create(Aowner: TComponent);
  202. begin
  203. inherited Create(Aowner);
  204. OnLog:=@DoMyLog;
  205. end;
  206. end.