├── .gitignore ├── License.md ├── README.md ├── bin └── pas2js.cfg ├── compiler ├── packages │ ├── DictHelper.pas │ ├── FPCTypes.pas │ ├── avl_tree.pas │ ├── delphi_defines.inc │ ├── fcl-js │ │ ├── README.TXT │ │ └── src │ │ │ ├── fcl-js.inc │ │ │ ├── jsbase.pas │ │ │ ├── jssrcmap.pas │ │ │ ├── jstoken.pas │ │ │ ├── jstree.pas │ │ │ └── jswriter.pas │ ├── fcl-json │ │ └── src │ │ │ ├── README.txt │ │ │ ├── fcl-json.inc │ │ │ ├── fpjson.pas │ │ │ ├── jsonparser.pas │ │ │ ├── jsonreader.pas │ │ │ └── jsonscanner.pas │ ├── fcl-passrc │ │ └── src │ │ │ ├── PParser.pas │ │ │ ├── PasResolver.pas │ │ │ ├── fcl-passrc.inc │ │ │ ├── pasresolveeval.pas │ │ │ ├── pastree.pas │ │ │ ├── pasuseanalyzer.pas │ │ │ └── pscanner.pas │ ├── pastojs │ │ └── src │ │ │ ├── FPPas2Js.pas │ │ │ ├── Pas2JSFSCompiler.pas │ │ │ ├── Pas2jsCompiler.pas │ │ │ ├── Pas2jsFileCache.pas │ │ │ ├── Pas2jsLogger.pas │ │ │ ├── Pas2jsPParser.pas │ │ │ ├── fppjssrcmap.pas │ │ │ ├── pas2js_defines.inc │ │ │ ├── pas2jscompilercfg.pas │ │ │ ├── pas2jscompilerpp.pas │ │ │ ├── pas2jsfileutils.pas │ │ │ ├── pas2jsfileutilsnodejs.inc │ │ │ ├── pas2jsfileutilsunix.inc │ │ │ ├── pas2jsfileutilswin.inc │ │ │ ├── pas2jsfs.pas │ │ │ ├── pas2jshtmlresources.pas │ │ │ ├── pas2jsjsresources.pas │ │ │ ├── pas2jsresources.pas │ │ │ ├── pas2jsresstrfile.pas │ │ │ ├── pas2jsuseanalyzer.pas │ │ │ └── pas2jsutils.pas │ ├── pipes.inc │ ├── pipes.pas │ ├── process.inc │ └── process.pas └── utils │ └── pas2js │ ├── dist │ └── rtl.js │ ├── docs │ └── translation.html │ ├── pas2js.cfg │ ├── pas2js.dpr │ ├── pas2js.dproj │ ├── pas2js.res │ ├── pas2jswebcompiler.pp │ └── webfilecache.pp ├── demo ├── apiclient │ ├── apiclient.lpr │ ├── bulma.min.css │ └── index.html ├── asyncawait │ ├── asyncawaitdemos.lpg │ ├── description.txt │ ├── fpc.png │ ├── manualpromise.html │ ├── manualpromise.lpr │ ├── pas2js.png │ ├── tryfetch.html │ ├── tryfetch.lpr │ ├── trymany.html │ └── trymany.lpr ├── atom │ ├── .gitignore │ ├── README.md │ ├── demoview.pas │ ├── keymaps │ │ └── pas2jsdemopackage.json │ ├── lib │ │ └── packageglue.js │ ├── menus │ │ └── pas2jsdemopackage.json │ ├── package.json │ ├── pas2jsdemopackage.lpr │ ├── screenshot │ │ ├── atom1.png │ │ └── atom2.png │ └── styles │ │ └── pas2jsdemopackage.less ├── bootstrap │ ├── bootstraptable.html │ ├── countries.json │ └── demobootstraptable.lpr ├── chartjs │ ├── chartjs_demos.lpg │ ├── demoarea.html │ ├── demoarea.lpr │ ├── demobar.html │ ├── demobar.lpr │ ├── demobubble.html │ ├── demobubble.lpr │ ├── democustompoints.html │ ├── democustompoints.lpr │ ├── demodatalabelling.html │ ├── demodatalabelling.lpr │ ├── demodate.html │ ├── demodate.lpr │ ├── demodoughnut.html │ ├── demodoughnut.lpr │ ├── demointeractions.html │ ├── demointeractions.lpr │ ├── demoline.html │ ├── demoline.lpr │ ├── demomixed.html │ ├── demomixed.lpr │ ├── demopie.html │ ├── demopie.lpr │ ├── demopolararea.html │ ├── demopolararea.lpr │ ├── demoprogressbar.html │ ├── demoprogressbar.lpr │ ├── demoradar.html │ ├── demoradar.lpr │ ├── demoscatter.html │ ├── demoscatter.lpr │ ├── demoscriptablebubble.html │ ├── demoscriptablebubble.lpr │ ├── demotime.html │ ├── demotime.lpr │ └── index.html ├── dataabstract │ ├── DataAbstract.js │ ├── DataAbstract4_intf.js │ ├── README.txt │ ├── RemObjectsSDK.js │ ├── sampleda.html │ ├── sampleda.lpr │ ├── sampledarw.html │ ├── sampledarw.lpr │ └── server │ │ ├── DALibrary.RODL │ │ ├── DAServer.dpr │ │ ├── DAServer.dproj │ │ ├── DAServer.res │ │ ├── DAServer_Intf.pas │ │ ├── DAServer_Invk.pas │ │ ├── DataService_Impl.dfm │ │ ├── DataService_Impl.pas │ │ ├── Modules.Server.dfm │ │ ├── Modules.Server.pas │ │ ├── RODLFILE.res │ │ └── country.sql ├── dynload │ ├── FormFactory.pas │ ├── MyFormDep.pas │ ├── myform.pp │ ├── myformdep2.pp │ ├── testloader.html │ └── testloader.lpr ├── errorhandler │ ├── errordemo.lpr │ └── index.html ├── extend_jsclass │ ├── ExtendJSFunctionClass1.html │ └── ExtendJSFunctionClass1.lpr ├── fcldb │ ├── countries-1.json │ ├── countries-2.json │ ├── countries-3.json │ ├── countries.json │ ├── demodb.html │ ├── demodb.lpr │ ├── demoload.html │ ├── demoload.lpr │ ├── demorest.html │ ├── demorest.lpr │ ├── restdata.pp │ └── restserver.pas ├── fpcunit │ ├── browsertest.cfg │ ├── browsertest.html │ ├── browsertest.lpr │ ├── demotests.pp │ ├── fpcunit.css │ └── frmrunform.pp ├── fpreport │ ├── README.md │ ├── bootstrap.min.css │ ├── frmmain.pp │ ├── reportdemo.html │ └── reportdemo.lpr ├── fullcalendar │ ├── demofullcalendar.lpr │ ├── demofullcalendar4.html │ ├── demofullcalendar4.lpr │ ├── demofullcalendar5.html │ ├── demofullcalendar5.lpr │ └── index.html ├── hotreload │ ├── dirwatch.pp │ ├── hotreload.cfg │ ├── hotreload.html │ ├── hotreload.lpr │ ├── server.lpr │ └── status.json ├── jitsimeet │ ├── demojitsimeet.lpr │ └── index.html ├── jquery │ ├── demoadd.html │ ├── demoadd.pas │ ├── demoaddclass.html │ ├── demoaddclass.pas │ ├── demoaddclass2.html │ └── demoaddclass2.pas ├── jspdf │ ├── basic.html │ └── basic.lpr ├── kurento │ ├── css │ │ └── kurento.css │ ├── helloworld.html │ ├── helloworld.lpr │ ├── img │ │ ├── kurento.png │ │ ├── spinner.gif │ │ └── webrtc.png │ └── js │ │ ├── kurento-client.js │ │ └── kurento-utils.js ├── modules │ ├── README.md │ ├── basic-units │ │ ├── canvas.pp │ │ ├── index.html │ │ ├── main.pp │ │ └── square.pp │ ├── basic │ │ ├── index.html │ │ └── main.pp │ ├── flat-units │ │ ├── canvas.pp │ │ ├── index.html │ │ ├── main.pp │ │ └── square.pp │ └── flat │ │ ├── index.html │ │ └── main.pp ├── nodehttpserver │ └── nodehttpdemo.lpr ├── opentok │ ├── css │ │ └── app.css │ ├── demoopentok.lpr │ └── index.html ├── pacman │ ├── audio │ │ ├── die.mp3 │ │ ├── eatghost.mp3 │ │ ├── eating.mp3 │ │ └── start.mp3 │ ├── cherry.png │ ├── ghost-scared.png │ ├── ghost1.png │ ├── ghost2.png │ ├── ghost3.png │ ├── ghost4.png │ ├── pacman.css │ ├── pacman.html │ ├── pacman.lpr │ └── upacman.pp ├── pas2js_demos.lpg ├── player │ ├── headset.jpeg │ ├── index.html │ ├── main.pas │ ├── style.css │ └── tracks.js ├── promise │ ├── askmom.html │ ├── askmom.pas │ ├── chapter-1.json │ ├── chapter-2.json │ ├── chapter-3.json │ ├── chapter-4.json │ ├── chapter-5.json │ ├── demoall.html │ ├── demoall.lpr │ ├── promise_demos.lpg │ ├── readme.md │ ├── story.html │ ├── story.json │ ├── story.lpr │ ├── story2.html │ ├── story2.lpr │ ├── story3.html │ ├── story3.lpr │ ├── styles.css │ └── utils.pp ├── pushjs │ ├── helloworld.html │ └── helloworld.lpr ├── resources │ ├── consoledemo.lpr │ ├── css │ │ ├── stylejs.css │ │ └── stylelink.css │ ├── down.png │ ├── help.txt │ ├── htmldemo.html │ ├── htmldemo.lpr │ ├── htmllinkdemo.html │ ├── htmllinkdemo.lpr │ ├── htmlloadlinkdemo.html │ ├── htmlloadlinkdemo.lpr │ ├── left.png │ ├── resourcedemos.lpg │ ├── right.png │ ├── testa.html │ ├── testb.html │ ├── testres.html │ ├── unita.pp │ ├── unitb.pp │ └── up.png ├── restbridge │ └── simple │ │ ├── README.txt │ │ ├── restbridge.html │ │ └── restbridgeclient.lpr ├── router │ ├── README.md │ ├── demorouter.html │ ├── demorouter.pas │ ├── demorouter2.html │ ├── demorouter2.pas │ ├── frmdemo.pp │ ├── histsrv.js │ └── histsrv2.js ├── rtl │ ├── README.md │ ├── ajax.pas │ ├── bytes.txt │ ├── countries.json │ ├── demo_njsprocess.pas │ ├── demoajax.html │ ├── demoajax.lpr │ ├── demobrowserconsole.html │ ├── demobrowserconsole.lpr │ ├── democanvas2d.html │ ├── democanvas2d.pas │ ├── democlasstopas.html │ ├── democlasstopas.pas │ ├── democollection.html │ ├── democollection.pas │ ├── democomponents.html │ ├── democomponents.lpr │ ├── demodatetime.pas │ ├── demodocument1.html │ ├── demodocument1.pas │ ├── demodombuttonevent.html │ ├── demodombuttonevent.pas │ ├── demojsarray.pas │ ├── demojsdataarray.pas │ ├── demojsregexp.pas │ ├── demojsstring.pas │ ├── demoloadstreamfromurl.html │ ├── demoloadstreamfromurl.lpr │ ├── demoloadstringsfromurl.html │ ├── demoloadstringsfromurl.lpr │ ├── demonew.html │ ├── demonew.pas │ ├── demonodecmdlineoptions.pas │ ├── demorouter.pas │ ├── demortti.pas │ ├── demostringlist.html │ ├── demostringlist.pas │ ├── demouncaughtexception.html │ ├── demouncaughtexception.pas │ ├── demoxhr.html │ ├── demoxhr.lpr │ └── rtl_demos.lpg ├── templates │ ├── favicon.ico │ ├── index.html │ ├── templates.lpr │ └── templates │ │ ├── this.txt │ │ └── thistoo.txt ├── tetris │ ├── tetris.css │ ├── tetris.html │ ├── tetris.lpr │ ├── tetrislogo.png │ └── utetris.pp ├── translate │ ├── dutch.json │ ├── mystrings.pp │ ├── translate_basic.html │ ├── translate_basic.lpr │ ├── translate_demos.lpg │ ├── translate_object.html │ ├── translate_object.lpr │ ├── translate_url.html │ └── translate_url.lpr ├── ts2pas │ ├── bulma.min.css │ ├── convert.lpr │ └── index.html ├── uselibpas2js │ ├── Readme.txt │ ├── examples │ │ └── TestUnitAlias1.pas │ ├── libpas2jsintf.pas │ ├── pas2js_unitalias.lpr │ └── pas2jscompilerproxy.pas ├── vscode │ └── helloworld │ │ ├── .vscode │ │ ├── launch.json │ │ └── tasks.json │ │ ├── README.md │ │ ├── js │ │ └── packageglue.js │ │ ├── package.json │ │ └── pas2jsdemoextension.lpr ├── wasienv │ ├── canvas │ │ ├── .gitignore │ │ ├── bulma.min.css │ │ ├── canvasdraw.lpr │ │ ├── demowasicanvas.lpr │ │ ├── index.html │ │ ├── wacanvas.pp │ │ └── webcanvas.pp │ ├── simple │ │ ├── bulma.min.css │ │ ├── demowasienv.lpr │ │ ├── helloworld.pp │ │ └── index.html │ ├── terminal │ │ ├── bulma.min.css │ │ ├── demowasiterm.lpr │ │ ├── index.html │ │ └── sums.pp │ ├── wasiapp │ │ ├── bulma.min.css │ │ ├── demowasiapp.lpr │ │ └── index.html │ └── wasienvdemos.lpg ├── webcompiler │ ├── demowebcompiler.lpr │ ├── run.html │ └── webcompiler.html ├── webgl │ ├── GLTypes.pas │ ├── GLUtils.pas │ ├── Mat4.pas │ ├── Matrix.pas │ ├── MemoryBuffer.pas │ ├── Noise.pas │ ├── Pas2JS_WebGL.pas │ ├── Pas2JS_WebGL_Minimal.pas │ ├── Pas2JS_WebGL_OBJ.pas │ ├── Pas2JS_WebGL_Terrain.pas │ ├── README.txt │ ├── Terrain.pas │ ├── html │ │ ├── Pas2JS_WebGL.html │ │ ├── Pas2JS_WebGL_Minimal.html │ │ ├── Pas2JS_WebGL_OBJ.html │ │ ├── Pas2JS_WebGL_Terrain.html │ │ └── res │ │ │ ├── cube.obj │ │ │ ├── dragon.obj │ │ │ ├── ground.jpg │ │ │ └── spacestars.jpg │ ├── project1.lpr │ └── webgl_demos.lpg ├── websockets │ ├── README.md │ ├── demowebsocket.lpr │ ├── guest.png │ ├── index.html │ ├── serverconfig.js │ ├── style.css │ └── you.png ├── webwidget │ ├── designdemo │ │ ├── design.css │ │ ├── designdemo.html │ │ ├── designdemo.lpr │ │ ├── designer.pp │ │ ├── webideclient.pp │ │ └── widgets │ │ │ ├── button.png │ │ │ ├── checkbox.png │ │ │ ├── container.png │ │ │ ├── edit.png │ │ │ ├── image.png │ │ │ ├── jumbo.png │ │ │ ├── memo.png │ │ │ ├── radio.png │ │ │ └── select.png │ ├── nativedesign │ │ ├── frmmain.lfm │ │ ├── frmmain.pp │ │ ├── globalcefapplication.pas │ │ ├── initsubprocess.pas │ │ ├── nativedesigner.ico │ │ ├── nativedesigner.lpr │ │ ├── nativedesigner.res │ │ └── webideintf.pp │ └── widgets │ │ ├── countrycodes.js │ │ ├── css │ │ └── widgetsdemo.css │ │ ├── demobootstrap.pp │ │ ├── democonsts.pp │ │ ├── demohtmlwidgets.pp │ │ ├── frmdemo.pp │ │ ├── images │ │ └── freePascal.jpeg │ │ ├── webwidgetsdemo.lpr │ │ ├── widgetdemo.pp │ │ └── widgetsdemo.html └── xterm │ ├── index.html │ └── xtermdemo.lpr ├── packages ├── atom │ ├── atomapp.pp │ ├── atomexports.js │ ├── atomimports.js │ └── libatom.pp ├── bootstrap │ ├── bootstrapwidgets.pp │ ├── libbootstrap.pp │ └── libbootstraptable.pp ├── chartjs │ └── chartjs.pas ├── dataabstract │ ├── da.pas │ ├── dadataset.pas │ ├── dasdk.pas │ └── rosdk.pas ├── fcl-base │ ├── browserapp.pas │ ├── custapp.pas │ ├── fcl_base_pas2js.lpk │ ├── fcl_base_pas2js.pas │ ├── fpexprpars.pas │ ├── nodejsapp.pas │ └── pascodegen.pp ├── fcl-db │ ├── db.pas │ ├── dbconst.pas │ ├── extjsdataset.pas │ ├── fieldmap.pp │ ├── jsondataset.pas │ ├── pas2js_fcldb.lpk │ ├── pas2js_fcldb.pas │ ├── restconnection.pas │ └── sqldbrestdataset.pp ├── fcl-json │ ├── fpjson.pp │ └── fpjsonjs.pas ├── fcl-rpc │ ├── fprpcclient.pp │ └── fprpccodegen.pp ├── flatpickr │ └── libflatpickr.pas ├── fpcunit │ ├── browsertestrunner.pas │ ├── consoletestrunner.pas │ ├── fpcunit.css │ ├── fpcunit.pas │ ├── fpcunit_pas2js.lpk │ ├── fpcunit_pas2js.pas │ ├── fpcunitreport.pas │ ├── htmltestreport.pp │ ├── plaintestreport.pas │ ├── testdecorator.pas │ └── testregistry.pas ├── fullcalendar │ ├── libfullcalendar4.pp │ └── libfullcalendar5.pp ├── jitsimeet │ └── libjitsimeet.pp ├── jspdf │ └── jspdf.pas ├── kurento │ └── libkurento.pp ├── nodejs │ ├── node.fs.pas │ ├── node.http.pas │ ├── node.net.pas │ ├── node.onoff.pas │ ├── node.spidevice.pas │ └── node.url.pas ├── opentok │ └── libopentok.pas ├── pushjs │ ├── pushjs.js │ └── pushjs.pas ├── rtl │ ├── README.txt │ ├── Rtl.BrowserLoadHelper.pas │ ├── Rtl.ScriptLoader.pas │ ├── Rtl.TemplateLoader.pas │ ├── Rtl.UnitLoader.pas │ ├── arrayutils.pas │ ├── browserconsole.pas │ ├── class2pas.pas │ ├── classes.pas │ ├── contnrs.pas │ ├── dateutils.pas │ ├── generics.collections.pas │ ├── generics.defaults.pas │ ├── generics.strings.pas │ ├── hotreloadclient.pas │ ├── js.pas │ ├── libjquery.pas │ ├── math.pas │ ├── node.events.pas │ ├── nodejs.pas │ ├── objpas.pas │ ├── p2jsres.pp │ ├── pas2js_rtl.lpk │ ├── pas2js_rtl.pas │ ├── rstranslate.pp │ ├── rtlconsts.pas │ ├── rtti.pas │ ├── simplelinkedlist.pas │ ├── strutils.pas │ ├── system.pas │ ├── sysutils.pas │ ├── timer.pas │ ├── types.pas │ ├── typinfo.pas │ ├── web.pas │ ├── webassembly.pas │ ├── webaudio.pas │ ├── webbluetooth.pas │ ├── webgl.pas │ ├── webrouter.pp │ ├── webrtc.pas │ ├── websvg.pas │ └── webutils.pas ├── vscode │ ├── libvscode.pas │ ├── vscodeapp.pp │ ├── vscodeexports.js │ └── vscodeimports.js ├── wasi │ ├── wasienv.pas │ └── wasihostapp.pas ├── webwidget │ ├── dbhtmlwidgets.pp │ ├── dbwebwidget.pp │ ├── htmlwidgets.pp │ ├── lazwebwidgets.lpk │ ├── lazwebwidgets.pas │ ├── propertygridwidget.pp │ └── webwidget.pas └── xterm │ └── xterm.pp └── test ├── frmrtlrun.pp ├── index.html ├── tcclasses.pas ├── tccompstreaming.pp ├── tcgenarrayhelper.pas ├── tcgenericdictionary.pp ├── tcgenericlist.pp ├── tcgenericqueue.pp ├── tcgenericstack.pp ├── tcstream.pp ├── tcstreaming.pp ├── tcstringhelp.pp ├── tcsyshelpers.pp ├── tcsysutils.pas ├── testcomps.pp ├── testrtl.lpr └── tohelper.inc /License.md: -------------------------------------------------------------------------------- 1 | # Pas2js for Delphi License Agreement 2 | 3 | This is the file COPYING.FPC, it applies to the Free Pascal Run-Time Library (RTL) and packages (packages) distributed by members of the Free Pascal Development Team. 4 | 5 | The source code of the Free Pascal Runtime Libraries and packages are distributed under the Library GNU General Public License (see the file COPYING) with the following modification: 6 | 7 | As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, 8 | and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. 9 | -------------------------------------------------------------------------------- /bin/pas2js.cfg: -------------------------------------------------------------------------------- 1 | # 2 | # Config file for pas2js compiler 3 | # 4 | # -d is the same as #DEFINE 5 | # -u is the same as #UNDEF 6 | # 7 | # Write always a nice logo ;) 8 | -l 9 | 10 | # Display Warnings, Notes and Hints 11 | -vwnh 12 | # If you don't want so much verbosity use 13 | #-vw 14 | 15 | # Support operators like C (*=,+=,/= and -=) 16 | -Sc 17 | 18 | #IFDEF nodejs 19 | -Jirtl.js 20 | #ENDIF 21 | 22 | -Fu$CfgDir\..\packages\* 23 | -Fu$CfgDir\..\compiler\utils\pas2js\dist\ 24 | 25 | # Put all generated JavaScript into one file 26 | #-Jc 27 | 28 | # end. 29 | -------------------------------------------------------------------------------- /compiler/packages/delphi_defines.inc: -------------------------------------------------------------------------------- 1 | {$inline on} 2 | 3 | {$IFDEF Windows} 4 | {$define CaseInsensitiveFilenames} 5 | {$define HasUNCPaths} 6 | {$ENDIF} 7 | {$IFDEF darwin} 8 | {$define CaseInsensitiveFilenames} 9 | {$ENDIF} 10 | {$IF defined(CaseInsensitiveFilenames) or defined(darwin)} 11 | {$DEFINE NotLiteralFilenames} // e.g. HFS+ normalizes file names 12 | {$ENDIF} 13 | 14 | {$IFDEF FPC} 15 | {$DEFINE UsePChar} 16 | {$DEFINE HasInt64} 17 | {.$define UseAnsiStrings} 18 | {$DEFINE HasStreams} 19 | {.$DEFINE UTF8_RTL} 20 | {.$DEFINE HasStdErr} 21 | {$DEFINE HasPas2jsFiler} 22 | {$define HasJsonParser} 23 | {$ENDIF} 24 | 25 | {$IF DEFINED(FPC) OR DEFINED(NODEJS)} 26 | {$DEFINE HASFILESYSTEM} 27 | {$define HasFS} 28 | {$define HasFileWriter} 29 | {$ENDIF} 30 | 31 | {$IFDEF CPU32BITS} 32 | {$DEFINE CPU32} 33 | {$ENDIF} 34 | 35 | {$IFDEF CPU64BITS} 36 | {$DEFINE CPU64} 37 | {$ENDIF} 38 | 39 | {$WARN WIDECHAR_REDUCED OFF} // W1050 WideChar reduced to byte char in set expressions 40 | 41 | // As of XE5 and newer, this needs to be in each individual unit 42 | // for which you want to disable RTTI 43 | {$IFDEF UNICODE} 44 | {$WEAKLINKRTTI ON} 45 | {$IF DECLARED(TVisibilityClasses)} 46 | {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} 47 | {$IFEND} 48 | {$ENDIF} 49 | -------------------------------------------------------------------------------- /compiler/packages/fcl-js/README.TXT: -------------------------------------------------------------------------------- 1 | This is a package that contains a Javascript Scanner/parser/Syntax tree. 2 | 3 | The following units are defined: 4 | 5 | jsbase: the definition of Javascript values. Used to represent constant values. 6 | jstree: The Javascript syntax tree elements. Used in the parser to describe a source program 7 | jsscanner: the Javascript scanner. Currently not yet unicode-enabled. 8 | jsparser: the Javascript parser. Builds a complete javascript syntax tree. 9 | 10 | The tests directory contains a set of FPCUnit tests to test the scanner and parser. 11 | It needs Lazarus to run. 12 | 13 | Todo: 14 | - Add more tests. 15 | - Unicode support. 16 | - Runtime-engine ? 17 | 18 | The idea for the tree elements and the parser come from the Libsee library, 19 | written by David Leonard. 20 | 21 | Enjoy! 22 | 23 | Michael. -------------------------------------------------------------------------------- /compiler/packages/fcl-js/src/fcl-js.inc: -------------------------------------------------------------------------------- 1 | {$mode objfpc}{$H+} 2 | {$if defined(fpc) or defined(NodeJS)} 3 | {$define HasFileWriter} 4 | {$endif} 5 | 6 | {$IF FPC_FULLVERSION>30100} 7 | {$warn 6058 off} // cannot inline 8 | {$ENDIF} 9 | 10 | -------------------------------------------------------------------------------- /compiler/packages/fcl-json/src/fcl-json.inc: -------------------------------------------------------------------------------- 1 | {$mode objfpc}{$H+} 2 | {$if defined(fpc) or defined(NodeJS)} 3 | {$define HasFileWriter} 4 | {$endif} 5 | 6 | {$IF FPC_FULLVERSION>30100} 7 | {$warn 6058 off} // cannot inline 8 | {$ENDIF} 9 | 10 | -------------------------------------------------------------------------------- /compiler/packages/fcl-passrc/src/fcl-passrc.inc: -------------------------------------------------------------------------------- 1 | {$mode objfpc}{$H+} 2 | {$inline on} 3 | 4 | {$ifdef fpc} 5 | {$define UsePChar} 6 | {$define HasInt64} 7 | {$define UsePChar} 8 | {$define UseAnsiStrings} 9 | {$define HasStreams} 10 | {$IF FPC_FULLVERSION<30101} 11 | {$define EmulateArrayInsert} 12 | {$endif} 13 | {$define HasFS} 14 | {$endif} 15 | 16 | {$IFDEF NODEJS} 17 | {$define HasFS} 18 | {$ENDIF} 19 | 20 | {$IF FPC_FULLVERSION>30100} 21 | {$warn 6058 off} // cannot inline 22 | {$ENDIF} 23 | 24 | -------------------------------------------------------------------------------- /compiler/packages/pastojs/src/pas2js_defines.inc: -------------------------------------------------------------------------------- 1 | 2 | {$inline on} 3 | 4 | {$IFDEF Windows} 5 | {$define CaseInsensitiveFilenames} 6 | {$define HasUNCPaths} 7 | {$ENDIF} 8 | {$IFDEF darwin} 9 | {$define CaseInsensitiveFilenames} 10 | {$ENDIF} 11 | {$IF defined(CaseInsensitiveFilenames) or defined(darwin)} 12 | {$DEFINE NotLiteralFilenames} // e.g. HFS+ normalizes file names 13 | {$ENDIF} 14 | 15 | {$IFDEF FPC} 16 | {$DEFINE UsePChar} 17 | {$DEFINE HasInt64} 18 | {$DEFINE HasStreams} 19 | {$DEFINE UTF8_RTL} 20 | {$DEFINE HasStdErr} 21 | {$DEFINE HasPas2jsFiler} 22 | {$DEFINE HASFILESYSTEM} 23 | {$ENDIF} 24 | 25 | {$IFDEF NODEJS} 26 | {$DEFINE HASFILESYSTEM} 27 | {$ENDIF} 28 | 29 | 30 | -------------------------------------------------------------------------------- /compiler/utils/pas2js/pas2js.cfg: -------------------------------------------------------------------------------- 1 | # 2 | # Config file for pas2js compiler 3 | # 4 | 5 | # not yet implemented: -d is the same as #DEFINE 6 | # not yet implemented: -u is the same as #UNDEF 7 | 8 | # Write always a nice logo ;) 9 | -l 10 | 11 | # Display Hints, Warnings and Notes 12 | -vwnh 13 | # If you don't want so much verbosity use 14 | #-vw 15 | 16 | #IFDEF nodejs 17 | -Ji$CfgDir/dist/rtl.js 18 | #ENDIF 19 | 20 | -Fu$CfgDir/dist 21 | -Fu$CfgDir/../../../packages/* 22 | 23 | # end. 24 | 25 | -------------------------------------------------------------------------------- /compiler/utils/pas2js/pas2js.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/compiler/utils/pas2js/pas2js.res -------------------------------------------------------------------------------- /demo/asyncawait/asyncawaitdemos.lpg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /demo/asyncawait/description.txt: -------------------------------------------------------------------------------- 1 | This example fetches 3 files, and waits for all 3 fetches to be completion 2 | using the TJSPromise.All() function. 3 | 4 | Since there are 3 promises, the result is an array with 3 results. 5 | 6 | 7 | -------------------------------------------------------------------------------- /demo/asyncawait/fpc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/asyncawait/fpc.png -------------------------------------------------------------------------------- /demo/asyncawait/manualpromise.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Manual promise demo 4 | 5 | 6 | 7 |
8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /demo/asyncawait/manualpromise.lpr: -------------------------------------------------------------------------------- 1 | Program manualpromise; 2 | 3 | uses browserconsole, JS, Web; 4 | 5 | function ResolveAfter2Seconds: TJSPromise; 6 | // returns immediately with a Promise, 7 | // which after 2 seconds gets resolved 8 | begin 9 | Result:=TJSPromise.new(procedure(resolve, reject : TJSPromiseResolver) 10 | begin 11 | window.setTimeout(procedure 12 | begin 13 | resolve('resolved'); 14 | end, 15 | 2000); // wait 2 seconds 16 | end); 17 | end; 18 | 19 | procedure AsyncCall; async; 20 | var s: string; 21 | begin 22 | writeln('calling'); 23 | s := await(string,resolveAfter2Seconds()); 24 | // the await pauses this procedure returning to the caller 25 | // when the Promise from resolveAfter2Seconds gets resolved 26 | // this procedure is continued 27 | writeln(s); // expected output: 'resolved' 28 | end; 29 | 30 | begin 31 | AsyncCall; 32 | // calling AsyncCall returns immediately, while the Promise is waiting 33 | writeln('called'); 34 | end. 35 | -------------------------------------------------------------------------------- /demo/asyncawait/pas2js.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/asyncawait/pas2js.png -------------------------------------------------------------------------------- /demo/asyncawait/tryfetch.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | fetch demo with async/await 4 | 5 | 6 | 7 |
8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /demo/asyncawait/tryfetch.lpr: -------------------------------------------------------------------------------- 1 | program tryfetch; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | browserconsole, JS, Web, SysUtils; 7 | 8 | procedure myFetch; async; 9 | var 10 | response: TJSResponse; 11 | myBlob: TJSBlob; 12 | image: TJSHTMLImageElement; 13 | objectURL: string; 14 | begin 15 | try 16 | response := await(window.fetch('pas2js.png')); 17 | 18 | if not response.ok then 19 | raise Exception.Create('HTTP error! status: '+str(response.status)) 20 | else begin 21 | myBlob := await(response.blob()); 22 | objectURL := TJSURL.createObjectURL(myBlob); 23 | image := TJSHTMLImageElement(document.createElement('img')); 24 | image.src := objectURL; 25 | document.body.appendChild(image); 26 | end; 27 | except 28 | console.log(JSExceptValue); 29 | end; 30 | end; 31 | 32 | begin 33 | myFetch; 34 | end. 35 | -------------------------------------------------------------------------------- /demo/asyncawait/trymany.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | multiple fetch demo with async/await and TJSPromise.All 4 | 5 | 6 | 7 |
8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /demo/atom/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | npm-debug.log 3 | node_modules 4 | -------------------------------------------------------------------------------- /demo/atom/README.md: -------------------------------------------------------------------------------- 1 | # pas2jsdemopackage package 2 | 3 | This package is a small adaptation of a Atom Package example. 4 | 5 | ![After activating](screenshot/atom1.png) 6 | 7 | ![After dismissing](screenshot/atom2.png) 8 | 9 | To install it, compile the program and then make a symlink to this directory from the atom 10 | packages dir: 11 | ```sh 12 | cd ~ 13 | cd .atom/packages 14 | ln -s ~/pas2js/demo/atom pas2jsdemopackage 15 | ``` 16 | Then restart atom and you should have a 'pas2jsdemopackage' item under the 17 | 'packages' menu. 18 | 19 | -------------------------------------------------------------------------------- /demo/atom/keymaps/pas2jsdemopackage.json: -------------------------------------------------------------------------------- 1 | { 2 | "atom-workspace": { 3 | "ctrl-alt-o": "pas2jsdemopackage:toggle" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /demo/atom/lib/packageglue.js: -------------------------------------------------------------------------------- 1 | 'use babel'; 2 | 3 | import { CompositeDisposable } from 'atom'; 4 | import { pas, rtl } from './pas2jsdemopackage.js'; 5 | 6 | export default { 7 | activate(state) { 8 | rtl.run(); 9 | this.subscriptions = new CompositeDisposable(); 10 | this.atomEnv = { 11 | atomGlobal : atom, 12 | subscriptions : this.subscriptions, 13 | initialState : state 14 | } 15 | this.atomHandler = { 16 | onDeactivate : function (a) {}, 17 | onSerialize : function (a,o) {} 18 | } 19 | pas.program.InitAtom(this.atomEnv,this.atomHandler); 20 | }, 21 | 22 | deactivate() { 23 | if (this.atomHandler.onDeactivate) { 24 | this.atomHandler.onDeactivate(this.atomEnv) 25 | } 26 | this.subscriptions.dispose(); 27 | }, 28 | 29 | serialize() { 30 | var obj = {}; 31 | if (this.atomHandler.onSerialize) { 32 | this.atomHandler.onSerialize(this.atomEnv,obj) 33 | } 34 | return obj; 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /demo/atom/menus/pas2jsdemopackage.json: -------------------------------------------------------------------------------- 1 | { 2 | "context-menu": { 3 | "atom-text-editor": [ 4 | { 5 | "label": "Toggle pas2jsdemopackage", 6 | "command": "pas2jsdemopackage:toggle" 7 | } 8 | ] 9 | }, 10 | "menu": [ 11 | { 12 | "label": "Packages", 13 | "submenu": [ 14 | { 15 | "label": "pas2jsdemopackage", 16 | "submenu": [ 17 | { 18 | "label": "Toggle", 19 | "command": "pas2jsdemopackage:toggle" 20 | } 21 | ] 22 | } 23 | ] 24 | } 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /demo/atom/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pas2jsdemopackage", 3 | "main": "./lib/packageglue", 4 | "version": "0.0.0", 5 | "description": "A short description of your package", 6 | "keywords": [ 7 | ], 8 | "activationCommands": { 9 | "atom-workspace": "pas2jsdemopackage:toggle" 10 | }, 11 | "repository": "https://github.com/atom/pas2jsdemopackage", 12 | "license": "MIT", 13 | "engines": { 14 | "atom": ">=1.0.0 <2.0.0" 15 | }, 16 | "dependencies": { 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /demo/atom/screenshot/atom1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/atom/screenshot/atom1.png -------------------------------------------------------------------------------- /demo/atom/screenshot/atom2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/atom/screenshot/atom2.png -------------------------------------------------------------------------------- /demo/atom/styles/pas2jsdemopackage.less: -------------------------------------------------------------------------------- 1 | // The ui-variables file is provided by base themes provided by Atom. 2 | // 3 | // See https://github.com/atom/atom-dark-ui/blob/master/styles/ui-variables.less 4 | // for a full listing of what's available. 5 | @import "ui-variables"; 6 | 7 | .pas2jsdemopackage { 8 | } 9 | -------------------------------------------------------------------------------- /demo/chartjs/demoarea.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | TChartJS example 12 | 17 | 18 | 19 |
20 |

21 | TChartJS Create area charts using Pas2JS & ChartJS (view source) 22 |

23 | 24 |
25 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /demo/chartjs/demobar.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | TChartJS example 12 | 17 | 18 | 19 |
20 |

21 | TChartJS Create bar charts using Pas2JS & ChartJS (view source) 22 |

23 | 24 |
25 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /demo/chartjs/demobar.lpr: -------------------------------------------------------------------------------- 1 | program demobar; 2 | 3 | {$MODE OBJFPC} 4 | {$MODESWITCH EXTERNALCLASS} 5 | 6 | uses 7 | ChartJS; 8 | 9 | var 10 | config: TChartConfiguration; 11 | dataset: TChartBarDataset; 12 | radialLinear: TChartScaleRadialLinear; 13 | begin 14 | config := TChartConfiguration.new; 15 | config.type_ := 'bar'; 16 | config.data := TChartData.new; 17 | config.data.labels := ['January', 'February', 'March', 'April', 'May', 18 | 'June', 'July']; 19 | dataset := TChartBarDataset.new; 20 | dataset.label_ := 'My First Dataset'; 21 | dataset.data := [65,59,80,81,56,55,40]; 22 | dataset.backgroundColors := ['rgba(255, 99, 132, 0.2)', 23 | 'rgba(255, 159, 64, 0.2)', 'rgba(255, 205, 86, 0.2)', 24 | 'rgba(75, 192, 192, 0.2)', 'rgba(54, 162, 235, 0.2)', 25 | 'rgba(153, 102, 255, 0.2)', 'rgba(201, 203, 207, 0.2)']; 26 | dataset.borderColors := ['rgb(255, 99, 132)', 'rgb(255, 159, 64)', 27 | 'rgb(255, 205, 86)', 'rgb(75, 192, 192)', 'rgb(54, 162, 235)', 28 | 'rgb(153, 102, 255)', 'rgb(201, 203, 207)']; 29 | dataset.borderWidth := 1; 30 | config.data.datasets := [dataset]; 31 | 32 | config.options := TChartOptions.new; 33 | config.options.scales := TChartScalesConfiguration.new; 34 | radialLinear := TChartScaleRadialLinear.new; 35 | radialLinear.ticks := TChartScaleRadialLinearTick.new; 36 | radialLinear.ticks.beginAtZero := True; 37 | config.options.scales.yAxes := [radialLinear]; 38 | 39 | TChart.new('myChart', config); 40 | end. 41 | -------------------------------------------------------------------------------- /demo/chartjs/demobubble.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | TChartJS example 12 | 17 | 18 | 19 |
20 |

21 | TChartJS Create bubble charts using Pas2JS & ChartJS (view source) 22 |

23 | 24 |
25 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /demo/chartjs/demobubble.lpr: -------------------------------------------------------------------------------- 1 | program demobubble; 2 | 3 | {$MODE OBJFPC} 4 | {$MODESWITCH EXTERNALCLASS} 5 | 6 | uses 7 | ChartJS; 8 | 9 | var 10 | config: TChartConfiguration; 11 | dataset: TChartBubbleDataset; 12 | begin 13 | config := TChartConfiguration.new; 14 | config.type_ := 'bubble'; 15 | dataset := TChartBubbleDataset.new; 16 | dataset.label_ := 'First Dataset'; 17 | dataset.data := [TChartXYRData.new(20, 30, 15), TChartXYRData.new(40, 10, 10)]; 18 | dataset.backgroundColor := 'rgb(255, 99, 132)'; 19 | config.data := TChartData.new; 20 | config.data.datasets := [dataset]; 21 | TChart.new('myChart', config); 22 | end. 23 | -------------------------------------------------------------------------------- /demo/chartjs/demodatalabelling.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | TChartJS example 12 | 22 | 23 | 24 |
25 |

26 | TChartJS Create data labelling charts using Pas2JS & ChartJS (view source) 27 |

28 |
29 | 30 |

31 | 32 |
33 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /demo/chartjs/demodoughnut.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | TChartJS example 12 | 17 | 18 | 19 |
20 |

21 | TChartJS Create doughnut charts using Pas2JS & ChartJS (view source) 22 |

23 | 24 |
25 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /demo/chartjs/demodoughnut.lpr: -------------------------------------------------------------------------------- 1 | program demodoughnut; 2 | 3 | {$MODE OBJFPC} 4 | {$MODESWITCH EXTERNALCLASS} 5 | 6 | uses 7 | ChartJS; 8 | 9 | var 10 | config: TChartConfiguration; 11 | dataset: TChartDoughnutDataset; 12 | begin 13 | config := TChartConfiguration.new; 14 | config.type_ := 'doughnut'; 15 | config.data := TChartData.new; 16 | config.data.labels := ['Red', 'Blue', 'Yellow']; 17 | dataset := TChartDoughnutDataset.new; 18 | dataset.data := [300, 50, 100]; 19 | dataset.backgroundColor := ['rgb(255, 99, 132)', 'rgb(54, 162, 235)', 20 | 'rgb(255, 205, 86)']; 21 | config.data.datasets := [dataset]; 22 | TChart.new('myChart', config); 23 | end. 24 | -------------------------------------------------------------------------------- /demo/chartjs/demointeractions.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | TChartJS example 12 | 31 | 32 | 33 |
34 |

35 | TChartJS Interaction charts using Pas2JS & ChartJS (view source) 36 |

37 |
38 |
39 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /demo/chartjs/demoline.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | TChartJS example 12 | 17 | 18 | 19 |
20 |

21 | TChartJS Create line charts using Pas2JS & ChartJS (view source) 22 |

23 | 24 |
25 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /demo/chartjs/demoline.lpr: -------------------------------------------------------------------------------- 1 | program demoline; 2 | 3 | {$MODE OBJFPC} 4 | {$MODESWITCH EXTERNALCLASS} 5 | 6 | uses 7 | ChartJS; 8 | 9 | var 10 | config: TChartConfiguration; 11 | dataset: TChartLineDataset; 12 | begin 13 | config := TChartConfiguration.new; 14 | config.type_ := 'line'; 15 | config.data := TChartData.new; 16 | config.data.labels := ['January', 'February', 'March', 'April', 'May', 17 | 'June', 'July']; 18 | dataset := TChartLineDataset.new; 19 | dataset.label_ := 'My First dataset'; 20 | dataset.data := [65, 59, 80, 81, 56, 55, 40]; 21 | dataset.fill := False; 22 | dataset.borderColor := 'rgb(75, 192, 192)'; 23 | dataset.lineTension := 0.1; 24 | config.data.datasets := [dataset]; 25 | TChart.new('myChart', config); 26 | end. 27 | -------------------------------------------------------------------------------- /demo/chartjs/demomixed.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | TChartJS example 12 | 17 | 18 | 19 |
20 |

21 | TChartJS Create mixed charts using Pas2JS & ChartJS (view source) 22 |

23 | 24 |
25 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /demo/chartjs/demomixed.lpr: -------------------------------------------------------------------------------- 1 | program demomixed; 2 | 3 | {$MODE OBJFPC} 4 | {$MODESWITCH EXTERNALCLASS} 5 | 6 | uses 7 | ChartJS; 8 | 9 | var 10 | config: TChartConfiguration; 11 | dataset1: TChartBarDataset; 12 | dataset2: TChartLineDataset; 13 | begin 14 | config := TChartConfiguration.new; 15 | config.type_ := 'bar'; 16 | config.data := TChartData.new; 17 | config.data.labels := ['January', 'February', 'March', 'April']; 18 | 19 | dataset1 := TChartBarDataset.new; 20 | dataset1.label_ := 'Bar Dataset'; 21 | dataset1.data := [10, 20, 30, 40]; 22 | dataset1.borderColor := 'rgb(255, 99, 132)'; 23 | dataset1.backgroundColor := 'rgba(255, 99, 132, 0.2)'; 24 | 25 | dataset2 := TChartLineDataset.new; 26 | dataset2.label_ := 'Line Dataset'; 27 | dataset2.data := [50, 50, 50, 50]; 28 | dataset2.type_ := 'line'; 29 | dataset2.fill := False; 30 | dataset2.borderColor := 'rgb(54, 162, 235)'; 31 | 32 | config.data.datasets := [dataset1, dataset2]; 33 | TChart.new('myChart', config); 34 | end. 35 | -------------------------------------------------------------------------------- /demo/chartjs/demopolararea.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | TChartJS example 12 | 17 | 18 | 19 |
20 |

21 | TChartJS Create polar area charts using Pas2JS & ChartJS (view source) 22 |

23 | 24 |
25 | 28 | 29 | -------------------------------------------------------------------------------- /demo/chartjs/demopolararea.lpr: -------------------------------------------------------------------------------- 1 | program demopolararea; 2 | 3 | {$MODE OBJFPC} 4 | {$MODESWITCH EXTERNALCLASS} 5 | 6 | uses 7 | ChartJS; 8 | 9 | var 10 | config: TChartConfiguration; 11 | dataset: TChartPolarAreaDataset; 12 | begin 13 | config := TChartConfiguration.new; 14 | config.type_ := 'polarArea'; 15 | config.data := TChartData.new; 16 | config.data.labels := ['Red', 'Green', 'Yellow', 'Grey', 'Blue']; 17 | dataset := TChartPolarAreaDataset.new; 18 | dataset.data := [11, 16, 7, 3, 14]; 19 | dataset.backgroundColor := ['rgb(255, 99, 132)', 'rgb(75, 192, 192)', 20 | 'rgb(255, 205, 86)', 'rgb(201, 203, 207)', 'rgb(54, 162, 235)']; 21 | config.data.datasets := [dataset]; 22 | TChart.new('myChart', config); 23 | end. 24 | -------------------------------------------------------------------------------- /demo/chartjs/demoprogressbar.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | TChartJS example 12 | 22 | 23 | 24 |
25 |

26 | TChartJS Create progress bar charts using Pas2JS & ChartJS (view source) 27 |

28 |
29 | 30 | 31 |
32 | 33 |
34 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /demo/chartjs/demoradar.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | TChartJS example 12 | 17 | 18 | 19 |
20 |

21 | TChartJS Create radar charts using Pas2JS & ChartJS (view source) 22 |

23 | 24 |
25 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /demo/chartjs/demoradar.lpr: -------------------------------------------------------------------------------- 1 | program demoradar; 2 | 3 | {$MODE OBJFPC} 4 | {$MODESWITCH EXTERNALCLASS} 5 | 6 | uses 7 | ChartJS; 8 | 9 | var 10 | config: TChartConfiguration; 11 | dataset1, dataset2: TChartRadarDataset; 12 | begin 13 | config := TChartConfiguration.new; 14 | config.type_ := 'radar'; 15 | config.data := TChartData.new; 16 | config.data.labels := ['Eating', 'Drinking', 'Sleeping', 'Designing', 17 | 'Coding', 'Cycling', 'Running']; 18 | 19 | dataset1 := TChartRadarDataset.new; 20 | dataset1.label_ := 'My First Dataset'; 21 | dataset1.data := [65, 59, 90, 81, 56, 55, 40]; 22 | dataset1.fill := True; 23 | dataset1.backgroundColor := 'rgba(255, 99, 132, 0.2)'; 24 | dataset1.borderColor := 'rgb(255, 99, 132)'; 25 | dataset1.pointBackgroundColor := 'rgb(255, 99, 132)'; 26 | dataset1.pointBorderColor := '#fff'; 27 | dataset1.pointHoverBackgroundColor := '#fff'; 28 | dataset1.pointHoverBorderColor := 'rgb(255, 99, 132)'; 29 | 30 | dataset2 := TChartRadarDataset.new; 31 | dataset2.label_ := 'My Second Dataset'; 32 | dataset2.data := [28, 48, 40, 19, 96, 27, 100]; 33 | dataset2.fill := True; 34 | dataset2.backgroundColor := 'rgba(54, 162, 235, 0.2)'; 35 | dataset2.borderColor := 'rgb(54, 162, 235)'; 36 | dataset2.pointBackgroundColor := 'rgb(54, 162, 235)'; 37 | dataset2.pointBorderColor := '#fff'; 38 | dataset2.pointHoverBackgroundColor := '#fff'; 39 | dataset2.pointHoverBorderColor := 'rgb(54, 162, 235)'; 40 | 41 | config.options := TChartOptions.new; 42 | config.options.elements := TChartElementsConfiguration.new; 43 | config.options.elements.line := TChartElementLine.new; 44 | config.options.elements.line.tension := 0; 45 | config.options.elements.line.borderWidth := 3; 46 | 47 | config.data.datasets := [dataset1, dataset2]; 48 | TChart.new('myChart', config); 49 | end. 50 | -------------------------------------------------------------------------------- /demo/chartjs/demoscatter.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | TChartJS example 12 | 17 | 18 | 19 |
20 |

21 | TChartJS Create scatter charts using Pas2JS & ChartJS (view source) 22 |

23 | 24 |
25 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /demo/chartjs/demoscatter.lpr: -------------------------------------------------------------------------------- 1 | program demoscatter; 2 | 3 | {$MODE OBJFPC} 4 | {$MODESWITCH EXTERNALCLASS} 5 | 6 | uses 7 | ChartJS; 8 | 9 | var 10 | config: TChartConfiguration; 11 | dataset: TChartScatterDataset; 12 | begin 13 | config := TChartConfiguration.new; 14 | config.type_ := 'scatter'; 15 | dataset := TChartScatterDataset.new; 16 | dataset.label_ := 'Scatter Dataset'; 17 | dataset.datas := [TChartXYData.new(1, -1.711e-2), 18 | TChartXYData.new(1.26, -2.708e-2), TChartXYData.new(1.58, -4.285e-2), 19 | TChartXYData.new(2.0, -6.772e-2), TChartXYData.new(2.51, -1.068e-1), 20 | TChartXYData.new(3.16, -1.681e-1), TChartXYData.new(3.98, -2.635e-1), 21 | TChartXYData.new(5.01, -4.106e-1), TChartXYData.new(6.31, -6.339e-1), 22 | TChartXYData.new(7.94, -9.659e-1), TChartXYData.new(10.00, -1.445), 23 | TChartXYData.new(12.6, -2.110), TChartXYData.new(15.8, -2.992), 24 | TChartXYData.new(20.0, -4.102), TChartXYData.new(25.1, -5.429), 25 | TChartXYData.new(31.6, -6.944), TChartXYData.new(39.8, -8.607), 26 | TChartXYData.new(50.1, -1.038e1), TChartXYData.new(63.1, -1.223e1), 27 | TChartXYData.new(79.4, -1.413e1), TChartXYData.new(100.00, -1.607e1), 28 | TChartXYData.new(126, -1.803e1), TChartXYData.new(158, -2e1), 29 | TChartXYData.new(200, -2.199e1), TChartXYData.new(251, -2.398e1), 30 | TChartXYData.new(316, -2.597e1), TChartXYData.new(398, -2.797e1), 31 | TChartXYData.new(501, -2.996e1), TChartXYData.new(631, -3.196e1), 32 | TChartXYData.new(794, -3.396e1), TChartXYData.new(1000, -3.596e1)]; 33 | dataset.borderColor := 'rgba(255, 99, 132, 0.5)'; 34 | dataset.backgroundColor := 'rgb(255, 99, 132)'; 35 | config.data := TChartData.new; 36 | config.data.datasets := [dataset]; 37 | TChart.new('myChart', config); 38 | end. 39 | -------------------------------------------------------------------------------- /demo/chartjs/demoscriptablebubble.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | TChartJS example 12 | 20 | 21 | 22 |
23 |

24 | TChartJS Create scriptable bubble charts using Pas2JS & ChartJS (view source) 25 |

26 |
27 |
28 | 29 | 30 | 31 |
32 |
33 |
34 |
35 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /demo/chartjs/demotime.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | TChartJS example 13 | 18 | 19 | 20 |
21 |

22 | TChartJS Create time charts using Pas2JS & ChartJS (view source) 23 |

24 | 25 | 26 | 30 |
31 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /demo/dataabstract/README.txt: -------------------------------------------------------------------------------- 1 | This directory contains 2 examples for use with Data Abstract. 2 | 3 | The sampleda project (and sampleda.html page) connect to the sample Data 4 | Abstract server hosted at Remobjects software. It is read-only. 5 | 6 | The sampledarw project (and sampledarw.html page) is read-write. 7 | It connects to a service located at /proxy/Server/Bin (you must change this if 8 | your service is listening somewhere else). 9 | The server is available in the directory "server", where you will also find a find the SQL needed to create 10 | the table. 11 | 12 | To get it to work: 13 | 14 | - You need a webserver. (simpleserver distributed with FPC works fine) 15 | 16 | - use country.sql to create the table in the database of your choice. 17 | 18 | - Open server in Delphi (you need Data Abstract of course) 19 | 20 | - Set the database connection string in the Modules.Server cmConnection component. 21 | 22 | - Compile server and start server. By default it listens on port 8099. 23 | 24 | - In the sampledarw.lpr, correctly set the URL where the server is 25 | listening on the connection component, see the CreateDataset method: 26 | 27 | FConn:=TDaConnection.Create(Self); 28 | FConn.URL:='/proxy/Server/bin'; 29 | 30 | If you use apache, you can configure it to forward the url to the data abstract application server: 31 | 32 | 33 | ProxyPass "http://127.0.0.1:8099/" 34 | 35 | 36 | if you use simpleserver, create a simpleserver.ini config file: 37 | 38 | [Server] 39 | ; Correct these 40 | Port=6789 41 | Directory=/home/michael/pas2js/demo/dataabstract 42 | 43 | [Proxy] 44 | Server=http://127.0.0.1:8099/ 45 | 46 | in either case, you can leave the URL as is. 47 | 48 | - compile the lazarus project, and visit the sampledarw.html page in the browser. 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /demo/dataabstract/server/DALibrary.RODL: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /demo/dataabstract/server/DAServer.dpr: -------------------------------------------------------------------------------- 1 | program DAServer; 2 | 3 | {$APPTYPE CONSOLE} 4 | {#ROGEN:DALibrary.rodl} // RemObjects: Careful, do not remove! 5 | 6 | uses 7 | uROComInit, 8 | uROServer, 9 | uROBinMessage, 10 | uROIndyHTTPServer, 11 | Modules.Server in 'Modules.Server.pas' {dmServer: TDataModule}, 12 | DataService_Impl in 'DataService_Impl.pas' {DataService: TDataAbstractService}, 13 | Units.Types in '..\Common\Units.Types.pas', 14 | DAServer_Intf in 'DAServer_Intf.pas', 15 | DAServer_Invk in 'DAServer_Invk.pas'; 16 | 17 | {$R *.res} 18 | {$R RODLFile.res} 19 | 20 | begin 21 | {$IFDEF DEBUG} 22 | ReportMemoryLeaksOnShutdown := True; 23 | {$ENDIF} 24 | 25 | Writeln('DA - Command Line Server'); 26 | 27 | dmServer := TdmServer.Create(nil); 28 | try 29 | dmServer.Active := True; 30 | 31 | 32 | 33 | WriteLn('Server is active and listening on port ',dmServer.Port,' press Enter to stop.'); 34 | Readln; 35 | finally 36 | dmServer.Free; 37 | end; 38 | end. 39 | -------------------------------------------------------------------------------- /demo/dataabstract/server/DAServer.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/dataabstract/server/DAServer.res -------------------------------------------------------------------------------- /demo/dataabstract/server/DAServer_Invk.pas: -------------------------------------------------------------------------------- 1 | unit DAServer_Invk; 2 | 3 | // ---------------------------------------------------------------------- 4 | // This file was automatically generated by Remoting SDK from a 5 | // RODL file downloaded from a server or associated with this project. 6 | // 7 | // Do not modify this file manually, or your changes will be lost when 8 | // it is regenerated the next time you update your RODL. 9 | // ---------------------------------------------------------------------- 10 | 11 | {$I RemObjects.inc} 12 | 13 | interface 14 | 15 | uses 16 | {$IFDEF DELPHIXE2UP}System.SysUtils{$ELSE}SysUtils{$ENDIF}, 17 | {$IFDEF DELPHIXE2UP}System.Classes{$ELSE}Classes{$ENDIF}, 18 | uROEncoding, 19 | uROXMLIntf, 20 | uROServer, 21 | uROServerIntf, 22 | uROClasses, 23 | uROTypes, 24 | uROClientIntf, 25 | DataAbstract4_Intf, 26 | DataAbstract4_Invk, 27 | DAServer_Intf; 28 | 29 | type 30 | { Forward declarations } 31 | TDataService_Invoker = class; 32 | 33 | TDataService_Invoker = class(DataAbstract4_invk.TDataAbstractService_Invoker) 34 | public 35 | constructor Create; override; 36 | end; 37 | 38 | implementation 39 | 40 | uses 41 | uROSystem, 42 | uROEventRepository, 43 | uRORes, 44 | uROClient; 45 | 46 | constructor TDataService_Invoker.Create; 47 | begin 48 | inherited Create(); 49 | FAbstract := false; 50 | end; 51 | 52 | initialization 53 | finalization 54 | end. 55 | 56 | -------------------------------------------------------------------------------- /demo/dataabstract/server/Modules.Server.dfm: -------------------------------------------------------------------------------- 1 | object dmServer: TdmServer 2 | OldCreateOrder = False 3 | Height = 296 4 | Width = 352 5 | object svrHTTP: TROIndyHTTPServer 6 | Dispatchers = < 7 | item 8 | Name = 'msgBIN' 9 | Message = msgBIN 10 | Enabled = True 11 | PathInfo = 'Bin' 12 | end> 13 | SendClientAccessPolicyXml = captAllowAll 14 | IndyServer.Bindings = <> 15 | IndyServer.DefaultPort = 8099 16 | Port = 8099 17 | Left = 64 18 | Top = 32 19 | end 20 | object msgBIN: TROBinMessage 21 | Envelopes = <> 22 | Left = 176 23 | Top = 32 24 | end 25 | object cmConnection: TDAConnectionManager 26 | Connections = < 27 | item 28 | Name = 'TestConn' 29 | ConnectionString = 30 | 'FireDAC?AuxDriver=PG;Server=192.168.0.98;Database=fpctest;UserID' + 31 | '=XXX;Password=YYY;' 32 | Description = 'Test database' 33 | ConnectionType = 'PostgreSQL' 34 | Default = True 35 | end> 36 | DriverManager = dmDriver 37 | PoolingEnabled = True 38 | Left = 64 39 | Top = 112 40 | end 41 | object dmDriver: TDADriverManager 42 | DriverDirectory = '%SYSTEM%\' 43 | AutoLoad = True 44 | TraceActive = False 45 | TraceFlags = [] 46 | Left = 64 47 | Top = 176 48 | end 49 | object drvFireDAC: TDAFireDACDriver 50 | Left = 64 51 | Top = 232 52 | end 53 | object smMemory: TROEventSessionManager 54 | Left = 176 55 | Top = 128 56 | end 57 | end 58 | -------------------------------------------------------------------------------- /demo/dataabstract/server/RODLFILE.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/dataabstract/server/RODLFILE.res -------------------------------------------------------------------------------- /demo/dataabstract/server/country.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE country 2 | ( 3 | iso character(2) NOT NULL, 4 | name character varying(80) NOT NULL, 5 | nicename character varying(80) NOT NULL, 6 | iso3 character(3) DEFAULT NULL::bpchar, 7 | numcode smallint, 8 | phonecode smallint NOT NULL, 9 | CONSTRAINT country_pkey PRIMARY KEY (iso) 10 | ): 11 | -------------------------------------------------------------------------------- /demo/dynload/FormFactory.pas: -------------------------------------------------------------------------------- 1 | unit formfactory; 2 | 3 | interface 4 | 5 | uses classes; 6 | 7 | Type 8 | TFormClass = Class of TComponent; 9 | 10 | procedure RegisterForm(aClass: TFormClass); 11 | Function GetFormClassByName(const aName : String) : TFormClass; 12 | 13 | implementation 14 | 15 | uses sysutils, js; 16 | 17 | Type 18 | TFormDef = Record 19 | aClass : TFormClass; 20 | aName : string; 21 | end; 22 | TFormDefArray = Array of TFormDef; 23 | 24 | Var 25 | List : TFormDefArray; 26 | 27 | procedure RegisterForm(aClass: TFormClass); 28 | 29 | Var 30 | Def : TFormDef; 31 | 32 | begin 33 | Def.aClass:=aClass; 34 | Def.aName:=aClass.ClassName; 35 | TJSArray(List).Push(JSValue(Def)); 36 | end; 37 | 38 | Function IndexOfFormClassByName(const aName : String) : Integer; 39 | 40 | begin 41 | Result:=Length(List)-1; 42 | While (Result>=0) and Not SameText(aName,List[Result].aName) do 43 | Dec(Result); 44 | end; 45 | 46 | Function GetFormClassByName(const aName : String) : TFormClass; 47 | 48 | Var 49 | Idx: Integer; 50 | 51 | begin 52 | Idx:=IndexOfFormClassByName(aName); 53 | if Idx=-1 then 54 | Result:=Nil 55 | else 56 | Result:=List[Idx].aClass; 57 | end; 58 | 59 | initialization 60 | SetLength(List,0); 61 | end. 62 | -------------------------------------------------------------------------------- /demo/dynload/MyFormDep.pas: -------------------------------------------------------------------------------- 1 | unit MyFormDep; 2 | 3 | interface 4 | 5 | uses myformdep2; 6 | 7 | Procedure DoLoaded; 8 | 9 | implementation 10 | 11 | Procedure DoLoaded; 12 | 13 | begin 14 | Writeln('loaded'); 15 | end; 16 | 17 | initialization 18 | DoLoaded; 19 | end. 20 | -------------------------------------------------------------------------------- /demo/dynload/myform.pp: -------------------------------------------------------------------------------- 1 | unit myform; 2 | 3 | interface 4 | 5 | uses classes, FormFactory, MyFormDep; 6 | 7 | Type 8 | TMyForm = Class(TComponent) 9 | Public 10 | Constructor Create(aOWner : TComponent); override; 11 | end; 12 | 13 | 14 | implementation 15 | 16 | uses web, myformdep2; 17 | 18 | Constructor TMyForm.Create(aOWner : TComponent); 19 | 20 | 21 | begin 22 | window.alert('TMyForm created!'); 23 | end; 24 | 25 | begin 26 | RegisterForm(TMyForm); 27 | end. 28 | -------------------------------------------------------------------------------- /demo/dynload/myformdep2.pp: -------------------------------------------------------------------------------- 1 | unit myformdep2; 2 | 3 | interface 4 | 5 | Procedure DoLoaded2; 6 | 7 | implementation 8 | 9 | Procedure DoLoaded2; 10 | 11 | begin 12 | Writeln('loaded 2'); 13 | end; 14 | 15 | initialization 16 | DoLoaded2; 17 | end. 18 | -------------------------------------------------------------------------------- /demo/dynload/testloader.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Script & Unit loader test 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /demo/dynload/testloader.lpr: -------------------------------------------------------------------------------- 1 | program testloader; 2 | 3 | uses types, js, web, Rtl.ScriptLoader, Rtl.UnitLoader, FormFactory; 4 | 5 | 6 | Function DoClick (e : TJSMouseEvent) : boolean; 7 | begin 8 | LoadScripts([ 9 | 'http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js', 10 | 'http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js' 11 | ], 12 | procedure (data : TObject) begin 13 | window. alert('All things are loaded'); 14 | end, Nil); 15 | Result:=false; 16 | end; 17 | 18 | Function DoFormClick (e : TJSMouseEvent) : boolean; 19 | 20 | procedure DoLoaded(const aUnitName : array of string; aData : TObject); 21 | 22 | Var 23 | C : TFormClass; 24 | 25 | begin 26 | Writeln('Unit ',aUnitName,' was loaded'); 27 | C:=GetFormClassByName('TMyForm'); 28 | if C<>Nil then 29 | C.Create(Nil) 30 | else 31 | begin 32 | Writeln('TMyForm not found'); 33 | window.alert('TMyForm not found'); 34 | end; 35 | end; 36 | 37 | begin 38 | TUnitLoader.Instance.LoadUnit('myform',@DoLoaded); 39 | Result:=False; 40 | end; 41 | 42 | begin 43 | TJSHTMLElement(document.getElementbyID('loader')).onclick:=@DoClick; 44 | TJSHTMLElement(document.getElementbyID('formloader')).onclick:=@DoFormClick; 45 | end. 46 | -------------------------------------------------------------------------------- /demo/errorhandler/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | TestException 7 | 8 | 9 | 10 | 11 | 12 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /demo/extend_jsclass/ExtendJSFunctionClass1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Demo - descend Pascal class from JS function 7 | 20 | 21 | 22 | 23 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /demo/fcldb/demodb.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | JSON Dataset demo 4 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /demo/fcldb/demoload.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | JSON Dataset demo 4 | 5 | 6 | 7 | 8 | 9 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /demo/fcldb/demorest.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | JSON Dataset demo 4 | 5 | 6 | 7 | 8 | 9 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /demo/fpcunit/browsertest.cfg: -------------------------------------------------------------------------------- 1 | -Jirtl.js 2 | -Jc 3 | -------------------------------------------------------------------------------- /demo/fpcunit/browsertest.html: -------------------------------------------------------------------------------- 1 | 2 | FPCUnit Test demo 3 | 4 | 5 | 6 | 7 |
8 |
9 | 12 | 13 | -------------------------------------------------------------------------------- /demo/fpcunit/browsertest.lpr: -------------------------------------------------------------------------------- 1 | program browsertest; 2 | 3 | uses 4 | SysUtils, BrowserTestRunner, demotests, frmrunform; 5 | 6 | Var 7 | Application : TTestRunner; 8 | 9 | begin 10 | Application:=TTestRunner.Create(Nil); 11 | Application.RunFormClass:=TTestRunForm; 12 | Application.Initialize; 13 | Application.Run; 14 | Application.Free; 15 | end. 16 | 17 | -------------------------------------------------------------------------------- /demo/fpcunit/demotests.pp: -------------------------------------------------------------------------------- 1 | unit demotests; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | interface 6 | 7 | uses 8 | Classes, SysUtils, fpcunit, testregistry; 9 | 10 | Type 11 | 12 | { TMyTestCase } 13 | 14 | TMyTestCase = Class(TTestCase) 15 | Published 16 | Procedure TestWillFail; 17 | Procedure TestMustFail; 18 | Procedure TestWillError; 19 | Procedure TestWillWork; 20 | Procedure TestWillWorkToo; 21 | Procedure TestWillDefinitelyWork; 22 | Procedure TestWeLLIgnoreThisOne; 23 | end; 24 | 25 | implementation 26 | 27 | { TMyTestCase } 28 | 29 | procedure TMyTestCase.TestWillFail; 30 | begin 31 | Fail('Aarrggghhhhh this test failed'); 32 | end; 33 | 34 | procedure TMyTestCase.TestMustFail; 35 | begin 36 | Fail('Uh-oh, this test failed too...'); 37 | end; 38 | 39 | procedure TMyTestCase.TestWillError; 40 | begin 41 | Raise Exception.Create('A random error'); 42 | end; 43 | 44 | procedure TMyTestCase.TestWillWork; 45 | begin 46 | end; 47 | 48 | procedure TMyTestCase.TestWillWorkToo; 49 | begin 50 | 51 | end; 52 | 53 | procedure TMyTestCase.TestWillDefinitelyWork; 54 | begin 55 | 56 | end; 57 | 58 | procedure TMyTestCase.TestWeLLIgnoreThisOne; 59 | begin 60 | Ignore('Not today, thank you!') 61 | end; 62 | 63 | initialization 64 | RegisterTest('DemoSuite',TMyTestCase); 65 | end. 66 | 67 | -------------------------------------------------------------------------------- /demo/fpreport/reportdemo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Pas2JS and FPReport demo 4 | 5 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /demo/fpreport/reportdemo.lpr: -------------------------------------------------------------------------------- 1 | program reportdemo; 2 | 3 | uses SysUtils, frmmain; 4 | 5 | begin 6 | TMainForm.Create(Nil); 7 | end. 8 | 9 | -------------------------------------------------------------------------------- /demo/fullcalendar/index.html: -------------------------------------------------------------------------------- 1 | 2 | Choose fullcalendar version 3 | 4 |

You must choose the FullCalendar version you wish to see:

5 | Version 4

6 | Version 5

7 | 8 | -------------------------------------------------------------------------------- /demo/hotreload/hotreload.cfg: -------------------------------------------------------------------------------- 1 | -Jirtl.js 2 | -Jc 3 | -------------------------------------------------------------------------------- /demo/hotreload/hotreload.html: -------------------------------------------------------------------------------- 1 | 2 | Pas2JS HotReloadD web demo 3 | 4 | 5 | 6 | 9 | -------------------------------------------------------------------------------- /demo/hotreload/status.json: -------------------------------------------------------------------------------- 1 | { "ping" : true } -------------------------------------------------------------------------------- /demo/jquery/demoadd.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | add demo 6 | 22 | 23 | 24 | 25 | 26 | 27 |

28 |
29 |
30 |
31 |
32 |
33 | 34 |

Added this... (notice no border)

35 | 36 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /demo/jquery/demoadd.pas: -------------------------------------------------------------------------------- 1 | uses libjquery; 2 | 3 | begin 4 | JQuery('div').css('border','2px solid red').add('p').css('background','yellow'); 5 | end. -------------------------------------------------------------------------------- /demo/jquery/demoaddclass.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | addClass demo 6 | 18 | 19 | 20 | 21 | 22 | 23 |

Hello

24 |

and

25 |

Goodbye

26 | 27 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /demo/jquery/demoaddclass.pas: -------------------------------------------------------------------------------- 1 | uses libjquery; 2 | 3 | begin 4 | jQuery('p:last').addClass('selected highlight'); 5 | end. -------------------------------------------------------------------------------- /demo/jquery/demoaddclass2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | addClass demo 6 | 17 | 18 | 19 | 20 | 21 | 22 |
This div should be white
23 |
This div will be green because it now has the "green" and "red" classes. 24 | It would be red if the addClass function failed.
25 |
This div should be white
26 |

There are zero green divs

27 | 28 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /demo/jquery/demoaddclass2.pas: -------------------------------------------------------------------------------- 1 | uses libjquery; 2 | 3 | function greenonred(index : Integer; currentclass:string) : string; 4 | 5 | begin 6 | result:=''; 7 | if (currentClass='red') then 8 | begin 9 | result:='green'; 10 | jQuery('p').text('There is one green div'); 11 | end; 12 | end; 13 | 14 | begin 15 | jQuery('div').addClass(@greenonred); 16 | end. -------------------------------------------------------------------------------- /demo/kurento/css/kurento.css: -------------------------------------------------------------------------------- 1 | /* 2 | * (C) Copyright 2014-2015 Kurento (http://kurento.org/) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | @CHARSET "UTF-8"; 18 | 19 | html { 20 | position: relative; 21 | min-height: 100%; 22 | } 23 | 24 | body { 25 | padding-top: 40px; 26 | body 27 | } 28 | 29 | video,#console { 30 | display: block; 31 | font-size: 14px; 32 | line-height: 1.42857143; 33 | color: #555; 34 | background-color: #fff; 35 | background-image: none; 36 | border: 1px solid #ccc; 37 | border-radius: 4px; 38 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); 39 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); 40 | -webkit-transition: border-color ease-in-out .15s, box-shadow 41 | ease-in-out .15s; 42 | transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; 43 | } 44 | 45 | #console { 46 | min-height: 120px; 47 | max-height: 360px; 48 | } 49 | 50 | .col-md-2 { 51 | width: 80px; 52 | padding-top: 190px; 53 | } 54 | -------------------------------------------------------------------------------- /demo/kurento/img/kurento.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/kurento/img/kurento.png -------------------------------------------------------------------------------- /demo/kurento/img/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/kurento/img/spinner.gif -------------------------------------------------------------------------------- /demo/kurento/img/webrtc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/kurento/img/webrtc.png -------------------------------------------------------------------------------- /demo/modules/basic-units/canvas.pp: -------------------------------------------------------------------------------- 1 | {$mode objfpc} 2 | {$modeswitch externalclass} 3 | // filename export object alias 4 | {$linklib ./modules/canvas.js canvas} 5 | 6 | unit canvas; 7 | 8 | interface 9 | 10 | uses js, web; 11 | 12 | type 13 | TCreateCanvasResult = class external name 'Object' (TJSObject) 14 | ctx: TJSCanvasRenderingContext2D; 15 | id : string; 16 | end; 17 | 18 | TCanvasAPI = class external name 'Object' (TJSObject) 19 | function create (aID : String; AParent : TJSElement; aWidth,aHeight : Integer) : TCreateCanvasResult; 20 | function createReportList(aWrapperID : String) : String; 21 | end; 22 | 23 | Var 24 | CanvasAPI : TCanvasAPI; external name 'canvas'; 25 | 26 | implementation 27 | 28 | end. -------------------------------------------------------------------------------- /demo/modules/basic-units/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Basic JavaScript module example 6 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /demo/modules/basic-units/main.pp: -------------------------------------------------------------------------------- 1 | {$mode objfpc} 2 | {$modeswitch externalclass} 3 | uses js, web, canvas, square; 4 | 5 | Var 6 | MyCanvas : TCreateCanvasResult; 7 | MyReportList : string; 8 | MySquare2,MySquare1 : TDrawResult; 9 | 10 | begin 11 | MyCanvas:=CanvasAPI.create('myCanvas', document.body, 480, 320); 12 | MyreportList:=CanvasAPI.createReportList(myCanvas.id); 13 | MySquare1:=SquareAPI.draw(myCanvas.ctx, 50, 50, 100, 'blue'); 14 | SquareAPI.reportArea(MySquare1.length, MyReportList); 15 | SQuareAPI.reportPerimeter(MySquare1.length,MyReportList); 16 | MySquare2:=SquareAPI.randomSquare(myCanvas.ctx); 17 | end. -------------------------------------------------------------------------------- /demo/modules/basic-units/square.pp: -------------------------------------------------------------------------------- 1 | {$mode objfpc} 2 | {$modeswitch externalclass} 3 | // filename export object alias 4 | {$linklib ./modules/square.js square} 5 | 6 | unit square; 7 | 8 | interface 9 | 10 | uses js, web; 11 | 12 | Type 13 | TDrawResult = class external name 'Object' (TJSObject) 14 | length,x,y : Integer; 15 | color : string; 16 | end; 17 | 18 | TSquareAPI = class external name 'Object' (TJSObject) 19 | name : string; 20 | // Default export 21 | function randomsquare(aCtx : TJSCanvasRenderingContext2D) : TDrawResult; external name 'default'; 22 | function draw(aCtx : TJSCanvasRenderingContext2D; alength,x,y : Integer; color : string) : TDrawResult; 23 | procedure reportArea(length : Integer; ListID : String); 24 | procedure reportPerimeter(length : Integer; ListID : String); 25 | end; 26 | 27 | var 28 | SquareAPI : TSquareAPI; external name 'square'; 29 | 30 | implementation 31 | 32 | end. -------------------------------------------------------------------------------- /demo/modules/basic/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Basic JavaScript module example 6 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /demo/modules/basic/main.pp: -------------------------------------------------------------------------------- 1 | // filename export object alias 2 | {$linklib ./modules/canvas.js canvas} 3 | {$linklib ./modules/square.js square} 4 | {$mode objfpc} 5 | {$modeswitch externalclass} 6 | uses js, web; 7 | 8 | type 9 | TCreateCanvasResult = class external name 'Object' (TJSObject) 10 | ctx: TJSCanvasRenderingContext2D; 11 | id : string; 12 | end; 13 | 14 | TCanvasAPI = class external name 'Object' (TJSObject) 15 | function create (aID : String; AParent : TJSElement; aWidth,aHeight : Integer) : TCreateCanvasResult; 16 | function createReportList(aWrapperID : String) : String; 17 | end; 18 | 19 | TDrawResult = class external name 'Object' (TJSObject) 20 | length,x,y : Integer; 21 | color : string; 22 | end; 23 | 24 | TSquareAPI = class external name 'Object' (TJSObject) 25 | name : string; 26 | // Default export 27 | function randomsquare(aCtx : TJSCanvasRenderingContext2D) : TDrawResult; external name 'default'; 28 | function draw(aCtx : TJSCanvasRenderingContext2D; alength,x,y : Integer; color : string) : TDrawResult; 29 | procedure reportArea(length : Integer; ListID : String); 30 | procedure reportPerimeter(length : Integer; ListID : String); 31 | end; 32 | 33 | var 34 | CanvasAPI : TCanvasAPI; external name 'canvas'; 35 | SquareAPI : TSquareAPI; external name 'square'; 36 | 37 | Var 38 | MyCanvas : TCreateCanvasResult; 39 | MyReportList : string; 40 | MySquare2,MySquare1 : TDrawResult; 41 | 42 | begin 43 | MyCanvas:=CanvasAPI.create('myCanvas', document.body, 480, 320); 44 | MyreportList:=CanvasAPI.createReportList(myCanvas.id); 45 | MySquare1:=SquareAPI.draw(myCanvas.ctx, 50, 50, 100, 'blue'); 46 | SquareAPI.reportArea(MySquare1.length, MyReportList); 47 | SQuareAPI.reportPerimeter(MySquare1.length,MyReportList); 48 | MySquare2:=SquareAPI.randomSquare(myCanvas.ctx); 49 | end. -------------------------------------------------------------------------------- /demo/modules/flat-units/canvas.pp: -------------------------------------------------------------------------------- 1 | {$linklib ./modules/canvas.js canvas} 2 | {$mode objfpc} 3 | {$modeswitch externalclass} 4 | unit canvas; 5 | 6 | interface 7 | 8 | uses js, web; 9 | 10 | Type 11 | 12 | TCreateCanvasResult = class external name 'Object' (TJSObject) 13 | ctx: TJSCanvasRenderingContext2D; 14 | id : string; 15 | end; 16 | 17 | function create (aID : String; AParent : TJSElement; aWidth,aHeight : Integer) : TCreateCanvasResult; external name 'canvas.create'; 18 | function createReportList(aWrapperID : String) : String; external name 'canvas.createReportList'; 19 | 20 | implementation 21 | 22 | end. 23 | -------------------------------------------------------------------------------- /demo/modules/flat-units/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Basic Pas2JS JavaScript module example - flat API 6 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /demo/modules/flat-units/main.pp: -------------------------------------------------------------------------------- 1 | // filename export object alias 2 | uses web,canvas, square; 3 | 4 | Var 5 | MyCanvas : TCreateCanvasResult; 6 | MyReportList : string; 7 | MySquare2,MySquare1 : TDrawResult; 8 | 9 | begin 10 | MyCanvas:=create('myCanvas', document.body, 480, 320); 11 | MyreportList:=createReportList(myCanvas.id); 12 | MySquare1:=draw(myCanvas.ctx, 50, 50, 100, 'blue'); 13 | reportArea(MySquare1.length, MyReportList); 14 | reportPerimeter(MySquare1.length,MyReportList); 15 | MySquare2:=randomSquare(myCanvas.ctx); 16 | end. -------------------------------------------------------------------------------- /demo/modules/flat-units/square.pp: -------------------------------------------------------------------------------- 1 | {$linklib ./modules/square.js square} 2 | {$mode objfpc} 3 | {$modeswitch externalclass} 4 | unit square; 5 | 6 | interface 7 | 8 | uses js, web; 9 | 10 | Type 11 | TDrawResult = class external name 'Object' (TJSObject) 12 | length,x,y : Integer; 13 | color : string; 14 | end; 15 | 16 | // Square API 17 | 18 | var 19 | name : string; external name 'square.name'; 20 | 21 | function randomsquare(aCtx : TJSCanvasRenderingContext2D) : TDrawResult; external name 'square.default'; 22 | function draw(aCtx : TJSCanvasRenderingContext2D; alength,x,y : Integer; color : string) : TDrawResult; external name 'square.draw'; 23 | procedure reportArea(length : Integer; ListID : String); external name 'square.reportArea'; 24 | procedure reportPerimeter(length : Integer; ListID : String); external name 'square.reportPerimeter'; 25 | 26 | implementation 27 | 28 | end. 29 | -------------------------------------------------------------------------------- /demo/modules/flat/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Basic Pas2JS JavaScript module example - flat API 6 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /demo/modules/flat/main.pp: -------------------------------------------------------------------------------- 1 | // filename export object alias 2 | {$linklib ./modules/canvas.js canvas} 3 | {$linklib ./modules/square.js square} 4 | {$mode objfpc} 5 | {$modeswitch externalclass} 6 | uses js, web; 7 | 8 | // canvas API 9 | 10 | type 11 | TCreateCanvasResult = class external name 'Object' (TJSObject) 12 | ctx: TJSCanvasRenderingContext2D; 13 | id : string; 14 | end; 15 | 16 | function create (aID : String; AParent : TJSElement; aWidth,aHeight : Integer) : TCreateCanvasResult; external name 'canvas.create'; 17 | function createReportList(aWrapperID : String) : String; external name 'canvas.createReportList'; 18 | 19 | Type 20 | TDrawResult = class external name 'Object' (TJSObject) 21 | length,x,y : Integer; 22 | color : string; 23 | end; 24 | 25 | // Square API 26 | 27 | var 28 | name : string; external name 'square.name'; 29 | 30 | function randomsquare(aCtx : TJSCanvasRenderingContext2D) : TDrawResult; external name 'square.default'; 31 | function draw(aCtx : TJSCanvasRenderingContext2D; alength,x,y : Integer; color : string) : TDrawResult; external name 'square.draw'; 32 | procedure reportArea(length : Integer; ListID : String); external name 'square.reportArea'; 33 | procedure reportPerimeter(length : Integer; ListID : String); external name 'square.reportPerimeter'; 34 | 35 | Var 36 | MyCanvas : TCreateCanvasResult; 37 | MyReportList : string; 38 | MySquare2,MySquare1 : TDrawResult; 39 | 40 | begin 41 | MyCanvas:=create('myCanvas', document.body, 480, 320); 42 | MyreportList:=createReportList(myCanvas.id); 43 | MySquare1:=draw(myCanvas.ctx, 50, 50, 100, 'blue'); 44 | reportArea(MySquare1.length, MyReportList); 45 | reportPerimeter(MySquare1.length,MyReportList); 46 | MySquare2:=randomSquare(myCanvas.ctx); 47 | end. -------------------------------------------------------------------------------- /demo/nodehttpserver/nodehttpdemo.lpr: -------------------------------------------------------------------------------- 1 | program nodehttpdemo; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | nodejsapp, JS, Classes, SysUtils, nodeJS, node.http, node.net; 7 | 8 | type 9 | 10 | { TMyApplication } 11 | 12 | TMyApplication = class(TNodeJSApplication) 13 | procedure doRun; override; 14 | private 15 | procedure doRequest(req: TNJSHTTPIncomingMessage; resp: TNJSHTTPServerResponse); 16 | end; 17 | 18 | procedure TMyApplication.doRequest(req : TNJSHTTPIncomingMessage; resp : TNJSHTTPServerResponse); 19 | 20 | Var 21 | S : string; 22 | h : JSValue; 23 | begin 24 | resp.write('Hello World!'+sLineBreak); 25 | resp.write('You asked for: '+req.URL+sLineBreak); 26 | resp.write('You sent the following headers: '+sLineBreak); 27 | for s in TJSObject.getOwnPropertyNames(req.headers) do 28 | begin 29 | H:=req.headers[S]; 30 | if jsTypeOf(H)='string' then 31 | resp.Write('Header "'+S+'": '+String(H)+sLineBreak); 32 | end; 33 | resp.end_(); //end the response 34 | end; 35 | 36 | procedure TMyApplication.doRun; 37 | 38 | begin 39 | http.createServer(@DoRequest).listen(7770); 40 | end; 41 | 42 | var 43 | Application : TMyApplication; 44 | 45 | begin 46 | Application:=TMyApplication.Create(nil); 47 | Application.Initialize; 48 | Application.Run; 49 | Application.Free; 50 | end. 51 | -------------------------------------------------------------------------------- /demo/opentok/css/app.css: -------------------------------------------------------------------------------- 1 | /* Enter your classes/style definitions here */ 2 | body, html { 3 | background-color: #eee; 4 | /* height: 100%; */ 5 | max-width: 1000px; 6 | margin: auto; 7 | } 8 | 9 | #videos { 10 | position: relative; 11 | width: 100%; 12 | height: 100%; 13 | margin-left: auto; 14 | margin-right: auto; 15 | } 16 | 17 | .subscriber { 18 | position: absolute; 19 | left: 0; 20 | top: 0; 21 | width: 100%; 22 | height: 100%; 23 | z-index: 10; 24 | } 25 | 26 | .publisher { 27 | position: absolute; 28 | width: 360px; 29 | height: 240px; 30 | bottom: 10px; 31 | left: 10px; 32 | z-index: 100; 33 | border: 3px solid white; 34 | border-radius: 3px; 35 | } 36 | -------------------------------------------------------------------------------- /demo/pacman/audio/die.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/pacman/audio/die.mp3 -------------------------------------------------------------------------------- /demo/pacman/audio/eatghost.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/pacman/audio/eatghost.mp3 -------------------------------------------------------------------------------- /demo/pacman/audio/eating.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/pacman/audio/eating.mp3 -------------------------------------------------------------------------------- /demo/pacman/audio/start.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/pacman/audio/start.mp3 -------------------------------------------------------------------------------- /demo/pacman/cherry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/pacman/cherry.png -------------------------------------------------------------------------------- /demo/pacman/ghost-scared.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/pacman/ghost-scared.png -------------------------------------------------------------------------------- /demo/pacman/ghost1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/pacman/ghost1.png -------------------------------------------------------------------------------- /demo/pacman/ghost2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/pacman/ghost2.png -------------------------------------------------------------------------------- /demo/pacman/ghost3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/pacman/ghost3.png -------------------------------------------------------------------------------- /demo/pacman/ghost4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/pacman/ghost4.png -------------------------------------------------------------------------------- /demo/pacman/pacman.lpr: -------------------------------------------------------------------------------- 1 | program pacman; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | browserapp, JS, Classes, SysUtils, Web, upacman; 7 | 8 | type 9 | TMyApplication = class(TBrowserApplication) 10 | FPacMan : TPacMan; 11 | procedure doRun; override; 12 | end; 13 | 14 | procedure TMyApplication.doRun; 15 | 16 | begin 17 | FPacMan:=TPacMan.Create(Self); 18 | FPacMan.Start; 19 | // Your code here 20 | Terminate; 21 | end; 22 | 23 | var 24 | Application : TMyApplication; 25 | 26 | begin 27 | Application:=TMyApplication.Create(nil); 28 | Application.Initialize; 29 | Application.Run; 30 | // Application.Free; 31 | end. 32 | -------------------------------------------------------------------------------- /demo/player/headset.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/player/headset.jpeg -------------------------------------------------------------------------------- /demo/player/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Media player demo 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 |
14 |
15 |
PLAYING x OF y
16 |
17 |
Track Name
18 |
Track Artist
19 |
20 | 21 |
22 |
23 | 24 |
25 |
26 | 27 |
28 |
29 | 30 |
31 |
32 | 33 |
34 |
00:00
35 | 37 |
00:00
38 |
39 | 40 |
41 | 42 | 44 | 45 |
46 |
47 |
48 | Program sources   Royalty-free music from Bensound 50 | 53 | 54 | -------------------------------------------------------------------------------- /demo/promise/askmom.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Ask mom 6 | 7 | 8 | 9 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /demo/promise/askmom.pas: -------------------------------------------------------------------------------- 1 | program askmom; 2 | 3 | {$mode objfpc} 4 | { 5 | Translated from 6 | https://scotch.io/tutorials/javascript-promises-for-dummies 7 | } 8 | uses 9 | browserconsole, JS, Web; 10 | 11 | var 12 | isMomHappy : Boolean = False; 13 | 14 | Procedure LetsAskMom; 15 | 16 | procedure MomDecides (resolve, reject : TJSPromiseResolver); 17 | 18 | begin 19 | if IsMomHappy then 20 | Resolve(New(['brand','Samsung','Color','Black'])) 21 | else 22 | Reject(TJSError.New('Mom is not happy')); 23 | end; 24 | 25 | Function Disappointed(aValue : JSValue): JSValue; 26 | 27 | begin 28 | Writeln('No present because: ',aValue); 29 | end; 30 | 31 | Function Showpresent(aValue : JSValue): JSValue; 32 | 33 | begin 34 | Writeln('Received : ',aValue); 35 | end; 36 | 37 | Var 38 | willIGetNewPhone : TJSPromise; 39 | 40 | begin 41 | TJSPromise.New(@MomDecides). 42 | _Then(@ShowPresent). 43 | Catch(@Disappointed); 44 | end; 45 | 46 | begin 47 | Writeln('Did something bad, making mom unhappy'); 48 | isMomHappy:=False; 49 | LetsAskMom(); 50 | Writeln('Made up with mom, making her happy again'); 51 | isMomHappy:=True; 52 | LetsAskMom(); 53 | end. 54 | -------------------------------------------------------------------------------- /demo/promise/chapter-1.json: -------------------------------------------------------------------------------- 1 | { 2 | "chapter": 1, 3 | "html": "

Chapter 1 text: Cras sollicitudin orci ac velit adipiscing, ut faucibus urna auctor. Pellentesque in sem nec sem molestie malesuada. Sed aliquam mi sit amet sollicitudin luctus. Aenean quis tempus sem, in viverra metus. Maecenas sed urna bibendum, cursus lectus sed, ultricies risus.

" 4 | } -------------------------------------------------------------------------------- /demo/promise/chapter-2.json: -------------------------------------------------------------------------------- 1 | { 2 | "chapter": 2, 3 | "html": "

Chapter 2 text: Curabitur laoreet cursus lectus, id tempus massa volutpat a. Vivamus placerat diam risus, ut rutrum neque consectetur ac. Sed ullamcorper porttitor diam, sit amet sollicitudin velit fermentum in. Praesent aliquet dui ac lorem molestie, non luctus lacus porta. Nullam risus justo, aliquam sit amet neque at, fringilla pharetra mi. Curabitur tincidunt dictum magna, vitae faucibus urna vehicula sit amet. Donec ornare malesuada nisi. Pellentesque tincidunt ultrices quam, ac laoreet risus convallis in. Ut consequat justo dolor, ac venenatis mi aliquam nec. Ut quis accumsan est, non pulvinar orci. Ut hendrerit nunc et laoreet rutrum. Nulla et libero fringilla, sodales risus in, euismod libero.

" 4 | } -------------------------------------------------------------------------------- /demo/promise/chapter-3.json: -------------------------------------------------------------------------------- 1 | { 2 | "chapter": 3, 3 | "html": "

Chapter 3 text: Duis ac lobortis mi. Vestibulum non augue pellentesque, convallis diam vitae, sollicitudin nulla. Aenean et pharetra erat, lobortis tincidunt tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum gravida ligula justo, vitae ullamcorper metus scelerisque non. Vestibulum commodo vel metus eget vestibulum. Phasellus porttitor, nunc nec rutrum vulputate, quam lorem dapibus urna, vel accumsan purus mauris id urna. Morbi vitae rutrum nisl, sit amet cursus est. Donec ipsum dui, aliquam non metus at, ultrices accumsan odio. Morbi pretium eros eu lorem commodo pulvinar.

Donec quis elementum orci. Aenean viverra, nisl eget tempus sodales, velit elit pretium dui, eu ultrices tellus lectus rhoncus orci. Praesent arcu sem, lacinia sit amet tempus ultrices, malesuada eu odio. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin tincidunt dictum posuere. Ut pretium lacinia tortor sit amet consequat. Phasellus ac velit pharetra, fringilla mi ut, porta neque. Donec non urna dolor. Sed sem erat, mattis non risus et, lobortis fringilla dui.

" 4 | } -------------------------------------------------------------------------------- /demo/promise/chapter-4.json: -------------------------------------------------------------------------------- 1 | { 2 | "chapter": 4, 3 | "html": "

Chapter 4 text: Maecenas nec ipsum viverra erat tincidunt convallis. Morbi nec varius lectus. Vivamus vestibulum massa vitae sapien vestibulum, eu pretium felis consectetur. Nulla sagittis sem sapien. Integer quis imperdiet ipsum, a luctus sem. Duis aliquet feugiat mauris, sed posuere diam aliquam eu. Phasellus vel turpis ac nunc blandit blandit. Sed hendrerit risus nec odio egestas gravida. Vestibulum eget purus vel nulla gravida vulputate eu auctor turpis. Integer laoreet cursus consectetur. Integer laoreet sapien a urna sollicitudin blandit. Curabitur commodo quam ut erat suscipit, ac elementum quam adipiscing. Fusce id venenatis dui. Sed vel diam vel est ullamcorper lacinia. Curabitur sollicitudin diam pharetra tincidunt scelerisque.

" 4 | } -------------------------------------------------------------------------------- /demo/promise/chapter-5.json: -------------------------------------------------------------------------------- 1 | { 2 | "chapter": 5, 3 | "html": "

Chapter 5 text: Vivamus dignissim enim vel dolor commodo, in vehicula est facilisis. Aliquam ac ipsum sem. Sed justo risus, tincidunt ac lectus nec, molestie elementum urna. Aenean quis velit nec sapien dignissim tincidunt. Aenean venenatis faucibus ultricies. Maecenas eu libero molestie, luctus diam ac, molestie urna. Aliquam erat volutpat. Cras eu augue vitae massa lobortis euismod id nec lacus. Cras gravida bibendum turpis at varius.

" 4 | } -------------------------------------------------------------------------------- /demo/promise/demoall.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | TJSPromise.All() demo 6 | 7 | 8 | 9 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /demo/promise/promise_demos.lpg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /demo/promise/readme.md: -------------------------------------------------------------------------------- 1 | 2 | This directory contains several examples of Javascript Promise support 3 | 4 | The askmom example is a basic example, translated from: 5 | 6 | https://scotch.io/tutorials/javascript-promises-for-dummies 7 | 8 | The demoall example contains some sample code found on the MDN website: 9 | https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all 10 | 11 | The "story" examples are translated from the examples found on: 12 | https://developers.google.com/web/fundamentals/primers/promises 13 | 14 | To run these samples, first compile them using lazarus. 15 | For the story samples, it is best to start a simple webserver in this directory: 16 | 17 | ``` 18 | simpleserver 19 | ``` 20 | 21 | then point your browser at 22 | http://localhost:3000/story.html 23 | http://localhost:3000/story2.html 24 | http://localhost:3000/story3.html 25 | 26 | The other examples can of course also be showed in this manner: 27 | http://localhost:3000/demoall.html 28 | http://localhost:3000/askmom.html 29 | 30 | It is best to open the developer console for these examples, since some of the logging happens with console.log() 31 | -------------------------------------------------------------------------------- /demo/promise/story.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Story using promises 6 | 7 | 8 | 9 | 10 |
11 | 12 |
13 |
14 | 15 | 16 | 17 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /demo/promise/story.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "

A story about something

", 3 | "chapterUrls": [ 4 | "chapter-1.json", 5 | "chapter-2.json", 6 | "chapter-3.json", 7 | "chapter-4.json", 8 | "chapter-5.json" 9 | ] 10 | } -------------------------------------------------------------------------------- /demo/promise/story.lpr: -------------------------------------------------------------------------------- 1 | program story; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | JS, Web, utils; 7 | 8 | Function ShowAllDone(aValue : JSValue) : JSValue; 9 | 10 | begin 11 | addTextToPage('All done'); 12 | end; 13 | 14 | Function ShowError(aValue : JSValue) : JSValue; 15 | 16 | begin 17 | addTextToPage('Broken: '+TJSError(aValue).Message); 18 | end; 19 | 20 | Function HideSpinner(aValue : JSValue) : JSValue; 21 | 22 | begin 23 | TJSHTMLElement(document.querySelector('.spinner')).style.SetProperty('display','none'); 24 | end; 25 | 26 | Function ShowStory(aJSON : JSValue) : JSValue; 27 | 28 | function ShowChapters(Chain, currentChapter: JSValue; currentIndex: NativeInt; 29 | anArray: TJSArray): JSValue; 30 | 31 | Function FetchNext(aValue : JSValue) : JSValue; 32 | 33 | begin 34 | Result:=getJson(String(currentChapter)); 35 | end; 36 | 37 | Function AddToPage(aChapter : JSValue) : JSValue; 38 | 39 | Var 40 | o : TJSObject; 41 | 42 | 43 | begin 44 | o:=TJSObject(aChapter); 45 | addHtmlToPage(String(o['html'])); 46 | end; 47 | 48 | begin 49 | Result:=TJSPromise(chain). 50 | _then(@FetchNext). 51 | _then(@AddToPage); 52 | end; 53 | 54 | 55 | Var 56 | Story : TJSObject; 57 | 58 | begin 59 | Story:=TJSObject(aJSON); 60 | addHtmlToPage(String(story['heading'])); 61 | Result:=TJSArray(story['chapterUrls']).reduce(@ShowChapters,TJSPromise.resolve(null)); 62 | end; 63 | 64 | begin 65 | initSlowNetWork; 66 | getJson('story.json'). 67 | _then(@ShowStory). 68 | _then(@ShowAllDone). 69 | catch(@ShowError). 70 | _then(@HideSpinner); 71 | end. 72 | 73 | -------------------------------------------------------------------------------- /demo/promise/story2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Story using promises, version 2 6 | 7 | 8 | 9 | 10 |
11 | 12 |
13 |
14 | 15 | 16 | 17 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /demo/promise/story2.lpr: -------------------------------------------------------------------------------- 1 | program story2; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | JS, Web, utils; 7 | 8 | Function ShowAllDone(aValue : JSValue) : JSValue; 9 | 10 | begin 11 | addTextToPage('All done'); 12 | end; 13 | 14 | Function ShowError(aValue : JSValue) : JSValue; 15 | 16 | begin 17 | addTextToPage('Broken: '+TJSError(aValue).Message); 18 | end; 19 | 20 | Function HideSpinner(aValue : JSValue) : JSValue; 21 | 22 | begin 23 | TJSHTMLElement(document.querySelector('.spinner')).style.SetProperty('display','none'); 24 | end; 25 | 26 | Function ShowChapters(Chapters: JSValue) : JSValue; 27 | 28 | function ShowChapter (element : JSValue; index: NativeInt; anArray : TJSArray) : Boolean; 29 | 30 | begin 31 | addHtmlToPage(String(TJSObject(element)['html'])); 32 | end; 33 | 34 | begin 35 | TJSArray(Chapters).foreach(@ShowChapter); 36 | end; 37 | 38 | function GetChapters(aValue : JSValue): JSValue; 39 | 40 | function GetChapter(url : JSValue; index: NativeInt; anArray : TJSArray) : JSValue; 41 | 42 | begin 43 | Result:=GetJSON(String(url)); 44 | end; 45 | 46 | Var 47 | Story : TJSObject; 48 | 49 | begin 50 | Story:=TJSObject(aValue); 51 | addHtmlToPage(String(story['heading'])); 52 | Result:=TJSPromise.All(TJSArray(story['chapterUrls']).map(@GetChapter)); 53 | end; 54 | 55 | begin 56 | initSlowNetWork; 57 | getJson('story.json'). 58 | _then(@GetChapters). 59 | _then(@ShowChapters). 60 | _then(@ShowAllDone). 61 | catch(@ShowError). 62 | _then(@HideSpinner); 63 | end. 64 | 65 | -------------------------------------------------------------------------------- /demo/promise/story3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Story using promises, version 3 6 | 7 | 8 | 9 | 10 |
11 | 12 |
13 |
14 | 15 | 16 | 17 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /demo/promise/story3.lpr: -------------------------------------------------------------------------------- 1 | program story3; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | JS, Web, utils; 7 | 8 | Function ShowAllDone(aValue : JSValue) : JSValue; 9 | 10 | begin 11 | addTextToPage('All done'); 12 | end; 13 | 14 | Function ShowError(aValue : JSValue) : JSValue; 15 | 16 | begin 17 | addTextToPage('Broken: '+TJSError(aValue).Message); 18 | end; 19 | 20 | Function HideSpinner(aValue : JSValue) : JSValue; 21 | 22 | begin 23 | TJSHTMLElement(document.querySelector('.spinner')).style.SetProperty('display','none'); 24 | end; 25 | 26 | 27 | function GetChapters(aValue : JSValue): JSValue; 28 | 29 | function GetChapter(url : JSValue; index: NativeInt; anArray : TJSArray) : JSValue; 30 | 31 | begin 32 | Result:=GetJSON(String(url)); 33 | end; 34 | 35 | function ChainRequests(chain, chapterPromise: JSValue; currentIndex: NativeInt; anArray: TJSArray): JSValue; 36 | 37 | Function ReturnChapter(aValue : JSValue) : JSValue; 38 | 39 | begin 40 | Result:=chapterPromise; 41 | end; 42 | 43 | Function AddToPage(aValue : JSValue) : JSValue; 44 | 45 | begin 46 | addHTMLToPage(String(TJSObject(aValue)['html'])); 47 | end; 48 | 49 | begin 50 | result:=TJSPromise(Chain). 51 | _then(@ReturnChapter). 52 | _then(@AddToPage); 53 | end; 54 | 55 | 56 | Var 57 | Story : TJSObject; 58 | 59 | begin 60 | Story:=TJSObject(aValue); 61 | addHtmlToPage(String(story['heading'])); 62 | Result:=TJSArray(story['chapterUrls']).map(@GetChapter).reduce(@ChainRequests,TJSPromise.Resolve); 63 | end; 64 | 65 | begin 66 | initSlowNetWork; 67 | getJson('story.json'). 68 | _then(@GetChapters). 69 | _then(@ShowAllDone). 70 | catch(@ShowError). 71 | _then(@HideSpinner); 72 | end. 73 | 74 | -------------------------------------------------------------------------------- /demo/promise/styles.css: -------------------------------------------------------------------------------- 1 | @-webkit-keyframes spin { 2 | to { 3 | stroke-dashoffset: -264; 4 | } 5 | } 6 | 7 | @keyframes spin { 8 | to { 9 | stroke-dashoffset: -264; 10 | } 11 | } 12 | 13 | .spinner circle { 14 | fill: none; 15 | stroke: slategray; 16 | stroke-width: 16; 17 | stroke-linecap: round; 18 | stroke-dasharray: 0, 0, 70, 194; 19 | stroke-dashoffset: 0; 20 | animation: spin 1s infinite linear; 21 | -webkit-animation: spin 1s infinite linear; 22 | } 23 | 24 | html { 25 | font-family: sans-serif; 26 | line-height: 1.5; 27 | font-size: 14px; 28 | } 29 | h1 { 30 | font-family: Cambria, Georgia, serif; 31 | font-size: 2em; 32 | line-height: 1.3em; 33 | margin: 0 0 0.5em; 34 | } 35 | .network-fake { 36 | display: none; 37 | margin-bottom: 1em; 38 | } 39 | input { 40 | vertical-align: middle; 41 | } -------------------------------------------------------------------------------- /demo/pushjs/helloworld.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | PushJS - Hello world! 7 | 8 | 9 | 39 | 40 | 41 | 42 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /demo/pushjs/helloworld.lpr: -------------------------------------------------------------------------------- 1 | program helloworld; 2 | 3 | {$MODE OBJFPC} 4 | 5 | uses 6 | JS, 7 | Web, 8 | PushJS; 9 | 10 | procedure optionClick; 11 | begin 12 | window.focus; 13 | TJSWindow(JSThis).close; 14 | end; 15 | 16 | procedure buttonClick; 17 | var 18 | option: TPushOptions; 19 | begin 20 | option := TPushOptions.new; 21 | option.body := 'How''s it hangin'; 22 | option.icon := '/icon.png'; 23 | option.timeout := 4000; 24 | option.onClick := @optionClick; 25 | TPush.create('Hello world!', option); 26 | end; 27 | 28 | begin 29 | document.querySelector('.button').addEventListener('click', @buttonClick); 30 | end. 31 | -------------------------------------------------------------------------------- /demo/resources/consoledemo.lpr: -------------------------------------------------------------------------------- 1 | program consoledemo; 2 | 3 | {$mode objfpc} 4 | 5 | {$R help.txt} 6 | 7 | uses 8 | types, p2jsres, nodejs; 9 | 10 | 11 | Var 12 | RL : TStringDynArray; 13 | S : String; 14 | aInfo : TResourceInfo; 15 | 16 | 17 | begin 18 | Writeln('Javascript source:'); 19 | SetResourceSource(rsJS); 20 | RL:=GetResourceNames; 21 | For S in RL do 22 | begin 23 | Writeln('--- Found resource ',S,' : '); 24 | if not GetResourceInfo(S,aInfo) then 25 | Writeln('No extra information for resource ',S,' available') 26 | else 27 | begin 28 | Writeln('Name: ',aInfo.Name); 29 | Writeln('Format: ',aInfo.Format); 30 | Writeln('encoding: ',aInfo.Encoding); 31 | Writeln('unit: ',aInfo.resourceunit); 32 | Writeln('data length: ',Length(aInfo.data)); 33 | end; 34 | end; 35 | if not GetResourceInfo('help',aInfo) then 36 | Writeln('resource help not found !') 37 | else 38 | begin 39 | Writeln('Usage:'); 40 | Writeln(TNJSBuffer.from(ainfo.Data,'base64').toString); 41 | end; 42 | end. 43 | -------------------------------------------------------------------------------- /demo/resources/css/stylejs.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css?family=Nunito+Sans&display=swap'); 2 | * { 3 | margin: 0; 4 | padding: 0; 5 | box-sizing: border-box; 6 | } 7 | body { 8 | font-family: 'Nunito Sans', sans-serif; 9 | margin: auto; 10 | max-width: 900px; 11 | padding: 0.5em 2em; 12 | border: 1px dotted grey; 13 | border-radius: 10px; 14 | } 15 | div { 16 | font-size: 0.8em; 17 | } 18 | a { 19 | color: blue; 20 | text-decoration: none; 21 | } 22 | button { 23 | display: inline-block; 24 | background: #333; 25 | color: #fff; 26 | padding: 0.4rem 1.6rem; 27 | margin-top: 1rem; 28 | cursor: pointer; 29 | } 30 | button:hover { 31 | opacity: 0.8; 32 | } 33 | h1 { 34 | margin: 0.5em 0; 35 | } 36 | 37 | -------------------------------------------------------------------------------- /demo/resources/css/stylelink.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css?family=Nunito+Sans&display=swap'); 2 | * { 3 | margin: 0; 4 | padding: 0; 5 | box-sizing: border-box; 6 | } 7 | body { 8 | font-family: 'Nunito Sans', sans-serif; 9 | margin: auto; 10 | max-width: 600px; 11 | padding: 2em; 12 | border: 1px dotted grey; 13 | border-radius: 10px; 14 | } 15 | a { 16 | color: blue; 17 | text-decoration: none; 18 | } 19 | a:hover { 20 | color: coral; 21 | } 22 | div { 23 | font-size: 0.8em; 24 | } 25 | img { 26 | max-width: 100%; 27 | margin: 3em; 28 | } 29 | 30 | -------------------------------------------------------------------------------- /demo/resources/down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/resources/down.png -------------------------------------------------------------------------------- /demo/resources/help.txt: -------------------------------------------------------------------------------- 1 | This demo is compiler with the help text embedded. 2 | 3 | NodeJS applications do not have an associated HTML page so -JRjs is the best 4 | option to use till another mechanism appears. 5 | -------------------------------------------------------------------------------- /demo/resources/htmldemo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Javascript resource demo 6 | 7 | 8 | 9 | 10 |

Javascript resource demo

11 |
12 | 15 | 16 |

Press button to insert HTML below from resource data

17 |
18 |

19 |

20 |

21 | Created using   pas2js.   Sources:   22 | Program. 23 |
24 |

25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /demo/resources/htmldemo.lpr: -------------------------------------------------------------------------------- 1 | program htmldemo; 2 | 3 | {$mode objfpc} 4 | 5 | {$R testres.html} 6 | 7 | uses 8 | browserconsole, JS, Classes, SysUtils, types, p2jsres, unita, unitb, web; 9 | 10 | 11 | 12 | function DoOnClick(aEvent: TJSMouseEvent): boolean; 13 | var 14 | el : TJSHTMLElement; 15 | aInfo : TResourceInfo; 16 | begin 17 | Result:=False; 18 | el:=TJSHTMLElement(document.getelementByid('playarea')); 19 | if not GetResourceInfo('testres',aInfo) then 20 | el.innerhtml:='resource testres not found !' 21 | else 22 | el.innerhtml:=window.atob(ainfo.Data); 23 | el:=TJSHTMLElement(document.getelementByid('headertext')); 24 | el.innertext:='Below HTML was inserted from resource data'; 25 | end; 26 | 27 | Var 28 | RL : TStringDynArray; 29 | aInfo : TResourceInfo; 30 | el : TJSHTMLElement; 31 | S : String; 32 | begin 33 | Writeln('Javascript embedded resources:'); 34 | SetResourceSource(rsJS); 35 | RL:=GetResourceNames; 36 | For S in RL do 37 | begin 38 | Writeln('--- Found resource name: ',S,' : '); 39 | if not GetResourceInfo(S,aInfo) then 40 | Writeln('No extra information for resource ',S,' available !') 41 | else 42 | begin 43 | Writeln('Name: ',aInfo.Name); 44 | Writeln('Format: ',aInfo.Format); 45 | Writeln('encoding: ',aInfo.Encoding); 46 | Writeln('unit: ',aInfo.resourceunit); 47 | Writeln('data length: ',Length(aInfo.data)); 48 | end; 49 | end; 50 | el:=TJSHTMLButtonElement(document.getelementByid('doinsert')); 51 | el.onclick:=@DoOnClick; 52 | end. 53 | -------------------------------------------------------------------------------- /demo/resources/htmllinkdemo.lpr: -------------------------------------------------------------------------------- 1 | program htmllinkdemo; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | JS, Classes, SysUtils, Web, p2jsres; 7 | 8 | {$R left.png} 9 | {$R right.png} 10 | {$R up.png} 11 | {$R down.png} 12 | 13 | Const 14 | MaxImages = 4; 15 | ImageResources : Array[1..MaxImages] of string = ('up','right','down','left'); 16 | 17 | Var 18 | Img : TJSHTMLImageElement; 19 | CurrentImage: Integer = 1; 20 | 21 | Procedure ShowCurrentImage; 22 | 23 | Var 24 | aInfo : TResourceInfo; 25 | 26 | begin 27 | if not GetResourceInfo(ImageResources[CurrentImage],aInfo) then 28 | Writeln('No info for image ',ImageResources[CurrentImage]) 29 | else 30 | Img.Src:='data:'+aInfo.format+';base64,'+aInfo.Data; 31 | end; 32 | 33 | function RotateImage(aEvent: TJSMouseEvent): boolean; 34 | begin 35 | Inc(CurrentImage); 36 | if CurrentImage>MaxImages then 37 | CurrentImage:=1; 38 | ShowCurrentImage; 39 | end; 40 | 41 | begin 42 | SetResourceSource(rsHTML); 43 | Img:=TJSHTMLImageElement(Document.GetElementByID('theimage')); 44 | Img.OnClick:=@RotateImage; 45 | ShowCurrentImage; 46 | end. 47 | -------------------------------------------------------------------------------- /demo/resources/htmlloadlinkdemo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Project1 7 | 8 | 9 | 10 | 11 |

Dynamically loaded HTML Preload link resources

12 |

13 | This demo demonstrates how to load resources and then load images from these resources.
14 | Click the below image to round-robin between the available images. 15 |

16 |
17 | The image 18 |
19 | 22 |
23 | Created using   pas2js.   Sources:   24 | Program. 25 |
26 |
27 | Scroll Up icon by Icons8
28 | Go Back icon by Icons8
29 | Circled Right icon by Icons8
30 | Scroll Down icon by Icons8
31 |
32 | 33 | 34 | -------------------------------------------------------------------------------- /demo/resources/htmlloadlinkdemo.lpr: -------------------------------------------------------------------------------- 1 | program htmlloadlinkdemo; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | Classes, Web, p2jsres; 7 | 8 | {$R left.png} 9 | {$R right.png} 10 | {$R up.png} 11 | {$R down.png} 12 | 13 | Const 14 | MaxImages = 4; 15 | ImageResources : Array[1..MaxImages] of string = ('up','right','down','left'); 16 | 17 | Var 18 | Img : TJSHTMLImageElement; 19 | CurrentImage: Integer = 1; 20 | 21 | Procedure ShowCurrentImage; 22 | 23 | Var 24 | aInfo : TResourceInfo; 25 | 26 | begin 27 | if not GetResourceInfo(ImageResources[CurrentImage],aInfo) then 28 | Writeln('No info for image ',ImageResources[CurrentImage]) 29 | else 30 | Img.Src:='data:'+aInfo.format+';base64,'+aInfo.Data; 31 | end; 32 | 33 | function RotateImage(aEvent: TJSMouseEvent): boolean; 34 | begin 35 | Result:=False; 36 | Inc(CurrentImage); 37 | if CurrentImage>MaxImages then 38 | CurrentImage:=1; 39 | ShowCurrentImage; 40 | end; 41 | 42 | procedure OnLoaded(const LoadedResources: array of String); 43 | 44 | Var 45 | S : String; 46 | 47 | begin 48 | // Some info 49 | for S in LoadedResources do 50 | Writeln('Found resource: ',S); 51 | Img.OnClick:=@RotateImage; 52 | ShowCurrentImage; 53 | end; 54 | 55 | procedure OnLoadFailed(const aError: string); 56 | begin 57 | window.alert('Failed to load resources : '+AError) 58 | end; 59 | 60 | begin 61 | SetResourceSource(rsHTML); 62 | Img:=TJSHTMLImageElement(Document.GetElementByID('theimage')); 63 | LoadHTMLLinkResources('htmlloadlinkdemo-res.html',@OnLoaded,@OnLoadFailed); 64 | end. 65 | -------------------------------------------------------------------------------- /demo/resources/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/resources/left.png -------------------------------------------------------------------------------- /demo/resources/resourcedemos.lpg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /demo/resources/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/resources/right.png -------------------------------------------------------------------------------- /demo/resources/testa.html: -------------------------------------------------------------------------------- 1 |

Hello Resource World Part A

2 |

3 | This message is saved in a resource file (Part A). 4 |

5 | 6 | -------------------------------------------------------------------------------- /demo/resources/testb.html: -------------------------------------------------------------------------------- 1 |

Hello Resource World Part B

2 |

3 | This message is saved in a resource file (Part B). 4 |

5 | 6 | -------------------------------------------------------------------------------- /demo/resources/testres.html: -------------------------------------------------------------------------------- 1 |

Test resource in HTML

2 | This is a main program file resource in HTML. 3 | -------------------------------------------------------------------------------- /demo/resources/unita.pp: -------------------------------------------------------------------------------- 1 | unit unita; 2 | 3 | interface 4 | 5 | Procedure Testa; 6 | 7 | implementation 8 | 9 | {$R testa.html} 10 | 11 | Procedure Testa; 12 | 13 | begin 14 | end; 15 | 16 | end. -------------------------------------------------------------------------------- /demo/resources/unitb.pp: -------------------------------------------------------------------------------- 1 | unit unitb; 2 | 3 | interface 4 | 5 | Procedure Testa; 6 | 7 | implementation 8 | 9 | {$R TestB.html} 10 | 11 | Procedure Testa; 12 | 13 | begin 14 | end; 15 | 16 | end. -------------------------------------------------------------------------------- /demo/resources/up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/resources/up.png -------------------------------------------------------------------------------- /demo/restbridge/simple/README.txt: -------------------------------------------------------------------------------- 1 | 2 | In order to run this demo, you must run one of the SQLDB REST bridge demos 3 | as a server: 4 | 5 | fpc/packages/fcl-web/example/restbridge 6 | lazarus/components/fpweb/demo/restbridge/ 7 | lazarus/components/fpweb/demo/restmodule/ 8 | 9 | You need to know how it is configured (The port, base URL) 10 | 11 | The servers are by default set up so the client requires authentication, 12 | so unless that was disabled, you need to know what user the demo is using to authenticate requests ! 13 | -------------------------------------------------------------------------------- /demo/router/README.md: -------------------------------------------------------------------------------- 1 | ### 2 Simple demos for the webrouter unit 2 | 3 | The 2 demos do the same, the difference is in how they achieve the same result: 4 | 5 | demorouter is the simplest. It registers 5 static routes, one for each form. 6 | 7 | demorouter2 is more advanced. It registers 1 route with a parameter. 8 | 9 | 10 | ### Compiling for running in the browser: 11 | 12 | ``` 13 | pas2js -browser -Jc -Jirtl.js demorouter.pas 14 | pas2js -browser -Jc -Jirtl.js demorouter2.pas 15 | ``` 16 | 17 | When using lazarus, you can also open the respective .lpi files, 18 | and compile your project. 19 | 20 | ### Choosing a history model: 21 | The router supports 3 models 22 | - Abstract (only for testing purposes) 23 | - Hash: the history is created by adding the route in the #hash part of te URL 24 | - HTML5: the history is created by using the window.history.pushState() API of the browser. 25 | Most modern browsers support this, but it requires server-side support to work safely. 26 | 27 | When in doubt, use the hash mechanism : 28 | ``` 29 | Router.InitHistory(hkHash) 30 | ``` 31 | 32 | ### Server support. 33 | If the history mechanism has set the url to e.g. http://localhost:3000/Form3 34 | and the user returns back to this URL, the server needs to know it should serve the demorouter.html file; 35 | it needs to be configured that it serves the 'main page' of the project 36 | if it encounters an URL that it doesn't know. 37 | 38 | You can start a small node server that does this: 39 | 40 | for demorouter.html: 41 | ``` 42 | nodejs histsrv.js 43 | ``` 44 | 45 | for demorouter2.html: 46 | ``` 47 | nodejs histsrv2.js 48 | ``` 49 | -------------------------------------------------------------------------------- /demo/router/demorouter.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Router demo 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /demo/router/demorouter.pas: -------------------------------------------------------------------------------- 1 | program demorouter; 2 | {$mode objfpc} 3 | {$H+} 4 | 5 | uses web, classes, js, sysutils, webrouter, frmdemo; 6 | 7 | Procedure ShowForm (URl : String; aRoute : TRoute; Params: TStrings); 8 | 9 | Var 10 | s : string; 11 | 12 | begin 13 | document.body.innerHTML:=''; 14 | S:=aRoute.URLPattern; 15 | if (Copy(S,Length(S),1)='/') then 16 | S:=Copy(S,1,Length(S)-1); 17 | Delete(S,1,4); 18 | TDemoForm.Create(StrToIntDef(S,1)); 19 | end; 20 | 21 | begin 22 | // Leave this if you want to use the hash history. 23 | // This will work in all cases. 24 | Router.InitHistory(hkHash); 25 | // Uncomment this if you want to use the HTML5 pushstate history mechanism. 26 | // Note that you must server the files from a webserver then. 27 | // See also the histsrv.js node server which will "correctly" serve all files. 28 | // Router.InitHistory(hkHTML5,'http://localhost:3000/'); 29 | Router.RegisterRoute('form1',@ShowForm,True); 30 | Router.RegisterRoute('form2',@ShowForm,False); 31 | Router.RegisterRoute('form3',@ShowForm,False); 32 | Router.RegisterRoute('form4',@ShowForm,False); 33 | Router.RegisterRoute('form5',@ShowForm,False); 34 | Router.Push('form1'); 35 | end. 36 | 37 | -------------------------------------------------------------------------------- /demo/router/demorouter2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Router 2 demo : route parameters 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /demo/router/demorouter2.pas: -------------------------------------------------------------------------------- 1 | program demorouter2; 2 | 3 | {$mode objfpc} 4 | {$H+} 5 | 6 | uses web, classes, js, sysutils, webrouter, frmdemo; 7 | 8 | Procedure ShowForm (URl : String; aRoute : TRoute; Params: TStrings); 9 | 10 | Var 11 | s : string; 12 | 13 | begin 14 | S:=Params.Values['ID']; 15 | document.body.innerHTML:=''; 16 | TDemoForm.Create(StrToIntDef(S,1),True); 17 | end; 18 | 19 | begin 20 | // Leave this if you want to use the #hash history mechanism. 21 | // This will work in all cases. 22 | Router.InitHistory(hkHash); 23 | // Uncomment this if you want to use HTML5 history. 24 | // Router.InitHistory(hkHTML5,'http://localhost:3000/'); 25 | Router.RegisterRoute('form/:ID',@ShowForm,True); 26 | Router.Push('form/1'); 27 | end. 28 | 29 | -------------------------------------------------------------------------------- /demo/router/histsrv.js: -------------------------------------------------------------------------------- 1 | const http = require('http') 2 | const fs = require('fs') 3 | const httpPort = 3000 4 | 5 | http.createServer((req, res) => { 6 | // console.log(req); 7 | console.log('Serving file.','.'+req.url); 8 | var fn = fs.existsSync('.'+req.url) ? '.'+req.url : "demorouter.html"; 9 | console.log('Actually Serving file.',fn); 10 | fs.readFile(fn, 'utf-8', (err, content) => { 11 | if (err) { 12 | console.log('We cannot open "'+fn+'" file.') 13 | } 14 | 15 | res.writeHead(200, { 16 | 'Content-Type': 'text/html; charset=utf-8' 17 | }) 18 | 19 | res.end(content) 20 | }) 21 | }).listen(httpPort, () => { 22 | console.log('Server listening on: http://localhost:%s', httpPort) 23 | }) -------------------------------------------------------------------------------- /demo/router/histsrv2.js: -------------------------------------------------------------------------------- 1 | const http = require('http') 2 | const fs = require('fs') 3 | const httpPort = 3000 4 | 5 | http.createServer((req, res) => { 6 | // console.log(req); 7 | console.log('Serving file.','.'+req.url); 8 | var fn = fs.existsSync('.'+req.url) ? '.'+req.url : "demorouter2.html"; 9 | console.log('Actually Serving file.',fn); 10 | fs.readFile(fn, 'utf-8', (err, content) => { 11 | if (err) { 12 | console.log('We cannot open "'+fn+'" file.') 13 | } 14 | 15 | res.writeHead(200, { 16 | 'Content-Type': 'text/html; charset=utf-8' 17 | }) 18 | 19 | res.end(content) 20 | }) 21 | }).listen(httpPort, () => { 22 | console.log('Server listening on: http://localhost:%s', httpPort) 23 | }) -------------------------------------------------------------------------------- /demo/rtl/README.md: -------------------------------------------------------------------------------- 1 | ### Simple demos for the RTL units 2 | 3 | ### Compiling for running in node.js: 4 | 5 | ``` 6 | pas2js -Tnodejs -Jirtl.js demojsstring.pas 7 | pas2js -Tnodejs -Jirtl.js demojsregexp.pas 8 | pas2js -Tnodejs -Jirtl.js democollection.pas 9 | pas2js -Tnodejs -Jirtl.js democomponents.lpr 10 | pas2js -Tnodejs -Jirtl.js demostringlist.pas 11 | pas2js -Tnodejs -Jirtl.js demo_njsprocess.pas 12 | ``` 13 | 14 | ### Compiling for running in a browser: 15 | ``` 16 | pas2js -Jc -Jirtl.js demodombuttonevent.pas 17 | pas2js -Jc -Jirtl.js demodocument1.pas 18 | pas2js -Jc -Jirtl.js democollection.pas 19 | pas2js -Jc -Jirtl.js democomponents.lpr 20 | pas2js -Jc -Jirtl.js demoajax.pas 21 | pas2js -Jc -Jirtl.js democanvas2d.pas 22 | pas2js -Jc -Jirtl.js demonew.pas 23 | pas2js -Jc -Jirtl.js democlasstopas.pas 24 | pas2js -Jc -Jirtl.js demodocument1.pas 25 | pas2js -Jc -Jirtl.js demouncaughtexception.pas 26 | pas2js -Jc -Jirtl.js demoxhr.lpr 27 | pas2js -Jc -Jirtl.js dembrowserconsole.lpr 28 | ``` 29 | When using lazarus, you can also open the respective .lpi files, 30 | and compile your project. 31 | Make sure pas2js is in your path, or the IDE will not find it. 32 | 33 | ### Run in node.js 34 | 35 | To run the code, you need to run 36 | ``` 37 | nodejs demojsstring.js 38 | nodejs demojsregexp.js 39 | ``` 40 | etc. 41 | 42 | ### Run/Show in a browser. 43 | Some of the projects can be run straight from file. 44 | Just open the file in the explorer using your favourite browser. 45 | 46 | The ajax demo needs to be run from a webserver, just as the demoxhr demo. 47 | 48 | One way to do so, is to compile the simpleserver example program from 49 | the fcl-web examples, and run it in this directory. 50 | Then point your browser to 51 | ```http://localhost:3000/ajaxdemo.html```. 52 | -------------------------------------------------------------------------------- /demo/rtl/ajax.pas: -------------------------------------------------------------------------------- 1 | unit ajax; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | interface 6 | 7 | uses 8 | Classes, Web; 9 | 10 | type 11 | 12 | { TAjax } 13 | 14 | TAjax = class 15 | private 16 | FOnLoad: TJSEventHandler; 17 | FXmlHttpRequest: TJSXMLHttpRequest; 18 | procedure SetOnLoad(AValue: TJSEventHandler); 19 | public 20 | constructor Create; 21 | destructor Destroy; override; 22 | procedure Open(AMethod, AUrl: string); 23 | property OnLoad: TJSEventHandler write SetOnLoad; 24 | end; 25 | 26 | implementation 27 | 28 | { TAjax } 29 | 30 | procedure TAjax.SetOnLoad(AValue: TJSEventHandler); 31 | begin 32 | FXmlHttpRequest.addEventListener('load', AValue); 33 | end; 34 | 35 | constructor TAjax.Create; 36 | begin 37 | FXmlHttpRequest := TJSXMLHttpRequest.new; 38 | end; 39 | 40 | destructor TAjax.Destroy; 41 | begin 42 | // FXmlHttpRequest.Free; 43 | end; 44 | 45 | procedure TAjax.Open(AMethod, AUrl: string); 46 | begin 47 | FXmlHttpRequest.open(AMethod, AUrl, true); 48 | FXmlHttpRequest.send; 49 | end; 50 | 51 | end. 52 | 53 | -------------------------------------------------------------------------------- /demo/rtl/bytes.txt: -------------------------------------------------------------------------------- 1 | Demo file for loading from stream. 2 | Or from stringlist. 3 | -------------------------------------------------------------------------------- /demo/rtl/demo_njsprocess.pas: -------------------------------------------------------------------------------- 1 | program demo_njsprocess; 2 | 3 | uses 4 | SysUtils, JS, NodeJS; 5 | 6 | //procedure List(s: jsvalue); assembler; 7 | //asm 8 | // for (var key in s) if (s.hasOwnProperty(key)) console.log('prop="'+key+'"'); 9 | //end; 10 | 11 | var 12 | i: Integer; 13 | begin 14 | //List(TNJSProcess); 15 | writeln('argv: ',TNJSProcess.argv); 16 | for i:=0 to length(TNJSProcess.argv)-1 do 17 | writeln(i,'/',length(TNJSProcess.argv),' ',TNJSProcess.argv[i]); 18 | writeln('arch=',TNJSProcess.arch); 19 | writeln('config=',TNJSProcess.config); 20 | writeln('cwd=',TNJSProcess.cwd); 21 | writeln('env=',TNJSProcess.env); 22 | writeln('execArgv=',TNJSProcess.execArgv); 23 | writeln('execPath=',TNJSProcess.execPath); 24 | writeln('getegid=',TNJSProcess.getegid); 25 | writeln('geteuid=',TNJSProcess.geteuid); 26 | writeln('getgid=',TNJSProcess.getgid); 27 | writeln('getgroups=',TNJSProcess.getgroups); 28 | writeln('getuid=',TNJSProcess.getuid); 29 | writeln('memoryUsage=',TNJSProcess.memoryUsage); 30 | writeln('pid=',TNJSProcess.pid); 31 | writeln('platform=',TNJSProcess.platform); 32 | writeln('release=',TNJSProcess.release); 33 | writeln('title=',TNJSProcess.title); 34 | writeln('umask=',TNJSProcess.umask); 35 | writeln('uptime=',TNJSProcess.uptime); 36 | writeln('version=',TNJSProcess.version); 37 | writeln('versions=',TNJSProcess.versions); 38 | end. 39 | 40 | -------------------------------------------------------------------------------- /demo/rtl/demoajax.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /demo/rtl/demoajax.lpr: -------------------------------------------------------------------------------- 1 | program demoajax; 2 | 3 | uses SysUtils, Web, ajax; 4 | 5 | Type 6 | 7 | { TForm } 8 | 9 | TForm = Class 10 | function onLoad(Event: TEventListenerEvent): boolean; 11 | Constructor Create; 12 | end; 13 | 14 | 15 | function TForm.onLoad(Event: TEventListenerEvent): boolean; 16 | var 17 | lPanel: TJSElement; 18 | lStatus: longint; 19 | begin 20 | lStatus := TJSXMLHttpRequest(event.target).Status; 21 | lPanel := document.createElement('div'); 22 | if(lStatus = 404) then 23 | lPanel['style'] := 'width: 100px; height: 100px; border: 4px solid red;' 24 | else 25 | lPanel['style'] := 'width: 100px; height: 100px; border: 4px solid green;'; 26 | document.body.appendChild(lPanel); 27 | console.log(TJSXMLHttpRequest(event.target).Status); 28 | Result := True; 29 | end; 30 | 31 | constructor TForm.Create; 32 | 33 | var 34 | lAjax: TAjax; 35 | 36 | begin 37 | lAjax := TAjax.Create; 38 | lAjax.OnLoad := @onLoad; 39 | lAjax.Open('GET','demoajax2.html'); 40 | end; 41 | 42 | begin 43 | TForm.Create; 44 | end. 45 | 46 | -------------------------------------------------------------------------------- /demo/rtl/demobrowserconsole.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Browser console output emulation demo 4 | 5 | 6 | 7 | 8 |
9 |
10 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /demo/rtl/demobrowserconsole.lpr: -------------------------------------------------------------------------------- 1 | program demobrowserconsole; 2 | 3 | uses browserconsole; 4 | 5 | 6 | Var 7 | I : Integer; 8 | 9 | begin 10 | For I:=30 downto 1 do 11 | Writeln(I,', Hello, world!'); 12 | ConsoleStyle:=DefaultCrtConsoleStyle; 13 | InitConsole; 14 | For I:=1 to 30 do 15 | Writeln(I,', Hello, world ?'); 16 | end. 17 | -------------------------------------------------------------------------------- /demo/rtl/democanvas2d.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Pas2JS web demo 6 | 7 | 8 | 9 | 10 | 11 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /demo/rtl/democollection.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Collection demo 4 | 5 | 6 | 7 |
8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /demo/rtl/democomponents.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Stringlist demo 4 | 5 | 6 | 7 |
8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /demo/rtl/democomponents.lpr: -------------------------------------------------------------------------------- 1 | program democomponents; 2 | 3 | uses browserconsole, Classes; 4 | 5 | Type 6 | TMyGeneration = (first,second,third); 7 | 8 | { TMyParentComponent } 9 | 10 | TMyParentComponent = Class(TComponent) 11 | private 12 | FMyProperty: TMyGeneration; 13 | Published 14 | Property MyProperty : TMyGeneration Read FMyProperty Write FMyProperty; 15 | end; 16 | 17 | { TMyChildComponent } 18 | 19 | TMyChildComponent = Class(TMyParentComponent) 20 | Public 21 | destructor Destroy; override; 22 | end; 23 | 24 | Var 25 | DestroyCount : Integer; 26 | 27 | { TMyChildComponent } 28 | 29 | destructor TMyChildComponent.Destroy; 30 | begin 31 | DestroyCount:=DestroyCount+1; 32 | Writeln('Destroying child "',Name,'", current count : ',DestroyCount); 33 | inherited Destroy; 34 | end; 35 | 36 | Var 37 | P : TMyParentComponent; 38 | C : TMyChildComponent; 39 | Ci : TComponent; 40 | 41 | begin 42 | P:=TMyParentComponent.Create(Nil); 43 | try 44 | P.Name:='Parent1'; 45 | P.MyProperty:=First; 46 | C:=TMyChildComponent.Create(P); 47 | C.Name:='Child1'; 48 | C.MyProperty:=Second; 49 | C:=TMyChildComponent.Create(C); 50 | C.Name:='Child2'; 51 | C.MyProperty:=Third; 52 | C:=TMyChildComponent.Create(P); 53 | C.Name:='Child3'; 54 | C.MyProperty:=Second; 55 | Writeln('Components for loop'); 56 | For CI in P do 57 | begin 58 | Write(CI.Name,', is child : ',C is TMyChildComponent,' '); 59 | If C is TMyChildComponent then 60 | Write('My property : ',TMyChildComponent(C).MyProperty); 61 | Writeln(''); 62 | end; 63 | finally 64 | P.Destroy; 65 | end; 66 | end. 67 | 68 | -------------------------------------------------------------------------------- /demo/rtl/demodatetime.pas: -------------------------------------------------------------------------------- 1 | program demodatetime; 2 | 3 | uses sysutils, js; 4 | 5 | Procedure DumpDate(Msg : String; Dt : TDateTime); 6 | 7 | Var 8 | Y,M,D : Word; 9 | 10 | begin 11 | DecodeDate(Dt,Y,M,D); 12 | Writeln(Msg,' : ',Y,'-',M,'-',D,' (',Dt,')'); 13 | end; 14 | 15 | Procedure DumpTime(Msg : String; Dt : TDateTime); 16 | 17 | Var 18 | H,M,S,Z : Word; 19 | 20 | begin 21 | DecodeTime(Frac(Dt),H,M,S,z); 22 | if z<>0 then 23 | Writeln(Msg,' : ',H,':',M,':',S,'.',z,' (',Frac(Dt),')') 24 | else 25 | Writeln(Msg,' : ',H,':',M,':',S,' (',Frac(Dt),')') 26 | end; 27 | 28 | Procedure DumpDateTime(Msg : String; Dt : TDateTime); 29 | 30 | Var 31 | Y,Mo,Da,H,M,S,Z : Word; 32 | 33 | begin 34 | DecodeDate(Dt,Y,Mo,Da); 35 | DecodeTime(Frac(Dt),H,M,S,z); 36 | if z<>0 then 37 | Writeln(Msg,' : ',Y,'-',Mo,'-',Da,' ',H,':',M,':',S,'.',z,' (',Dt,')') 38 | else 39 | Writeln(Msg,' : ',Y,'-',Mo,'-',Da,' ',H,':',M,':',S,' (',Dt,')') 40 | end; 41 | 42 | Var 43 | Dt : TDateTime; 44 | 45 | begin 46 | Dt:=Date; 47 | DumpDate('Date',Dt); 48 | Dt:=Time; 49 | DumpTime('Time',dt); 50 | Dt:=Now; 51 | DumpDateTime('Now',Dt); 52 | Writeln('DateToStr : ',DateToStr(Dt)); 53 | Writeln('TimeToStr : ',TimeToStr(Dt)); 54 | DumpTime('StrToTime',StrToTime('14:15:16')); 55 | DumpDate('StrToDate (yyyy-mm-dd)',StrToDate('2016-10-12')); 56 | ShortDateFormat:='mm-dd-yyyy'; 57 | DumpDate('StrToDate (mm-dd-yyyy)',StrToDate('10-16-2016')); 58 | ShortDateFormat:='dd-mm-yyyy'; 59 | DumpDate('StrToDate (dd-mm-yyyy)',StrToDate('17-10-2016')); 60 | end. 61 | 62 | -------------------------------------------------------------------------------- /demo/rtl/demodocument1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Hello, world! 5 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /demo/rtl/demodocument1.pas: -------------------------------------------------------------------------------- 1 | program test; 2 | 3 | uses web; 4 | 5 | begin 6 | document.body.innerHTML := 'Hello world!'; 7 | end. 8 | -------------------------------------------------------------------------------- /demo/rtl/demodombuttonevent.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Pas2JS web demo 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /demo/rtl/demodombuttonevent.pas: -------------------------------------------------------------------------------- 1 | program demodombuttonevent; 2 | 3 | uses web, classes, libjquery; 4 | 5 | Type 6 | TForm = Class 7 | function ButtonClick(Event: TJSMouseEvent): boolean; 8 | Constructor Create; 9 | end; 10 | 11 | function TForm.ButtonClick(Event: TJSMouseEvent): boolean; 12 | begin 13 | writeln('ButtonClick ',Event,' in ',className); 14 | window.alert('Hello world from Pascal!'); 15 | Result:=true; 16 | end; 17 | 18 | constructor TForm.Create; 19 | Var 20 | Panel,PanelContent : TJSElement; 21 | Button1:TJSElement; 22 | begin 23 | Panel:=document.createElement('div'); 24 | // attrs are default array property... 25 | Panel['class']:='panel panel-default'; 26 | PanelContent:=document.createElement('div'); 27 | PanelContent['class']:='panel-body'; 28 | Button1:=document.createElement('input'); 29 | Button1['id']:='Button1'; 30 | Button1['type']:='submit'; 31 | Button1['class']:='btn btn-default'; 32 | Button1['value']:='Click me!'; 33 | TJSHTMLElement(Button1).onclick:=@ButtonClick; 34 | document.body.appendChild(Panel); 35 | Panel.appendChild(PanelContent); 36 | PanelContent.appendChild(Button1); 37 | end; 38 | 39 | begin 40 | TForm.Create; 41 | end. 42 | 43 | -------------------------------------------------------------------------------- /demo/rtl/demojsarray.pas: -------------------------------------------------------------------------------- 1 | uses js; 2 | 3 | function FilterOdd(el : JSValue; Index : NativeInt; Arr: TJSArray) : boolean ; 4 | 5 | Var 6 | I : Integer; 7 | begin 8 | I:=Integer(el); 9 | result:=((i mod 2)=1); 10 | end; 11 | 12 | function showElement(el : JSValue; Index : NativeInt; Arr: TJSArray) : boolean ; 13 | 14 | begin 15 | Writeln(Index,':',el); 16 | result:=true; 17 | end; 18 | 19 | Procedure ShowArray(Msg : string; a: TJSArray); 20 | 21 | begin 22 | writeln(Msg,' : '); 23 | a.forEach(@ShowElement); 24 | end; 25 | 26 | 27 | var 28 | a,b : TJSArray; 29 | 30 | begin 31 | a:=TJSArray._of(5,4,3,2,1,0); 32 | ShowArray('init',a); 33 | a:=TJSArray.new(5,4,3,2,1,0); 34 | ShowArray('init 2',a); 35 | {$IFDEF ECMAScript6} 36 | // Note these change the array itself 37 | ShowArray('fill(-1,3)',a.fill(-1,3)); 38 | ShowArray('fill(-1,1,1)',a.fill(-1,1,1)); 39 | ShowArray('fill(-1)',a.fill(-1)); 40 | {$ENDIF} 41 | a:=TJSArray.new(5,4,3,2,1,2,3); 42 | Writeln(a.ToString,'.indexOf(3): ',a.indexOf(3)); 43 | Writeln(a.ToString,'.indexOf(2,4): ',a.indexOf(2,4)); 44 | ShowArray('Filter(odd)',a.filter(@FilterOdd)); 45 | a:=TJSArray.new('alpha', 'bravo', 'charlie', 'delta'); 46 | ShowArray('copyWithin(2,0)',a.copyWithin(2, 0)); 47 | end. 48 | -------------------------------------------------------------------------------- /demo/rtl/demojsdataarray.pas: -------------------------------------------------------------------------------- 1 | uses js; 2 | 3 | Const 4 | BSize = 10; 5 | 6 | var 7 | B : TJSArrayBuffer; 8 | V : TJSDataView; 9 | I : Integer; 10 | 11 | begin 12 | B:=TJSArrayBuffer.New(BSize); 13 | V:=TJSDataView.New(B); 14 | for I:=0 to v.byteLength-1 do 15 | Writeln('Byte ',I,': ',v.getUInt8(i)); 16 | for I:=0 to v.byteLength-1 do 17 | v.setUInt8(i,i+1); 18 | Writeln('Writing bytes'); 19 | for I:=0 to v.byteLength-1 do 20 | Writeln('Byte ',I,': ',v.getUInt8(i)); 21 | Writeln('Reading as Words'); 22 | for I:=0 to (v.byteLength-1) div 2 do 23 | Writeln('Word ',I,': ',v.getUInt16(i*2)); 24 | end. -------------------------------------------------------------------------------- /demo/rtl/demojsregexp.pas: -------------------------------------------------------------------------------- 1 | uses JS, Types; 2 | 3 | Var 4 | R : TJSRegexp; 5 | T : TStringDynArray; 6 | i : integer; 7 | 8 | begin 9 | r:=TJSRegexp.New('m(.)','g'); 10 | writeln('source: ',r.source); 11 | writeln('toString: ',r.toString); 12 | writeln('Multiline: ',r.multiline); 13 | writeln('global: ',r.global); 14 | writeln('ignoreCase: ',r.ignoreCase); 15 | {$IFDEF FIREFOX} 16 | writeln('sticky: ',r.sticky); 17 | {$ENDIF} 18 | t:=r.exec('memamimomu'); 19 | While t<>nil do 20 | begin 21 | Writeln(r.toString,' -> exec(''memamimomu'') : length ',length(t),' lastIndex:',r.lastIndex); 22 | for I:=0 to Length(t)-1 do 23 | Writeln('Match[',i,'] : ',t[i]); 24 | t:=r.exec('memamimomu'); 25 | end 26 | end. -------------------------------------------------------------------------------- /demo/rtl/demoloadstreamfromurl.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Load stream from URL demo 7 | 8 | 9 | 10 |

Demo loading file from URL to stream

11 |
12 |
13 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /demo/rtl/demoloadstreamfromurl.lpr: -------------------------------------------------------------------------------- 1 | program demoloadstreamfromurl; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | browserconsole, Classes; 7 | 8 | Var 9 | SS,SS2,SS3 : TStringStream; 10 | 11 | begin 12 | Writeln('Loading synchronously'); 13 | SS:=TStringStream.Create(''); 14 | try 15 | SS.LoadFromFile('bytes.txt'); 16 | Writeln('Loaded : ',SS.DataString); 17 | finally 18 | SS.Free; 19 | end; 20 | Writeln('Loading asynchronously'); 21 | SS2:=TStringStream.Create(''); 22 | SS2.LoadFromURL('bytes.txt',True,procedure(Sender: tobject) 23 | begin 24 | Writeln('Loaded 2: ',SS2.DataString); 25 | end 26 | ); 27 | Writeln('Loading non-existing file'); 28 | SS3:=TStringStream.Create(''); 29 | SS3.LoadFromURL('bytesnonexist.txt',True,procedure(Sender: tobject) 30 | begin 31 | Writeln('Loaded 3: ',SS3.DataString); 32 | end 33 | , 34 | procedure(Sender: tobject; Const aError : string) 35 | begin 36 | Writeln('Load error: ',aError); 37 | end 38 | ); 39 | end. 40 | -------------------------------------------------------------------------------- /demo/rtl/demoloadstringsfromurl.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Demo load strings from URL 7 | 8 | 9 | 10 |

Demo loading file from URL to TStringList

11 |
12 |
13 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /demo/rtl/demoloadstringsfromurl.lpr: -------------------------------------------------------------------------------- 1 | program demoloadstringsfromurl; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | browserconsole, Classes; 7 | 8 | Procedure DumpList(s : Tstrings); 9 | 10 | Var 11 | I : Integer; 12 | 13 | begin 14 | Writeln('----------'); 15 | For I:=0 to S.Count-1 do 16 | Writeln('Line[',I,'] : ',S[I]); 17 | Writeln('----------'); 18 | end; 19 | 20 | Var 21 | Lst,lst2,lst3 : TStrings; 22 | 23 | begin 24 | Writeln('Loading synchronously'); 25 | Lst:=TStringList.Create; 26 | try 27 | Lst.LoadFromFile('bytes.txt'); 28 | DumpList(Lst); 29 | finally 30 | Lst.Free; 31 | end; 32 | Writeln('Loading asynchronously'); 33 | // We can't free the stringlist, because of the async nature 34 | Lst2:=TStringList.Create; 35 | Lst2.LoadFromURL('bytes.txt',True,procedure(Sender: tobject) 36 | begin 37 | DumpList(Lst2); 38 | end 39 | ); 40 | Writeln('Loading non-existing file'); 41 | // We can't free the stringlist, because of the async nature 42 | Lst3:=TStringList.Create; 43 | Lst3.LoadFromURL('bytesnonexist.txt',True,procedure(Sender: tobject) 44 | begin 45 | DumpList(Lst3); 46 | end 47 | , 48 | procedure(Sender: tobject; Const aError : string) 49 | begin 50 | Writeln('Load error: ',aError); 51 | end 52 | ); 53 | end. 54 | -------------------------------------------------------------------------------- /demo/rtl/demonew.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | New demo 5 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /demo/rtl/demonew.pas: -------------------------------------------------------------------------------- 1 | uses types, js; 2 | 3 | Var 4 | O : TJSObject; 5 | S : TStringDynArray; 6 | I : integer; 7 | V : JSValue; 8 | 9 | begin 10 | O:=new(['a','text','b',123,'c',true]); 11 | S:=TJSObject.getOwnPropertyNames(O); 12 | Writeln('Object has ',Length(S),' own properties'); 13 | for I:=0 to Length(S)-1 do 14 | begin 15 | Writeln(i); 16 | V:=O.Properties[S[i]]; 17 | Writeln('Property ',S[i],' : ',V); 18 | end; 19 | S:=TJSObject.Keys(O); 20 | Writeln('Object has ',Length(S),' keys'); 21 | for I:=0 to Length(S)-1 do 22 | Writeln('Property ',S[i],' : ',O.Properties[S[i]]); 23 | Writeln('Manual : '); 24 | Writeln('a: ',O['a']); 25 | Writeln('b: ',O['b']); 26 | Writeln('c: ',O['c']); 27 | end. -------------------------------------------------------------------------------- /demo/rtl/demonodecmdlineoptions.pas: -------------------------------------------------------------------------------- 1 | program demonodecmdlineoptions; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | nodejsapp, JS, Classes, SysUtils, nodeJS; 7 | 8 | type 9 | 10 | { TMyApplication } 11 | 12 | TMyApplication = class(TNodeJSApplication) 13 | procedure doRun; override; 14 | private 15 | procedure Usage(Msg: string); 16 | end; 17 | 18 | procedure TMyApplication.Usage(Msg : string); 19 | 20 | begin 21 | if Msg<>'' then 22 | Writeln('Error :',Msg); 23 | Writeln('Usage:'); 24 | Writeln(ExeName,' [options]'); 25 | Writeln('Where options is one or more of'); 26 | Writeln('-h --help this help message'); 27 | Writeln('-e --echo echo option'); 28 | ExitCode:=Ord(Msg<>''); 29 | end; 30 | 31 | procedure TMyApplication.doRun; 32 | 33 | Var 34 | S : String; 35 | begin 36 | S:=CheckOptions('he:',['help','echo']); 37 | if (S<>'') or HasOption('h','help') then 38 | Usage(S); 39 | if HasOption('e','echo') then 40 | Writeln(GetoptionValue('e','echo')); 41 | for S in GetNonOptions('he:',['help','echo']) do 42 | Writeln(s); 43 | Terminate; 44 | end; 45 | 46 | var 47 | Application : TMyApplication; 48 | 49 | begin 50 | Application:=TMyApplication.Create(nil); 51 | Application.Initialize; 52 | Application.Run; 53 | Application.Free; 54 | end. 55 | -------------------------------------------------------------------------------- /demo/rtl/demorouter.pas: -------------------------------------------------------------------------------- 1 | program demorouter; 2 | 3 | uses web, classes, libjquery; 4 | 5 | Type 6 | TForm = Class 7 | function ButtonClick(Event: TJSMouseEvent): boolean; 8 | Constructor Create; 9 | end; 10 | 11 | function TForm.ButtonClick(Event: TJSMouseEvent): boolean; 12 | begin 13 | writeln('ButtonClick ',Event,' in ',className); 14 | window.alert('Hello world from Pascal!'); 15 | Result:=true; 16 | end; 17 | 18 | constructor TForm.Create; 19 | Var 20 | Panel,PanelContent : TJSElement; 21 | Button1:TJSElement; 22 | begin 23 | Panel:=document.createElement('div'); 24 | // attrs are default array property... 25 | Panel['class']:='panel panel-default'; 26 | PanelContent:=document.createElement('div'); 27 | PanelContent['class']:='panel-body'; 28 | Button1:=document.createElement('input'); 29 | Button1['id']:='Button1'; 30 | Button1['type']:='submit'; 31 | Button1['class']:='btn btn-default'; 32 | Button1['value']:='Click me!'; 33 | TJSHTMLElement(Button1).onclick:=@ButtonClick; 34 | document.body.appendChild(Panel); 35 | Panel.appendChild(PanelContent); 36 | PanelContent.appendChild(Button1); 37 | end; 38 | 39 | begin 40 | TForm.Create; 41 | end. 42 | 43 | -------------------------------------------------------------------------------- /demo/rtl/demostringlist.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Stringlist demo 4 | 5 | 6 | 7 |
8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /demo/rtl/demostringlist.pas: -------------------------------------------------------------------------------- 1 | {$mode objfpc} 2 | {$H+} 3 | uses browserconsole,sysutils,classes; 4 | 5 | Var 6 | L : TStringList; 7 | I : Integer; 8 | //S : TJSString; 9 | S : String; 10 | 11 | begin 12 | L:=TStringList.Create; 13 | for I:=0 to 10 do 14 | L.Add(IntToStr(I)); 15 | for I:=0 to L.Count-1 do 16 | Writeln(I,' : ',L[i]); 17 | writeln('in one swoop: ',L.text); 18 | L.Delete(4); 19 | Writeln('Index 4 deleted.',L.Text); 20 | Writeln('Commatext : ',L.CommaText); 21 | Writeln('IndexOf(5) : ',L.INdexOf('5')); 22 | L.Clear; 23 | Writeln('Clear : "',L.Text,'"'); 24 | L.CommaText:='3,4,5'; 25 | Writeln('After set commatext: ',L.CommaText); 26 | L.exchange(2,0); 27 | Writeln('After exchange : ',L.CommaText); 28 | L.Sort; 29 | Writeln('After sort : ',L.CommaText); 30 | //S:=TJSString.new('abc'); 31 | //Writeln(S.toUpperCase); 32 | Writeln('For in loop:'); 33 | for S in L do 34 | Writeln(S); 35 | 36 | end. 37 | -------------------------------------------------------------------------------- /demo/rtl/demouncaughtexception.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /demo/rtl/demouncaughtexception.pas: -------------------------------------------------------------------------------- 1 | program demouncaughtexception; 2 | 3 | uses sysutils; 4 | 5 | Type 6 | EMyError = class(Exception); 7 | 8 | begin 9 | Raise EMyError.Create('This can be shown in an alert by setting rtl.setUncaughtException=true'); 10 | end. 11 | 12 | -------------------------------------------------------------------------------- /demo/rtl/demoxhr.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | XMLHTTPRequest demo 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /demo/rtl/rtl_demos.lpg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /demo/templates/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/templates/favicon.ico -------------------------------------------------------------------------------- /demo/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Template loader demo 8 | 9 | 10 | 11 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /demo/templates/templates/this.txt: -------------------------------------------------------------------------------- 1 | this text 2 | -------------------------------------------------------------------------------- /demo/templates/templates/thistoo.txt: -------------------------------------------------------------------------------- 1 | this text too 2 | -------------------------------------------------------------------------------- /demo/tetris/tetris.lpr: -------------------------------------------------------------------------------- 1 | program tetris; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | browserapp, JS, Classes, SysUtils, Web, utetris; 7 | 8 | type 9 | TTetrisApplication = class(TBrowserApplication) 10 | FTetris : TTetris; 11 | procedure doRun; override; 12 | end; 13 | 14 | procedure TTetrisApplication.doRun; 15 | 16 | begin 17 | FTetris:=TTetris.Create(Self); 18 | FTetris.Start; 19 | end; 20 | 21 | var 22 | Application : TTetrisApplication; 23 | 24 | begin 25 | Application:=TTetrisApplication.Create(nil); 26 | Application.Initialize; 27 | Application.Run; 28 | end. 29 | -------------------------------------------------------------------------------- /demo/tetris/tetrislogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/tetris/tetrislogo.png -------------------------------------------------------------------------------- /demo/translate/dutch.json: -------------------------------------------------------------------------------- 1 | { 2 | "program" : { 3 | "URLTitle":"Vertaling met resourcestrings - URL API" 4 | }, 5 | "mystrings": { 6 | "Button":"Vertaal deze pagina", 7 | "Header":"Vertaling met resourcestrings", 8 | "Paragraph":"Deze tekst wordt vertaald.", 9 | "TranslateDirect":"De directe API wordt gebruikt voor dit voorbeeld.", 10 | "TranslateJSON":"Een JSON object wordt gebruikt voor dit voorbeeld.", 11 | "TranslateURL":"Een URL wordt gebruikt voor dit voorbeeld." 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /demo/translate/mystrings.pp: -------------------------------------------------------------------------------- 1 | unit mystrings; 2 | 3 | {$mode objfpc} 4 | 5 | interface 6 | 7 | Resourcestring 8 | Header = 'Translation using resource strings'; 9 | Paragraph = 'This text will be translated.'; 10 | TranslateDirect = 'The direct API is used for this example.'; 11 | TranslateJSON = 'A JSON object is used for this example.'; 12 | TranslateURL = 'A URL is used for this example.'; 13 | Button = 'Translate this page'; 14 | 15 | implementation 16 | 17 | end. 18 | 19 | -------------------------------------------------------------------------------- /demo/translate/translate_basic.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Translation using resource strings - Basic API 7 | 8 | 9 | 10 |

11 |

12 | 13 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /demo/translate/translate_demos.lpg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /demo/translate/translate_object.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Translation using resource strings - Object API 7 | 8 | 9 | 10 |

11 |

12 | 13 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /demo/translate/translate_url.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Translation using resource strings - URL API 7 | 8 | 9 | 10 |

11 |

12 | 13 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /demo/uselibpas2js/examples/TestUnitAlias1.pas: -------------------------------------------------------------------------------- 1 | unit TestUnitAlias2; 2 | 3 | interface 4 | 5 | implementation 6 | 7 | uses 8 | Test.Foo.Alias1; // replaced with bar 9 | //Test.Foo.Alias2; // replaced with Test.Foo.SomeLongUnitName 10 | 11 | end. 12 | 13 | -------------------------------------------------------------------------------- /demo/uselibpas2js/pas2js_unitalias.lpr: -------------------------------------------------------------------------------- 1 | program pas2js_unitalias; 2 | 3 | uses 4 | {$IFDEF FPC} 5 | {$IFDEF unix} 6 | cmem, cwstring, 7 | {$ENDIF} 8 | DynLibs, 9 | {$ENDIF} 10 | SysUtils, LibPas2jsIntf, Pas2jsCompilerProxy; 11 | 12 | begin 13 | LoadPas2JsLibrary(ExtractFilePath(ParamStr(0))+libpas2js); 14 | With TPas2JSCompilerProxy.Create do 15 | try 16 | Execute; 17 | finally 18 | Free; 19 | end; 20 | end. 21 | 22 | -------------------------------------------------------------------------------- /demo/vscode/helloworld/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Run Extension", 6 | "type": "extensionHost", 7 | "request": "launch", 8 | "runtimeExecutable": "${execPath}", 9 | "args": [ 10 | "--extensionDevelopmentPath=${workspaceFolder}" 11 | ] 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /demo/vscode/helloworld/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "Compile", 8 | "type": "shell", 9 | "command": "pas2js pas2jsdemoextension.lpr -ojs/pas2jsdemoextension.js -Tbrowser -Jivscodeimports.js -Jirtl.js -Javscodeexports.js -Jc ", 10 | "group":{ 11 | "kind": "build", 12 | "isDefault": true 13 | }, 14 | "presentation": { 15 | "reveal": "always", 16 | "panel": "new" 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /demo/vscode/helloworld/README.md: -------------------------------------------------------------------------------- 1 | # pas2jsdemoextension VS Code extension. 2 | 3 | This package is a small adaptation of the VS Code extensions Hello World 4 | sample. 5 | 6 | To install it in VS Code: 7 | * compile the program. 8 | You can do so in VS Code: just run the Build command. 9 | * run the package: 10 | This will start a second VS Code instance with the package installed. 11 | * To package it, you need to have vsce installed, so first it must be 12 | installed: 13 | ```sh 14 | npm install -g vsce 15 | ``` 16 | Once installed, packaging can be done on the command-line 17 | run 18 | ```sh 19 | vsce package 20 | ``` 21 | 22 | This will create a pas2jsdemoextension-0.0.1.vsix file which can be 23 | distributed and installed in VS Code. 24 | 25 | -------------------------------------------------------------------------------- /demo/vscode/helloworld/js/packageglue.js: -------------------------------------------------------------------------------- 1 | const vscode = require('vscode'); 2 | const pascalRuntime = require('./pas2jsdemoextension.js'); 3 | 4 | var callbacks = { 5 | onDeactivate: function (a) { } 6 | } 7 | 8 | // this method is called when your extension is activated 9 | function activate(context) { 10 | pascalRuntime.rtl.run(); 11 | var vscodeEnv = { 12 | vscodeGlobal: vscode, 13 | extensionContext: context 14 | } 15 | pascalRuntime.pas.program.InitVSCode(vscodeEnv,callbacks); 16 | } 17 | 18 | // this method is called when your extension is deactivated 19 | function deactivate() { 20 | if (callbacks.onDeactivate) { 21 | callbacks.onDeactivate(); 22 | } 23 | } 24 | 25 | // eslint-disable-next-line no-undef 26 | module.exports = { 27 | activate, 28 | deactivate 29 | } 30 | -------------------------------------------------------------------------------- /demo/vscode/helloworld/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pas2jsdemoextension", 3 | "description": "Minimal HelloWorld pas2js example for VS Code", 4 | "version": "0.0.1", 5 | "publisher": "pas2js team", 6 | "engines": { 7 | "vscode": "^1.32.0" 8 | }, 9 | "activationEvents": [ 10 | "onCommand:pas2jsdemoextension.helloWorld" 11 | ], 12 | "main": "js/packageglue.js", 13 | "contributes": { 14 | "commands": [ 15 | { 16 | "command": "pas2jsdemoextension.helloWorld", 17 | "title": "Pas2js Extension Hello World" 18 | } 19 | ] 20 | }, 21 | "scripts": {}, 22 | "devDependencies": { 23 | "@types/vscode": "^1.32.0" 24 | } 25 | } -------------------------------------------------------------------------------- /demo/vscode/helloworld/pas2jsdemoextension.lpr: -------------------------------------------------------------------------------- 1 | program pas2jsdemoextension; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | JS, Types, Classes, SysUtils, libvscode, vscodeapp; 7 | 8 | 9 | Type 10 | { TMyVSCodeExtension } 11 | 12 | TMyVSCodeExtension = Class(TVSCodeApplication) 13 | Private 14 | function DoHello(args:TJSValueDynArray) : JSValue; 15 | Protected 16 | procedure DoActivate; override; 17 | procedure DoDeactivate; override; 18 | Public 19 | // Add function handlers here 20 | end; 21 | 22 | 23 | // Do not change the name of this procedure, the Javascript glue code depends on it. 24 | // If you do want to change it, change the glue code as well. 25 | Procedure InitVSCode(aVSCode : TVSCodeEnvironment; aCallBacks : TVSCodeExtensionCallBacks); 26 | 27 | begin 28 | If Application=Nil then 29 | Application:=TMyVSCodeExtension.Create(Nil); 30 | Application.SaveVSCodeEnvironment(aVSCode,aCallBacks); 31 | end; 32 | 33 | { TMyVSCodeExtension } 34 | 35 | procedure TMyVSCodeExtension.DoActivate; 36 | 37 | Var 38 | disp : TVSDisposable; 39 | 40 | begin 41 | inherited DoActivate; 42 | disp:=vscode.commands.registerCommand('pas2jsdemoextension.helloWorld',@doHello); 43 | TJSArray(ExtensionContext.subscriptions).push(disp); 44 | end; 45 | 46 | function TMyVSCodeExtension.DoHello(args:TJSValueDynArray) : JSValue; 47 | begin 48 | vscode.window.showInformationMessage('Hello World from Pas2js!'); 49 | end; 50 | 51 | procedure TMyVSCodeExtension.DoDeactivate(); 52 | begin 53 | inherited DoDeactivate(); 54 | end; 55 | 56 | // This code is needed to prevent the pas2js compiler from removing the InitAtom call. 57 | var 58 | dummy : JSValue; 59 | 60 | begin 61 | Application:=TMyVSCodeExtension.Create(Nil); 62 | dummy:=@InitVSCode; 63 | end. 64 | 65 | -------------------------------------------------------------------------------- /demo/wasienv/canvas/.gitignore: -------------------------------------------------------------------------------- 1 | lib 2 | -------------------------------------------------------------------------------- /demo/wasienv/canvas/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | FPC-Webassembly and Pas2JS Demo 8 | 9 | 10 | 11 | 26 | 27 | 28 |
29 |

Canvas

30 |
31 |
32 |
33 |

Console output

34 |
35 |
36 | 37 |
38 |
39 |
40 |
41 |

Created using   pas2js.

42 |

Pas2JS Sources:   Pas2JS Program

43 |

Webassembly Sources:   FPC Program

44 |
45 |
46 |
47 |
48 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /demo/wasienv/simple/helloworld.pp: -------------------------------------------------------------------------------- 1 | program HelloWorld; 2 | 3 | begin 4 | Writeln('Hello world from FPC webassembly and Pas2JS!'); 5 | Writeln('... and a merry Christmas for all!'); 6 | end. 7 | -------------------------------------------------------------------------------- /demo/wasienv/simple/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | FPC-Webassembly and Pas2JS Demo 8 | 9 | 10 | 11 | 26 | 27 | 28 |
29 |

FPC compiled wasm program console output:

30 |
31 |
32 | 33 |
34 |
35 |
36 |
37 |

Created using   pas2js.

38 |

Pas2JS Sources:   Pas2JS Program

39 |

Webassembly Sources:   FPC Program

40 |
41 |
42 |
43 |
44 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /demo/wasienv/terminal/sums.pp: -------------------------------------------------------------------------------- 1 | program sums; 2 | 3 | Var 4 | A,B,C : Integer; 5 | 6 | begin 7 | Writeln('Answer -1 to end the program'); 8 | Repeat 9 | A:=Random(100); 10 | B:=Random(100); 11 | Write(A,' + ',B,' = '); 12 | Readln(C); 13 | if (C=(A+B)) then 14 | Writeln('Well done !') 15 | else if (C<>-1) then 16 | Writeln('Sorry, wrong. The correct answer is ',A+B); 17 | Until (C=-1); 18 | end. 19 | 20 | -------------------------------------------------------------------------------- /demo/wasienv/wasiapp/demowasiapp.lpr: -------------------------------------------------------------------------------- 1 | program demowasiapp; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | browserconsole, browserapp, JS, Classes, SysUtils, Web, WebAssembly, types, 7 | wasienv, wasihostapp; 8 | 9 | Type 10 | 11 | { TMyApplication } 12 | 13 | TMyApplication = class(TWASIHostApplication) 14 | Private 15 | procedure DoWrite(Sender: TObject; const aOutput: String); 16 | Public 17 | Constructor Create(aOwner : TComponent); override; 18 | procedure doRun; override; 19 | end; 20 | 21 | 22 | procedure TMyApplication.DoWrite(Sender: TObject; const aOutput: String); 23 | begin 24 | Writeln(aOutput); 25 | end; 26 | 27 | constructor TMyApplication.Create(aOwner: TComponent); 28 | begin 29 | inherited Create(aOwner); 30 | WasiEnvironment.OnStdErrorWrite:=@DoWrite; 31 | WasiEnvironment.OnStdOutputWrite:=@DoWrite; 32 | end; 33 | 34 | procedure TMyApplication.doRun; 35 | 36 | begin 37 | // Your code here 38 | Terminate; 39 | StartWebAssembly('helloworld.wasm'); 40 | end; 41 | 42 | var 43 | Application : TMyApplication; 44 | 45 | begin 46 | Application:=TMyApplication.Create(nil); 47 | Application.Initialize; 48 | Application.Run; 49 | end. 50 | -------------------------------------------------------------------------------- /demo/wasienv/wasiapp/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | FPC-Webassembly and Pas2JS Demo 8 | 9 | 10 | 11 | 26 | 27 | 28 |
29 |

FPC compiled wasm program console output:

30 |
31 |
32 | 33 |
34 |
35 |
36 |
37 |

Created using   pas2js.

38 |

Pas2JS Sources:   Pas2JS Program

39 |

Webassembly Sources:   FPC Program

40 |
41 |
42 |
43 |
44 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /demo/wasienv/wasienvdemos.lpg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /demo/webcompiler/run.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Pas2JS web compiler Program output 5 | 8 | 9 | 10 | 11 |
12 |
13 |
Run program output
14 |
Compile and run your program first.
15 |
16 |
17 |
18 |
19 | 20 | -------------------------------------------------------------------------------- /demo/webgl/Matrix.pas: -------------------------------------------------------------------------------- 1 | unit Matrix; 2 | interface 3 | uses 4 | JS; 5 | 6 | type 7 | TMatrix = class 8 | public 9 | constructor Create (w, h: integer); 10 | procedure SetValue(x, y: integer; value: JSValue); 11 | function GetValue(x, y: integer): JSValue; 12 | procedure Show; 13 | function GetWidth: integer; 14 | function GetHeight: integer; 15 | // NOTE: no indexers yet? 16 | //property Indexer[const x,y:integer]:JSValue read GetValue write SetValue; default; 17 | private 18 | table: TJSArray; 19 | width: integer; 20 | height: integer; 21 | 22 | function IndexFor(x, y: integer): integer; 23 | end; 24 | 25 | implementation 26 | 27 | constructor TMatrix.Create (w, h: integer); 28 | begin 29 | width := w; 30 | height := h; 31 | table := TJSArray.new(width * height); 32 | end; 33 | 34 | procedure TMatrix.SetValue(x, y: integer; value: JSValue); 35 | begin 36 | table[IndexFor(x, y)] := value; 37 | end; 38 | 39 | function TMatrix.GetValue(x, y: integer): JSValue; 40 | begin 41 | result := table[IndexFor(x, y)]; 42 | end; 43 | 44 | function TMatrix.IndexFor(x, y: integer): integer; 45 | begin 46 | result := x + y * height; 47 | end; 48 | 49 | procedure TMatrix.Show; 50 | var 51 | x, y: integer; 52 | begin 53 | for x := 0 to width - 1 do 54 | for y := 0 to height - 1 do 55 | begin 56 | writeln(x,',',y, ': ', GetValue(x, y)); 57 | end; 58 | end; 59 | 60 | function TMatrix.GetWidth: integer; 61 | begin 62 | result := width; 63 | end; 64 | 65 | function TMatrix.GetHeight: integer; 66 | begin 67 | result := height; 68 | end; 69 | 70 | 71 | end. -------------------------------------------------------------------------------- /demo/webgl/README.txt: -------------------------------------------------------------------------------- 1 | Contributed by Ryan Joseph 2 | 3 | # Pas2JS-WebGL 4 | WebGL demo with Pas2JS 5 | 6 | Most basics of WebGL: 7 | 8 | - Vertex data packed into byte array for interleaved vertex data 9 | - Shaders 10 | - Matricies 11 | - Animation 12 | - OBJ Loader 13 | - Lighting 14 | 15 | Most basic example possible: 16 | 17 | http://htmlpreview.github.io/?https://raw.githubusercontent.com/genericptr/Pas2JS-WebGL/master/html/Pas2JS_WebGL_Minimal.html 18 | 19 | Interleaved vertex data: 20 | 21 | http://htmlpreview.github.io/?https://raw.githubusercontent.com/genericptr/Pas2JS-WebGL/master/html/Pas2JS_WebGL.html 22 | 23 | OBJ Loader with lighting: 24 | 25 | http://htmlpreview.github.io/?https://raw.githubusercontent.com/genericptr/Pas2JS-WebGL/master/html/Pas2JS_WebGL_OBJ.html 26 | 27 | Terrain generation using Perlin noise (NOTE: can't be viewed online currently until I figure out the image loading security issue): 28 | 29 | http://htmlpreview.github.io/?https://raw.githubusercontent.com/genericptr/Pas2JS-WebGL/master/html/Pas2JS_WebGL_Terrain.html 30 | -------------------------------------------------------------------------------- /demo/webgl/html/Pas2JS_WebGL.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 22 | 30 | 33 | 34 | -------------------------------------------------------------------------------- /demo/webgl/html/Pas2JS_WebGL_Minimal.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 14 | 21 | 24 | 25 | -------------------------------------------------------------------------------- /demo/webgl/html/res/cube.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.79 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | o Cube 4 | v 1.000000 0.000000 0.000000 5 | v 1.000000 0.000000 1.000000 6 | v -0.000000 0.000000 1.000000 7 | v 0.000000 0.000000 -0.000000 8 | v 1.000000 1.000000 0.000001 9 | v 0.999999 1.000000 1.000000 10 | v -0.000000 1.000000 1.000000 11 | v 0.000000 1.000000 0.000000 12 | vn 0.0000 -1.0000 0.0000 13 | vn 0.0000 1.0000 0.0000 14 | vn 1.0000 -0.0000 0.0000 15 | vn -0.0000 -0.0000 1.0000 16 | vn -1.0000 -0.0000 -0.0000 17 | vn 0.0000 0.0000 -1.0000 18 | s off 19 | f 2//1 4//1 1//1 20 | f 8//2 6//2 5//2 21 | f 5//3 2//3 1//3 22 | f 6//4 3//4 2//4 23 | f 3//5 8//5 4//5 24 | f 1//6 8//6 5//6 25 | f 2//1 3//1 4//1 26 | f 8//2 7//2 6//2 27 | f 5//3 6//3 2//3 28 | f 6//4 7//4 3//4 29 | f 3//5 7//5 8//5 30 | f 1//6 4//6 8//6 31 | -------------------------------------------------------------------------------- /demo/webgl/html/res/ground.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/webgl/html/res/ground.jpg -------------------------------------------------------------------------------- /demo/webgl/html/res/spacestars.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/webgl/html/res/spacestars.jpg -------------------------------------------------------------------------------- /demo/webgl/project1.lpr: -------------------------------------------------------------------------------- 1 | program project1; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | JS, Classes, SysUtils, Web; 7 | 8 | begin 9 | // Your code here 10 | end. 11 | -------------------------------------------------------------------------------- /demo/webgl/webgl_demos.lpg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /demo/websockets/README.md: -------------------------------------------------------------------------------- 1 | # Websocket demo 2 | 3 | This demo is intended to run with the wsserver demo of the FPC websocket 4 | support example wsserver. It is a small chat server client. 5 | 6 | # Running the example 7 | 8 | To run it, run the FPC wsserver example application (see fcl-web/examples/websocket/server). 9 | ```sh 10 | wsserver -p 8080 11 | ``` 12 | 13 | Edit the serverconfig.js and set the correct server URL: 14 | ```json 15 | var 16 | serverConfig = { 17 | "url": "ws://localhost:8080/" 18 | }; 19 | ``` 20 | (change port etc. to match your setup) 21 | 22 | Compile the demowebsocket example using lazarus or pa2js. 23 | 24 | run simpleserver (or any other webserver) in this directory: 25 | 26 | ```sh 27 | simpleserver -p 3000 28 | ``` 29 | 30 | and point your browser at port 3000: 31 | ```text 32 | http://localhost:3000/ 33 | ``` 34 | 35 | 36 | -------------------------------------------------------------------------------- /demo/websockets/guest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/websockets/guest.png -------------------------------------------------------------------------------- /demo/websockets/serverconfig.js: -------------------------------------------------------------------------------- 1 | var 2 | serverConfig = { 3 | "url": "ws://localhost:8080/" 4 | }; 5 | -------------------------------------------------------------------------------- /demo/websockets/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Manrope&display=swap'); 2 | 3 | html, 4 | body { 5 | height: 100%; 6 | } 7 | 8 | * { 9 | padding: 0px; 10 | margin: 0px; 11 | } 12 | 13 | body { 14 | background-color: #fff; 15 | font-family: 'Manrope', sans-serif; 16 | } 17 | 18 | ::-webkit-scrollbar { 19 | width: 10px; 20 | } 21 | 22 | ::-webkit-scrollbar-track { 23 | background: #eee; 24 | } 25 | 26 | ::-webkit-scrollbar-thumb { 27 | background: #888; 28 | } 29 | 30 | ::-webkit-scrollbar-thumb:hover { 31 | background: #555; 32 | } 33 | 34 | 35 | .scroll { 36 | overflow-y: scroll; 37 | scroll-behavior: smooth; 38 | /* height: 325px */ 39 | height: 425px; 40 | } 41 | 42 | .card { 43 | background-color: #eee; 44 | border-radius: 10px; 45 | } 46 | 47 | .main { 48 | position: relative; 49 | padding: 6px 0px 0px 0px; 50 | } 51 | 52 | .name { 53 | font-size: 14px; 54 | } 55 | 56 | .msg { 57 | background-color: #fff; 58 | font-size: 16px; 59 | padding: 5px 10px; 60 | border-radius: 5px; 61 | font-weight: 500; 62 | color: #3e3c3c; 63 | } 64 | 65 | .between { 66 | font-size: 14px; 67 | font-weight: 500; 68 | color: #a09e9e; 69 | padding: 10px 0; 70 | } 71 | 72 | .navbar { 73 | border-bottom-left-radius: 8px; 74 | border-bottom-right-radius: 8px; 75 | box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19) 76 | } 77 | 78 | .form-control:focus { 79 | box-shadow: none; 80 | } 81 | -------------------------------------------------------------------------------- /demo/websockets/you.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/websockets/you.png -------------------------------------------------------------------------------- /demo/webwidget/designdemo/design.css: -------------------------------------------------------------------------------- 1 | button[data-widget-class] { 2 | background-repeat: no-repeat; 3 | background-position: center; 4 | width: 36px; 5 | height: 36px; 6 | } 7 | #toolbar { 8 | width: 80%; 9 | background-color: #DDDDDD; 10 | margin-bottom: 32px; 11 | padding: 4px 4px 4px 4px; 12 | margin-left: 30px; 13 | } 14 | #designpage { 15 | background-color: #A0A0A0; 16 | width: 80%; 17 | height: 80vh; 18 | margin-left: 30px; 19 | margin-top: 32px; 20 | } 21 | 22 | .designerActive { 23 | position: relative; 24 | border: 1px dashed #87cefa; 25 | } 26 | 27 | .designerToolbar { 28 | position: absolute; 29 | top: 0px; 30 | left: -18px; 31 | height: 100%; 32 | display: flex; 33 | flex-direction: column; 34 | /* justify-content: space-around; */ 35 | } 36 | 37 | .designerDragHandle{ 38 | margin-left: 1px; 39 | } 40 | 41 | .designerPlaceholder { 42 | border: 3px dotted black; 43 | margin: 1em 1em 1em 1em; 44 | height: 50px; 45 | } 46 | 47 | .source { 48 | display: flex; 49 | width: 540px; 50 | margin: 10px auto; 51 | font-size: 12px; 52 | } -------------------------------------------------------------------------------- /demo/webwidget/designdemo/designdemo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Designdemo 14 | 15 | 16 | 17 |
18 |
19 |
20 | Created using   pas2js. 21 |   Sources:   Program   22 | unit. 23 | 24 |
25 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /demo/webwidget/designdemo/designdemo.lpr: -------------------------------------------------------------------------------- 1 | program designdemo; 2 | 3 | {$mode objfpc} 4 | { $DEFINE USEIDE} 5 | 6 | uses 7 | browserapp, JS, Classes, SysUtils, Web, designer, webideclient; 8 | 9 | type 10 | TMyApplication = class(TBrowserApplication) 11 | Public 12 | FDemo : TDesignDemo; 13 | {$IFDEF USEIDE} 14 | FIDEIntf : TIDEClient; 15 | {$ENDIF} 16 | procedure doRun; override; 17 | end; 18 | 19 | procedure TMyApplication.doRun; 20 | 21 | begin 22 | FDemo:=TDesignDemo.Create(Self); 23 | {$IFDEF USEIDE} 24 | FIDEIntf:=TIDEClient.Create(Self); 25 | FDemo.IDEClient:=FIDEintf; 26 | FIDEIntf.RegisterClient; 27 | {$ENDIF} 28 | end; 29 | 30 | var 31 | Application : TMyApplication; 32 | 33 | begin 34 | Application:=TMyApplication.Create(nil); 35 | Application.Initialize; 36 | Application.Run; 37 | end. 38 | -------------------------------------------------------------------------------- /demo/webwidget/designdemo/widgets/button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/webwidget/designdemo/widgets/button.png -------------------------------------------------------------------------------- /demo/webwidget/designdemo/widgets/checkbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/webwidget/designdemo/widgets/checkbox.png -------------------------------------------------------------------------------- /demo/webwidget/designdemo/widgets/container.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/webwidget/designdemo/widgets/container.png -------------------------------------------------------------------------------- /demo/webwidget/designdemo/widgets/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/webwidget/designdemo/widgets/edit.png -------------------------------------------------------------------------------- /demo/webwidget/designdemo/widgets/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/webwidget/designdemo/widgets/image.png -------------------------------------------------------------------------------- /demo/webwidget/designdemo/widgets/jumbo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/webwidget/designdemo/widgets/jumbo.png -------------------------------------------------------------------------------- /demo/webwidget/designdemo/widgets/memo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/webwidget/designdemo/widgets/memo.png -------------------------------------------------------------------------------- /demo/webwidget/designdemo/widgets/radio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/webwidget/designdemo/widgets/radio.png -------------------------------------------------------------------------------- /demo/webwidget/designdemo/widgets/select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/webwidget/designdemo/widgets/select.png -------------------------------------------------------------------------------- /demo/webwidget/nativedesign/nativedesigner.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/webwidget/nativedesign/nativedesigner.ico -------------------------------------------------------------------------------- /demo/webwidget/nativedesign/nativedesigner.lpr: -------------------------------------------------------------------------------- 1 | program nativedesigner; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | uses 6 | {$IFDEF UNIX} 7 | cthreads, 8 | {$ENDIF} 9 | {$IFDEF LINUX} 10 | InitSubProcess, // On Linux this unit must be used *before* the "interfaces" unit. 11 | {$ENDIF} 12 | Interfaces, // this includes the LCL widgetset 13 | Forms, frmmain, webideintf 14 | { you can add units after this }; 15 | 16 | {$R *.res} 17 | 18 | begin 19 | RequireDerivedFormResource:=True; 20 | Application.Scaled := True; 21 | Application.Initialize; 22 | Application.CreateForm(TMainForm, MainForm); 23 | Application.Run; 24 | end. 25 | 26 | -------------------------------------------------------------------------------- /demo/webwidget/nativedesign/nativedesigner.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/webwidget/nativedesign/nativedesigner.res -------------------------------------------------------------------------------- /demo/webwidget/widgets/css/widgetsdemo.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | } 6 | 7 | #democontainer { 8 | padding: 10px; 9 | background-color: #E0ECFF; 10 | } 11 | 12 | .propGridTable { 13 | border: solid 1px #95B8E7; 14 | border-spacing: 0; 15 | } 16 | 17 | .propGridGroupRow { 18 | background-color: #E0ECFF; 19 | font-weight: bold; 20 | } 21 | 22 | .propGridGroupRow.pgCollapsible { 23 | cursor: pointer; 24 | } 25 | 26 | .propGridGroupCell { 27 | padding: 5px; 28 | } 29 | 30 | .propGridRow{ 31 | } 32 | 33 | .propGridDataCell { 34 | border: dotted 1px #ccc; 35 | padding: 5px; 36 | } 37 | 38 | .propGridNameCell { 39 | border: dotted 1px #ccc; 40 | padding: 5px; 41 | } -------------------------------------------------------------------------------- /demo/webwidget/widgets/images/freePascal.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kryuski/pas2js-for-delphi/9cfdf70eb6c6e8f9f154d73f53dd26db9203ebed/demo/webwidget/widgets/images/freePascal.jpeg -------------------------------------------------------------------------------- /demo/webwidget/widgets/webwidgetsdemo.lpr: -------------------------------------------------------------------------------- 1 | program webwidgetsdemo; 2 | 3 | {$mode objfpc} 4 | 5 | uses 6 | browserconsole, browserapp, JS, Classes, SysUtils, Web, widgetdemo, frmDemo, Rtl.TemplateLoader, 7 | demohtmlwidgets, democonsts, webrouter, demobootstrap; 8 | 9 | type 10 | TMyApplication = class(TBrowserApplication) 11 | FForm : TDemoForm; 12 | procedure doRun; override; 13 | end; 14 | 15 | procedure TMyApplication.doRun; 16 | 17 | begin 18 | Router.InitHistory(hkHash); 19 | FForm:=TDemoForm.Create(Self); 20 | FForm.Show; 21 | Router.RouteFromURL; 22 | Terminate; 23 | end; 24 | 25 | var 26 | Application : TMyApplication; 27 | 28 | begin 29 | MaxConsoleLines:=15; 30 | ConsoleStyle:=DefaultCRTConsoleStyle; 31 | InitConsole; 32 | Application:=TMyApplication.Create(nil); 33 | Application.Initialize; 34 | Application.Run; 35 | end. 36 | -------------------------------------------------------------------------------- /demo/xterm/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | XTerm demo 9 | 10 | 11 | 12 |
13 |
14 |
15 | 16 | 17 |
18 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /packages/atom/atomexports.js: -------------------------------------------------------------------------------- 1 | 2 | var exports = {}; 3 | exports['pas']=pas; 4 | exports['rtl']=rtl; 5 | module.exports = exports; 6 | -------------------------------------------------------------------------------- /packages/atom/atomimports.js: -------------------------------------------------------------------------------- 1 | require ('atom'); 2 | -------------------------------------------------------------------------------- /packages/fcl-base/fcl_base_pas2js.lpk: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /packages/fcl-base/fcl_base_pas2js.pas: -------------------------------------------------------------------------------- 1 | { This file was automatically created by Lazarus. Do not edit! 2 | This source is only used to compile and install the package. 3 | } 4 | 5 | unit fcl_base_pas2js; 6 | 7 | {$warn 5023 off : no warning about unused units} 8 | interface 9 | 10 | uses 11 | CustApp, NodeJSApp, browserapp; 12 | 13 | implementation 14 | 15 | end. 16 | -------------------------------------------------------------------------------- /packages/fcl-db/pas2js_fcldb.lpk: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /packages/fcl-db/pas2js_fcldb.pas: -------------------------------------------------------------------------------- 1 | { This file was automatically created by Lazarus. Do not edit! 2 | This source is only used to compile and install the package. 3 | } 4 | 5 | unit pas2js_fcldb; 6 | 7 | {$warn 5023 off : no warning about unused units} 8 | interface 9 | 10 | uses 11 | DB, DBConst, JSONDataset, RestConnection, extjsdataset; 12 | 13 | implementation 14 | 15 | end. 16 | -------------------------------------------------------------------------------- /packages/fpcunit/fpcunit_pas2js.pas: -------------------------------------------------------------------------------- 1 | { This file was automatically created by Lazarus. Do not edit! 2 | This source is only used to compile and install the package. 3 | } 4 | 5 | unit fpcunit_pas2js; 6 | 7 | {$warn 5023 off : no warning about unused units} 8 | interface 9 | 10 | uses 11 | FPCUnit, TestRegistry, TestDecorator, ConsoleTestRunner, FPCUnitReport, PlainTestReport, htmltestreport; 12 | 13 | implementation 14 | 15 | end. 16 | -------------------------------------------------------------------------------- /packages/pushjs/pushjs.js: -------------------------------------------------------------------------------- 1 | rtl.module("PushJS",["System","JS"],function () { 2 | "use strict"; 3 | var $mod = this; 4 | $mod.$rtti.$RefToProcVar("TPushFunction",{procsig: rtl.newTIProcSig(null)}); 5 | $mod.$rtti.$RefToProcVar("TPushParamsFallback",{procsig: rtl.newTIProcSig([["payload",$mod.$rtti["TPushFallbackPayload"]]])}); 6 | }); 7 | -------------------------------------------------------------------------------- /packages/rtl/README.txt: -------------------------------------------------------------------------------- 1 | Basic RTL for pas2js programs. 2 | 3 | The files in this directory are part of the Free Pascal pas2js tool. 4 | 5 | See the file COPYING.FPC, included in this distribution, 6 | for details about the copyright. 7 | 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 | -------------------------------------------------------------------------------- /packages/rtl/Rtl.ScriptLoader.pas: -------------------------------------------------------------------------------- 1 | unit Rtl.ScriptLoader; 2 | 3 | interface 4 | 5 | uses types; 6 | 7 | Type 8 | TloadedCallBack = Reference to procedure(Data : TObject); 9 | TProc = reference to procedure; 10 | 11 | Procedure loadScripts(scripts : TStringDynArray; callback : TLoadedCallback; Data : TObject); 12 | 13 | implementation 14 | 15 | uses js, web; 16 | 17 | Procedure loadScripts(scripts : TStringDynArray; callback : TLoadedCallback; Data : TObject); 18 | 19 | Procedure loader (src : String; handler : TProc); 20 | 21 | var 22 | head,script : TJSElement; 23 | 24 | Procedure DoLoaded; 25 | 26 | begin 27 | script.Properties['onload']:=Nil; 28 | script.Properties['onreadystatechange']:=Nil; 29 | Handler; 30 | end; 31 | 32 | begin 33 | script:= document.createElement('script'); 34 | script['src'] := src; 35 | script.Properties['onload'] := @DoLoaded; 36 | script.Properties['onreadystatechange']:=@DoLoaded; 37 | head:=TJSElement(document.getElementsByTagName('head')[0]); 38 | if Head=Nil then 39 | Head:=Document.body; 40 | head.appendChild( script ); 41 | end; 42 | 43 | Procedure run; 44 | begin 45 | if Length(Scripts)<>0 then 46 | loader(String(TJSArray(scripts).shift()), @run) 47 | else if Assigned(callback) then 48 | callback(data); 49 | end; 50 | 51 | begin 52 | Run; 53 | end; 54 | 55 | end. 56 | -------------------------------------------------------------------------------- /packages/rtl/generics.strings.pas: -------------------------------------------------------------------------------- 1 | unit Generics.Strings; 2 | 3 | {$Mode Delphi} 4 | 5 | interface 6 | 7 | resourcestring 8 | SArgumentOutOfRange = 'Argument out of range'; 9 | //SArgumentNilNode = 'Node is nil'; 10 | //SDuplicatesNotAllowed = 'Duplicates not allowed in dictionary'; 11 | //SCollectionInconsistency = 'Collection inconsistency'; 12 | //SCollectionDuplicate = 'Collection does not allow duplicates'; 13 | //SDictionaryKeyDoesNotExist = 'Dictionary key does not exist'; 14 | //SItemNotFound = 'Item not found'; 15 | 16 | implementation 17 | 18 | end. 19 | 20 | -------------------------------------------------------------------------------- /packages/rtl/objpas.pas: -------------------------------------------------------------------------------- 1 | { 2 | This file is part of the Pas2JS run time library. 3 | Copyright (c) 2017 by Mattias Gaertner 4 | 5 | See the file COPYING.FPC, included in this distribution, 6 | for details about the copyright. 7 | 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 | **********************************************************************} 13 | unit ObjPas; 14 | 15 | {$mode objfpc} 16 | 17 | interface 18 | 19 | const 20 | MinInt = -$10000000000000; 21 | MaxInt = $fffffffffffff; 22 | 23 | type 24 | IntegerArray = array of Integer; 25 | TIntegerArray = IntegerArray; 26 | 27 | implementation 28 | 29 | end. 30 | 31 | -------------------------------------------------------------------------------- /packages/rtl/pas2js_rtl.pas: -------------------------------------------------------------------------------- 1 | { This file was automatically created by Lazarus. Do not edit! 2 | This source is only used to compile and install the package. 3 | } 4 | 5 | unit pas2js_rtl; 6 | 7 | {$warn 5023 off : no warning about unused units} 8 | interface 9 | 10 | uses 11 | Classes, JS, Math, ObjPas, RTLConsts, SysUtils, Types, TypInfo, Web, 12 | hotreloadclient, DateUtils, strutils, contnrs, browserconsole, webrouter, 13 | RTTI, webgl; 14 | 15 | implementation 16 | 17 | end. 18 | -------------------------------------------------------------------------------- /packages/rtl/webutils.pas: -------------------------------------------------------------------------------- 1 | unit webutils; 2 | 3 | {$mode objfpc} 4 | 5 | interface 6 | 7 | uses 8 | web, js; 9 | 10 | function AsyncSleep(ms: NativeInt): TJSPromise; 11 | 12 | implementation 13 | 14 | function AsyncSleep(ms: NativeInt): TJSPromise; 15 | 16 | begin 17 | Result := TJSPromise.New( 18 | procedure(resolve,reject : TJSPromiseResolver) 19 | begin 20 | window.setTimeout( 21 | procedure() 22 | begin 23 | resolve(ms); 24 | end, 25 | ms); 26 | end); 27 | end; 28 | 29 | end. 30 | 31 | -------------------------------------------------------------------------------- /packages/vscode/vscodeexports.js: -------------------------------------------------------------------------------- 1 | 2 | var exports = {}; 3 | exports['pas']=pas; 4 | exports['rtl']=rtl; 5 | module.exports = exports; 6 | -------------------------------------------------------------------------------- /packages/vscode/vscodeimports.js: -------------------------------------------------------------------------------- 1 | 2 | // Do not change this name without changing the names of the external objects in libvscode. 3 | var vscode = require ('vscode'); 4 | -------------------------------------------------------------------------------- /packages/webwidget/lazwebwidgets.lpk: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /packages/webwidget/lazwebwidgets.pas: -------------------------------------------------------------------------------- 1 | { This file was automatically created by Lazarus. Do not edit! 2 | This source is only used to compile and install the package. 3 | } 4 | 5 | unit lazwebwidgets; 6 | 7 | {$warn 5023 off : no warning about unused units} 8 | interface 9 | 10 | uses 11 | webwidget; 12 | 13 | implementation 14 | 15 | end. 16 | -------------------------------------------------------------------------------- /test/frmrtlrun.pp: -------------------------------------------------------------------------------- 1 | unit frmrtlrun; 2 | 3 | {$mode objfpc} 4 | 5 | interface 6 | 7 | uses 8 | Classes, fpcunitreport, BrowserConsole, web; 9 | 10 | Type 11 | 12 | { TConsoleRunner } 13 | 14 | TConsoleRunner = Class(TRunForm) 15 | Private 16 | FRun : TJSHTMLButtonElement; 17 | function DoRunTest(aEvent: TJSMouseEvent): boolean; 18 | public 19 | procedure initialize; override; 20 | end; 21 | 22 | implementation 23 | 24 | { TConsoleRunner } 25 | 26 | function TConsoleRunner.DoRunTest(aEvent: TJSMouseEvent): boolean; 27 | begin 28 | Result:=False; 29 | ResetConsole; 30 | If Assigned(OnRun) then 31 | OnRun(Self); 32 | end; 33 | 34 | procedure TConsoleRunner.initialize; 35 | begin 36 | FRun:=TJSHTMLButtonElement(document.getElementById('RunTest')); 37 | FRun.onClick:=@DoRunTest; 38 | ResetConsole; 39 | end; 40 | 41 | end. 42 | 43 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | RTL testsuite 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 |
15 |
16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /test/tohelper.inc: -------------------------------------------------------------------------------- 1 | 2 | V:=value; 3 | AssertEquals('ToString',ValueAsString,V.ToString); 4 | AssertEquals('ToBoolean',True,V.ToBoolean); 5 | V:=0; 6 | AssertEquals('ToBoolean (false)',False,V.ToBoolean); 7 | V:=value; 8 | AssertEquals('ToHexString',ValueAshex,V.ToHexString); 9 | AssertEquals('ToHexString(digits)',ValueAsHexDigString,V.ToHexString(ValueAsHexDig)); 10 | AssertEquals('ToDouble',Double(Value+0.0),V.ToDouble,0.00001); 11 | AssertEquals('ToExtended',Extended(Value+0.0),V.ToExtended,0.00001); 12 | 13 | --------------------------------------------------------------------------------