Browse Source

* dts2pas added for next pas2js release

Michaël Van Canneyt 3 years ago
parent
commit
396b516a85
4 changed files with 420 additions and 0 deletions
  1. 2 0
      packages/fcl-js/fpmake.pp
  2. 251 0
      utils/pas2js/dts2pas.pp
  3. 1 0
      utils/pas2js/fpmake.pp
  4. 166 0
      utils/pas2js/web.inc

+ 2 - 0
packages/fcl-js/fpmake.pp

@@ -45,6 +45,8 @@ begin
       T.ResourceStrings:=true;
     T:=P.Targets.AddUnit('jsminifier.pp');
       T.ResourceStrings:=true;
+    T:=P.Targets.AddUnit('tstopas.pp');
+      T.ResourceStrings:=true;
 {$ifndef ALLPACKAGES}
     Run;
     end;

+ 251 - 0
utils/pas2js/dts2pas.pp

@@ -0,0 +1,251 @@
+{ *********************************************************************
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2021 Michael Van Canneyt.
+
+    Typescript declaration module conversion to pascal program.
+
+    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.
+
+  **********************************************************************}
+
+program dts2pas;
+
+{$mode objfpc}{$H+}
+
+uses
+  Classes, SysUtils, StrUtils, CustApp, pascodegen, tstopas;
+
+type
+  { TParseTSApplication }
+
+  TParseTSApplication = class(TCustomApplication)
+  private
+    FVerbose,
+    FWeb : Boolean;
+    FLinks,
+    FUnits,
+    FAliases : TStringArray;
+
+    procedure AddAliases(Converter: TTypescriptToPas; aAlias: String);
+    procedure AddWebAliases(S: Tstrings);
+    procedure AddJSAliases(S: Tstrings);
+    procedure DoLog(Sender: TObject; LogType: TCodegenLogType; const Msg: String);
+    function ParseFile(const aInputFileName, aOutputFileName, aUnitName: string): Boolean;
+  protected
+    procedure DoRun; override;
+  public
+    constructor Create(TheOwner: TComponent); override;
+    destructor Destroy; override;
+    procedure Usage(Msg : string); virtual;
+  end;
+
+{ TParseTSApplication }
+
+procedure TParseTSApplication.DoRun;
+
+var
+  ErrorMsg: String;
+  aUnitName,InputFile,OutputFile : String;
+
+begin
+  Terminate;
+  ErrorMsg:=CheckOptions('hi:o:a:wx:u:vl:', ['help','input:','output:','alias:','web','extra-units:','unitname:','verbose','link:']);
+  if (ErrorMsg<>'') or HasOption('h','help') then
+    begin
+    Usage(ErrorMsg);
+    Exit;
+    end;
+  InputFile:=GetOptionValue('i','input');
+  OutputFile:=GetOptionValue('o','output');
+  FAliases:=GetOptionValues('a','alias');
+  FLinks:=GetOptionValues('l','link');
+  FUnits:=GetOptionValues('x','extra-units');
+  FWeb:=HasOption('w','web');
+  FVerbose:=HasOption('v','verbose');
+  If OutputFile='' then
+    if InputFile.EndsWith('d.ts') then
+      OutputFile:=ChangeFileExt(ChangeFileExt(InputFile,''),'.pp')
+    else
+      OutputFile:=ChangeFileExt(InputFile,'.pp');
+  aUnitName:=GetOptionValue('u','unitname');
+  if aUnitName='' then
+    aUnitName:=ChangeFileExt(ExtractFileName(outputFile),'');
+  if not ParseFile(InputFIle,OutputFile,aUnitName) then
+    ExitCode:=1;
+end;
+
+procedure TParseTSApplication.AddAliases(Converter : TTypescriptToPas; aAlias : String);
+
+Var
+  aList : TStringList;
+  S : String;
+
+begin
+  if (aAlias='') then
+    exit;
+  if aAlias[1]='@' then
+    begin
+    AList:=TStringList.Create;
+    try
+      aList.LoadFromFile(Copy(aAlias,2,Length(aAlias)-1));
+      Converter.TypeAliases.AddStrings(AList);
+    finally
+      AList.Free;
+    end;
+    end
+  else
+    For S in SplitString(aAlias,',;') do
+      if Pos('=',S)<>0 then
+        Converter.TypeAliases.Add(S);
+end;
+
+Function TParseTSApplication.ParseFile(const aInputFileName,aOutputFileName,aUnitName : string) : Boolean;
+
+Var
+  Converter : TTypescriptToPas;
+  A, S,U,U1,U2 : String;
+  L : TStringArray;
+begin
+  Result:=False;
+  try
+    Converter:=TTypescriptToPas.Create(Self);
+    try
+      AddJSAliases(Converter.TypeAliases);
+      For A in FAliases do
+        AddAliases(Converter,A);
+      if FWeb then
+        begin
+        AddWebAliases(Converter.TypeAliases);
+        Funits:=Concat(Funits, [ 'web' ]);
+        end;
+      U:='';
+      For S in FUnits do
+        begin
+        L:=SplitString(S,',');
+        For U1 in L do
+          begin
+          U2:=Trim(U1);
+          if U2<>'' then
+            begin
+            if U<>'' then
+              U:=U+', ';
+            U:=U+U2;
+            end;
+          end;
+        end;
+      For S in Flinks do
+        Converter.LinkStatements.Add(S);
+      Converter.Verbose:=FVerbose;
+      Converter.Options:=Converter.Options+[coInterfaceAsClass];
+      Converter.ExtraUnits:=U;
+      Converter.InputFileName:=aInputFileName;
+      Converter.OutputFileName:=aOutputFileName;
+      Converter.OutputUnitName:=aUnitName;
+      Converter.Execute;
+      Converter.OnLog:=@DoLog;
+      Result:=True;
+    finally
+      Converter.Free;
+    end;
+  except
+    on E : Exception do
+      Writeln('Conversion error ',E.ClassName,' : ',E.Message);
+  end;
+end;
+
+constructor TParseTSApplication.Create(TheOwner: TComponent);
+begin
+  inherited Create(TheOwner);
+  StopOnException:=True;
+end;
+
+destructor TParseTSApplication.Destroy;
+begin
+  inherited Destroy;
+end;
+
+procedure TParseTSApplication.AddWebAliases(S : Tstrings);
+
+begin
+  With S do
+    begin
+    {$i web.inc}
+    end;
+end;
+
+procedure TParseTSApplication.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 TParseTSApplication.DoLog(Sender: TObject; LogType: TCodegenLogType; const Msg: String);
+begin
+  Writeln('[',LogType,'] : ',Msg);
+end;
+
+
+procedure TParseTSApplication.Usage(Msg: string);
+begin
+  if Msg<>'' then
+    Writeln('Error : ',Msg);
+  writeln('Usage: ', ExeName, ' [options]');
+  Writeln('Where options is one or mote of:');
+  Writeln('-a --alias=ALIAS      Define type aliases (option can be speficied multiple times)');
+  Writeln('                      where ALIAS is one of');
+  Writeln('                      a comma-separated list of Alias=TypeName values');
+  Writeln('                      a @FILE : list is read from FILENAME, one line per alias');
+  Writeln('-h --help             Display this help text');
+  Writeln('-i --input=FILENAME   Parse .d.ts file FILENAME');
+  Writeln('-l --link=FILENAME    add {$linklib FILENAME} statement. (option can be specified multiple times)');
+  Writeln('-o --output=FILENAME  Output unit in file FILENAME');
+  Writeln('-u --unit=NAME        Set output unitname');
+  Writeln('-w --web              Add web unit to uses, define type aliases for web unit');
+  Writeln('-x --extra-units=UNITLIST   Add units (comma-separated list of unit names) to uses clause.');
+  Writeln('                      This option can be specified multiple times.');
+end;
+
+var
+  Application: TParseTSApplication;
+begin
+  Application:=TParseTSApplication.Create(nil);
+  Application.Title:='My Application';
+  Application.Run;
+  Application.Free;
+end.
+

+ 1 - 0
utils/pas2js/fpmake.pp

@@ -43,6 +43,7 @@ begin
     PT:=P.Targets.AddProgram('compileserver.pp');
     PT.Dependencies.AddUnit('httpcompiler');
     PT:=P.Targets.AddProgram('webidl2pas.pp');
+    PT:=P.Targets.AddProgram('dts2pas.pp');
     end;
 end;
 

+ 166 - 0
utils/pas2js/web.inc

@@ -0,0 +1,166 @@
+Add('Attr=TJSAttr');
+Add('AudioTrackList=TJSHTMLAudioTrackList');
+Add('AudioTrack=TJSHTMLAudioTrack');
+Add('Blob=TJSBlob');
+Add('Body=TJSBody');
+Add('CanvasGradient=TJSCanvasGradient');
+Add('CanvasPattern=TJSCanvasPattern');
+Add('CanvasRenderingContext2D=TJSCanvasRenderingContext2D');
+Add('CharacterData=TJSCharacterData');
+Add('ClipboardEvent=TJSClipBoardEvent');
+Add('ClipboardItem=TJSClipBoardItem');
+Add('Clipboard=TJSClipBoard');
+Add('CloseEvent=TJSCloseEvent');
+Add('Console=TJSConsole');
+Add('CryptoKey=TJSCryptoKey');
+Add('Crypto=TJSCrypto');
+Add('CSSRuleList=TJSCSSRuleList');
+Add('CSSRule=TJSCSSRule');
+Add('CSSStyleDeclaration=TJSCSSStyleDeclaration');
+Add('CSSStyleRule=TJSCSSStyleRule');
+Add('CSSStyleSheet=TJSCSSStyleSheet');
+Add('DataTransferItemList=TJSDataTransferItemList');
+Add('DataTransferItem=TJSDataTransferItem');
+Add('DataTransfer=TJSDataTransfer');
+Add('DocumentFragment=TJSDocumentFragment');
+Add('DocumentImplementation=TJSDOMImplementation');
+Add('Document=TJSDocument');
+Add('DocumentType=TJSDocumentType');
+Add('DOMException=TJSDOMException');
+Add('DOMParser=TDOMParser');
+Add('DOMRect=TJSDOMRect');
+Add('DOMSettableTokenList=TJSDOMSettableTokenList');
+Add('DOMTokenList=TJSDOMTokenList');
+Add('DragEvent=TJSDragEvent');
+Add('Element=TJSElement');
+Add('ErrorEvent=TJSErrorEvent');
+Add('EventListenerEvent=TEventListenerEvent');
+Add('EventTarget=TJSEventTarget');
+Add('Event=TJSEvent');
+Add('FileList=TJSHTMLFileList');
+Add('FileReader=TJSFileReader');
+Add('FileSystemDirectoryHandle=TJSFileSystemDirectoryHandle');
+Add('FileSystemFileHandle=TJSFileSystemFileHandle');
+Add('FileSystemHandle=TJSFileSystemHandle');
+Add('FileSystemWritableFileStream=TJSFileSystemWritableFileStream');
+Add('File=TJSHTMLFile');
+Add('FormData=TJSFormData');
+Add('GeoLocation=TJSGeoLocation');
+Add('HashChangeEvent=TJSHashChangeEvent');
+Add('Headers=TJSHTMLHeaders');
+Add('History=TJSHistory');
+Add('HTMLAnchorElement=TJSHTMLAnchorElement');
+Add('HTMLAudioElement=TJSHTMLAudioElement');
+Add('HTMLButtonElement=TJSHTMLButtonElement');
+Add('HTMLCanvasElement=TJSHTMLCanvasElement');
+Add('HTMLCollection=TJSHTMLCollection');
+Add('HTMLDivElement=TJSHTMLDivElement');
+Add('HTMLDocument=TJSHTMLDocument');
+Add('HTMLElement=TJSHTMLElement');
+Add('HTMLEmbedElement=TJSHTMLEmbedElement');
+Add('HTMLFormControlsCollection=TJSHTMLFormControlsCollection');
+Add('HTMLFormElement=TJSHTMLFormElement');
+Add('HTMLIFrameElement=TJSHTMLIFrameElement');
+Add('HTMLInputElement=TJSHTMLInputElement');
+Add('HTMLLabelElement=TJSHTMLLabelElement');
+Add('HTMLLinkElement=TJSHTMLLinkElement');
+Add('HTMLMediaElement=TJSHTMLMediaElement');
+Add('HTMLMenuElement=TJSHTMLMenuElement');
+Add('HTMLOptGroupElement=TJSHTMLOptGroupElement');
+Add('HTMLOptionsCollection=TJSHTMLOptionsCollection');
+Add('HTMLOutputElement=TJSHTMLOutputElement');
+Add('HTMLProgressElement=TJSHTMLProgressElement');
+Add('HTMLScriptElement=TJSHTMLScriptElement');
+Add('HTMLSelectElement=TJSHTMLSelectElement');
+Add('HTMLStyleElement=TJSHTMLStyleElement');
+Add('HTMLTableCellElement=TJSHTMLTableCellElement');
+Add('HTMLTableDataCellElement=TJSHTMLTableDataCellElement');
+Add('HTMLTableElement=TJSHTMLTableElement');
+Add('HTMLTableRowElement=TJSHTMLTableRowElement');
+Add('HTMLTableSectionElement=TJSHTMLTableSectionElement');
+Add('HTMLTemplateElement=TJSHTMLTemplateElement');
+Add('HTMLTextAreaElement=TJSHTMLTextAreaElement');
+Add('HTMLVideoElement=TJSHTMLVideoElement');
+Add('IDBCursorDirection=TJSIDBCursorDirection');
+Add('IDBCursor=TJSIDBCursor');
+Add('IDBDatabase=TIDBDatabase');
+Add('IDBFactory=TJSIDBFactory');
+Add('IDBIndex=TJSIDBIndex');
+Add('IDBKeyRange=TJSIDBKeyRange');
+Add('IDBObjectStore=TJSIDBObjectStore');
+Add('IDBOpenDBRequest=TJSIDBOpenDBRequest');
+Add('IDBRequest=TJSIDBRequest');
+Add('IDBTransaction=TJSIDBTransaction');
+Add('IdleDeadline=TJSIdleDeadline');
+Add('ImageData=TJSImageData');
+Add('Image=TJSHTMLImageElement');
+Add('IVisible=TJSVisibleItem');
+Add('KeyboardEvent=TJSKeyboardEvent');
+Add('LocationBar=TJSLocationBar');
+Add('Location=TJSLocation');
+Add('MediaController=TJSHTMLMediaController');
+Add('MediaDevices=TJSMediaDevices');
+Add('MediaError=TJSMEdiaError');
+Add('MediaQueryList=TJSMediaQueryList');
+Add('MediaStream=TJSHTMLMediaStream');
+Add('MediaStreamTrack=TJSMediaStreamTrack');
+Add('MenuBar=TJSMenuBar');
+Add('MessageEvent=TJSMessageEvent');
+Add('MessagePort=TJSMessagePort');
+Add('MouseEvent=TJSMouseEvent');
+Add('MutationObserver=TJSMutationObserver');
+Add('NamedNodeMap=TJSNamedNodeMap');
+Add('Navigator=TJSNavigator');
+Add('NodeFilter=TJSNodeFilter');
+Add('NodeList=TJSNodeList');
+Add('Node=TJSNode');
+Add('Option=TJSHTMLOptionElement');
+Add('Path2D=TJSPath2D');
+Add('Performance=TJSPerformance');
+Add('PermissionStatus=TJSPermissionStatus');
+Add('Permissions=TJSPermissions');
+Add('PersonalBar=TJSPersonalBar');
+Add('PointerEvent=TJSPointerEvent');
+Add('PopStateEvent=TJSPopStateEvent');
+Add('ProcessingInstruction=TJSProcessingInstruction');
+Add('ProgressEvent=TJSProgressEvent');
+Add('Range=TJSRange');
+Add('ReadableStream=TJSReadableStream');
+Add('Response=TJSResponse');
+Add('Screen=TJSScreen');
+Add('ScrollBars=TJSScrollBars');
+Add('Selection=TJSSelection');
+Add('ServiceWorkerContainer=TJSServiceWorkerContainer');
+Add('ServiceWorkerRegistration=TJSServiceWorkerRegistration');
+Add('ServiceWorker=TJSServiceWorker');
+Add('SharedWorker=TJSSharedWorker');
+Add('StorageEvent=TJSStorageEvent');
+Add('Storage=TJSStorage');
+Add('StyleSheetList=TJSStyleSheetList');
+Add('StyleSheet=TJSStyleSheet');
+Add('SubtleCrypto=TJSSubtleCrypto');
+Add('TextMetrics=TJSTextMetrics');
+Add('TextTrackList=TJSHTMLTextTrackList');
+Add('TextTrack=TJSHTMLTextTrack');
+Add('ToolBar=TJSToolBar');
+Add('TouchEvent=TJSTouchEvent');
+Add('TouchList=TJSTouchList');
+Add('Touch=TJSTouch');
+Add('TreeWalker=TJSTreeWalker');
+Add('UIEvent=TJSUIEvent');
+Add('URLSearchParams=TJSURLSearchParams');
+Add('URL=TJSURL');
+Add('ValidityState=TJSValidityState');
+Add('VideoTrackList=TJSHTMLVideoTrackList');
+Add('VideoTrack=TJSHTMLVideoTrack');
+Add('WebSocket=TJSWebSocket');
+Add('WheelEvent=TJSWheelEvent');
+Add('Window=TJSWindow');
+Add('Worker=TJSWorker');
+Add('WritableStream=TJSWritableStream');
+Add('XMLHttpRequestEventTarget=TJSXMLHttpRequestEventTarget');
+Add('XMLHttpRequest=TJSXMLHttpRequest');
+Add('XMLHttpRequestUpload=TJSXMLHttpRequestUpload');
+Add('XPathExpression=TJSXPathExpression');
+Add('XPathNSResolver=TJSXPathNSResolver');
+Add('XPathResult=TJSXPathResult');