convert.lpr 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. program convert;
  2. {$mode objfpc}
  3. uses typinfo, types, web, js, webwidget, browserapp;
  4. var
  5. dtsfiles : TStringDynArray; external name 'dtsfiles';
  6. Type
  7. TConversionOption = (coRaw,coGenericArrays,coUseNativeTypeAliases,coLocalArgumentTypes, coUntypedTuples, coDynamicTuples,
  8. coExternalConst,coExpandUnionTypeArgs,coaddOptionsToheader,coInterfaceAsClass,coSkipImportStatements);
  9. { TConvertApplication }
  10. TConvertApplication = class(TBrowserApplication)
  11. Private
  12. edtFileInput : TJSHTMLInputElement;
  13. edtUnitName : TJSHTMLInputElement;
  14. btnGo : TJSHTMLButtonElement;
  15. edtSource : TJSHTMLTextAreaElement;
  16. divMenu : TJSHTMLElement;
  17. cbOptions : Array[TConversionOption] of TJSHTMLInputElement;
  18. cbPrependLog : TJSHTMLInputElement;
  19. function GetQueryOptions: String;
  20. Protected
  21. Function LogGetElementErrors : Boolean; override;
  22. Procedure DoGoClick(aEvent : TJSEvent);
  23. Procedure DoAnchorClick(aEvent : TJSEvent);
  24. Procedure DoInputChange(aEvent : TJSEvent);
  25. Procedure DoInputExit(aEvent : TJSEvent);
  26. Procedure DoRun; override;
  27. end;
  28. function TConvertApplication.GetQueryOptions: String;
  29. Procedure AddToRes(N,V : String);
  30. begin
  31. if V='' then
  32. exit;
  33. if Result<>'' then
  34. Result:=Result+'&';
  35. Result:=Result+N+'='+V;
  36. end;
  37. Var
  38. T : TConversionOption;
  39. begin
  40. AddToRes('file',edtFileInput.value);
  41. AddToRes('unit',edtUnitName.value);
  42. if cbPrependLog.Checked then
  43. AddToRes('prependlog','1');
  44. For T in TConversionoption do
  45. if cbOptions[T].checked then
  46. AddToRes(cbOptions[T].ID,'1');
  47. end;
  48. function TConvertApplication.LogGetElementErrors: Boolean;
  49. begin
  50. Result:=true;
  51. end;
  52. procedure TConvertApplication.DoGoClick(aEvent: TJSEvent);
  53. function haveText(res : JSValue) : JSValue;
  54. begin
  55. edtSource.Value:=String(res);
  56. end;
  57. function DoFetchOK (res : JSValue) : JSValue;
  58. var
  59. Resp : TJSResponse absolute res;
  60. begin
  61. Resp.Text()._then(@HaveText);
  62. Result:=True;
  63. end;
  64. begin
  65. divMenu.style['display']:='none';
  66. window.fetch('convcgi.cgi/convert/?'+GetQueryOptions)._then(@DoFetchOK)
  67. end;
  68. procedure TConvertApplication.DoAnchorClick(aEvent: TJSEvent);
  69. var
  70. a : TJSHTMLAnchorElement;
  71. begin
  72. aEvent.preventDefault();
  73. a:=TJSHTMLAnchorElement(aEvent.target);
  74. edtFileInput.Value:=a.innertext;
  75. divmenu.style['display']:='none';
  76. end;
  77. procedure TConvertApplication.DoInputExit(aEvent: TJSEvent);
  78. var
  79. FE: TJSFocusEvent absolute aEvent;
  80. begin
  81. if (FE.relatedTarget=Nil) or (Pos('dropdown-item',FE.relatedTarget.className)=0) then
  82. divmenu.style['display']:= 'none'
  83. end;
  84. procedure TConvertApplication.DoInputChange(aEvent: TJSEvent);
  85. var
  86. inp,S : String;
  87. a : TJSHTMLAnchorElement;
  88. aCount : Integer;
  89. begin
  90. inp:=edtFileInput.Value;
  91. if length(inp)<2 then exit;
  92. divMenu.style['display']:='none';
  93. divMenu.innerHTML:='<div class="dropdown-content"></div>';
  94. aCount:=0;
  95. for S in dtsFiles do
  96. if Pos(Inp,S)<>0 then
  97. begin
  98. a:=TJSHTMLAnchorElement(Window.Document.CreateElement('a'));
  99. a.className:='dropdown-item';
  100. a.href:='#';
  101. a.InnerText:=S;
  102. a.addEventListener('click',@DoAnchorClick);
  103. divMenu.childNodes[0].appendChild(a);
  104. Inc(aCount);
  105. end;
  106. if aCount>0 then
  107. divMenu.style['display']:='block';
  108. end;
  109. procedure TConvertApplication.DoRun;
  110. Var
  111. T : TConversionOption;
  112. N : String;
  113. begin
  114. edtFileInput:=TJSHTMLInputElement(GetHTMLElement('edtfilename'));
  115. edtFileInput.addEventListener('input',@DoInputChange);
  116. edtFileInput.addEventListener('focusout',@DoInputexit);
  117. edtUnitName:=TJSHTMLInputElement(GetHTMLElement('edtunitname'));
  118. btnGo:=TJSHTMLButtonElement(GetHTMLElement('btnGo'));
  119. btnGo.AddEventListener('click',@DoGoClick);
  120. edtSource:=TJSHTMLTextAreaElement(GetHTMLElement('edtSource'));
  121. cbPrependLog:=TJSHTMLInputElement(GetHTMLElement('cbPrependLog'));
  122. divMenu:=GetHTMLElement('file-menu');
  123. for T in TConversionOption do
  124. begin
  125. N:=GetEnumName(TypeInfo(TConversionOption),Ord(T));
  126. cbOptions[T]:=TJSHTMLInputElement(GetHTMLElement(N));
  127. end;
  128. end;
  129. Var
  130. Application : TConvertApplication;
  131. begin
  132. Application:= TConvertApplication.Create(Nil);
  133. Application.Initialize;
  134. Application.Run;
  135. end.