From fe3b4850c6fd25da2ae981d7c6b02c93fc0b6870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Van=20Canneyt?= Date: Tue, 8 Feb 2022 15:51:26 +0100 Subject: [PATCH 1/8] * New version --- compiler | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler b/compiler index 8f083f6..540fd5e 160000 --- a/compiler +++ b/compiler @@ -1 +1 @@ -Subproject commit 8f083f6342ab8d193d5dc0ae2205bad4b1d7bab9 +Subproject commit 540fd5e58d00e1a70ae02ff74ca199b4f6473599 From 9e4fc04fb3ee1ba0617eeb1f0f11c0fe53624e46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Van=20Canneyt?= Date: Tue, 8 Feb 2022 23:19:59 +0100 Subject: [PATCH 2/8] * Demo of library support --- demo/library/demo_libraries.lpg | 22 ++++++++ demo/library/index.html | 17 ++++++ demo/library/main.lpi | 89 +++++++++++++++++++++++++++++++ demo/library/main.lpr | 44 ++++++++++++++++ demo/library/modules/canvas.lpi | 90 ++++++++++++++++++++++++++++++++ demo/library/modules/canvas.lpr | 14 +++++ demo/library/modules/square.lpi | 82 +++++++++++++++++++++++++++++ demo/library/modules/square.lpr | 71 +++++++++++++++++++++++++ demo/library/modules/ucanvas.pas | 55 +++++++++++++++++++ 9 files changed, 484 insertions(+) create mode 100644 demo/library/demo_libraries.lpg create mode 100644 demo/library/index.html create mode 100644 demo/library/main.lpi create mode 100644 demo/library/main.lpr create mode 100644 demo/library/modules/canvas.lpi create mode 100644 demo/library/modules/canvas.lpr create mode 100644 demo/library/modules/square.lpi create mode 100644 demo/library/modules/square.lpr create mode 100644 demo/library/modules/ucanvas.pas diff --git a/demo/library/demo_libraries.lpg b/demo/library/demo_libraries.lpg new file mode 100644 index 0000000..66696eb --- /dev/null +++ b/demo/library/demo_libraries.lpg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/library/index.html b/demo/library/index.html new file mode 100644 index 0000000..a77cacd --- /dev/null +++ b/demo/library/index.html @@ -0,0 +1,17 @@ + + + + + Basic Pas2JS library example + + + + + + + + diff --git a/demo/library/main.lpi b/demo/library/main.lpi new file mode 100644 index 0000000..7665f65 --- /dev/null +++ b/demo/library/main.lpi @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <CustomData Count="3"> + <Item0 Name="MaintainHTML" Value="1"/> + <Item1 Name="PasJSWebBrowserProject" Value="1"/> + <Item2 Name="RunAtReady" Value="1"/> + </CustomData> + <BuildModes> + <Item Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + </RunParams> + <Units> + <Unit> + <Filename Value="main.lpr"/> + <IsPartOfProject Value="True"/> + </Unit> + <Unit> + <Filename Value="index.html"/> + <IsPartOfProject Value="True"/> + <CustomData Count="1"> + <Item0 Name="PasJSIsProjectHTMLFile" Value="1"/> + </CustomData> + </Unit> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <Target FileExt=".js"> + <Filename Value="main"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="js"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <AllowLabel Value="False"/> + <CPPInline Value="False"/> + <UseAnsiStrings Value="False"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <TargetOS Value="browser"/> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + <UseLineInfoUnit Value="False"/> + </Debugging> + </Linking> + <Other> + <CustomOptions Value="-Jeutf-8 -Jirtl.js -Jc -Jminclude -Tmodule"/> + <CompilerPath Value="$(pas2js)"/> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions> + <Item> + <Name Value="EAbort"/> + </Item> + <Item> + <Name Value="ECodetoolError"/> + </Item> + <Item> + <Name Value="EFOpenError"/> + </Item> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/demo/library/main.lpr b/demo/library/main.lpr new file mode 100644 index 0000000..6df7944 --- /dev/null +++ b/demo/library/main.lpr @@ -0,0 +1,44 @@ +program main; + +{$mode objfpc} + +uses js, web; + +{$linklib ./modules/canvas.js canvas} +{$linklib ./modules/square.js square} + +Type + TCreateCanvasResult = record + ctx : TJSCanvasRenderingContext2D; + id : string; + end; + +Function create(aID : String; aParent : TJSElement; aWidth,aHeight : integer) : TCreateCanvasResult; external name 'canvas.create'; +Function createReportList(aID : String) : string ; external name 'canvas.createReportList'; + +Type + TDrawSquare = record + length,x,y : NativeInt; + color : string; + end; + +function draw(aCTX : TJSCanvasRenderingContext2D; aLength,aX,aY : NativeInt; aColor : String) : TDrawSquare; external name 'square.draw'; +Function randomSquare (aCTX : TJSCanvasRenderingContext2D) : TDrawSquare; external name 'square.randomSquare'; +procedure reportArea (aLength : NativeInt; aListID : string); external name 'square.reportArea'; +procedure reportPerimeter (aLength : NativeInt; aListID : string); external name 'square.reportPerimeter'; + +var + myCanvas : TCreateCanvasResult; + reportList : String; + square1,square2 : TDrawSquare; + +begin + myCanvas:=create('myCanvas', document.body, 480, 320); + ReportList:= createReportList(myCanvas.id); + square1:=draw(myCanvas.ctx, 50, 50, 100, 'blue'); + reportArea(square1.length, reportList); + reportPerimeter(square1.length, reportList); + square2:=randomSquare(myCanvas.ctx); + reportArea(square2.length, reportList); + reportPerimeter(square2.length, reportList); +end. diff --git a/demo/library/modules/canvas.lpi b/demo/library/modules/canvas.lpi new file mode 100644 index 0000000..aca6317 --- /dev/null +++ b/demo/library/modules/canvas.lpi @@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectOptions> + <Version Value="12"/> + <General> + <Flags> + <MainUnitHasCreateFormStatements Value="False"/> + <MainUnitHasTitleStatement Value="False"/> + <MainUnitHasScaledStatement Value="False"/> + <Runnable Value="False"/> + </Flags> + <SessionStorage Value="InProjectDir"/> + <Title Value="canvas"/> + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <CustomData Count="1"> + <Item0 Name="PasJSWebBrowserProject" Value="1"/> + </CustomData> + <BuildModes> + <Item Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + </RunParams> + <Units> + <Unit> + <Filename Value="canvas.lpr"/> + <IsPartOfProject Value="True"/> + </Unit> + <Unit> + <Filename Value="ucanvas.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="uCanvas"/> + </Unit> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <Target FileExt=".js"> + <Filename Value="canvas.js" ApplyConventions="False"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <AllowLabel Value="False"/> + <CPPInline Value="False"/> + <UseAnsiStrings Value="False"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <TargetOS Value="browser"/> + <Optimizations> + <OptimizationLevel Value="0"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + <UseLineInfoUnit Value="False"/> + </Debugging> + <Options> + <ExecutableType Value="Library"/> + </Options> + </Linking> + <Other> + <CustomOptions Value="-Jeutf-8 -Jirtl.js -Jc -Jminclude -O-"/> + <CompilerPath Value="$(pas2js)"/> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions> + <Item> + <Name Value="EAbort"/> + </Item> + <Item> + <Name Value="ECodetoolError"/> + </Item> + <Item> + <Name Value="EFOpenError"/> + </Item> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/demo/library/modules/canvas.lpr b/demo/library/modules/canvas.lpr new file mode 100644 index 0000000..642b14f --- /dev/null +++ b/demo/library/modules/canvas.lpr @@ -0,0 +1,14 @@ +library canvas; + +{$mode objfpc} + +uses + web, ucanvas; + +exports + create, + createReportList; + +begin + // Your code here +end. diff --git a/demo/library/modules/square.lpi b/demo/library/modules/square.lpi new file mode 100644 index 0000000..7ddb465 --- /dev/null +++ b/demo/library/modules/square.lpi @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectOptions> + <Version Value="12"/> + <General> + <Flags> + <MainUnitHasCreateFormStatements Value="False"/> + <MainUnitHasTitleStatement Value="False"/> + <MainUnitHasScaledStatement Value="False"/> + <Runnable Value="False"/> + </Flags> + <SessionStorage Value="InProjectDir"/> + <Title Value="square"/> + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <CustomData Count="1"> + <Item0 Name="PasJSWebBrowserProject" Value="1"/> + </CustomData> + <BuildModes> + <Item Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + </RunParams> + <Units> + <Unit> + <Filename Value="square.lpr"/> + <IsPartOfProject Value="True"/> + </Unit> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <Target> + <Filename Value="square.js" ApplyConventions="False"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <AllowLabel Value="False"/> + <CPPInline Value="False"/> + <UseAnsiStrings Value="False"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <TargetOS Value="browser"/> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + <UseLineInfoUnit Value="False"/> + </Debugging> + <Options> + <ExecutableType Value="Library"/> + </Options> + </Linking> + <Other> + <CustomOptions Value="-Jeutf-8 -Jirtl.js -Jc -Jminclude -O-"/> + <CompilerPath Value="$(pas2js)"/> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions> + <Item> + <Name Value="EAbort"/> + </Item> + <Item> + <Name Value="ECodetoolError"/> + </Item> + <Item> + <Name Value="EFOpenError"/> + </Item> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/demo/library/modules/square.lpr b/demo/library/modules/square.lpr new file mode 100644 index 0000000..587ba80 --- /dev/null +++ b/demo/library/modules/square.lpr @@ -0,0 +1,71 @@ +library square; + +{$mode objfpc} + +uses + SysUtils,JS, Web; + +Type + TDrawSquare = record + length,x,y : NativeInt; + color : string; + end; + +function draw(aCTX : TJSCanvasRenderingContext2D; aLength,aX,aY : NativeInt; aColor : String) : TDrawSquare; + +begin + aCtx.fillStyle:=aColor; + aCtx.fillRect(aX, aY, aLength, aLength); + Result.length:=alength; + Result.x:=aX; + Result.y:=aY; + Result.color:=aColor; +end; + +Function randomSquare (aCTX : TJSCanvasRenderingContext2D) : TDrawSquare; + +var + x,y,l : Integer; + col : string; + +begin + Col:=format('rgb(%d,%d,%d)',[Random(256),Random(256),Random(256)]); + X:=Random(481); + Y:=Random(320); + L:=10+Random(9); + Result:=Draw(aCtx,l,x,y,col); +end; + +procedure reportArea (aLength : NativeInt; aListID : string); + +Var + aItem,aList : TJSHTMLElement; + +begin + aItem:=TJSHTMLElement(document.createElement('li')); + aItem.textContent:=Format('Square area is %dpx squared.',[aLength*aLength]); + aList:=TJSHTMLElement(document.getElementById(aListID)); + alist.appendChild(aItem); +end; + +procedure reportPerimeter (aLength : NativeInt; aListID : string); + +Var + aItem,aList : TJSHTMLElement; + +begin + aItem:=TJSHTMLElement(document.createElement('li')); + aItem.textContent:=Format('Square perimeter is %dpx.',[aLength*4]); + aList:=TJSHTMLElement(document.getElementById(aListID)); + alist.appendChild(aItem); +end; + +exports + draw, + randomSquare, + reportArea, + reportPerimeter; + +begin + // Your code here +end. diff --git a/demo/library/modules/ucanvas.pas b/demo/library/modules/ucanvas.pas new file mode 100644 index 0000000..fc8942f --- /dev/null +++ b/demo/library/modules/ucanvas.pas @@ -0,0 +1,55 @@ +unit uCanvas; + +{$mode ObjFPC} + +interface + +uses + web; + +Type + TCreateCanvasResult = record + ctx : TJSCanvasRenderingContext2D; + id : string; + end; + +Function create(aID : String; aParent : TJSElement; aWidth,aHeight : integer) : TCreateCanvasResult; +Function createReportList(aID : String) : string ; + + +Implementation + +Function create(aID : String; aParent : TJSElement; aWidth,aHeight : integer) : TCreateCanvasResult; + +Var + divWrapper : TJSHTMLElement; + canvasElem : TJSHTMLCanvasElement; + +begin + divWrapper:=TJSHTMLElement(document.createElement('div')); + canvasElem:=TJSHTMLCanvasElement(document.createElement('canvas')); + aParent.appendChild(divWrapper); + divWrapper.appendChild(canvasElem); + + divWrapper.id:=aid; + canvasElem.width := awidth; + canvasElem.height := aheight; + Result.ctx:=TJSCanvasRenderingContext2D(canvasElem.getContext('2d')); + Result.ID:=aID; +end; + +Function createReportList(aID : String) : string ; + +Var + aWrapper,aList : TJSHTMLElement; + +begin + alist:=TJSHTMLElement(document.createElement('ul')); + alist.id:=aId + '-reporter'; + aWrapper:=TJSHTMLElement(document.getElementById(aId)); + aWrapper.appendChild(aList); + Result:=aList.id; +end; + +end. + From bd550876b26916eb16117fd24cccccfa6befd2d3 Mon Sep 17 00:00:00 2001 From: FPC_Admin <michael.vancanneyt+fpcadmin@gmail.com> Date: Wed, 9 Feb 2022 01:00:08 +0000 Subject: [PATCH 3/8] * updated --- compiler | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler b/compiler index 540fd5e..bbece3e 160000 --- a/compiler +++ b/compiler @@ -1 +1 @@ -Subproject commit 540fd5e58d00e1a70ae02ff74ca199b4f6473599 +Subproject commit bbece3e6680dd7a7a9454b1f55db125619f8e639 From ffcb2ac150b21b96d681a0420eca71976c90ea41 Mon Sep 17 00:00:00 2001 From: Henrique Gottardi Werlang <henriquewerlang@hotmail.com> Date: Tue, 25 May 2021 11:01:34 -0300 Subject: [PATCH 4/8] Invariant no format settings. --- packages/rtl/sysutils.pas | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/packages/rtl/sysutils.pas b/packages/rtl/sysutils.pas index 2522c42..c566d4c 100644 --- a/packages/rtl/sysutils.pas +++ b/packages/rtl/sysutils.pas @@ -93,6 +93,7 @@ type class var InitLocaleHandler : TLocaleInitCallback; class function Create: TFormatSettings; overload; static; class function Create(const ALocale: string): TFormatSettings; overload; static; + class function Invariant: TFormatSettings; static; end; @@ -4960,11 +4961,6 @@ begin Result:='0'+Result; end; - - -{ TFormatSettings } - - { TFormatSettings } class function TFormatSettings.Create: TFormatSettings; @@ -4972,11 +4968,8 @@ begin Result := Create(GetJSLocale); end; - -class function TFormatSettings.Create(const ALocale: string): TFormatSettings; - +class function TFormatSettings.Create(const ALocale: String): TFormatSettings; begin - Result.LongDayNames:=DefaultLongDayNames; Result.ShortDayNames:=DefaultShortDayNames; Result.ShortMonthNames:=DefaultShortMonthNames; @@ -4998,10 +4991,35 @@ begin Result.NegCurrFormat:=0; Result.CurrencyDecimals:=2; Result.CurrencyString:='$'; - If Assigned(TFormatSettings.InitLocaleHandler) then + + if Assigned(TFormatSettings.InitLocaleHandler) then TFormatSettings.InitLocaleHandler(UpperCase(aLocale),Result); end; +class function TFormatSettings.Invariant: TFormatSettings; +begin + Result.CurrencyString := #$00A4; + Result.CurrencyFormat := 0; + Result.CurrencyDecimals := 2; + Result.DateSeparator := '/'; + Result.TimeSeparator := ':'; + Result.ShortDateFormat := 'MM/dd/yyyy'; + Result.LongDateFormat := 'dddd, dd MMMMM yyyy HH:mm:ss'; + Result.TimeAMString := 'AM'; + Result.TimePMString := 'PM'; + Result.ShortTimeFormat := 'HH:mm'; + Result.LongTimeFormat := 'HH:mm:ss'; + Result.ShortMonthNames := DefaultShortMonthNames; + Result.ShortMonthNames := DefaultShortMonthNames; + Result.LongMonthNames := DefaultLongMonthNames; + Result.ShortDayNames := DefaultShortDayNames; + Result.LongDayNames := DefaultLongDayNames; + Result.ThousandSeparator := ','; + Result.DecimalSeparator := '.'; + Result.TwoDigitYearCenturyWindow := 50; + Result.NegCurrFormat := 0; +end; + class function TFormatSettings.GetJSLocale: string; assembler; asm return Intl.DateTimeFormat().resolvedOptions().locale From cd47ca8a6f396942a81d4edb78d63e0ec21063a1 Mon Sep 17 00:00:00 2001 From: FPC_Admin <michael.vancanneyt+fpcadmin@gmail.com> Date: Thu, 10 Feb 2022 01:00:07 +0000 Subject: [PATCH 5/8] * updated --- compiler | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler b/compiler index bbece3e..ba51494 160000 --- a/compiler +++ b/compiler @@ -1 +1 @@ -Subproject commit bbece3e6680dd7a7a9454b1f55db125619f8e639 +Subproject commit ba51494bd7d9f5552c91918ea01f3c9e02152149 From 9acccfe26777544bd2956a6013e9cc57c7a2c09b Mon Sep 17 00:00:00 2001 From: FPC_Admin <michael.vancanneyt+fpcadmin@gmail.com> Date: Fri, 11 Feb 2022 01:00:07 +0000 Subject: [PATCH 6/8] * updated --- compiler | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler b/compiler index ba51494..12ef9a4 160000 --- a/compiler +++ b/compiler @@ -1 +1 @@ -Subproject commit ba51494bd7d9f5552c91918ea01f3c9e02152149 +Subproject commit 12ef9a4a223ec54c16cbe96a8107c7aa26380cbe From 4f7a2f2d03817d52891e8bd39ec0a7152d7ea56b Mon Sep 17 00:00:00 2001 From: FPC_Admin <michael.vancanneyt+fpcadmin@gmail.com> Date: Sat, 12 Feb 2022 01:00:07 +0000 Subject: [PATCH 7/8] * updated --- compiler | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler b/compiler index 12ef9a4..1fce64f 160000 --- a/compiler +++ b/compiler @@ -1 +1 @@ -Subproject commit 12ef9a4a223ec54c16cbe96a8107c7aa26380cbe +Subproject commit 1fce64fa0a780d4b0753eae79c2ae172ca8fb58e From e4c3a83f763bcf2b297040d41140ae151054a590 Mon Sep 17 00:00:00 2001 From: FPC_Admin <michael.vancanneyt+fpcadmin@gmail.com> Date: Sun, 13 Feb 2022 01:00:09 +0000 Subject: [PATCH 8/8] * updated --- compiler | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler b/compiler index 1fce64f..3c91a7c 160000 --- a/compiler +++ b/compiler @@ -1 +1 @@ -Subproject commit 1fce64fa0a780d4b0753eae79c2ae172ca8fb58e +Subproject commit 3c91a7c01ea16f5fc9239b21636d4127faacaf31