123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2022 by the Free Pascal development team
- Original author: Michael van Canneyt
- Some helper routines for the CGI code generator app
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- unit cgutils;
- {$mode ObjFPC}{$H+}
- interface
- uses
- Classes, SysUtils, pascodegen, tstopas;
- Type
- TSettings = record
- basedir : string;
- cachefile : string;
- end;
- { TLoggingConverter }
- TLoggingConverter = Class(TTypescriptToPas)
- private
- FLogs: TStrings;
- procedure DoMyLog(Sender: TObject; LogType: TCodegenLogType; const Msg: String);
- Public
- Constructor Create(Aowner: TComponent); override;
- Property Logs : TStrings Read FLogs Write Flogs;
- end;
- Procedure GetDeclarationFileNames(const BaseDir,aDir : String; aList: TStrings);
- Procedure ConvertFile(Const BaseDir,aFileName,aUnitName : String; aOptions : TConversionOptions; aPascal,aLog : TStrings);
- Function GetOutputUnitName(Const aFileName,aUnitName : String) : string;
- Function GetInputFileName(Const BaseDir,aFileName : String) : string;
- Function GetSettings : TSettings;
- implementation
- uses inifiles;
- Function GetSettings : TSettings;
- begin
- Result.BaseDir:=ExtractFilePath(ParamStr(0));
- Result.CacheFile:=GetTempDir(True)+'definitelytypedcache.lst';
- With TIniFile.Create(GetAppConfigFile(True)) do
- try
- Result.BaseDir:=ReadString('Settings','BaseDir',Result.BaseDir);
- Result.cachefile:=ReadString('Settings','CacheDir',Result.CacheFile);
- finally
- Free;
- end;
- end;
- Procedure GetDeclarationFileNames(Const BaseDir,aDir : String; aList: TStrings);
- Var
- Info : TSearchRec;
- D,FN : string;
- begin
- D:=IncludeTrailingPathDelimiter(aDir);
- if FindFirst(D+'*.d.ts',0,Info)=0 then
- try
- Repeat
- FN:=Info.Name;
- if (FN<>'.') and (FN<>'..') then
- Alist.Add(ExtractRelativePath(BaseDir,D+FN));
- until FindNext(Info)<>0;
- finally
- FindClose(Info);
- end;
- if FindFirst(D+AllFilesMask,faDirectory,Info)=0 then
- try
- Repeat
- if (Info.Attr and faDirectory)<>0 then
- begin
- FN:=Info.Name;
- if (FN<>'.') and (FN<>'..') then
- GetDeclarationFileNames(BaseDir,D+FN,aList);
- end;
- until FindNext(Info)<>0;
- finally
- FindClose(Info);
- end;
- end;
- Function GetInputFileName(Const BaseDir,aFileName : String) : string;
- Var
- BD,FN : String;
- begin
- BD:=IncludeTrailingPathDelimiter(BaseDir);
- FN:=BD+aFileName;
- if Not FileExists(FN) then
- if Not DirectoryExists(BD+aFileName) then
- FN:=''
- else
- begin
- FN:=IncludeTrailingPathDelimiter(BD+aFileName)+'index.d.ts';
- if not FileExists(FN) then
- Fn:='';
- end;
- if FN='' then
- Raise ETSToPas.Create('No such file: '+aFileName);
- Result:=FN;
- end;
- Function GetOutputUnitName(Const aFileName,aUnitName : String) : string;
- Var
- UN : String;
- begin
- UN:=aUnitName;
- if aUnitName='' then
- begin
- UN:=ChangeFileExt(ChangeFileExt(ExtractFileName(aFilename),''),'');
- if UN='index' then
- UN:=ExtractFileName(ExcludeTrailingPathDelimiter(ExtractFilePath(aFileName)));
- end;
- Result:=UN;
- end;
- procedure AddWebAliases(S: Tstrings);
- begin
- With S do
- begin
- {$i web.inc}
- end;
- end;
- procedure AddJSAliases(S: Tstrings);
- begin
- With S do
- begin
- Add('Object=TJSObject');
- Add('Function=TJSFunction');
- Add('RegExp=TJSRegexp');
- Add('Promise=TJSPromise');
- Add('Date=TJSDate');
- Add('Array=TJSArray');
- Add('Iterator=TJSIterator');
- Add('IteratorResult=TJSIteratorResult');
- Add('AsyncIterator=TJSAsyncIterator');
- Add('ArrayBuffer=TJSArrayBuffer');
- Add('Set=TJSSet');
- Add('Map=TJSMap');
- Add('BufferSource=TJSBufferSource');
- Add('DataView=TJSDataView');
- Add('Int8Array=TJSInt8Array');
- Add('Int8ClampedArray=TJSInt8ClampedArray');
- Add('Int16Array=TJSInt16Array');
- Add('Int32Array=TJSInt32Array');
- Add('Uint8Array=TJSUInt8Array');
- Add('Uint8ClampedArray=TJSUInt8ClampedArray');
- Add('Uint16Array=TJSUInt16Array');
- Add('Uint32Array=TJSUInt32Array');
- Add('Float32Array=TJSFloat32Array');
- Add('Float64Array=TJSFloat64Array');
- Add('JSON=TJSJSON');
- Add('TextDecoder=TJSTextDecoder');
- Add('TextEncoder=TJSTextEncoder');
- Add('SyntaxError=TJSSyntaxError');
- Add('Error=TJSError');
- end;
- end;
- Procedure ConvertFile(Const BaseDir,aFileName,aUnitName : String; aOptions : TConversionOptions; aPascal,aLog : TStrings);
- Var
- L : TLoggingConverter;
- UN,Fn : String;
- begin
- FN:=GetInputFileName(BaseDir,aFileName);
- UN:=GetOutputUnitName(FN,aUnitName);
- L:=TLoggingConverter.Create(Nil);
- try
- L.Options:=aOptions;
- L.InputFileName:=FN;
- L.OutputUnitName:=UN;
- L.Logs:=aLog;
- AddJSAliases(L.TypeAliases);
- AddWebAliases(L.TypeAliases);
- L.Execute;
- aPascal.Assign(L.Source);
- finally
- L.Free;
- end;
- end;
- { TLoggingConverter }
- procedure TLoggingConverter.DoMyLog(Sender: TObject; LogType: TCodegenLogType; const Msg: String);
- Var
- S : String;
- begin
- Str(LogType,S);
- If Assigned(Flogs) then
- Flogs.Add('['+S+']: '+Msg);
- end;
- constructor TLoggingConverter.Create(Aowner: TComponent);
- begin
- inherited Create(Aowner);
- OnLog:=@DoMyLog;
- end;
- end.
|