Clemens Schwaighofer
37367db878
Fix regex for $$ PostgresSQL string in convert placeholder
2025-04-07 19:44:18 +09:00
Clemens Schwaighofer
2d30d1d160
Rewrite DB param lookup
...
* Correct wrong comment lookup
* simplify regex by excluding comment and string blocks before
* simpler lookup for each type
* update checks for more tests for various special cases
In DB IO
* add a function to return all placeholders found in a query
* only numbered parameters are looked up
2025-04-07 17:30:30 +09:00
Clemens Schwaighofer
531229e8b7
Add DB Encryption tests
2025-04-07 12:05:06 +09:00
Clemens Schwaighofer
d09c20ff9d
hash test page update
2025-04-07 09:09:45 +09:00
Clemens Schwaighofer
f4ddc5a5fc
Add hash hmac to the Create Hash class
2025-04-07 09:05:37 +09:00
Clemens Schwaighofer
1791ec3908
phan and phpstan fixes for hash uses in CoreLibs
2025-04-04 15:17:42 +09:00
Clemens Schwaighofer
3d13f55c35
Update Hash Class
...
Add new constant: STANDARD_HASH for sha256
Deprecate DEFAULT_HASH is now STANDARD_HASH_SHORT
Deprecated
__sha1Short:
replace with __crc32b with the default parameter use_sha false
replace with sha1Short if use_sha is true
__hash:
replace with hashShort if default hash type
replace with hash for all others with new default STANDARD_HASH
__hashLong:
replace with hashLong
New:
hashShort: returns STANDARD_HASH_SHORT which is __hash default type
hashStd: returns STANDARD_HASH sha256
hash: switches to STANDARD_HASH as default type
2025-04-04 15:08:58 +09:00
Clemens Schwaighofer
cf1989819a
phpstan fixes
2025-04-01 11:22:59 +09:00
Clemens Schwaighofer
b302fb4053
Add CombinedDateTime class calcDaysInteral wrapper functions
...
calcDaysIntervalNamedIndex for force using named index and returning only named index
calcDaysIntervalNumIndex for force using numeric index and returning only numeric index
2025-04-01 11:15:00 +09:00
Clemens Schwaighofer
32decdd037
Readme update
2025-03-28 10:58:07 +09:00
Clemens Schwaighofer
46cda40d37
JavaScript general utils file updates
2025-03-28 10:53:42 +09:00
Clemens Schwaighofer
e71df90144
Fully deprecate prototype edit.js, add deprecation warnings to edit.jq.js and add new utils
...
Note that all the utils.js are build in an external repository and just copied here
2025-03-10 11:00:02 +09:00
Clemens Schwaighofer
bbcc642fde
All "edit.js" development has moved to a new repository
...
"Code-Blocks.javascript-utils"
2025-03-07 15:09:47 +09:00
Clemens Schwaighofer
558694aa6c
Fix DEFAULT_ENCODING that it is string
2025-02-28 10:32:43 +09:00
Clemens Schwaighofer
f3bd09529a
phpstan fixes
2025-02-28 10:29:04 +09:00
Clemens Schwaighofer
816bb7c9ee
Allow encoding ovrride for htmlentities
2025-02-28 10:19:36 +09:00
Clemens Schwaighofer
fc7b705355
config.master.php file update
...
- remove not used code
- reorder defines for possible clean up targets
- TARGET and HOST_NAME are set early
HOST NAME is set right at the top
TARGET is set after site configs is read
- add more $_ENV reads
DEFAULT_ACL_LEVEL
LOCALE (encoding is read from locale which should be in the format of nn_CT.ENCODING, eg en_US.UTF-8), falls back to UTF-8
ADMIN.STYLESHEET
ADMIN.JAVASCRIPT
2025-02-28 10:17:10 +09:00
Clemens Schwaighofer
7b96c1f9ca
Remove old eslint config, replaced with mjs one
2025-02-17 12:55:20 +09:00
Clemens Schwaighofer
26c6ebcea7
Merge branch 'NewFeatures' into Update-eslintrcToFlatLayout
2025-02-17 12:54:23 +09:00
Clemens Schwaighofer
32dee1692e
Fix DateTime days internal counter
...
Fixed the bad coded include end date with using flags instead
Allow exclude of start date
Reverse counter fixed, and also includes weekend days
Add reverse for weekend in date interval
Login class: add numeric for ACL level
DB IO: some minor code clean up for not needed var set check
Some edit.jq.js clean ups and added
- loadEl: load element by id and return element value or throw error if not found
- goTo: scroll to an element with scroll into view call
2025-02-17 11:16:51 +09:00
Clemens Schwaighofer
6291ed88c0
eslint config update
2025-02-13 19:01:44 +09:00
Clemens Schwaighofer
5e21ead6fa
change error catcher for javasript from log to error as output
2025-02-13 18:24:50 +09:00
Clemens Schwaighofer
07fbd13213
Setup npm with eslint
2025-02-13 18:24:30 +09:00
Clemens Schwaighofer
44b825310a
Add ACL level number to unit detail
2025-02-07 19:06:35 +09:00
Clemens Schwaighofer
2c234ccef6
On config errors do not exit but throw exception
2025-01-29 09:57:58 +09:00
Clemens Schwaighofer
b493b3c4fd
Remove debug message
2025-01-20 20:27:34 +09:00
Clemens Schwaighofer
e7dd96b5d9
Further fixes for PHP 8.4
2025-01-20 20:27:03 +09:00
Clemens Schwaighofer
bcde36ac17
DB IO Cache reset should not be an error
...
If the query is not found, do not throw an error, just show a warning
2025-01-20 10:45:31 +09:00
Clemens Schwaighofer
8bde34ec7d
Fix bug in DB IO prepared statement with INSERT and auto RETURNING add
...
INSERT will get a RETURNING added automatically if it has a primary key
This was not checked when query was compared for prepared statements.
Also added a prepared statement status checker
2025-01-17 17:52:41 +09:00
Clemens Schwaighofer
a345d71306
De-depricate the ACL Login loginCheckEditAccessId method
...
This is still used a lot, and there is no reason to deprecate it so early.
First all the other logic should be brought in to make this an easy
conversion.
2025-01-17 14:43:13 +09:00
Clemens Schwaighofer
0ff6294faa
Fix ACL Login cuid <-> id pk lookups
...
Used the wrong SESSION var for lookup
2025-01-17 14:34:41 +09:00
Clemens Schwaighofer
757d7ae01d
ACL Login fixes for legacy id lookups
...
add an edit access id lookup to cuid
Fix unit_cuid not initialized, only old unit_id
2025-01-17 12:48:46 +09:00
Clemens Schwaighofer
4e78b21c67
phpstan fix for fegetcsv param $length
2025-01-17 09:59:39 +09:00
Clemens Schwaighofer
d7e6434808
New DeprecatedHelper namespace
...
For temporary wrapper functions for deprecated calls that need this
PHP 8.4 fputcsv/fgetcsv/str_getcsv encoding default change deprecated warning
Note this does not cover the SqlFileInfo class as this is not used in our code
2025-01-17 09:58:02 +09:00
Clemens Schwaighofer
443cc2751d
Update Logging file name change unit tests
2025-01-17 09:33:05 +09:00
Clemens Schwaighofer
cf6500b55a
Logging class change to "." for block separator
...
Blocks for info are now separated with "." and not "_" to make it visual more easy to see
2025-01-17 09:08:13 +09:00
Clemens Schwaighofer
09c2ec653f
ACL Login set deprecated edit user id too
...
We need that for some old calls in old projects
2025-01-16 14:49:15 +09:00
Clemens Schwaighofer
fc105f9295
Add ACL Login lookup edit access id to edit access cuid
2025-01-16 14:36:11 +09:00
Clemens Schwaighofer
053ab69330
Add edit access cuuid to the unit detail list
2025-01-16 14:04:30 +09:00
Clemens Schwaighofer
fd079316f5
ACL Login: Add edit_access_id to unit detail block
...
This is needed for a lot of legacy data lookup
2025-01-16 13:55:17 +09:00
Clemens Schwaighofer
08664e9834
Update log writing for login info
...
Fix the deprecated message in the Admin/Backend one with a full sample
Update the admin_header include sample page with the corret writeLog call
2025-01-16 10:40:41 +09:00
Clemens Schwaighofer
e063162161
Remove not needed use parts and ignore noop new for phan check
2025-01-15 12:53:02 +09:00
Clemens Schwaighofer
7fbc449a5c
PHPunit test call script update
...
Fix for default PHP set via getting version from default PHP.
Add a verbose option and remove the fixed verbose setting from the phpunit config
Update the options call to add a usage info block
2025-01-15 11:57:25 +09:00
Clemens Schwaighofer
72912c8c90
Bad password check for PHP earlier than 8.4
2025-01-06 13:52:28 +09:00
Clemens Schwaighofer
de2ed8be3d
EditBase SmartyExtended class call update
2024-12-27 17:07:44 +09:00
Clemens Schwaighofer
9d65f5d7c1
phpunit script update, SmartyExtended allow load of plugins
...
- phpunit has better options set for testdox/php version
- SmartyExtended has logger class as option (argument 2) and options
- SmartyExtneded can via option set html escape and load of plugins
- plugin array is set of
- file: path to plugin file
- type: what type this is
- tag: tag name
- callable: the callable for the tag name
- will throw exceptions on plugin load
- for all other things will set warning only and skip read
- fix the Smarty call with the logger option
- fix password test for PHP 8.4 password hash change
*IMPORTANT*
SmartyExtended($l10n, $logger, $cache_id, $compile_id)
The second argument is now the Logger class, this MUST be updated for all calls
2024-12-27 14:00:12 +09:00
Clemens Schwaighofer
fbe827e989
Update Smarty Extended for Smarty-extended v5 upgrade
2024-12-27 11:30:55 +09:00
Clemens Schwaighofer
c778a4eb81
Add phive back in for static tools like phpunit instead of using the composer package
2024-12-27 09:32:54 +09:00
Clemens Schwaighofer
ce1c72a0bc
Bug fix for DB IO parameters in CASE calls
2024-12-24 12:43:30 +09:00
Clemens Schwaighofer
10319ef728
Fix throws type for AsymmetricAnonymousEncryption in the phpdoc part
2024-12-23 12:56:57 +09:00
Clemens Schwaighofer
8d0036eaac
Fix phpdoc return types
2024-12-23 11:26:50 +09:00
Clemens Schwaighofer
d1e65c702e
Allow Seession settings to be changed
...
eg set the auto write + others
or set/unset can be chagned for single sets
2024-12-20 18:48:00 +09:00
Clemens Schwaighofer
7248906da7
Allow chaining of key set functions for encryption
2024-12-20 15:13:22 +09:00
Clemens Schwaighofer
7f9a4dc04f
Merge branch 'Feature-AsymmetricEncryption' into NewFeatures
2024-12-18 10:52:29 +09:00
Clemens Schwaighofer
10935214eb
Fix Class file name for asymmetric anonymous encryption
2024-12-18 10:50:27 +09:00
Clemens Schwaighofer
41e116f7d4
phpstan checks for level 9
2024-12-18 10:11:47 +09:00
Clemens Schwaighofer
881c93c343
Asymmetric Anoymouse Encryption phpunit tests
2024-12-18 09:56:48 +09:00
Clemens Schwaighofer
185d044a0b
Symmetric encryption key set tests
2024-12-17 18:23:10 +09:00
Clemens Schwaighofer
cc067cc202
Update symmetric encryption with compare/get key, empty key test, unset on end
...
All key and messages are set SensitiveParameter type
On end, unset the key parameter with sodium mem zero
Get/Compare key set methods
Additional check on empty key
Add missing sodium mem zero for inner function variable clean up
2024-12-17 15:18:06 +09:00
Clemens Schwaighofer
37e2e54b2a
Add asymmetric anonymous encryption
...
Private/Public key encryption for anonymous messages (not receipient)
2024-12-17 15:16:48 +09:00
Clemens Schwaighofer
711b3bfe97
Remove E_STRICT from error reporting, it is deprecated
2024-12-13 18:45:27 +09:00
Clemens Schwaighofer
3bd21c75d8
Make the font-size for ACL Login template a bit smaller
...
1.5em was too large, 1.3em is better
2024-12-13 13:58:56 +09:00
Clemens Schwaighofer
4971f62490
ecuid name fix in test file
2024-12-13 11:42:45 +09:00
Clemens Schwaighofer
1cf4fdf31a
Fix column named for edit_log to eu prefixed
...
as eucuid and eucuuid
2024-12-13 11:37:52 +09:00
Clemens Schwaighofer
d16b920966
Update arrayReturnMatchinKeyOnly description
2024-12-13 11:29:37 +09:00
Clemens Schwaighofer
ab52bf59b5
phan/phpstan fixes
2024-12-13 10:38:24 +09:00
Clemens Schwaighofer
a8dd076aac
Merge branch 'NewFeatures' into Feature-LoginClassAddUuidv4
2024-12-13 10:27:49 +09:00
Clemens Schwaighofer
c17ca1f847
Merge branch 'development'
2024-12-13 10:21:41 +09:00
Clemens Schwaighofer
e349613d60
phpunit updates
...
Add testsuits for default run
Fix wording in testdox
add a fallback in the Debugging Support test suit
2024-12-13 10:17:28 +09:00
Clemens Schwaighofer
e9cfdb4bf0
Remove all deprecated tests
2024-12-13 09:35:54 +09:00
Clemens Schwaighofer
f966209e0a
phpstan param declration fix for ACL Login user status
2024-12-12 21:20:09 +09:00
Clemens Schwaighofer
c13934de99
Fix for wrong key handling in Symmetric encryption
2024-12-12 21:09:41 +09:00
Clemens Schwaighofer
1e90bb677e
Fix Symmetric encryption with wrong key handling
...
- static call encrypt: do not check pre set key
- indirect call: set new if key is different
2024-12-12 21:07:17 +09:00
Clemens Schwaighofer
540269e61f
Fix update script for now to clock_timestamp
2024-12-12 19:04:21 +09:00
Clemens Schwaighofer
e793c3975b
Change all db now to clock_timestamp for triggers
2024-12-12 12:02:49 +09:00
Clemens Schwaighofer
7d4c9724fe
Fix session options argument declaration for phpstan
2024-12-11 21:10:00 +09:00
Clemens Schwaighofer
d1c4611431
Indent fix for ACL Login
2024-12-11 21:06:59 +09:00
Clemens Schwaighofer
8d3882a6fe
Session and ACL Login Class update
...
Session:
regenerate session id after some time or random.
Default is 'never', can be 'interval' form 0 to 1h and random from always to 1 in 100
Session also checks that strict session settings are enabled
Login class:
Automatic re-read of acl settings after some time (default 5min, can be chnaged via option).
Default set strict headers, can be turned off via option
Moved various parts into their own methods and cleaned up double call logic.
Login is now recorded in the last login entry
no more debug flags are read from the database anymore
All options are set via array and not with a single option (was auto login)
2024-12-11 21:05:56 +09:00
Clemens Schwaighofer
2b0434e36b
Merge branch 'NewFeatures' into Feature-AclLoginClassUpdateTokenCheckWithUuidV4
2024-12-11 10:36:57 +09:00
Clemens Schwaighofer
ba11a936db
DB IO remove debug placeholder output
2024-12-11 10:36:31 +09:00
Clemens Schwaighofer
df591659cb
Merge branch 'NewFeatures' into Feature-AclLoginClassUpdateTokenCheckWithUuidV4
2024-12-11 10:35:19 +09:00
Clemens Schwaighofer
5343034768
Fix DB IO placeholder detect and count regex
...
comment regex: (?:\-\-[^\r\n]*?\r?\n)*
Which is AFTER the element search as the comment can appear anywhere after the tag trigger
2024-12-11 10:30:41 +09:00
Clemens Schwaighofer
dec56c9559
Merge remote-tracking branch 'all/NewFeatures' into Feature-AclLoginClassUpdateTokenCheckWithUuidV4
2024-12-10 15:28:59 +09:00
Clemens Schwaighofer
880f15ac6f
Merge branch 'development'
2024-12-10 15:26:24 +09:00
Clemens Schwaighofer
a46601fe03
Sync folder is master and not trunk
2024-12-10 15:25:17 +09:00
Clemens Schwaighofer
022c39e791
Add missing phpunit test folder for deprecated session var load test
2024-12-10 15:24:45 +09:00
Clemens Schwaighofer
fdefaca301
Missing php unit test path for locale check
2024-12-10 15:22:59 +09:00
Clemens Schwaighofer
46e44c19bf
edit log table column order update
2024-12-10 14:44:42 +09:00
Clemens Schwaighofer
41cb6358f9
phpunit checks update, update edit_log logging sets
2024-12-10 14:40:07 +09:00
Clemens Schwaighofer
23142a4549
Merge branch 'Bug-DBIOWrongParamCountWithCommentBeforeParam' into Feature-AclLoginClassUpdateTokenCheckWithUuidV4
2024-12-10 13:37:43 +09:00
Clemens Schwaighofer
a7742bd5c8
DB IO count params fix for comments
2024-12-10 13:36:57 +09:00
Clemens Schwaighofer
50f83b822c
Merge branch 'Bug-DBIOWrongParamCountWithCommentBeforeParam' into Feature-AclLoginClassUpdateTokenCheckWithUuidV4
2024-12-10 12:02:31 +09:00
Clemens Schwaighofer
78591d6ba4
Fix Param regex lookup
...
Query was not counting params after "--" comment strings
2024-12-10 12:01:06 +09:00
Clemens Schwaighofer
e8299a123b
Update Edit Log with JSONB blocks
...
all action data goes into a JSON block and the old action columns will be deprecated
Same for ip, new ip address block with all possible ip addeses
Additional HTTP_ data goes into the http_data block
new request_schema column to get if the request was done to http or https
2024-12-10 10:06:49 +09:00
Clemens Schwaighofer
10c320f60c
Rename all ACL Login session vars to LOGIN_, remove debug enties
...
All ACL\Login loaded _SESSION vars are now prefixd with LOGIN_
only the language one stay as "DEFAULT_"
Removed DEBUG_ALL/DB_DEBUG as they are now fully removed from everywhere
- removed the edit user entries
- removed from the edit user table
The LANG direct loaded language entries is removed too. We only use locale and encoding.
No more LOCALE_PATH and DEFAULT_DOMAIN _SESSION are set during the option set
2024-12-09 19:37:23 +09:00
Clemens Schwaighofer
eeca138192
Remove the debug/db_debug flag from the edit user edit interface
...
These settings are deprecated and do nothing. keep the DB default values for now, but update table create to remove them.
They are set to 0
2024-12-09 19:22:54 +09:00
Clemens Schwaighofer
65715ea9c3
Add Array function to return only array entries based on matching key
...
A simple key based array filter
2024-12-09 19:13:03 +09:00
Clemens Schwaighofer
a56cbd8e97
ACL Login update layout to work with PC/Smartphone
...
Updated login template and password change template block
2024-12-09 16:20:21 +09:00
Clemens Schwaighofer
fe50a988a0
Switch session ACL Login user load check to cuuid
...
Update tests too for using edit user cuuid instead of the primary key
2024-12-06 20:11:28 +09:00
Clemens Schwaighofer
a84ab86e31
Various fixes for ACL Login methods with deprecated calls
...
make all calls that go through primary keys as deprecated
create CUID calls for all of them
Update phpunit tests with new cuid tests, keep old deprecated tests
2024-12-06 18:07:06 +09:00
Clemens Schwaighofer
b044999772
ACL Login query update to params and heredoc
...
All queries are in Params and all SQL is in heredoc blocks
Disable 1011 error entry, this is no longer used
2024-12-06 16:31:20 +09:00
Clemens Schwaighofer
98bf3a40cd
Add logout button to class.test.php for logout test, ANY placeholder db test
2024-12-06 14:54:09 +09:00
Clemens Schwaighofer
cbd47fb015
edit log table update, Change all DB tests serial to identity for primary key
2024-12-05 14:59:49 +09:00
Clemens Schwaighofer
5f89917abd
Add composer keywords
2024-12-05 14:30:12 +09:00
Clemens Schwaighofer
eeaff3042e
phpstan config file update with phpVersion information
2024-12-05 14:16:57 +09:00
Clemens Schwaighofer
d070c4e461
phan min php set to 8.2
2024-12-05 13:59:20 +09:00
Clemens Schwaighofer
e57c336dba
Clean up to use session methods and not _SESSION directly
...
Add session_unset for unsetAll and rename this method to "clear"
2024-12-05 13:52:45 +09:00
Clemens Schwaighofer
075fe967d5
Merge branch 'NewFeatures' into Feature-FixSessionClass
2024-12-05 12:18:51 +09:00
Clemens Schwaighofer
0e5f637052
Update Serial to Identity function
...
Return status as varchar from change.
clean up edit table SQL files with too many empty lines
2024-12-05 12:11:07 +09:00
Clemens Schwaighofer
2e1b767a85
Fix Session class with Many update and get
...
Update Login and Backend class to use interface when writing to avoid
problems with not written _SESSION vars with session is in write close status
2024-12-05 12:09:58 +09:00
Clemens Schwaighofer
f78c67c378
Fix ACL Login phpunit test
2024-12-04 14:17:16 +09:00
Clemens Schwaighofer
75e69932fc
Session class rewrite
...
create new session on class call, there is no need to delay that at all
new option to auto write close a session
session_id and session_name are stored as class vars
deprecate the __set/__get part because we do not want to set via ->session_var_name
but use the set()/get() methods.
They have been renamed from setS/getS... to set/get alone
2024-12-04 14:10:36 +09:00
Clemens Schwaighofer
7354632479
ACL Login update with cuuid and cuid add/update and move write log to login class
...
Add a UUIDv4 column to edit_generic as cuuid, add the cuid column to all reads with
the cuuid too
The cuuid will replace the cuid and remove the EUID as the session login var
Moved the adbEditLog to login class as writeLog and renamed the current private writeLog to writeEditLog which is only for internal logging in the class
The Backend log class is deprecated and a new get all action var method has been added to get the action vars into the edit log
2024-12-03 13:16:47 +09:00
Clemens Schwaighofer
5a21d22c7b
Add edit user cuid to session and ACL read
...
This is for phasing out the EUID and replace it with an UUIDv4 for any user settings
2024-12-02 17:09:02 +09:00
Clemens Schwaighofer
cee3b5c2d1
HSB Colorspace skip phpstan colorspace variable never read
2024-12-02 15:45:47 +09:00
Clemens Schwaighofer
47e44c15cc
Add a uuid4 validate method
2024-12-02 15:36:21 +09:00
Clemens Schwaighofer
83738adcb6
Remove old code
2024-11-27 14:32:34 +09:00
Clemens Schwaighofer
5454133239
Update SQL\PgSQL with param calls and heredoc, primary key search method update
...
The primary key currval select is udpated to use proper calls so it works with
serial and identity columns
2024-11-22 17:25:22 +09:00
Clemens Schwaighofer
87f35f23c3
edit_* table update for serial to identity columns
2024-11-22 17:24:34 +09:00
Clemens Schwaighofer
3c4c5d3106
Upgrade PostgreSQL serial to identity columns function
...
Function to help update PostgreSQL serial columns to identity
2024-11-22 17:21:07 +09:00
Clemens Schwaighofer
b080727ff3
Add missing PgSQL to the Interface
2024-11-21 10:40:24 +09:00
Clemens Schwaighofer
ae044bee6f
DB IO Placeholder convert fixers and updates
...
Add more checks in phpunit for this,
Update the placeholder check and convert and move all regex into the
placeholder convert support class
Move $ placeholder count function to the SQL\PgSQL class
Note: further moves of PgSQL only stuff have to be done for SQLite
SQL class add
2024-11-20 19:07:10 +09:00
Clemens Schwaighofer
529b6a75ba
Set base path for config file to load in edit_base.php
2024-11-19 15:43:00 +09:00
Clemens Schwaighofer
8de112ba7e
Math Matrix multiplication fix for unbalanced array rows
...
Test for unbalanced arrays to matrix multiplication and fix unbalanced a array
2024-11-19 10:24:37 +09:00
Clemens Schwaighofer
ad070ebdf4
Composer phpstan update 2.0
2024-11-18 18:33:04 +09:00
Clemens Schwaighofer
9edfc2acb6
phpstan 2.0 update checks
2024-11-18 17:08:28 +09:00
Clemens Schwaighofer
35cc6dbf91
Minor fixes for some calls
2024-11-18 14:52:36 +09:00
Clemens Schwaighofer
cb3d5e1f27
Matrix multiplication fixes
2024-11-18 14:44:18 +09:00
Clemens Schwaighofer
0a45300c21
fix the deprecation version for Colors class calls
2024-11-18 10:12:48 +09:00
Clemens Schwaighofer
54ce378ae2
Text fix for deprecation message
2024-11-18 10:10:39 +09:00
Clemens Schwaighofer
4ac659f7d9
Colors deprecation messages and remove Class Basic color convert calls
2024-11-18 09:50:24 +09:00
Clemens Schwaighofer
497833ca71
phpunit test updated to removal of __get
2024-11-15 19:45:36 +09:00
Clemens Schwaighofer
e5a9b149b1
phpstan fixes with move away from __get to dedicated get
2024-11-15 19:43:30 +09:00
Clemens Schwaighofer
5213805a58
phan updates
2024-11-15 18:18:45 +09:00
Clemens Schwaighofer
a9f1d878f7
Math: add epsilon compare for float, update Color Coordinate calls
...
Math has a compare with epsilon for float numbers.
Use this for fixing sligth color conversion issues.
NOTE: this might need some adjustment over time
All phpunint tests written and checked
2024-11-15 18:13:16 +09:00
Clemens Schwaighofer
3845bc7ff5
Color Coordinates class udpates
...
move creation into the main constructor and do not rely on "::create" or
any other pass through creation.
Make all constructors equal with options array so we can create an Interface
Remove all outsite setters. Once a color is set this color stays
2024-11-14 14:51:31 +09:00
Clemens Schwaighofer
32c192a362
Basic colors test add started
...
Also fixes for various things that come up during test writing
Test phpunit not yet finished (exceptions, etc)
Note: a lot of checks for extreme values are (int) so we do not fail
for small float values
2024-11-13 19:19:35 +09:00
Clemens Schwaighofer
2bd68f32ac
Legacy color convert update to use new methods
2024-11-13 13:16:02 +09:00
Clemens Schwaighofer
f5964fed02
Legacy colors test update
2024-11-13 12:45:21 +09:00
Clemens Schwaighofer
625272198d
Math matrix phpunit checks added
2024-11-13 11:42:24 +09:00
Clemens Schwaighofer
00821bd5ea
Move all Cie XYZ to dedicated class as this is not used in direct frontend convert
...
Clean up old Colors class with calling new class calls
Test all and set phpstan deprecated messages
Add all missing convert functions for oklab/cielab/oklch/cielch calls
Prepare for test run creation
2024-11-12 18:53:18 +09:00
Clemens Schwaighofer
921b9cb3d9
Remove not used Color Coordinate classes and old oklab convert class
2024-11-12 18:53:02 +09:00
Clemens Schwaighofer
720b78b687
Add CIE XYZ classes for D50/D65 whitespace before clean up
2024-11-12 18:52:24 +09:00
Clemens Schwaighofer
565014e1e2
diff --git c/4dev/tests/Convert/CoreLibsConvertMathTest.php i/4dev/tests/Convert/CoreLibsConvertMathTest.php
...
index 9a97e37e..c98b4b2a 100644
--- c/4dev/tests/Convert/CoreLibsConvertMathTest.php
+++ i/4dev/tests/Convert/CoreLibsConvertMathTest.php
@@ -113,6 +113,8 @@ final class CoreLibsConvertMathTest extends TestCase
\CoreLibs\Convert\Math::initNumeric($input)
);
}
+
+ // TODO: cbrt tests
}
// __END__
diff --git c/www/admin/class_test.convert.colors.php i/www/admin/class_test.convert.colors.php
index 6f809691..a37cb2df 100644
--- c/www/admin/class_test.convert.colors.php
+++ i/www/admin/class_test.convert.colors.php
@@ -19,6 +19,8 @@ $LOG_FILE_ID = 'classTest-convert-colors';
ob_end_flush();
use CoreLibs\Convert\Colors;
+use CoreLibs\Convert\Color\Color;
+use CoreLibs\Convert\Color\Coordinates;
use CoreLibs\Debug\Support as DgS;
use CoreLibs\Convert\SetVarType;
@@ -52,16 +54,16 @@ try {
print "**Exception: " . $e->getMessage() . "<br><pre>" . print_r($e, true) . "</pre><br>";
}
// B(valid)
-$rgb = [10, 20, 30];
+$rgb = [50, 20, 30];
$hex = '#0a141e';
$hsb = [210, 67, 12];
$hsb_f = [210.5, 67.5, 12.5];
-$hsl = [210, 50, 7.8];
+$hsb = [210, 50, 7.8];
print "S::COLOR rgb->hex: $rgb[0], $rgb[1], $rgb[2]: " . Colors::rgb2hex($rgb[0], $rgb[1], $rgb[2]) . "<br>";
print "S::COLOR hex->rgb: $hex: " . DgS::printAr(SetVarType::setArray(
Colors::hex2rgb($hex)
)) . "<br>";
-print "C::S/COLOR rgb->hext: $hex: " . DgS::printAr(SetVarType::setArray(
+print "C::S/COLOR rgb->hex: $hex: " . DgS::printAr(SetVarType::setArray(
CoreLibs\Convert\Colors::hex2rgb($hex)
)) . "<br>";
// C(to hsb/hsl)
@@ -82,9 +84,9 @@ print "S::COLOR hsb_f->rgb: $hsb_f[0], $hsb_f[1], $hsb_f[2]: "
. DgS::printAr(SetVarType::setArray(
Colors::hsb2rgb($hsb_f[0], $hsb_f[1], $hsb_f[2])
)) . "<br>";
-print "S::COLOR hsl->rgb: $hsl[0], $hsl[1], $hsl[2]: "
+print "S::COLOR hsl->rgb: $hsb[0], $hsb[1], $hsb[2]: "
. DgS::printAr(SetVarType::setArray(
- Colors::hsl2rgb($hsl[0], $hsl[1], $hsl[2])
+ Colors::hsl2rgb($hsb[0], $hsb[1], $hsb[2])
)) . "<br>";
$hsb = [0, 0, 5];
@@ -102,8 +104,44 @@ print "RANDOM IN: H: " . $h . ", S: " . $s . ", B/L: " . $b . "/" . $l . "<br>";
print "RANDOM hsb->rgb: <pre>" . DgS::printAr(SetVarType::setArray(Colors::hsb2rgb($h, $s, $b))) . "</pre><br>";
print "RANDOM hsl->rgb: <pre>" . DgS::printAr(SetVarType::setArray(Colors::hsl2rgb($h, $s, $l))) . "</pre><br>";
+$rgb = [0, 0, 0];
+print "rgb 0,0,0: " . Dgs::printAr($rgb) . " => " . Dgs::printAr(Colors::rgb2hsb($rgb[0], $rgb[1], $rgb[2])) . "<br>";
+
// TODO: run compare check input must match output
+$hwb = Color::hsbToHwb(Coordinates\HSB::__constructFromArray([
+ 160,
+ 0,
+ 50,
+]));
+print "HWB: " . DgS::printAr($hwb) . "<br>";
+$hsb = Color::hwbToHsb($hwb);
+print "HSB: " . DgS::printAr($hsb) . "<br>";
+
+$oklch = Color::rgbToOkLch(Coordinates\RGB::__constructFromArray([
+ 250,
+ 0,
+ 0
+]));
+print "OkLch: " . DgS::printAr($oklch) . "<br>";
+$rgb = Color::okLchToRgb($oklch);
+print "OkLch -> RGB: " . DgS::printAr($rgb) . "<br>";
+
+$oklab = Color::rgbToOkLab(Coordinates\RGB::__constructFromArray([
+ 250,
+ 0,
+ 0
+]));
+print "OkLab: " . DgS::printAr($oklab) . "<br>";
+$rgb = Color::okLabToRgb($oklab);
+print "OkLab -> RGB: " . DgS::printAr($rgb) . "<br>";
+
+$rgb = Coordinates\RGB::__constructFromArray([250, 100, 10])->toLinear();
+print "RGBlinear: " . DgS::printAr($rgb) . "<br>";
+$rgb = Coordinates\RGB::__constructFromArray([0, 0, 0])->toLinear();
+print "RGBlinear: " . DgS::printAr($rgb) . "<br>";
+
+
print "</body></html>";
// __END__
diff --git c/www/lib/CoreLibs/Convert/Color/Color.php i/www/lib/CoreLibs/Convert/Color/Color.php
new file mode 100644
index 00000000..c56f8c11
--- /dev/null
+++ i/www/lib/CoreLibs/Convert/Color/Color.php
@@ -0,0 +1,803 @@
+<?php
+
+/**
+ * AUTHOR: Clemens Schwaighofer
+ * CREATED: 2024/11/11
+ * DESCRIPTION:
+ * Color Coordinate and Color Space conversions
+ *
+ * We convert between color cooradinates and color spaces
+ * as seen in the list below
+ *
+ * | | RGB | Oklab | Cie
+ * | | | HSB | | | | | | |
+ * | | RGB | HSV | HSL | HWB | OkLab | OkLch | CieLab | CieLch |
+ * -------+-----+-----+-----+-----+-------+-------+--------+--------+
+ * RGB | - | o | o | o | o | o | | |
+ * HSB/HB | o | - | o | o | | | | |
+ * HSL | o | o | - | o | o | o | | |
+ * HWB | o | o | o | - | | | | |
+ * OkLab | o | | o | | - | | | |
+ * OkLch | o | | o | | | - | | |
+ * CieLab | | | | | | | - | |
+ * CieLch | | | | | | | | - |
+ *
+ * All color coordinates are classes
+ * The data can then be converted to a CSS string
+*/
+
+declare(strict_types=1);
+
+namespace CoreLibs\Convert\Color;
+
+use CoreLibs\Convert\Math;
+use CoreLibs\Convert\Color\Coordinates\RGB;
+use CoreLibs\Convert\Color\Coordinates\HSL;
+use CoreLibs\Convert\Color\Coordinates\HSB;
+use CoreLibs\Convert\Color\Coordinates\HWB;
+use CoreLibs\Convert\Color\Coordinates\LCH;
+use CoreLibs\Convert\Color\Coordinates\Lab;
+use CoreLibs\Convert\Color\Coordinates\XYZD65;
+
+class Color
+{
+ // MARK: RGB <-> HSL
+
+ /**
+ * converts a RGB (0-255) to HSL
+ * return:
+ * class with hue (0-360), saturation (0-100%) and luminance (0-100%)
+ *
+ * @param RGB $rgb Class for rgb
+ * @return HSL Class hue/sat/luminance
+ */
+ public static function rgbToHsl(RGB $rgb): HSL
+ {
+ $red = $rgb->R / 255;
+ $green = $rgb->G / 255;
+ $blue = $rgb->B / 255;
+
+ $min = min($red, $green, $blue);
+ $max = max($red, $green, $blue);
+ $chroma = $max - $min;
+ $sat = 0;
+ $hue = 0;
+ // luminance
+ $lum = ($max + $min) / 2;
+
+ // achromatic
+ if ($chroma == 0) {
+ // H, S, L
+ return HSL::__constructFromArray([
+ 0.0,
+ 0.0,
+ $lum * 100,
+ ]);
+ } else {
+ $sat = $chroma / (1 - abs(2 * $lum - 1));
+ if ($max == $red) {
+ $hue = fmod((($green - $blue) / $chroma), 6);
+ if ($hue < 0) {
+ $hue = (6 - fmod(abs($hue), 6));
+ }
+ } elseif ($max == $green) {
+ $hue = ($blue - $red) / $chroma + 2;
+ } elseif ($max == $blue) {
+ $hue = ($red - $green) / $chroma + 4;
+ }
+ $hue = $hue * 60;
+ // $sat = 1 - abs(2 * $lum - 1);
+ return HSL::__constructFromArray([
+ $hue,
+ $sat * 100,
+ $lum * 100,
+ ]);
+ }
+ }
+
+ /**
+ * converts an HSL to RGB
+ * if HSL value is invalid, set this value to 0
+ *
+ * @param HSL $hsl Class with hue: 0-360 (degrees),
+ * saturation: 0-100,
+ * luminance: 0-100
+ * @return RGB Class for rgb
+ */
+ public static function hslToRgb(HSL $hsl): RGB
+ {
+ $hue = $hsl->H;
+ $sat = $hsl->S;
+ $lum = $hsl->L;
+ // calc to internal convert value for hue
+ $hue = (1 / 360) * $hue;
+ // convert to internal 0-1 format
+ $sat /= 100;
+ $lum /= 100;
+ // if saturation is 0
+ if ($sat == 0) {
+ $lum = round($lum * 255);
+ return RGB::__constructFromArray([$lum, $lum, $lum]);
+ } else {
+ $m2 = $lum < 0.5 ? $lum * ($sat + 1) : ($lum + $sat) - ($lum * $sat);
+ $m1 = $lum * 2 - $m2;
+ $hueue = function ($base) use ($m1, $m2) {
+ // base = hue, hue > 360 (1) - 360 (1), else < 0 + 360 (1)
+ $base = $base < 0 ? $base + 1 : ($base > 1 ? $base - 1 : $base);
+ // 6: 60, 2: 180, 3: 240
+ // 2/3 = 240
+ // 1/3 = 120 (all from 360)
+ if ($base * 6 < 1) {
+ return $m1 + ($m2 - $m1) * $base * 6;
+ }
+ if ($base * 2 < 1) {
+ return $m2;
+ }
+ if ($base * 3 < 2) {
+ return $m1 + ($m2 - $m1) * ((2 / 3) - $base) * 6;
+ }
+ return $m1;
+ };
+
+ return RGB::__constructFromArray([
+ 255 * $hueue($hue + (1 / 3)),
+ 255 * $hueue($hue),
+ 255 * $hueue($hue - (1 / 3)),
+ ]);
+ }
+ }
+
+ // MARK: RGB <-> HSB
+
+ /**
+ * rgb2hsb does not clean convert back to rgb in a round trip
+ * converts RGB to HSB/V values
+ * returns:
+ * Class with hue (0-360), sat (0-100%), brightness/value (0-100%)
+ *
+ * @param RGB $rgb Class for rgb
+ * @return HSB Class Hue, Sat, Brightness/Value
+ */
+ public static function rgbToHsb(RGB $rgb): HSB
+ {
+ $red = $rgb->R / 255;
+ $green = $rgb->G / 255;
+ $blue = $rgb->B / 255;
+
+ $MAX = max($red, $green, $blue);
+ $MIN = min($red, $green, $blue);
+ $HUE = 0;
+ $DELTA = $MAX - $MIN;
+
+ // achromatic
+ if ($MAX == $MIN) {
+ return HSB::__constructFromArray([0, 0, $MAX * 100]);
+ }
+ if ($red == $MAX) {
+ $HUE = fmod(($green - $blue) / $DELTA, 6);
+ } elseif ($green == $MAX) {
+ $HUE = (($blue - $red) / $DELTA) + 2;
+ } elseif ($blue == $MAX) {
+ $HUE = (($red - $green) / $DELTA) + 4;
+ }
+ $HUE *= 60;
+ // avoid negative
+ if ($HUE < 0) {
+ $HUE += 360;
+ }
+
+ return HSB::__constructFromArray([
+ $HUE, // Hue
+ ($DELTA / $MAX) * 100, // Saturation
+ $MAX * 100, // Brightness
+ ]);
+ }
+
+ /**
+ * hsb2rgb does not clean convert back to hsb in a round trip
+ * converts HSB/V to RGB values RGB is full INT
+ * if HSB/V value is invalid, sets this value to 0
+ *
+ * @param HSB $hsb hue 0-360 (int),
+ * saturation 0-100 (int),
+ * brightness/value 0-100 (int)
+ * @return RGB Class for RGB
+ */
+ public static function hsbToRgb(HSB $hsb): RGB
+ {
+ $H = $hsb->H;
+ $S = $hsb->S;
+ $V = $hsb->B;
+ // convert to internal 0-1 format
+ $S /= 100;
+ $V /= 100;
+
+ if ($S == 0) {
+ $V = $V * 255;
+ return RGB::__constructFromArray([$V, $V, $V]);
+ }
+
+ $Hi = floor($H / 60);
+ $f = ($H / 60) - $Hi;
+ $p = $V * (1 - $S);
+ $q = $V * (1 - ($S * $f));
+ $t = $V * (1 - ($S * (1 - $f)));
+
+ switch ($Hi) {
+ case 0:
+ $red = $V;
+ $green = $t;
+ $blue = $p;
+ break;
+ case 1:
+ $red = $q;
+ $green = $V;
+ $blue = $p;
+ break;
+ case 2:
+ $red = $p;
+ $green = $V;
+ $blue = $t;
+ break;
+ case 3:
+ $red = $p;
+ $green = $q;
+ $blue = $V;
+ break;
+ case 4:
+ $red = $t;
+ $green = $p;
+ $blue = $V;
+ break;
+ case 5:
+ $red = $V;
+ $green = $p;
+ $blue = $q;
+ break;
+ default:
+ $red = 0;
+ $green = 0;
+ $blue = 0;
+ }
+
+ return RGB::__constructFromArray([
+ $red * 255,
+ $green * 255,
+ $blue * 255,
+ ]);
+ }
+
+ // MARK: HSL <-> HSB
+
+ /**
+ * Convert HSL to HSB
+ *
+ * @param HSL $hsl
+ * @return HSB
+ */
+ public static function hslToHsb(HSL $hsl): HSB
+ {
+ $saturation = $hsl->S / 100;
+ $lightness = $hsl->L / 100;
+ $value = $lightness + $saturation * min($lightness, 1 - $lightness);
+ // check for black and white
+ $saturation = ($value === 0) ?
+ 0 :
+ 200 * (1 - $lightness / $value);
+ return HSB::__constructFromArray([
+ $hsl->H,
+ $saturation,
+ $value * 100,
+ ]);
+ }
+
+ /**
+ * Convert HSB to HSL
+ *
+ * @param HSB $hsb
+ * @return HSL
+ */
+ public static function hsbToHsl(HSB $hsb): HSL
+ {
+ // hsv/toHsl
+ $hue = $hsb->H;
+ $saturation = $hsb->S / 100;
+ $value = $hsb->V / 100;
+
+ $lightness = $value * (1 - $saturation / 2);
+ // check for B/W
+ $saturation = in_array($lightness, [0, 1], true) ?
+ 0 :
+ 100 * ($value - $lightness) / min($lightness, 1 - $lightness)
+ ;
+
+ return HSL::__constructFromArray([
+ $hue,
+ $saturation,
+ $lightness * 100,
+ ]);
+ }
+
+ // MARK: HSB <-> HWB
+
+ /**
+ * convert HSB to HWB
+ *
+ * @param HSB $hsb
+ * @return HWB
+ */
+ public static function hsbToHwb(HSB $hsb): HWB
+ {
+ // hsv\Hwb
+ return HWB::__constructFromArray([
+ $hsb->H, // hue,
+ $hsb->B * (100 - $hsb->S) / 100, // 2: brightness, 1: saturation
+ 100 - $hsb->B,
+ ]);
+ }
+
+ /**
+ * convert HWB to HSB
+ *
+ * @param HWB $hwb
+ * @return HSB
+ */
+ public static function hwbToHsb(HWB $hwb): HSB
+ {
+ $hue = $hwb->H;
+ $whiteness = $hwb->W / 100;
+ $blackness = $hwb->B / 100;
+
+ $sum = $whiteness + $blackness;
+ // for black and white
+ if ($sum >= 1) {
+ $saturation = 0;
+ $value = $whiteness / $sum * 100;
+ } else {
+ $value = 1 - $blackness;
+ $saturation = $value === 0 ? 0 : (1 - $whiteness / $value) * 100;
+ $value *= 100;
+ }
+
+ return HSB::__constructFromArray([
+ $hue,
+ $saturation,
+ $value,
+ ]);
+ }
+
+ // MARK: RGB <-> HWB
+
+ /**
+ * Convert RGB to HWB
+ * via rgb -> hsl -> hsb -> hwb
+ *
+ * @param RGB $rgb
+ * @return HWB
+ */
+ public static function rgbToHwb(RGB $rgb): HWB
+ {
+ return self::hsbToHwb(
+ self::hslToHsb(
+ self::rgbToHsl($rgb)
+ )
+ );
+ }
+
+ /**
+ * Convert HWB to RGB
+ * via hwb -> hsb -> hsl -> rgb
+ *
+ * @param HWB $hwb
+ * @return RGB
+ */
+ public static function hwbToRgb(HWB $hwb): RGB
+ {
+ return self::hslToRgb(
+ self::hsbToHsl(
+ self::hwbToHsb($hwb)
+ )
+ );
+ }
+
+ // MARK: HSL <-> HWB
+
+ /**
+ * Convert HSL to HWB
+ * via hsl -> hsb -> hwb
+ *
+ * @param HSL $hsl
+ * @return HWB
+ */
+ public static function hslToHwb(HSL $hsl): HWB
+ {
+ return self::hsbToHwb(
+ self::hslToHsb(
+ $hsl
+ )
+ );
+ }
+
+ /**
+ * Convert HWB to HSL
+ * via hwb -> hsb -> hsl
+ *
+ * @param HWB $hwb
+ * @return HSL
+ */
+ public static function hwbToHsl(HWB $hwb): HSL
+ {
+ return self::hsbToHsl(
+ self::hwbToHsb($hwb)
+ );
+ }
+
+ // MARK: OkLch <-> OkLab
+
+ /**
+ * okLAab to okLCH
+ *
+ * @param Lab $lab
+ * @return LCH
+ */
+ public static function okLabToOkLch(Lab $lab): LCH
+ {
+ // okLab\toOkLch
+ $a = $lab->a;
+ $b = $lab->b;
+
+ $hue = atan2($b, $a) * 180 / pi();
+
+ return LCH::__constructFromArray([
+ $lab->L,
+ sqrt($a ** 2 + $b ** 2),
+ $hue >= 0 ? $hue : $hue + 360,
+ ]);
+ }
+
+ /**
+ * okLCH to okLab
+ *
+ * @param LCH $lch
+ * @return Lab
+ */
+ public static function okLchToOkLab(LCH $lch): Lab
+ {
+ // oklch/toOkLab
+ // oklch to oklab
+ return Lab::__constructFromArray([
+ $lch->L,
+ $lch->C * cos($lch->H * pi() / 180), // a
+ $lch->C * sin($lch->H * pi() / 180), // b
+ ], 'Oklab');
+ }
+
+ // MARK: xyzD65 <-> linearRGB
+
+ /**
+ * convert linear RGB to xyz D65
+ * if rgb is not flagged linear, it will be auto converted
+ *
+ * @param RGB $rgb
+ * @return XYZD65
+ */
+ public static function linRgbToXyzD65(RGB $rgb): XYZD65
+ {
+ // if not linear, convert to linear
+ if (!$rgb->linear) {
+ $rgb->toLinear();
+ }
+ return XYZD65::__constructFromArray(Math::multiplyMatrices(
+ [
+ [0.41239079926595934, 0.357584339383878, 0.1804807884018343],
+ [0.21263900587151027, 0.715168678767756, 0.07219231536073371],
+ [0.01933081871559182, 0.11919477979462598, 0.9505321522496607],
+ ],
+ $rgb->returnAsArray()
+ ));
+ }
+
+ /**
+ * Convert xyz D65 to linear RGB
+ *
+ * @param XYZD65 $xyzD65
+ * @return RGB
+ */
+ public static function xyzD65ToLinRgb(XYZD65 $xyzD65): RGB
+ {
+ // xyz D65 to linrgb
+ return RGB::__constructFromArray(Math::multiplyMatrices(
+ a : [
+ [ 3.2409699419045226, -1.537383177570094, -0.4986107602930034 ],
+ [ -0.9692436362808796, 1.8759675015077202, 0.04155505740717559 ],
+ [ 0.05563007969699366, -0.20397695888897652, 1.0569715142428786 ],
+ ],
+ b : $xyzD65->returnAsArray()
+ ), linear: true);
+ }
+
+ // MARK: xyzD65 <-> OkLab
+
+ /**
+ * xyz D65 to OkLab
+ *
+ * @param XYZD65 $xyzD65
+ * @return Lab
+ */
+ public static function xyzD65ToOkLab(XYZD65 $xyzD65): Lab
+ {
+ return Lab::__constructFromArray(Math::multiplyMatrices(
+ [
+ [0.2104542553, 0.7936177850, -0.0040720468],
+ [1.9779984951, -2.4285922050, 0.4505937099],
+ [0.0259040371, 0.7827717662, -0.8086757660],
+ ],
+ array_map(
+ callback: fn ($v) => pow($v, 1 / 3),
+ array: Math::multiplyMatrices(
+ a: [
+ [0.8190224432164319, 0.3619062562801221, -0.12887378261216414],
+ [0.0329836671980271, 0.9292868468965546, 0.03614466816999844],
+ [0.048177199566046255, 0.26423952494422764, 0.6335478258136937],
+ ],
+ b: $xyzD65->returnAsArray(),
+ ),
+ )
+ ), 'Oklab');
+ }
+
+ /**
+ * xyz D65 to OkLab
+ *
+ * @param Lab $lab
+ * @return XYZD65
+ */
+ public static function okLabToXyzD65(Lab $lab): XYZD65
+ {
+ return XYZD65::__constructFromArray(Math::multiplyMatrices(
+ a: [
+ [1.2268798733741557, -0.5578149965554813, 0.28139105017721583],
+ [-0.04057576262431372, 1.1122868293970594, -0.07171106666151701],
+ [-0.07637294974672142, -0.4214933239627914, 1.5869240244272418],
+ ],
+ b: array_map(
+ callback: fn ($v) => is_numeric($v) ? $v ** 3 : 0,
+ array: Math::multiplyMatrices(
+ a: [
+ [0.99999999845051981432, 0.39633779217376785678, 0.21580375806075880339],
+ [1.0000000088817607767, -0.1055613423236563494, -0.063854174771705903402],
+ [1.0000000546724109177, -0.089484182094965759684, -1.2914855378640917399],
+ ],
+ // Divide $lightness by 100 to convert from CSS OkLab
+ b: $lab->returnAsArray(),
+ ),
+ ),
+ ));
+ }
+
+ // MARK: rgb <-> oklab
+
+ /**
+ * Undocumented function
+ *
+ * @param RGB $rgb
+ * @return Lab
+ */
+ public static function rgbToOkLab(RGB $rgb): Lab
+ {
+ return self::xyzD65ToOkLab(
+ self::linRgbToXyzD65($rgb)
+ );
+ }
+
+ /**
+ * Undocumented function
+ *
+ * @param Lab $lab
+ * @return RGB
+ */
+ public static function okLabToRgb(Lab $lab): RGB
+ {
+ return self::xyzD65ToLinRgb(
+ self::okLabToXyzD65($lab)
+ )->fromLinear();
+ }
+
+ // MARK: rgb <-> oklch
+
+ /**
+ * convert rgb to OkLch
+ * via rgb -> linear rgb -> xyz D65 -> OkLab -> OkLch
+ *
+ * @param RGB $rbh
+ * @return LCH
+ */
+ public static function rgbToOkLch(RGB $rgb): LCH
+ {
+ return self::okLabToOkLch(
+ self::rgbToOkLab($rgb)
+ );
+ }
+
+ /**
+ * Convert OkLch to rgb
+ * via OkLab -> OkLch -> xyz D65 -> linear rgb -> rgb
+ *
+ * @param LCH $lch
+ * @return RGB
+ */
+ public static function okLchToRgb(LCH $lch): RGB
+ {
+ return self::okLabToRgb(
+ self::okLchToOkLab($lch)
+ );
+ }
+
+ // MARK: HSL <-> OKLab
+
+ /**
+ * Undocumented function
+ *
+ * @param HSL $hsl
+ * @return Lab
+ */
+ public static function hslToOkLab(HSL $hsl): Lab
+ {
+ return self::rgbToOkLab(
+ self::hslToRgb($hsl)
+ );
+ }
+
+ /**
+ * Undocumented function
+ *
+ * @param Lab $lab
+ * @return HSL
+ */
+ public static function okLabToHsl(Lab $lab): HSL
+ {
+ return self::rgbToHsl(
+ self::okLabToRgb($lab)
+ );
+ }
+
+ // MARK: HSL <-> OKLCH
+
+ /**
+ * Undocumented function
+ *
+ * @param HSL $hsl
+ * @return LCH
+ */
+ public static function hslToOkLch(HSL $hsl): LCH
+ {
+ return self::rgbToOkLch(
+ self::hslToRgb($hsl)
+ );
+ }
+
+ /**
+ * Undocumented function
+ *
+ * @param LCH $lch
+ * @return HSL
+ */
+ public static function okLchToHsl(LCH $lch): HSL
+ {
+ return self::rgbToHsl(
+ self::okLchToRgb($lch)
+ );
+ }
+
+ // MARK: HSB <-> OKLab
+
+ /**
+ * Undocumented function
+ *
+ * @param HSB $hsb
+ * @return Lab
+ */
+ public static function hsbToOkLab(HSB $hsb): Lab
+ {
+ return self::rgbToOkLab(
+ self::hsbToRgb($hsb)
+ );
+ }
+
+ /**
+ * Undocumented function
+ *
+ * @param Lab $lab
+ * @return HSB
+ */
+ public static function okLabToHsb(Lab $lab): HSB
+ {
+ return self::rgbToHsb(
+ self::okLabToRgb($lab)
+ );
+ }
+
+ // MARK: HSB <-> OKLCH
+
+ /**
+ * Undocumented function
+ *
+ * @param HSB $hsb
+ * @return LCH
+ */
+ public static function hsbToOkLch(HSB $hsb): LCH
+ {
+ return self::rgbToOkLch(
+ self::hsbToRgb($hsb)
+ );
+ }
+
+ /**
+ * Undocumented function
+ *
+ * @param LCH $lch
+ * @return HSB
+ */
+ public static function okLchToHsb(LCH $lch): HSB
+ {
+ return self::rgbToHsb(
+ self::okLchToRgb($lch)
+ );
+ }
+
+ // MARK: HWB <-> OKLab
+
+ /**
+ * Undocumented function
+ *
+ * @param HWB $hwb
+ * @return Lab
+ */
+ public function hwbToOkLab(HWB $hwb): Lab
+ {
+ return self::rgbToOkLab(
+ self::hwbToRgb($hwb)
+ );
+ }
+
+ /**
+ * Undocumented function
+ *
+ * @param Lab $lab
+ * @return HWB
+ */
+ public function okLabToHwb(Lab $lab): HWB
+ {
+ return self::rgbToHwb(
+ self::okLabToRgb($lab)
+ );
+ }
+
+ // MARK: HWB <-> OKLCH
+
+ /**
+ * Undocumented function
+ *
+ * @param HWB $hwb
+ * @return LCH
+ */
+ public function hwbToOkLch(HWB $hwb): LCH
+ {
+ return self::rgbToOkLch(
+ self::hwbToRgb($hwb)
+ );
+ }
+
+ /**
+ * Undocumented function
+ *
+ * @param LCH $lch
+ * @return HWB
+ */
+ public function okLchToHwb(LCH $lch): HWB
+ {
+ return self::rgbToHwb(
+ self::okLchToRgb($lch)
+ );
+ }
+}
diff --git c/www/lib/CoreLibs/Convert/Color/Coordinates/HSB.php i/www/lib/CoreLibs/Convert/Color/Coordinates/HSB.php
new file mode 100644
index 00000000..b435a9ef
--- /dev/null
+++ i/www/lib/CoreLibs/Convert/Color/Coordinates/HSB.php
@@ -0,0 +1,155 @@
+<?php
+
+/**
+ * AUTHOR: Clemens Schwaighofer
+ * CREATED: 2024/11/11
+ * DESCRIPTION:
+ * Color Coordinate: HSB/HSV
+*/
+
+declare(strict_types=1);
+
+namespace CoreLibs\Convert\Color\Coordinates;
+
+class HSB
+{
+ /** @var float hue */
+ private float $H = 0.0;
+ /** @var float saturation */
+ private float $S = 0.0;
+ /** @var float brightness / value */
+ private float $B = 0.0;
+
+ /**
+ * HSB (HSV) color coordinates
+ * Hue/Saturation/Brightness or Value
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * set with each value as parameters
+ *
+ * @param float $H Hue
+ * @param float $S Saturation
+ * @param float $B Brightness
+ * @return self
+ */
+ public static function __constructFromSet(float $H, float $S, float $B): self
+ {
+ return (new HSB())->setAsArray([$H, $S, $B]);
+ }
+
+ /**
+ * set from array
+ * where 0: Hue, 1: Saturation, 2: Brightness
+ *
+ * @param array{0:float,1:float,2:float} $hsb
+ * @return self
+ */
+ public static function __constructFromArray(array $hsb): self
+ {
+ return (new HSB())->setAsArray($hsb);
+ }
+
+ /**
+ * set color
+ *
+ * @param string $name
+ * @param float $value
+ * @return void
+ */
+ public function __set(string $name, float $value): void
+ {
+ $name = strtoupper($name);
+ if (!property_exists($this, $name)) {
+ throw new \ErrorException('Creation of dynamic property is not allowed', 0);
+ }
+ switch ($name) {
+ case 'H':
+ if ($value == 360) {
+ $value = 0;
+ }
+ if ($value < 0 || $value > 359) {
+ throw new \LengthException(
+ 'Argument value ' . $value . ' for hue is not in the range of 0 to 359',
+ 1
+ );
+ }
+ break;
+ case 'S':
+ if ($value < 0 || $value > 100) {
+ throw new \LengthException(
+ 'Argument value ' . $value . ' for saturation is not in the range of 0 to 100',
+ 2
+ );
+ }
+ break;
+ case 'B':
+ if ($value < 0 || $value > 100) {
+ throw new \LengthException(
+ 'Argument value ' . $value . ' for brightness is not in the range of 0 to 100',
+ 3
+ );
+ }
+ break;
+ }
+ $this->$name = $value;
+ }
+
+ /**
+ * get color
+ *
+ * @param string $name
+ * @return float
+ */
+ public function __get(string $name): float
+ {
+ $name = strtoupper($name);
+ if (!property_exists($this, $name)) {
+ throw new \ErrorException('Creation of dynamic property is not allowed', 0);
+ }
+ return $this->$name;
+ }
+
+ /**
+ * Returns the color as array
+ * where 0: Hue, 1: Saturation, 2: Brightness
+ *
+ * @return array{0:float,1:float,2:float}
+ */
+ public function returnAsArray(): array
+ {
+ return [$this->H, $this->S, $this->B];
+ }
+
+ /**
+ * set color as array
+ * where 0: Hue, 1: Saturation, 2: Brightness
+ *
+ * @param array{0:float,1:float,2:float} $hsb
+ * @return self
+ */
+ public function setAsArray(array $hsb): self
+ {
+ $this->__set('H', $hsb[0]);
+ $this->__set('S', $hsb[1]);
+ $this->__set('B', $hsb[2]);
+ return $this;
+ }
+
+ /**
+ * no hsb in css
+ *
+ * @param float|string|null $opacity
+ * @return string
+ * @throws \ErrorException
+ */
+ public function toCssString(null|float|string $opacity = null): string
+ {
+ throw new \ErrorException('HSB is not available as CSS color string', 0);
+ }
+}
+
+// __END__
diff --git c/www/lib/CoreLibs/Convert/Color/Coordinates/HSL.php i/www/lib/CoreLibs/Convert/Color/Coordinates/HSL.php
new file mode 100644
index 00000000..21be7fe5
--- /dev/null
+++ i/www/lib/CoreLibs/Convert/Color/Coordinates/HSL.php
@@ -0,0 +1,140 @@
+<?php
+
+/**
+ * AUTHOR: Clemens Schwaighofer
+ * CREATED: 2024/11/11
+ * DESCRIPTION:
+ * Color Coordinate: HSL
+*/
+
+declare(strict_types=1);
+
+namespace CoreLibs\Convert\Color\Coordinates;
+
+class HSL
+{
+ /** @var float hue */
+ private float $H = 0.0;
+ /** @var float saturation */
+ private float $S = 0.0;
+ /** @var float lightness (luminance) */
+ private float $L = 0.0;
+ /**
+ * Color Coordinate HSL
+ * Hue/Saturation/Lightness
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * set with each value as parameters
+ *
+ * @param float $H Hue
+ * @param float $S Saturation
+ * @param float $L Lightness
+ * @return self
+ */
+ public static function __constructFromSet(float $H, float $S, float $L): self
+ {
+ return (new HSL())->setAsArray([$H, $S, $L]);
+ }
+
+ /**
+ * set from array
+ * where 0: Hue, 1: Saturation, 2: Lightness
+ *
+ * @param array{0:float,1:float,2:float} $hsl
+ * @return self
+ */
+ public static function __constructFromArray(array $hsl): self
+ {
+ return (new HSL())->setAsArray($hsl);
+ }
+
+ /**
+ * set color
+ *
+ * @param string $name
+ * @param float $value
+ * @return void
+ */
+ public function __set(string $name, float $value): void
+ {
+ if (!property_exists($this, $name)) {
+ throw new \ErrorException('Creation of dynamic property is not allowed', 0);
+ }
+ switch ($name) {
+ case 'H':
+ if ($value == 360) {
+ $value = 0;
+ }
+ if ($value < 0 || $value > 359) {
+ throw new \LengthException(
+ 'Argument value ' . $value . ' for hue is not in the range of 0 to 359',
+ 1
+ );
+ }
+ break;
+ case 'S':
+ if ($value < 0 || $value > 100) {
+ throw new \LengthException(
+ 'Argument value ' . $value . ' for saturation is not in the range of 0 to 100',
+ 2
+ );
+ }
+ break;
+ case 'L':
+ if ($value < 0 || $value > 100) {
+ throw new \LengthException(
+ 'Argument value ' . $value . ' for luminance is not in the range of 0 to 100',
+ 3
+ );
+ }
+ break;
+ }
+ $this->$name = $value;
+ }
+
+ /**
+ * get color
+ *
+ * @param string $name
+ * @return float
+ */
+ public function __get(string $name): float
+ {
+ if (!property_exists($this, $name)) {
+ throw new \ErrorException('Creation of dynamic property is not allowed', 0);
+ }
+ return $this->$name;
+ }
+
+ /**
+ * Returns the color as array
+ * where 0: Hue, 1: Saturation, 2: Lightness
+ *
+ * @return array{0:float,1:float,2:float}
+ */
+ public function returnAsArray(): array
+ {
+ return [$this->H, $this->S, $this->L];
+ }
+
+ /**
+ * set color as array
+ * where 0: Hue, 1: Saturation, 2: Lightness
+ *
+ * @param array{0:float,1:float,2:float} $hsl
+ * @return self
+ */
+ public function setAsArray(array $hsl): self
+ {
+ $this->__set('H', $hsl[0]);
+ $this->__set('S', $hsl[1]);
+ $this->__set('L', $hsl[2]);
+ return $this;
+ }
+}
+
+// __END__
diff --git c/www/lib/CoreLibs/Convert/Color/Coordinates/HWB.php i/www/lib/CoreLibs/Convert/Color/Coordinates/HWB.php
new file mode 100644
index 00000000..ee6b7f63
--- /dev/null
+++ i/www/lib/CoreLibs/Convert/Color/Coordinates/HWB.php
@@ -0,0 +1,140 @@
+<?php
+
+/**
+ * AUTHOR: Clemens Schwaighofer
+ * CREATED: 2024/11/11
+ * DESCRIPTION:
+ * Color Coordinate: HWB
+*/
+
+declare(strict_types=1);
+
+namespace CoreLibs\Convert\Color\Coordinates;
+
+class HWB
+{
+ /** @var float Hue */
+ private float $H = 0.0;
+ /** @var float Whiteness */
+ private float $W = 0.0;
+ /** @var float Blackness */
+ private float $B = 0.0;
+ /**
+ * Color Coordinate: HWB
+ * Hue/Whiteness/Blackness
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * set with each value as parameters
+ *
+ * @param float $H Hue
+ * @param float $W Whiteness
+ * @param float $B Blackness
+ * @return self
+ */
+ public static function __constructFromSet(float $H, float $W, float $B): self
+ {
+ return (new HWB())->setAsArray([$H, $W, $B]);
+ }
+
+ /**
+ * set from array
+ * where 0: Hue, 1: Whiteness, 2: Blackness
+ *
+ * @param array{0:float,1:float,2:float} $hwb
+ * @return self
+ */
+ public static function __constructFromArray(array $hwb): self
+ {
+ return (new HWB())->setAsArray($hwb);
+ }
+
+ /**
+ * set color
+ *
+ * @param string $name
+ * @param float $value
+ * @return void
+ */
+ public function __set(string $name, float $value): void
+ {
+ if (!property_exists($this, $name)) {
+ throw new \ErrorException('Creation of dynamic property is not allowed', 0);
+ }
+ switch ($name) {
+ case 'H':
+ if ($value == 360) {
+ $value = 0;
+ }
+ if ($value < 0 || $value > 360) {
+ throw new \LengthException(
+ 'Argument value ' . $value . ' for hue is not in the range of 0 to 360',
+ 1
+ );
+ }
+ break;
+ case 'W':
+ if ($value < 0 || $value > 100) {
+ throw new \LengthException(
+ 'Argument value ' . $value . ' for saturation is not in the range of 0 to 100',
+ 2
+ );
+ }
+ break;
+ case 'B':
+ if ($value < 0 || $value > 100) {
+ throw new \LengthException(
+ 'Argument value ' . $value . ' for luminance is not in the range of 0 to 100',
+ 3
+ );
+ }
+ break;
+ }
+ $this->$name = $value;
+ }
+
+ /**
+ * get color
+ *
+ * @param string $name
+ * @return float
+ */
+ public function __get(string $name): float
+ {
+ if (!property_exists($this, $name)) {
+ throw new \ErrorException('Creation of dynamic property is not allowed', 0);
+ }
+ return $this->$name;
+ }
+
+ /**
+ * Returns the color as array
+ * where 0: Hue, 1: Whiteness, 2: Blackness
+ *
+ * @return array{0:float,1:float,2:float}
+ */
+ public function returnAsArray(): array
+ {
+ return [$this->H, $this->W, $this->B];
+ }
+
+ /**
+ * set color as array
+ * where 0: Hue, 1: Whiteness, 2: Blackness
+ *
+ * @param array{0:float,1:float,2:float} $hwb
+ * @return self
+ */
+ public function setAsArray(array $hwb): self
+ {
+ $this->__set('H', $hwb[0]);
+ $this->__set('W', $hwb[1]);
+ $this->__set('B', $hwb[2]);
+ return $this;
+ }
+}
+
+// __END__
diff --git c/www/lib/CoreLibs/Convert/Color/Coordinates/LCH.php i/www/lib/CoreLibs/Convert/Color/Coordinates/LCH.php
new file mode 100644
index 00000000..648fb466
--- /dev/null
+++ i/www/lib/CoreLibs/Convert/Color/Coordinates/LCH.php
@@ -0,0 +1,169 @@
+<?php
+
+/**
+ * AUTHOR: Clemens Schwaighofer
+ * CREATED: 2024/11/11
+ * DESCRIPTION:
+ * Color Coordinate: Lch
+ * for oklch or cie
+*/
+
+declare(strict_types=1);
+
+namespace CoreLibs\Convert\Color\Coordinates;
+
+class LCH
+{
+ /** @var float Lightness/Luminance
+ * CIE: 0 to 100
+ * OKlch: 0.0 to 1.0
+ * BOTH: 0% to 100%
+ */
+ private float $L = 0.0;
+ /** @var float Chroma
+ * CIE: 0 to 150, cannot be more than 230
+ * OkLch: 0 to 0.4, does not exceed 0.5
+ * BOTH: 0% to 100% (0 to 150, 0 to 0.4)
+ */
+ private float $C = 0.0;
+ /** @var float Hue
+ * 0 to 360 deg
+ */
+ private float $H = 0.0;
+
+ /** @var string color space: either ok or cie */
+ private string $colorspace = '';
+
+ /**
+ * Color Coordinate Lch
+ * for oklch
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * set with each value as parameters
+ *
+ * @param float $L
+ * @param float $c
+ * @param float $h
+ * @return self
+ */
+ public static function __constructFromSet(float $L, float $c, float $h): self
+ {
+ return (new LCH())->setAsArray([$L, $c, $h]);
+ }
+
+ /**
+ * set from array
+ * where 0: Lightness, 1: Chroma, 2: Hue
+ *
+ * @param array{0:float,1:float,2:float} $lch
+ * @return self
+ */
+ public static function __constructFromArray(array $lch): self
+ {
+ return (new LCH())->setAsArray($lch);
+ }
+
+ /**
+ * set color
+ *
+ * @param string $name
+ * @param float $value
+ * @return void
+ */
+ public function __set(string $name, float $value): void
+ {
+ if (!property_exists($this, $name)) {
+ throw new \ErrorException('Creation of dynamic property is not allowed', 0);
+ }
+ switch ($name) {
+ // case 'L':
+ // if ($this->colorspace == 'cie' && ($value < 0 || $value > 100)) {
+ // throw new \LengthException(
+ // 'Argument value ' . $value . ' for lightness is not in the range of '
+ // . '0 to 100',
+ // 3
+ // );
+ // } elseif ($this->colorspace == 'ok' && ($value < 0 || $value > 1)) {
+ // throw new \LengthException(
+ // 'Argument value ' . $value . ' for lightness is not in the range of '
+ // . '0 to 1',
+ // 3
+ // );
+ // }
+ // break;
+ // case 'c':
+ // if ($this->colorspace == 'cie' && ($value < 0 || $value > 230)) {
+ // throw new \LengthException(
+ // 'Argument value ' . $value . ' for chroma is not in the range of '
+ // . '0 to 230 with normal upper limit of 150',
+ // 3
+ // );
+ // } elseif ($this->colorspace == 'ok' && ($value < 0 || $value > 0.5)) {
+ // throw new \LengthException(
+ // 'Argument value ' . $value . ' for chroma is not in the range of '
+ // . '0 to 0.5 with normal upper limit of 0.5',
+ // 3
+ // );
+ // }
+ // break;
+ case 'h':
+ if ($value == 360) {
+ $value = 0;
+ }
+ if ($value < 0 || $value > 360) {
+ throw new \LengthException(
+ 'Argument value ' . $value . ' for lightness is not in the range of 0 to 360',
+ 1
+ );
+ }
+ break;
+ }
+ $this->$name = $value;
+ }
+
+ /**
+ * get color
+ *
+ * @param string $name
+ * @return float
+ */
+ public function __get(string $name): float
+ {
+ if (!property_exists($this, $name)) {
+ throw new \ErrorException('Creation of dynamic property is not allowed', 0);
+ }
+ return $this->$name;
+ }
+
+ /**
+ * Returns the color as array
+ * where 0: Lightness, 1: Chroma, 2: Hue
+ *
+ * @return array{0:float,1:float,2:float}
+ */
+ public function returnAsArray(): array
+ {
+ return [$this->L, $this->C, $this->H];
+ }
+
+ /**
+ * set color as array
+ * where 0: Lightness, 1: Chroma, 2: Hue
+ *
+ * @param array{0:float,1:float,2:float} $lch
+ * @return self
+ */
+ public function setAsArray(array $lch): self
+ {
+ $this->__set('L', $lch[0]);
+ $this->__set('C', $lch[1]);
+ $this->__set('H', $lch[2]);
+ return $this;
+ }
+}
+
+// __END__
diff --git c/www/lib/CoreLibs/Convert/Color/Coordinates/Lab.php i/www/lib/CoreLibs/Convert/Color/Coordinates/Lab.php
new file mode 100644
index 00000000..e2eb11a4
--- /dev/null
+++ i/www/lib/CoreLibs/Convert/Color/Coordinates/Lab.php
@@ -0,0 +1,177 @@
+<?php
+
+/**
+ * AUTHOR: Clemens Schwaighofer
+ * CREATED: 2024/11/11
+ * DESCRIPTION:
+ * Color Coordinate: Lab
+ * for oklab or cie
+*/
+
+declare(strict_types=1);
+
+namespace CoreLibs\Convert\Color\Coordinates;
+
+class Lab
+{
+ /** @var array<string> allowed colorspaces */
+ private const COLORSPACES = ['Oklab', 'cie'];
+
+ /** @var float lightness/luminance
+ * CIE: 0f to 100f
+ * OKlab: 0.0 to 1.0
+ * BOTH: 0% to 100%
+ */
+ private float $L = 0.0;
+ /** @var float a axis distance
+ * CIE: -125 to 125, cannot be more than +/- 160
+ * OKlab: -0.4 to 0.4, cannot exceed +/- 0.5
+ * BOTH: -100% to 100% (+/-125 or 0.4)
+ */
+ private float $a = 0.0;
+ /** @var float b axis distance
+ * CIE: -125 to 125, cannot be more than +/- 160
+ * OKlab: -0.4 to 0.4, cannot exceed +/- 0.5
+ * BOTH: -100% to 100% (+/-125 or 0.4)
+ */
+ private float $b = 0.0;
+
+ /** @var string color space: either ok or cie */
+ private string $colorspace = '';
+
+ /**
+ * Color Coordinate: Lab
+ * for oklab or cie
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * set with each value as parameters
+ *
+ * @param float $L
+ * @param float $a
+ * @param float $b
+ * @param string $colorspace
+ * @return self
+ */
+ public static function __constructFromSet(float $L, float $a, float $b, string $colorspace): self
+ {
+ return (new Lab())->setColorspace($colorspace)->setAsArray([$L, $a, $b]);
+ }
+
+ /**
+ * set from array
+ * where 0: Lightness, 1: a, 2: b
+ *
+ * @param array{0:float,1:float,2:float} $rgb
+ * @param string $colorspace
+ * @return self
+ */
+ public static function __constructFromArray(array $lab, string $colorspace): self
+ {
+ return (new Lab())->setColorspace($colorspace)->setAsArray($lab);
+ }
+
+ /**
+ * set color
+ *
+ * @param string $name
+ * @param float $value
+ * @return void
+ */
+ public function __set(string $name, float $value): void
+ {
+ if (!property_exists($this, $name)) {
+ throw new \ErrorException('Creation of dynamic property is not allowed', 0);
+ }
+ // switch ($name) {
+ // case 'L':
+ // if ($value == 360) {
+ // $value = 0;
+ // }
+ // if ($value < 0 || $value > 360) {
+ // throw new \LengthException(
+ // 'Argument value ' . $value . ' for lightness is not in the range of 0 to 360',
+ // 1
+ // );
+ // }
+ // break;
+ // case 'a':
+ // if ($value < 0 || $value > 100) {
+ // throw new \LengthException(
+ // 'Argument value ' . $value . ' for a is not in the range of 0 to 100',
+ // 2
+ // );
+ // }
+ // break;
+ // case 'b':
+ // if ($value < 0 || $value > 100) {
+ // throw new \LengthException(
+ // 'Argument value ' . $value . ' for b is not in the range of 0 to 100',
+ // 3
+ // );
+ // }
+ // break;
+ // }
+ $this->$name = $value;
+ }
+
+ /**
+ * get color
+ *
+ * @param string $name
+ * @return float
+ */
+ public function __get(string $name): float
+ {
+ if (!property_exists($this, $name)) {
+ throw new \ErrorException('Creation of dynamic property is not allowed', 0);
+ }
+ return $this->$name;
+ }
+
+ /**
+ * set the colorspace
+ *
+ * @param string $colorspace
+ * @return self
+ */
+ private function setColorspace(string $colorspace): self
+ {
+ if (!in_array($colorspace, $this::COLORSPACES)) {
+ throw new \InvalidArgumentException('Not allowed colorspace', 0);
+ }
+ $this->colorspace = $colorspace;
+ return $this;
+ }
+
+ /**
+ * Returns the color as array
+ * where 0: Lightness, 1: a, 2: b
+ *
+ * @return array{0:float,1:float,2:float}
+ */
+ public function returnAsArray(): array
+ {
+ return [$this->L, $this->a, $this->b];
+ }
+
+ /**
+ * set color as array
+ * where 0: Lightness, 1: a, 2: b
+ *
+ * @param array{0:float,1:float,2:float} $lab
+ * @return self
+ */
+ public function setAsArray(array $lab): self
+ {
+ $this->__set('L', $lab[0]);
+ $this->__set('a', $lab[1]);
+ $this->__set('b', $lab[2]);
+ return $this;
+ }
+}
+
+// __END__
diff --git c/www/lib/CoreLibs/Convert/Color/Coordinates/RGB.php i/www/lib/CoreLibs/Convert/Color/Coordinates/RGB.php
new file mode 100644
index 00000000..acc81952
--- /dev/null
+++ i/www/lib/CoreLibs/Convert/Color/Coordinates/RGB.php
@@ -0,0 +1,226 @@
+<?php
+
+/**
+ * AUTHOR: Clemens Schwaighofer
+ * CREATED: 2024/11/11
+ * DESCRIPTION:
+ * Color Coordinate: RGB
+*/
+
+declare(strict_types=1);
+
+namespace CoreLibs\Convert\Color\Coordinates;
+
+class RGB
+{
+ /** @var float red 0 to 255 or 0.0f to 1.0f for linear RGB */
+ private float $R = 0.0;
+ /** @var float green 0 to 255 or 0.0f to 1.0f for linear RGB */
+ private float $G = 0.0;
+ /** @var float blue 0 to 255 or 0.0f to 1.0f for linear RGB */
+ private float $B = 0.0;
+
+ /** @var bool set if this is linear */
+ private bool $linear = false;
+
+ /**
+ * Color Coordinate RGB
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * set with each value as parameters
+ *
+ * @param float $R Red
+ * @param float $G Green
+ * @param float $B Blue
+ * @param bool $linear [default=false]
+ * @return self
+ */
+ public static function __constructFromSet(float $R, float $G, float $B, bool $linear = false): self
+ {
+ return (new RGB())->flagLinear($linear)->setAsArray([$R, $G, $B]);
+ }
+
+ /**
+ * set from array
+ * where 0: Red, 1: Green, 2: Blue
+ *
+ * @param array{0:float,1:float,2:float} $rgb
+ * @param bool $linear [default=false]
+ * @return self
+ */
+ public static function __constructFromArray(array $rgb, bool $linear = false): self
+ {
+ return (new RGB())->flagLinear($linear)->setAsArray($rgb);
+ }
+
+ /**
+ * set color
+ *
+ * @param string $name
+ * @param float $value
+ * @return void
+ */
+ public function __set(string $name, float $value): void
+ {
+ // do not allow setting linear from outside
+ if ($name == 'linear') {
+ return;
+ }
+ if (!property_exists($this, $name)) {
+ throw new \ErrorException('Creation of dynamic property is not allowed', 0);
+ }
+ // if not linear
+ if (!$this->linear && ($value < 0 || $value > 255)) {
+ throw new \LengthException('Argument value ' . $value . ' for color ' . $name
+ . ' is not in the range of 0 to 255', 1);
+ } elseif ($this->linear && ($value < -10E10 || $value > 1)) {
+ // not allow very very small negative numbers
+ throw new \LengthException('Argument value ' . $value . ' for color ' . $name
+ . ' is not in the range of 0 to 1 for linear rgb', 1);
+ }
+ $this->$name = $value;
+ }
+
+ /**
+ * get color
+ *
+ * @param string $name
+ * @return float|bool
+ */
+ public function __get(string $name): float|bool
+ {
+ if (!property_exists($this, $name)) {
+ throw new \ErrorException('Creation of dynamic property is not allowed', 0);
+ }
+ return $this->$name;
+ }
+
+ /**
+ * Returns the color as array
+ * where 0: Red, 1: Green, 2: Blue
+ *
+ * @return array{0:float,1:float,2:float}
+ */
+ public function returnAsArray(): array
+ {
+ return [$this->R, $this->G, $this->B];
+ }
+
+ /**
+ * set color as array
+ * where 0: Red, 1: Green, 2: Blue
+ *
+ * @param array{0:float,1:float,2:float} $rgb
+ * @return self
+ */
+ public function setAsArray(array $rgb): self
+ {
+ $this->__set('R', $rgb[0]);
+ $this->__set('G', $rgb[1]);
+ $this->__set('B', $rgb[2]);
+ return $this;
+ }
+
+ /**
+ * set as linear
+ * can be used as chain call on create if input is linear RGB
+ * RGB::__construct**(...)->flagLinear();
+ * as it returns self
+ *
+ * @return self
+ */
+ private function flagLinear(bool $linear): self
+ {
+ $this->linear = $linear;
+ return $this;
+ }
+
+ /**
+ * Both function source:
+ * https://bottosson.github.io/posts/colorwrong/#what-can-we-do%3F
+ * but reverse f: fromLinear and f_inv for toLinear
+ * Code copied from here:
+ * https://stackoverflow.com/a/12894053
+ *
+ * converts RGB to linear
+ * We come from 0-255 so we need to divide by 255
+ *
+ * @return self
+ */
+ public function toLinear(): self
+ {
+ $this->flagLinear(true)->setAsArray(array_map(
+ callback: function (int|float $v) {
+ $v = (float)($v / 255);
+ $abs = abs($v);
+ $sign = ($v < 0) ? -1 : 1;
+ return (float)(
+ $abs <= 0.04045 ?
+ $v / 12.92 :
+ $sign * pow(($abs + 0.055) / 1.055, 2.4)
+ );
+ },
+ array: $this->returnAsArray(),
+ ));
+ return $this;
+ }
+
+ /**
+ * convert back to normal sRGB from linear RGB
+ * we go to 0-255 rgb so we multiply by 255
+ *
+ * @return self
+ */
+ public function fromLinear(): self
+ {
+ $this->flagLinear(false)->setAsArray(array_map(
+ callback: function (int|float $v) {
+ $abs = abs($v);
+ $sign = ($v < 0) ? -1 : 1;
+ // during reverse in some situations the values can become negative in very small ways
+ // like -...E16 and ...E17
+ return ($ret = (float)(255 * (
+ $abs <= 0.0031308 ?
+ $v * 12.92 :
+ $sign * (1.055 * pow($abs, 1.0 / 2.4) - 0.055)
+ ))) < 0 ? 0 : $ret;
+ },
+ array: $this->returnAsArray(),
+ ));
+ // $this->linear = false;
+ return $this;
+ }
+
+ /**
+ * convert to css string with optional opacity
+ * Note: if this is a linea RGB, this data will not be correct
+ *
+ * @param float|string|null $opacity
+ * @return string
+ */
+ public function toCssString(null|float|string $opacity = null): string
+ {
+ // set opacity, either a string or float
+ if (is_string($opacity)) {
+ $opacity = ' / ' . $opacity;
+ } elseif ($opacity !== null) {
+ $opacity = ' / ' . $opacity;
+ } else {
+ $opacity = '';
+ }
+ return 'rgb('
+ . (int)round($this->R, 0)
+ . ' '
+ . (int)round($this->G, 0)
+ . ' '
+ . (int)round($this->B, 0)
+ . $opacity
+ . ')';
+ }
+}
+
+// __END__
diff --git c/www/lib/CoreLibs/Convert/Color/Coordinates/XYZD65.php i/www/lib/CoreLibs/Convert/Color/Coordinates/XYZD65.php
new file mode 100644
index 00000000..ebdf633d
--- /dev/null
+++ i/www/lib/CoreLibs/Convert/Color/Coordinates/XYZD65.php
@@ -0,0 +1,116 @@
+<?php
+
+/**
+ * AUTHOR: Clemens Schwaighofer
+ * CREATED: 2024/11/11
+ * DESCRIPTION:
+ * Color Coordinate: XYZ (Cie)
+ * Note, this is only for the D65 whitepoint
+ * https://en.wikipedia.org/wiki/CIE_1931_color_space#Construction_of_the_CIE_XYZ_color_space_from_the_Wright%E2%80%93Guild_data
+ * https://en.wikipedia.org/wiki/Standard_illuminant#D65_values
+*/
+
+declare(strict_types=1);
+
+namespace CoreLibs\Convert\Color\Coordinates;
+
+class XYZD65
+{
+ private float $X = 0.0;
+ private float $Y = 0.0;
+ private float $Z = 0.0;
+
+ /**
+ * Color Coordinate Lch
+ * for oklch
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * set with each value as parameters
+ *
+ * @param float $X
+ * @param float $Y
+ * @param float $Z
+ * @return self
+ */
+ public static function __constructFromSet(float $X, float $Y, float $Z): self
+ {
+ return (new XYZD65())->setAsArray([$X, $Y, $Z]);
+ }
+
+ /**
+ * set from array
+ * where 0: X, 1: Y, 2: Z
+ *
+ * @param array{0:float,1:float,2:float} $xyzD65
+ * @return self
+ */
+ public static function __constructFromArray(array $xyzD65): self
+ {
+ return (new XYZD65())->setAsArray($xyzD65);
+ }
+
+ /**
+ * set color
+ *
+ * @param string $name
+ * @param float $value
+ * @return void
+ */
+ public function __set(string $name, float $value): void
+ {
+ if (!property_exists($this, $name)) {
+ throw new \ErrorException('Creation of dynamic property is not allowed', 0);
+ }
+ // if ($value < 0 || $value > 255) {
+ // throw new \LengthException('Argument value ' . $value . ' for color ' . $name
+ // . ' is not in the range of 0 to 255', 1);
+ // }
+ $this->$name = $value;
+ }
+
+ /**
+ * get color
+ *
+ * @param string $name
+ * @return float
+ */
+ public function __get(string $name): float
+ {
+ if (!property_exists($this, $name)) {
+ throw new \ErrorException('Creation of dynamic property is not allowed', 0);
+ }
+ return $this->$name;
+ }
+
+ /**
+ * Returns the color as array
+ * where 0: X, 1: Y, 2: Z
+ *
+ * @return array{0:float,1:float,2:float}
+ */
+ public function returnAsArray(): array
+ {
+ return [$this->X, $this->Y, $this->Z];
+ }
+
+ /**
+ * set color as array
+ * where 0: X, 1: Y, 2: Z
+ *
+ * @param array{0:float,1:float,2:float} $xyzD65
+ * @return self
+ */
+ public function setAsArray(array $xyzD65): self
+ {
+ $this->__set('X', $xyzD65[0]);
+ $this->__set('Y', $xyzD65[1]);
+ $this->__set('Z', $xyzD65[2]);
+ return $this;
+ }
+}
+
+// __END__
diff --git c/www/lib/CoreLibs/Convert/Color/OkLab.php i/www/lib/CoreLibs/Convert/Color/OkLab.php
new file mode 100644
index 00000000..2bbdbbc2
--- /dev/null
+++ i/www/lib/CoreLibs/Convert/Color/OkLab.php
@@ -0,0 +1,80 @@
+<?php
+
+/**
+ * AUTHOR: Clemens Schwaighofer
+ * CREATED: 2024/11/7
+ * DESCRIPTION:
+ * oklab conversions
+ * rgb -> oklab
+ * oklab -> rgb
+ * rgb -> okhsl
+ * okshl -> rgb
+ * rgb -> okhsv
+ * okhsv -> rgb
+*/
+
+declare(strict_types=1);
+
+namespace CoreLibs\Convert\Color;
+
+class OkLab
+{
+ /**
+ * lines sRGB to oklab
+ *
+ * @param int $red
+ * @param int $green
+ * @param int $blue
+ * @return array<float>
+ */
+ public static function srgb2okLab(int $red, int $green, int $blue): array
+ {
+ $l = (float)0.4122214708 * (float)$red +
+ (float)0.5363325363 * (float)$green +
+ (float)0.0514459929 * (float)$blue;
+ $m = (float)0.2119034982 * (float)$red +
+ (float)0.6806995451 * (float)$green +
+ (float)0.1073969566 * (float)$blue;
+ $s = (float)0.0883024619 * (float)$red +
+ (float)0.2817188376 * (float)$green +
+ (float)0.6299787005 * (float)$blue;
+
+ // cbrtf = 3 root (val)
+ $l_ = pow($l, 1.0 / 3);
+ $m_ = pow($m, 1.0 / 3);
+ $s_ = pow($s, 1.0 / 3);
+
+ return [
+ (float)0.2104542553 * $l_ + (float)0.7936177850 * $m_ - (float)0.0040720468 * $s_,
+ (float)1.9779984951 * $l_ - (float)2.4285922050 * $m_ + (float)0.4505937099 * $s_,
+ (float)0.0259040371 * $l_ + (float)0.7827717662 * $m_ - (float)0.8086757660 * $s_,
+ ];
+ }
+
+ /**
+ * convert okLab to linear sRGB
+ *
+ * @param float $L
+ * @param float $a
+ * @param float $b
+ * @return array<int>
+ */
+ public static function okLab2srgb(float $L, float $a, float $b): array
+ {
+ $l_ = $L + (float)0.3963377774 * $a + (float)0.2158037573 * $b;
+ $m_ = $L - (float)0.1055613458 * $a - (float)0.0638541728 * $b;
+ $s_ = $L - (float)0.0894841775 * $a - (float)1.2914855480 * $b;
+
+ $l = $l_ * $l_ * $l_;
+ $m = $m_ * $m_ * $m_;
+ $s = $s_ * $s_ * $s_;
+
+ return [
+ (int)round(+(float)4.0767416621 * $l - (float)3.3077115913 * $m + (float)0.2309699292 * $s),
+ (int)round(-(float)1.2684380046 * $l + (float)2.6097574011 * $m - (float)0.3413193965 * $s),
+ (int)round(-(float)0.0041960863 * $l - (float)0.7034186147 * $m + (float)1.7076147010 * $s),
+ ];
+ }
+}
+
+// __END__
diff --git c/www/lib/CoreLibs/Convert/Color/Stringify.php i/www/lib/CoreLibs/Convert/Color/Stringify.php
new file mode 100644
index 00000000..6ca68431
--- /dev/null
+++ i/www/lib/CoreLibs/Convert/Color/Stringify.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * AUTHOR: Clemens Schwaighofer
+ * CREATED: 2024/11/11
+ * DESCRIPTION:
+ * Convert color coordinate to CSS string
+*/
+
+declare(strict_types=1);
+
+namespace CoreLibs\Convert\Color;
+
+use CoreLibs\Convert\Color\Coordinates\RGB;
+use CoreLibs\Convert\Color\Coordinates\HSL;
+use CoreLibs\Convert\Color\Coordinates\HWB;
+use CoreLibs\Convert\Color\Coordinates\Lab;
+use CoreLibs\Convert\Color\Coordinates\LCH;
+
+class Stringify
+{
+ /**
+ * Undocumented function
+ *
+ * @param RGB|Lab|LCH|HSL|HWB $data
+ * @param null|float|string $opacity
+ * @return string
+ */
+ public static function toCssString(RGB|Lab|LCH|HSL|HWB $data, null|float|string $opacity): string
+ {
+ return $data->toCssString($opacity);
+ }
+}
+
+// __END__
diff --git c/www/lib/CoreLibs/Convert/Colors.php i/www/lib/CoreLibs/Convert/Colors.php
index f9f56171..8ff32608 100644
--- c/www/lib/CoreLibs/Convert/Colors.php
+++ i/www/lib/CoreLibs/Convert/Colors.php
@@ -120,26 +120,29 @@ class Colors
$MAX = max($red, $green, $blue);
$MIN = min($red, $green, $blue);
$HUE = 0;
+ $DELTA = $MAX - $MIN;
+ // achromatic
if ($MAX == $MIN) {
return [0, 0, round($MAX * 100)];
}
if ($red == $MAX) {
- $HUE = ($green - $blue) / ($MAX - $MIN);
+ $HUE = fmod(($green - $blue) / $DELTA, 6);
} elseif ($green == $MAX) {
- $HUE = 2 + (($blue - $red) / ($MAX - $MIN));
+ $HUE = (($blue - $red) / $DELTA) + 2;
} elseif ($blue == $MAX) {
- $HUE = 4 + (($red - $green) / ($MAX - $MIN));
+ $HUE = (($red - $green) / $DELTA) + 4;
}
$HUE *= 60;
+ // avoid negative
if ($HUE < 0) {
$HUE += 360;
}
return [
- (int)round($HUE),
- (int)round((($MAX - $MIN) / $MAX) * 100),
- (int)round($MAX * 100)
+ (int)round($HUE), // Hue
+ (int)round(($DELTA / $MAX) * 100), // Saturation
+ (int)round($MAX * 100) // Value/Brightness
];
}
diff --git c/www/lib/CoreLibs/Convert/Math.php i/www/lib/CoreLibs/Convert/Math.php
index 205abbf1..26739c5f 100644
--- c/www/lib/CoreLibs/Convert/Math.php
+++ i/www/lib/CoreLibs/Convert/Math.php
@@ -56,6 +56,95 @@ class Math
return (float)$number;
}
}
+
+ /**
+ * calc cube root
+ *
+ * @param float $number Number to cubic root
+ * @return float Calculated value
+ */
+ public static function cbrt(float $number): float
+ {
+ return pow($number, 1.0 / 3);
+ }
+
+ /**
+ * This function is directly inspired by the multiplyMatrices() function in color.js
+ * form Lea Verou and Chris Lilley.
+ * (see https://github.com/LeaVerou/color.js/blob/main/src/multiply-matrices.js )
+ * From:
+ * 3842cf51c9/src/utils/utils.php (L507)
+ *
+ * It returns an array which is the product of the two number matrices passed as parameters.
+ *
+ * @param array<array<int|float>> $a m x n matrice
+ * @param array<array<int|float>> $b n x p matrice
+ *
+ * @return array<array<int|float>> m x p product
+ */
+ public static function multiplyMatrices(array $a, array $b): array
+ {
+ $m = count($a);
+
+ if (!is_array($a[0] ?? null)) {
+ // $a is vector, convert to [[a, b, c, ...]]
+ $a = [ $a ];
+ }
+
+ if (!is_array($b[0])) {
+ // $b is vector, convert to [[a], [b], [c], ...]]
+ $b = array_map(
+ callback: fn ($v) => [ $v ],
+ array: $b,
+ );
+ }
+
+ $p = count($b[0]);
+
+ // transpose $b:
+ $bCols = array_map(
+ callback: fn ($k) => \array_map(
+ (fn ($i) => $i[$k]),
+ $b,
+ ),
+ array: array_keys($b[0]),
+ );
+
+ $product = array_map(
+ callback: fn ($row) => array_map(
+ callback: fn ($col) => is_array($row) ?
+ array_reduce(
+ array: $row,
+ callback: fn ($a, $v, $i = null) => $a + $v * (
+ $col[$i ?? array_search($v, $row)] ?? 0
+ ),
+ initial: 0,
+ ) :
+ array_reduce(
+ array: $col,
+ callback: fn ($a, $v) => $a + $v * $row,
+ initial: 0,
+ ),
+ array: $bCols,
+ ),
+ array: $a,
+ );
+
+ if ($m === 1) {
+ // Avoid [[a, b, c, ...]]:
+ $product = $product[0];
+ }
+
+ if ($p === 1) {
+ // Avoid [[a], [b], [c], ...]]:
+ return array_map(
+ callback: fn ($v) => $v[0],
+ array: $product,
+ );
+ }
+
+ return $product;
+ }
}
// __END__
2024-11-11 18:48:56 +09:00
Clemens Schwaighofer
d9bcb577d7
some minor test page code fixes
2024-11-07 12:05:23 +09:00
Clemens Schwaighofer
8613e8977b
UrlRequests curl: move options set logic to main curl wrapper call
...
change the curlRequest call to options array and build the options array
there.
Remove any options check + pre build from the get/request calls
Update phpunit tests with string type body return
2024-11-07 11:22:36 +09:00
Clemens Schwaighofer
0c51a3be87
Add phpunit tests for header key/value exceptions
2024-11-06 18:49:48 +09:00
Clemens Schwaighofer
f9cf36524e
UrlRequests auth set allowed in requests call
...
Removed the parseHeaders public call, headers must be set as array
Throw errors on invalid headers before sending them: Key/Value check
Add headers invalid check in phpunit
Auth headers can be set per call and will override global settings if matching
2024-11-06 18:42:35 +09:00
Clemens Schwaighofer
bacb9881ac
Fix UrlRequests Interface name, fix header build
...
Header default build was not done well, pass original headers inside and
set them. On new default start with empty array.
Switch to CoreLibs Json calls, because we use this libarary anyway already
2024-11-06 14:28:15 +09:00
Clemens Schwaighofer
f0fae1f76d
Fix Composer package phpunit test url for UrlRequests
2024-11-06 13:35:00 +09:00
Clemens Schwaighofer
1653e6b684
Allow http_errors unset/set on each call
...
If set or not set, on each call this option can be set.
If set to null on call, the original value or default config value is used
2024-11-06 13:29:19 +09:00
Clemens Schwaighofer
c8bc0062ad
URL Requests change error response
...
Instead of just throwing exception on 401 auth, throw exception for any
error code from 400 on
This can be turned off with the option "http_errors" set to false
Also updaed the exception content to match 400 or 500 error type with
more information attached
General Exception error codes:
Cnnn: Curl errors (FAILURE)
Rnnn: general class errors (ERROR)
Hnnn: http response errors (ERROR)
2024-11-06 12:48:01 +09:00
Clemens Schwaighofer
5c8a2ef8da
Update test paths for URLRequests tests
2024-11-06 10:38:30 +09:00
Clemens Schwaighofer
d8379a10d9
URL Request phpunit test added
2024-11-06 10:33:05 +09:00
Clemens Schwaighofer
30e2f33620
Test calls update for admin area
2024-11-06 10:03:33 +09:00
Clemens Schwaighofer
a4f16f4ca9
Various updates and fixes during testing
...
Move the build auth content to dedicated variables
Add a default User-Agent that is always sent
Default headers like Authorization and User-Agent are always set, even when
request is sent with headers null
Fix timeout, was sent as is and not converted to milliseconds
Fix headers not correctly set to null if array entry was set to null
2024-11-06 10:03:14 +09:00
Clemens Schwaighofer
6e7b9cd033
phpunit URL Requests backend test file
2024-11-01 14:43:10 +09:00
Clemens Schwaighofer
4bc2ad8fa0
URL Requests basic tests file
2024-11-01 14:42:43 +09:00
Clemens Schwaighofer
0d4e959f39
Remove the nice formatter for now
2024-11-01 14:42:04 +09:00
Clemens Schwaighofer
95d567545a
URL Requests via curl, a simple library
2024-11-01 14:41:46 +09:00
Clemens Schwaighofer
d89c6d1bde
UrlRequests target file renamed
2024-10-29 18:28:19 +09:00
Clemens Schwaighofer
337ebb9032
Add a localhost entry to the hosts config
2024-10-29 18:28:07 +09:00
Clemens Schwaighofer
9538ebce7b
Merge branch 'NewFeatures' into Feature-UrlRequestsCurl
2024-10-29 14:14:10 +09:00
Clemens Schwaighofer
1bff19f4b6
Update UrlRequests with patch, admin test page for it
...
Also update delete to have optional body (content)
2024-10-28 17:05:49 +09:00
Clemens Schwaighofer
66dc72ec67
phpunit test text doc typo fix
2024-10-21 10:19:29 +09:00
Clemens Schwaighofer
f781b5e55f
Name update for params/query
...
Order in methods
url: mandatory
payload: mandatory in post/put
header = []
query = ""
old "params" -> "payload"
2024-10-21 09:52:49 +09:00
Clemens Schwaighofer
934db50b3a
Merge branch 'NewFeatures' into Feature-UrlRequestsCurl
2024-10-21 09:52:09 +09:00
Clemens Schwaighofer
573588ad3c
Ignore www composer data
2024-10-21 09:36:50 +09:00
Clemens Schwaighofer
d04addba81
Add a SQL lite media folder
2024-10-21 09:33:46 +09:00
Clemens Schwaighofer
a50a38fd40
DB IO Query Placeholder tests
2024-10-21 09:33:18 +09:00
Clemens Schwaighofer
3c5200cd99
Test run for Curl URL Requests
2024-10-21 09:32:20 +09:00
Clemens Schwaighofer
50a4b88f55
UrlRequests\Curl class
...
Basic interface class to CURL calls
Open:
clean up and check code is neutral
write tests, for this we need a running localhost server for tests to request to
2024-10-21 09:25:39 +09:00
Clemens Schwaighofer
e82929f512
core composer install update
2024-10-18 09:37:18 +09:00
Clemens Schwaighofer
5fc55c53b8
Update composer and ignore composer/vendor and phive/tools folders
2024-10-18 09:28:27 +09:00
Clemens Schwaighofer
47da4d02ff
ignore local vendor/composer and tools folder
2024-10-18 09:19:10 +09:00
Clemens Schwaighofer
9d131cf6dd
Bug: Remove echo in call
2024-10-17 13:58:52 +09:00
Clemens Schwaighofer
dfcae20f64
Update DB\IO and do not print call steck on DB_INFO calls
2024-10-17 13:52:44 +09:00
Clemens Schwaighofer
61e489ee4c
Remove entries from an array wrapper
...
just wrapper around array_diff
2024-10-17 09:44:24 +09:00
Clemens Schwaighofer
29982f90bc
Admin\Backend change non filled dat part comment
...
the not filled data or data_binary part is a JSON with "type" set to the
type that is used with a general message
To decode try to read both sides if data = JSON + "type" and "message" set
then data is in data_binary else data_binary holds the type on the left side
2024-10-16 16:45:13 +09:00
Clemens Schwaighofer
7cced63c4b
Update the Admin\Backend edit log call with query params and different data compressors
...
All queries uses now Params
On load checks for valid write types for edit log write, eg if bzip and lzip compression
are avaiable
adbEditLog:
Also add JSON type encoding for data outside STRING/SERIAL and BINARY/BZIP (bzip compressed)
Add ZLIB as altnerative to BZIP
Add alert if invalid type was set
Auto fallback to JSON if other write types are not available
adbLiveQueue:
Also convert the live queue query to a params style call
2024-10-16 16:21:51 +09:00
Clemens Schwaighofer
06c2ea5e0d
Admin\Backend: make sure we do not access unset ->action vars
2024-10-16 12:34:48 +09:00
Clemens Schwaighofer
2e9239ec23
Ingore node_modules/ folder
2024-10-16 12:18:51 +09:00
Clemens Schwaighofer
545279b9fe
First tests with eslint flat layout
2024-10-16 12:17:24 +09:00
Clemens Schwaighofer
0c89840dba
Admin\Backend move _POST action read to sub function and trigger not auto loading it
...
On default it still auto loads the _POST vars for backwards compatible, but add a load class
flag to ignore it "init_action_vars"
also add a get vor tha "acl" array adbGetAcl()
2024-10-16 12:15:19 +09:00
Clemens Schwaighofer
db144493f3
Message system: allow warning level to be logged
...
Like error messages, they are written to the log if debug is on or the
flag is explicit set
2024-09-24 15:10:53 +09:00
Clemens Schwaighofer
5cec54d508
Add "Success" to message logging levels, fixes for PHP 8.4, other preg_match fixes
...
The Logger/MessageLevel gets "success" as level 110 to something a bit
heigher than "ok" which is the general "OK" for anything ending without
an error. The "success" is currently only used in file uploads with the
java script ajax file uploader
Fix any "type $var = null" with correctly "?type $var = null" for PHP 8.4 (phphan)
Fix preg match no return catches for DB IO compare version and for language
look up.
2024-09-20 13:33:19 +09:00
Clemens Schwaighofer
8e60c992f1
Fixes phan/phpstan
2024-09-03 12:06:01 +09:00
Clemens Schwaighofer
1b5437b675
Add testing for new added bom utf8 replace
2024-09-03 11:58:36 +09:00
Clemens Schwaighofer
ef80cba561
Add new functions: get IPs, strip UTF8 BOM from text, text updates
...
Add the following new static methods
Convert\Strings::stripUTF8BomBytes: removes the UTF8 BOM bytes from the beginning of a line
Used for CSV files created in Excel for the first header entry (line 0/row 0)
Get\Systen::getIpAddresses: gets all IP addresses for the the current access user
and returns an array
Moved the frontend folder detection from the first load config to the config.path.php
Cleaned up the translations JS scripts
2024-09-03 09:49:01 +09:00
Clemens Schwaighofer
2d71e760e8
Composer update
2024-08-21 11:45:17 +09:00
Clemens Schwaighofer
a8d07634ff
Add soba.egplusww.jp as local development host, jshint esversion update to 11
2024-08-07 13:41:09 +09:00
Clemens Schwaighofer
aa2b60973e
HTML::htmlent and HTML::checked updates
...
Changed Params form ENT_COMPAT | ENT_HTML401 to ENT_QUOTES | ENT_HTML5
Flags can be overwritten on call
Logic clean up for return flow
HTML::checked gets logic updated with less nested ifs
2024-08-05 13:24:37 +09:00
Clemens Schwaighofer
554dd5f73c
Fix not closed <head> block in all admin test files
2024-08-05 12:53:48 +09:00
Clemens Schwaighofer
e6f9559fbb
DB IO: placeholder fix for JSON/JSONB lists
2024-07-29 16:30:48 +09:00
Clemens Schwaighofer
770d6f30a4
DB\IO Placeholder regex fix for json queries, test data updates
...
Some doc typo fixes
test updates with remove of not used sub calls
DB IO Placeholder regex now checks for any JSON/JSONB operators
2024-07-29 15:55:38 +09:00
Clemens Schwaighofer
f94f6cbe87
Add .shellcheckrc, move phpstan tmp folder to repository temp folder
2024-07-19 18:40:24 +09:00
Clemens Schwaighofer
9b69390fa2
Merge branch 'development' into NewFeatures
2024-05-22 10:47:12 +09:00
Clemens Schwaighofer
0524d8ac1b
Update Symmetric Encryption
...
Can be used as a class with central key set.
for old static calls:
encrypt -> encryptKey
decrypt -> decryptKey
2024-05-22 10:43:54 +09:00
Clemens Schwaighofer
e933022671
Phive update
2024-05-22 10:27:20 +09:00
Clemens Schwaighofer
c549d34e65
phive tools update
2024-05-15 17:06:09 +09:00
Clemens Schwaighofer
f4ff31721b
phpunit test add php 8.3, remove special code for mb_encode_mimeheader
...
In the past we had a special function to do mb_encode_mimeheader correctly.
Since PHP 8.2 this works perfectly fine, so all the code was removed and
replaced with just the normal "mb_encode_mimeheader" call with the same
settings as before:
- set global encoding to parameter
- run encoding with charset, 'B' for transfer and use the line break given in parameter
- reset the global encoding to previous set
2024-04-17 10:08:12 +09:00
Clemens Schwaighofer
21ac91d2e6
Composer update for Smarty v4.5.2
2024-04-16 18:27:55 +09:00
Clemens Schwaighofer
2d98d26d0b
phive update
2024-04-16 16:32:48 +09:00
Clemens Schwaighofer
3fda1bef60
Move Symmetric Encryption Key generation into its own method
...
Test update for future class based encryption system without static
methods
2024-03-27 11:58:53 +09:00
Clemens Schwaighofer
4f1104c36e
phive tools update
2024-03-21 12:38:43 +09:00
Clemens Schwaighofer
db1007ef12
Smarty Update v4.6.1, Bug fixes in DB\Extended\ArrayIO and Form\Generate
2024-03-19 10:43:12 +09:00
Clemens Schwaighofer
13c76efcef
Fix new layout path location
...
Was "www/layout/admin|frontend/..." now is
www/frontend/layout and www/admin/layout
2024-03-07 14:53:00 +09:00
Clemens Schwaighofer
f59c325b05
Bug fix in string path slash fix
...
if null error return original path
2024-03-07 14:37:05 +09:00
Clemens Schwaighofer
aac5157173
phive update
2024-03-07 14:33:30 +09:00
Clemens Schwaighofer
abc2705c64
Bug fix in Form Generate load list generation
...
For binary 1/0 blocks make sure we use the actual data and not just the
wrong binary 0/1 source
Also add auto translations for all strings in there
2024-03-07 14:31:30 +09:00
Clemens Schwaighofer
e2fff45b16
Composer update Smarty v4.4.1
2024-03-06 18:44:41 +09:00
Clemens Schwaighofer
b6ae3f99d9
Layout folder move to admin and frontend
2024-02-27 12:02:03 +09:00
Clemens Schwaighofer
a377ab4b61
Strip multiple slashes in CoreLibs Convert Strings
2024-02-14 12:26:17 +09:00
Clemens Schwaighofer
ec9275d8d3
Add mime type get to the Check\File class
2024-01-11 16:15:08 +09:00
Clemens Schwaighofer
10ed5b3ea0
phive packages updates
2024-01-10 17:04:20 +09:00
Clemens Schwaighofer
5f290419c6
Minor php cs fixes
2024-01-10 17:03:18 +09:00
Clemens Schwaighofer
0152af6e65
add php code sniffer xml
2023-12-05 17:37:55 +09:00
Clemens Schwaighofer
4adb9fba30
DB IO Bug Fix for parameter detect after <>, DateTime code fix
...
Query Parameters where not detected after a <> unequal check
DateTime fix for last element, use array_pop instead of $array[count - 1]
2023-11-29 10:44:21 +09:00
Clemens Schwaighofer
672931ee67
phive packages update
2023-11-29 10:36:49 +09:00
Clemens Schwaighofer
373a9aff2f
Add local eslintrc and jsconfig
2023-11-28 11:34:29 +09:00
Clemens Schwaighofer
4e3ceecac8
Phive update
2023-11-02 14:05:49 +09:00
Clemens Schwaighofer
8bf694b2b2
ArrayHandler: find next or previous key in array and return it
...
get next or previous key in array
2023-11-02 14:01:47 +09:00
Clemens Schwaighofer
caf03421a7
Bug fix for DB\IO param prepare call with wrong param array check
...
The global param array in the class instead of the param array passed
to the method was checked
2023-10-31 10:18:44 +09:00
Clemens Schwaighofer
facf8adaf7
DB\IO move dbReturn params set before first abort
2023-10-31 10:05:43 +09:00
Clemens Schwaighofer
c8158c8224
Remove echo from phpunit test file
2023-10-23 17:11:06 +09:00
Clemens Schwaighofer
7b9a0043d3
Add Support::getCallStack
...
returns full call stack for call (excluding self)
2023-10-23 16:59:14 +09:00
Clemens Schwaighofer
6517747fef
Move old intervalStringFormat into the class_test.datetime.php file
...
For current reference testing, will be removed later.
Update phpunit tests (ongoing)
2023-10-18 13:12:48 +09:00
Clemens Schwaighofer
fb7071adc4
Basic used Exception documentation
...
What PHP Exception is used for what
NOTE: Subject to change
2023-10-18 10:59:15 +09:00
Clemens Schwaighofer
d96c92f9ef
Update phpunit tests for Byte class with new exception names
2023-10-18 09:32:36 +09:00
Clemens Schwaighofer
d7c0054ea0
Change default Exception to proper named Exceptions
...
Byte: InvalidArgumentException for parameters
Image: RunetimeException for cannot write file to system
2023-10-18 09:30:08 +09:00
Clemens Schwaighofer
80d2215f2b
Combined\DateTime new intervalStringFormat method
...
new method to replace old timeStringFormat method:
- has year/month data too
- can format with natural names (minutes, seconds, etc)
- can have normal naming (5 hours, 1 minute and 10 seconds)
- skip or not skip zero values in between (6h 0m 1s -> 6h 1s)
- skip or add trailing zero values (6m 0s -> 6m)
- add or not add milliseconds with decimal nano seconds
- drop nano seconds (115.55ms -> 115ms)
- truncate value after a certain part (eg only show up to days)
- add leading 0s to only milli seconds values (115ms -> 0s 115ms)
- namespace separator (6h -> 6 h)
Bug fix for timeStringFormat
- 1.5s and 1.05s and 1.005s all where 5ms -> fixed to 500ms, 50ms 5ms
- bug fix for 0ms drop even thought show ms is requested
Start unit testing part
2023-10-17 19:14:12 +09:00
Clemens Schwaighofer
b18bf937d3
DB\IO Missing dbWarning updates with call context
...
all in the __dbSetInsertId method
2023-10-16 16:10:47 +09:00
Clemens Schwaighofer
4b6c5df74f
Update all DB\IO params with new array layout
2023-10-16 14:55:39 +09:00
Clemens Schwaighofer
89e3888bf8
Update DB\IO with auto query placeholder rewrite and better error logging
...
All errors have context that is used to add query, params, etc info
for logging into the DB.
Avoid double logging for PostGreSQL direct errors as those will be
logged now in context to the actual error log
Remove error: 16 missing/empty dbh has this is handled with error 14
in the connect method.
Auto convert ?, :named to $numbered, default off. Activate with
'db_convert_placeholder' flag or method dbSetConvertPlaceholder.
Converted result data for single queries in dbGetPlaceholderConverted
or in the cursor_ext array in placeholer_converted key
Do not auto translate debug queries with placeholder values in query
but keep them in the array in the context array. If needed
'db_debug_replace_placeholder' can be set to show prepared query
with placeholder replaced in the context
New methods:
public function dbSetConvertPlaceholder(bool $flag): void
public function dbGetConvertPlaceholder(): bool
public function dbSetConvertPlaceholderTarget(string $target): bool
public function dbGetConvertPlaceholderTarget(): string
public function dbSetDebugReplacePlaceholder(bool $flag): void
public function dbGetDebugReplacePlaceholder(): bool
public function dbGetPlaceholderConverted(): array
Chagned to public:
public function dbCheckQueryForSelect(string $query): bool
public function dbCheckQueryForInsert(string $query, bool $pure = false): bool
public function dbCheckQueryForUpdate(string $query): bool
2023-10-16 14:43:55 +09:00
Clemens Schwaighofer
c46125aef1
Merge branch 'OutputImageException' into development
2023-10-12 17:14:34 +09:00
Clemens Schwaighofer
a8ca5d7a2b
Add missing exceptions to Output\Image image rotate
...
Also create a basic phpunit class to test exceptions only
2023-10-12 17:08:44 +09:00
Clemens Schwaighofer
ae2d6580a2
Initial add for PDO/PG convert placeholders
2023-10-11 18:36:06 +09:00
Clemens Schwaighofer
97e1b2b63d
Update DB\IO numbered params in query detection
...
- Fix the regex to proper match $n params in al;l kind of combinations
- Move the count into a sub private method and use this instead of using
the same code twice
2023-10-06 16:41:47 +09:00
Clemens Schwaighofer
d632a2599e
PHPunit and VScode intelephense setup information in readme file
2023-10-04 18:26:47 +09:00
Clemens Schwaighofer
2f81009a97
Fix TestCalls class folder name based on namespace
2023-10-04 18:26:38 +09:00
Clemens Schwaighofer
e9799f888b
Install PHP CS Fixer
2023-10-04 15:12:14 +09:00
Clemens Schwaighofer
94b24b4eae
Basic documentation tools: phpdox/phpdocumentor installed for testing which is best
2023-10-04 15:07:49 +09:00
Clemens Schwaighofer
a304d29698
Switch check to to phive installed tools, fix in phpunit bootsrap file
2023-10-04 14:58:29 +09:00
Clemens Schwaighofer
c4c809be66
Remove all base composer installed packages and move tool phive install for phan/phpstan/etc
2023-10-04 14:47:48 +09:00
Clemens Schwaighofer
a3bf38f6cf
Update bootstrap file for phpunit to work with different folder layouts
...
we have the autoloader in different base folders for some dev work
2023-10-04 14:35:53 +09:00
Clemens Schwaighofer
c1b906e701
Install composer viea phive and remove phpunit from composer dev install
...
Update comoser test files to work with both, but primary is the phive
installed one.
run tests via 4dev/check/phpunit.sh as before
2023-10-04 14:22:24 +09:00
Clemens Schwaighofer
32f8e1440d
Update Logging\ErrorMsg jump target with level for css
...
So we can have different stylesheets for the levels like in the error
messages.
Output changes to ...[$target] = ['info' ..., 'level'] and on return
this is converted into an array for each entry so it can be handled
like the error msg return string
2023-10-02 17:31:11 +09:00
Clemens Schwaighofer
2f8f98642b
Update Logging\ErrorMsg to add a Jump Target list for direct jumps
...
So we can return a list for css element ids we want to jump directly to
2023-10-02 14:02:00 +09:00
Clemens Schwaighofer
7ab03913ac
Merge remote-tracking branch 'all/master' into development
2023-10-02 12:27:36 +09:00
Clemens Schwaighofer
a7853171e0
Merge remote-tracking branch 'all/master' into development
2023-10-02 12:26:35 +09:00
Clemens Schwaighofer
dfdfcf87f2
Merge branch 'development'
2023-10-02 12:26:14 +09:00
Clemens Schwaighofer
6218e0a6a8
Output\Form\Generate fix for phan check
2023-10-02 12:25:07 +09:00
Clemens Schwaighofer
a84a745be2
Logging\ErrorMsg class update to log error level automatically for debug
...
if log level is debug, automatically log the error messages.
We still skip warn and info levels from logging.
The rest is based on the logging level (notice eg only gets logged if
log level is at least notice)
2023-10-02 12:23:44 +09:00
Clemens Schwaighofer
312762e92e
Composer update
2023-10-02 12:23:15 +09:00
Clemens Schwaighofer
fa4c1f0597
Form\Generate and DB\Extend\ArrayIO split
...
Move DB\Extend\ArrayIO to internal class in variable and do not extend
Form\Generate from it (as we do not have a base class anymore, this is
no longer neded)
Update all calls in connected classes.
Add interface methods for DB\Extend\ArrayIO to interface with all class
vars that are now all private
2023-09-29 19:05:58 +09:00
Clemens Schwaighofer
438a75af23
Merge branch 'development'
2023-09-27 11:42:32 +09:00
Clemens Schwaighofer
afd8ff3e31
Composer updates
2023-09-27 11:42:07 +09:00
Clemens Schwaighofer
4343af7937
Composer core updates
2023-09-27 11:41:41 +09:00
Clemens Schwaighofer
d06769c48b
empty admin folder page for edit base page creation tests
2023-09-27 11:38:32 +09:00
Clemens Schwaighofer
4c0390f082
ErrorMessage class: add notice for non error logging to log file
...
info is already used for write back to front. So we use notice for
non error level messages into the log file
2023-09-27 11:37:26 +09:00
Clemens Schwaighofer
95bee3dc8c
Update DB\IO dbWriteDataExt to allow null primary key
...
So we do not get an error on a new data call with a null primary key
2023-09-27 11:22:16 +09:00
Clemens Schwaighofer
65132d8a4a
Fix DB\ArrayIO access to unset pk_id
2023-09-27 09:41:41 +09:00
Clemens Schwaighofer
b2243cd06d
Add EditOrder dummy template class for edit_order page
...
without this dummy class the Form\Generate cannot load.
We don't need it, except for the set page name
2023-09-26 18:36:29 +09:00
Clemens Schwaighofer
8f09b67d86
Update for phpunit tests
2023-09-15 18:31:41 +09:00
Clemens Schwaighofer
fe459aec80
Update ErrorMsg with optional target_style string for one style
...
Applied to master or to target style
2023-09-15 18:22:38 +09:00
Clemens Schwaighofer
de0ed058ca
ErrorMessage: new flag for logging 'error' level to log
2023-09-11 13:35:35 +09:00
Clemens Schwaighofer
f90bd193d9
Change setError to setMessage to make it clear what is the corret name
2023-09-08 18:54:44 +09:00
Clemens Schwaighofer
0e31180868
Rename setErrorMsgLevel to setError for backend calls
2023-09-08 18:47:44 +09:00
Clemens Schwaighofer
68c9164eaa
New ErrorMessage class for frontend return error messages
2023-09-08 18:30:05 +09:00
Clemens Schwaighofer
c2389db1c9
Composer updates
2023-09-08 18:30:02 +09:00
Clemens Schwaighofer
f9558cd3aa
Fix for the SetVarType / SetVarTypeNull
...
string: if it is stringable in anyway, set string (it converts)
this is not check IF it is a string value as it was before
int/float: same, if it is numerc it will be convert to int or float
All other stay the same
Note "set ..." imply to set, and not to convert to 0 if it is int
string that can be covnerted to int
2023-09-05 14:26:57 +09:00
Clemens Schwaighofer
ae3011fe22
php unit test fix for DB\IO
2023-09-01 18:29:00 +09:00
Clemens Schwaighofer
9b9dfeac69
phan error supress
2023-09-01 18:21:25 +09:00
Clemens Schwaighofer
33cb05a002
Update to Exceptions: add codes, update phpunit tests
...
DB Class throws Exception if on init it fails to connect to the DB,
will not throw Exception if failed connection during execution but
will do the normal retry and soft failure run
DB\ArrayIO will throw Exception on missing table array and table name
All Exceptions have a code set
2023-09-01 08:37:15 +09:00
Clemens Schwaighofer
ec110499a8
phan fixs
2023-08-31 19:06:16 +09:00
Clemens Schwaighofer
09839f3451
phpstan fixes
2023-08-31 19:04:45 +09:00
Clemens Schwaighofer
067e0aed5d
L10n change Exception to RuntimeException
2023-08-31 18:08:34 +09:00
Clemens Schwaighofer
545de5c4a1
Fixed more Exceptions to be not Errors but Exceptions
...
DateTime, Session, FileWrite, Image, SymmetricEncryption
phpunit tests updated, run checks added
2023-08-31 18:06:02 +09:00
Clemens Schwaighofer
2fe37bf92a
Exceptions change in Check\Colors, add in Cmbined\ArrayHandler
...
Chech\Colors now throws correct exceptions for wrong values
Combined\ArrayHandler will throw errors and not return false
2023-08-31 12:07:28 +09:00
Clemens Schwaighofer
cd81d15d9a
Convert\Color methods will throw Exception instead of false on error
...
All Color methods will throw Exceptions:
LengthException,
InvalidArgumentException,
UnexpectedValueException
instead of returning bool: false
All methods will return valid color data as expected only
2023-08-31 10:45:33 +09:00
Clemens Schwaighofer
8a33ee5c15
Slight update for ACL\Login class exit codes
...
exit will add message as first parameter (string) next to code (int)
Log this to info or critical.
3000 -> 100: info
rest >=1000: critical
previous 4000 = 3000 (options not set)
update unit tests for this
Possible change idea: critical abort throw error?
2023-08-31 10:41:44 +09:00
Clemens Schwaighofer
46e1419ef5
phan checks and updates
2023-08-30 19:26:13 +09:00
Clemens Schwaighofer
c441063437
Composer updates
2023-08-30 19:25:48 +09:00
Clemens Schwaighofer
5290d5f351
Update db class tests in admin run
2023-08-28 09:28:17 +09:00
Clemens Schwaighofer
2635ccb82b
edit.css: rename animation, Bug fix in DB\IO cursor_ext access and others
...
Make sure cursor_ext is set before we access it, else return null for
not set yet.
false for errors, else data value
Other class var access checks to be sure to never fail
2023-08-28 07:40:41 +09:00
Clemens Schwaighofer
4f2ac2ed1b
Change Logging class / method name and Debug Support for backtrace
...
Debug Support:
getCallerClass now returns level 1 class from the trace like the
getCallerMethod. There is also a new getCallerClassMethod that returns
namespace\class->method (or :: for static).
getCallerTopLevelClass works like getCallerClass did before and returns
the TOP level (first entry on the call stack that has a set class name)
Logging:
Do not use the Support getCallerClass/Method/File but call it inside
and use level 2 in trace to get the data we need For the last call
before debug call
Also update the strack trace for the debug call to use ->/:: for method
type
2023-08-22 13:28:59 +09:00
Clemens Schwaighofer
5b8e4e4e3e
Core composer packages update
2023-08-22 13:04:19 +09:00
Clemens Schwaighofer
53192da571
www folder composer updates
2023-08-22 13:04:01 +09:00
Clemens Schwaighofer
f29e915068
class_test fixes for phpstan checks
2023-08-02 16:32:11 +09:00
Clemens Schwaighofer
46bc5f2da6
Json phpunit tests updates, fixes in test php with ignore for deprecated
2023-08-02 16:22:09 +09:00
Clemens Schwaighofer
d70182a84e
Add JSON convert array to json with always return string
...
Allows the same post run error check like the other way around
2023-08-02 16:12:01 +09:00
Clemens Schwaighofer
7243f69826
Email Type class returns correct "false" instead of "bool"
2023-08-02 16:08:39 +09:00
Clemens Schwaighofer
1fc144e178
Composer Workspace global packages
2023-08-02 14:52:33 +09:00
Clemens Schwaighofer
c383a7b7b7
Update convert colors to return false and not bool
...
All convert color either return the color value or false.
To make sure any checker knows that we only return "value" or "false"
change all return bool to false
2023-08-02 07:29:49 +09:00
Clemens Schwaighofer
69077c384c
phpdoc fix for DB\IO dbGetCursorNumRows
2023-08-01 09:00:43 +09:00
Clemens Schwaighofer
cfd49947ad
Bug fix in ACL\Login: mnake sure ['base'] acl is int
2023-07-26 11:48:56 +09:00
Clemens Schwaighofer
6985dc4e9d
ACL\Login fix for UNIT DEFAULT return
...
It has to be int or null but because the SQL result is undefined (string)
it needs to be converted on return if it is a numeric value, else
null will be returned (it is the edit access id PK so it has to be
numeric)
2023-07-24 09:11:32 +09:00
Clemens Schwaighofer
5f2668b011
ACL\Login
...
Remove log per class flag set inside Login.
If per class logging is needed here, set that BEFORE and AFTER the class
call
2023-07-21 19:03:24 +09:00
Clemens Schwaighofer
eba1ef9c59
Init DB\IO dbh with null to avoid any problems
...
There could have been some problems where the dbh var was not touched
even thought it was inited.
2023-07-21 17:48:09 +09:00
Clemens Schwaighofer
8497144053
Admin\Backend level check, DB\IO Error/Warning message update
...
on Admin\Backend init check that the provided default acl level is valid
DB\IO warning and error drop the "db :" prefix part as this is not needed
we have [DB_ERROR] and [DB_WARNING] sub prefixes anyway, also we run
dedicated log level alerts with context
2023-07-14 15:01:46 +09:00
Clemens Schwaighofer
2006798388
Init set empty db config if db config not found
2023-07-10 08:18:49 +09:00
Clemens Schwaighofer
bf63d850ca
Add new DateTime class has date range weekened method
...
dateRangeHasWeekend with two dates, checks if between those two dates
a weekend (sat or sun) is set
2023-07-04 11:43:27 +09:00
Clemens Schwaighofer
53e267ce24
Updates and fixes from phan/phpstan runs
2023-06-28 15:30:08 +09:00
Clemens Schwaighofer
1754ecf2ee
HtmlBuilder: change all return error to Throw, update Element/StrinReplace
...
We do not return old style bool on error, we throw Exceptions: HtmlBuilderExcpetion
Element has more classes to set tag, id, etc with basic checks for valid data
String Replace to set strings is one array with key -> value entries
Errors thrown on index for element/replace blocks
2023-06-28 14:16:44 +09:00
Clemens Schwaighofer
3c37899a48
Rename Replace to StringReplace to match the actual content
...
Replace is too general. it is String Replace
2023-06-27 18:33:04 +09:00
Clemens Schwaighofer
0436cfe3da
HtmlBuilder classes for Object, Array, String Replace build
...
Object build is a replicata from the JS one
Array is similar but build on pure Array elements
String replace is just a simple string replacer for now
General\Error for overall error handling
General\Settings for Object/Array based checks and settings
2023-06-27 18:30:26 +09:00
Clemens Schwaighofer
3606de1a00
Back add some checks for the phfo function that matches the php one
2023-06-27 18:30:00 +09:00
Clemens Schwaighofer
3081439eda
Switch edit_base CSS name from ADMIN_STYLESHEET to EDIT_BASE_STYLESHEET
2023-06-27 18:29:28 +09:00
Clemens Schwaighofer
7af0e74b85
Fix phpUnit test name for Security\SymmetricEncryption
2023-06-26 14:25:36 +09:00
Clemens Schwaighofer
7748b83a6b
DB\IO add stack trace to debug/error/warning calls
...
To add the actuall call reference for DB IO debug calls we add the
call trace as context options
2023-06-16 13:17:49 +09:00
Clemens Schwaighofer
f83293ff1a
Info comments for DB\IO convert options
2023-06-13 11:47:38 +09:00
Clemens Schwaighofer
9c3be2942e
phan and phpstan fixes, also add a convert flag reset to original
...
dbResetConvertFlag resets to the settings given on init of class
2023-06-09 18:23:28 +09:00
Clemens Schwaighofer
ee62bd98ee
Add auto type convert for DB\IO
...
set via db options "db_convert_type" as array with "on", "json", "numeric",
"bytea"
"on" only converts know good types: "bool", "int"
"json" will convert json/jsonb to array
"bytea" will decode escaped bytea to string (note: this might change to resource)
"numeric" will convert to float.
NOTE: if a numeric number is too large a covnersion might drop data.
Use with care.
Convert flags can be chagned with dbSetConvertFlag and dbUnsetConvertFlag
All convert flags are in "DB\Options\Convert" as enum.
2023-06-09 17:01:03 +09:00
Clemens Schwaighofer
02e9610fad
Add a general log method to Logger class
...
the params order is the actual correct one:
log level, message, context, group_id, prefix
not that group_id and prefix are only used if log level is debug
Switched debug params order for context and prefix so prefix is last
2023-06-09 16:59:22 +09:00
Clemens Schwaighofer
8a41db4649
Output\Image cleanup for phpstan
2023-06-09 12:16:49 +09:00
Clemens Schwaighofer
e27ea3dc9f
DB\IO phpdoc update
2023-06-09 10:24:26 +09:00
Clemens Schwaighofer
ec4bf54d81
DB\IO phpdoc layout update
...
Add line between params and method description
2023-06-09 10:21:02 +09:00
Clemens Schwaighofer
ec3ca787fa
Logging: prepare message only if log level is high enough
...
Also some clean ups on internal method call parameters
2023-06-05 09:30:26 +09:00
Clemens Schwaighofer
86acbbb85b
Per run logging was not set if flag changed
...
if setFlag was set for per_run or per_date the init values where not set
Fixed that on setFlag it is checked if we have per_date or per_run and
then set if not set.
Not that for date, set the flag will set a new date, for per run no.
2023-06-02 17:38:09 +09:00
Clemens Schwaighofer
8e0af7a5f7
Class var init fixes
2023-06-01 13:03:46 +09:00
Clemens Schwaighofer
b022662dfc
Removed restrictions for printAr to only accept arrays
...
print_r call takes any value, changed that for all functions
array -> mixed
2023-06-01 12:00:20 +09:00
Clemens Schwaighofer
3039ebf913
Unlink files after test
2023-06-01 11:02:53 +09:00
Clemens Schwaighofer
e2e080c404
Bug fix for DB\IO
2023-06-01 10:58:11 +09:00
Clemens Schwaighofer
4671143d1c
phpunit debug fixes
2023-06-01 09:13:59 +09:00
Clemens Schwaighofer
b492558cca
Logging unit test regex fix
2023-06-01 08:54:47 +09:00
Clemens Schwaighofer
64e76530d4
deprecated log method call name change in test file
2023-06-01 08:43:47 +09:00
Clemens Schwaighofer
0b93f9f146
Bug fixes and minor updates
...
- Removed echo from Support Debug dumpVar call
- deprecated DB\IO toggle dbDebug and changed set/get to be like normal
ones where set just sets and doesn't return anything
- Renamed the logJsDebug to loggingLevelIsDebug
(other levels can be checked with ->getLoggingLevel()->includes(Level::...))
Adjusted tests for all changes
2023-06-01 08:40:55 +09:00
Clemens Schwaighofer
4c6fe1cd6c
Fix Logger\Logger Psr Excpetion calls
2023-05-31 18:44:40 +09:00
Clemens Schwaighofer
83ba48f598
Remove db_debug flag from DB\IO, is set from Logging level
2023-05-31 18:41:13 +09:00
Clemens Schwaighofer
62c6de8244
minor phan config fix
2023-05-31 17:32:00 +09:00
Clemens Schwaighofer
1c2f9f0c2c
ACL\Login if euid was set from SESSION and EUID is not int, error
...
Force to (int)
2023-05-31 16:30:25 +09:00
Clemens Schwaighofer
30bb0e8895
phpunit checks and fixes
2023-05-31 16:14:40 +09:00
Clemens Schwaighofer
75c4c98de8
Convert all classes to strict variable types
...
All variable declarations in all classes have a strict type set
Exception: constants (will be setable from PHP 8.3 on), resources (no type)
Debug\LoggingLegacy is kept as is, will be deprecated
2023-05-31 15:58:06 +09:00
Clemens Schwaighofer
f72055909b
Update in class error/warning/etc calls instead of debug calls
...
For anything that is not debug use the proper reporting level
2023-05-30 18:30:31 +09:00
Clemens Schwaighofer
b0a8783276
Logging class major change, Debug\Support update
...
old Debug\Logging is in Debug\LoggingLegacy and Debug\Logging extends
Logging\Logging
Logging\Logging is a new class with most of the functionality except
there is no more print/outout to screen, but we use the default log
levels (RFC5424)
The plan is to be a frontend between the old type class and
Monolog\Monolog
Updated all other classes to use new class interface
2023-05-30 18:12:24 +09:00
Clemens Schwaighofer
7b5ad92e66
Composer updates
2023-05-29 16:21:51 +09:00
Clemens Schwaighofer
250067927a
fdebug deprecated message update, update debug logger tester script
2023-05-25 17:55:04 +09:00
Clemens Schwaighofer
7c2cbbaca7
Fix Password phpunit test class name
2023-05-24 15:57:34 +09:00
Clemens Schwaighofer
ac037eabde
New Secruity namespace added
...
Move Passwords from Check to Security and deprecate old
Add new SymmetricEncryption and CreateKey
CreateKey class just creates keys for the SymmetricEncryption
SymmetricEncryption uses the hex2bin calls to convert the hex key to the
internal binary key
Example:
$key = CreateKey::generateRandomKey();
$encrypted = SymmetricEncryption::encrypt($string, $key);
$decrypted = SymmetricEncryption::decrypt($encrypted, $key);
Above $key must be stored in some secure location (.env file)
2023-05-24 15:47:02 +09:00
Clemens Schwaighofer
0250b86b3f
Merge branch 'development' of git.tokyo.tequila.jp:E-GRAPHICS_Communications_Japan/PHP_Core_Libraries into development
2023-05-18 15:14:40 +09:00
Clemens Schwaighofer
e45acc412b
Add better error reporting to DB\IO for query with params
...
On error with query with params the query was sent to the server and
if ther query itself is ok but there is a problem with the parameters
a wrong error message ($1 not found) will be returned
Add pg_last_error reporting to catch this too.
Update both error reporting to return not string and prefix combined
but prefix + error string in array
In error return check that both strings are not equal, so we do not
return the same error string twice.
Also default set dbh variable in the PgSQL class to false so it will
skip last error report if there is no dbh set yet.
Bug fix for db query with params debug output. if there are more than 9
entries the $1 of eg $10 is replaced with $1 entry again. Changed to
'#' instead '$' to avoid this.
Other:
ACL\Login: replace EOM with HTML
config.master: replace list() with []
Add single DB tester where we can test single db calls without adding
more to the general test run
2023-05-18 15:14:29 +09:00
Clemens Schwaighofer
854206bc70
Add better error reporting to DB\IO for query with params
...
On error with query with params the query was sent to the server and
if ther query itself is ok but there is a problem with the parameters
a wrong error message ($1 not found) will be returned
Add pg_last_error reporting to catch this too.
Update both error reporting to return not string and prefix combined
but prefix + error string in array
In error return check that both strings are not equal, so we do not
return the same error string twice.
Also default set dbh variable in the PgSQL class to false so it will
skip last error report if there is no dbh set yet.
Bug fix for db query with params debug output. if there are more than 9
entries the $1 of eg $10 is replaced with $1 entry again. Changed to
'#' instead '$' to avoid this.
Other:
ACL\Login: replace EOM with HTML
config.master: replace list() with []
Add single DB tester where we can test single db calls without adding
more to the general test run
2023-05-18 15:08:45 +09:00
Clemens Schwaighofer
b192e98a8a
edit.jq.js docstring fix
...
not needed [ in param part
2023-05-10 08:26:40 +09:00
Clemens Schwaighofer
c4e2c781c6
Bug fix in arraySearchKey
...
Path was fully reset, reven if we went up just one level.
Now splice the reset off but keep everything before
2023-04-26 15:38:48 +09:00
Clemens Schwaighofer
e80b3b8dfd
arraySearchKey: search for key in array and return value or path set
...
search in an array in any format and returns value of key if found.
Either as set with path to key, or as flat with only values.
Optional possible to prefix with the search keys to group found entries
2023-04-26 14:40:39 +09:00
Clemens Schwaighofer
2b079ff836
DB\IO: add missing debug query, clean up not needed code
...
in dbReturn with params on not matching param the system exited on fail
without printing the query making it hard to find where the error is.
Added debug output in case the params count is not matching.
Same move in the dbExecute call
removed param count check from dbReturnRow/dbReturnArray as this check
is done in the dbExecParams call anyway
2023-04-11 10:58:38 +09:00
Clemens Schwaighofer
37201799b5
DB\IO params debug output fix for dbReturn/dbReturnParams calls
...
Those two calls did not replace the params with values for debug output
2023-04-10 17:20:53 +09:00
Clemens Schwaighofer
b9d8911c7b
ACL\Login
...
load and export the additional acl json arrays for
* user: USER_ADDITIONAL_ACL
* group: GROUP_ADDITIONAL_ACL
* access: array element 'additional_acl'
also added to the master acl array:
'additional_acl' => ['user' => [], 'group' => []]
'unit_detail' => [] => ['additional_acl' => []]
2023-04-10 14:32:32 +09:00
Clemens Schwaighofer
c51ceb926e
Bug fix for DB\IO params detection
...
Param detection found too many params, for example '$1'.
Fixed the regex to only allow params that are no preceeded by '
And must start with space/tab, =, (
2023-04-07 14:34:13 +09:00
Clemens Schwaighofer
b4b33d6873
Bug fix for DB\IO returning detection
...
it was still coded with old one line and not taking in possible
line breaks in the returning code part
2023-04-03 15:02:39 +09:00
Clemens Schwaighofer
959240b0fa
Fixes in db class tests files
2023-03-29 09:59:30 +09:00
Clemens Schwaighofer
7eace1013e
DB\IO switch dbReturn, dbReturnParams to NO_CACHE as default
...
Cache is never used, so to keep memory default lower, lets switch to
NO_CACHE
2023-03-29 09:55:09 +09:00
Clemens Schwaighofer
be1e55cad7
Add more DB tests with params methods
2023-03-28 17:01:02 +09:00
Clemens Schwaighofer
11a8c6440b
Update DB\IO debug output for parameter queries
...
if value null set "NULL" else convert to string
Update class basic test with various type tests
2023-03-28 16:46:34 +09:00
Clemens Schwaighofer
742cbc31df
DB\IO add dbExec*, dbReturn* Params methods
...
Instead of prepare/execute, add the proper quary_params calls for all
the dbExec*, dbReturn* calls
Also add field types to cursor info
2023-03-28 15:31:07 +09:00
Clemens Schwaighofer
28909fdc03
composer base packages updates
2023-03-28 11:51:54 +09:00
Clemens Schwaighofer
c3b29ad0d7
comment formatting update only
2023-03-27 16:25:11 +09:00
Clemens Schwaighofer
6d481657df
class test file update for DB with ANY calls
2023-03-16 18:21:48 +09:00
Clemens Schwaighofer
fc57aabf5d
Updates in SmartyExtend set var calls
...
Removed cms object from Frontend and replaced with optional smarty data
array (HEADER, DATA, DEBUG_DATA)
Updated admin call that if $cms is given above data will be extracted.
Added a CONTENT_PATH option for admin, must be set if $cms is set
Is used for the adbTopMenu call
Moved the $cms global check and trigger to the admin call branch only
2023-03-13 11:29:21 +09:00
Clemens Schwaighofer
d56ee68482
Fix missing default null in setSmartyVarsFrontend
2023-03-13 10:36:05 +09:00
Clemens Schwaighofer
b89ab09e12
SmartyExtend parameter phpdoc order fix
2023-03-13 09:25:50 +09:00
Clemens Schwaighofer
e873ade6c0
Change the SmartyExtended Vars set calls to use options array
...
Instead of having each parameter single, group them into an options array
so we do not have to worry about updating the whole function call.
Keep the main core call as is
2023-03-13 09:15:59 +09:00
Clemens Schwaighofer
5910b884ac
Bug fix in SmartyExtend class and user name set
2023-03-10 15:25:54 +09:00
Clemens Schwaighofer
e3bd2c1c3b
Remove more _SESSION calls in classes, test updates
...
Admin\EditBase now has ACL\Login class as mandatory class parameter
Output\Form\Generate has loginAcl array parameter as mandatory
2023-03-10 15:08:56 +09:00
Clemens Schwaighofer
90a8c5540f
Deprecate the GetLocale class and replace with ACL\Login locales set
...
If ACL\Login is used, the loginGetLocale() call should be used to fetch
the locale data set during login
Language\L10n now has new encoding/charset optional parameter 4
If the locale does not have a charset set the defautl charset is UTF-8
unless set via the new parameter or setOverrideEncoding()
Because of the deprecation of the getLocales call the following methods
do no longer need $locales
- Admin\Backend
- Admin\EditBase
- Output\Form\Generate
- Template\SmartyExtend
They all use the new l10n->getLocaleAsArray() call to set all the local
variables
* Admin\EditBase has new parameter "options" to set
- cache_id
- compile_id
which must be passed on the SmartyExtend class init
2023-03-10 13:43:43 +09:00
Clemens Schwaighofer
ea503fffe9
Merge branch 'development'
2023-03-09 16:45:07 +09:00
Clemens Schwaighofer
feba79a2e8
Install psalm as dev, sync scripts updates
2023-03-09 16:27:10 +09:00
Clemens Schwaighofer
6bec59e387
Deprecate check for GetDotEnv tests
2023-03-09 16:17:52 +09:00
Clemens Schwaighofer
03fbcaecfb
Code Clean up, more testing
...
Remove unused code and classes.
Clean up code to remove all named constant from them and throw
deprecation alerts if used.
Add basic psalm setup in root folder and remove from www folder
2023-03-09 15:55:57 +09:00
Clemens Schwaighofer
283e7de1dc
Remove Jason class, now in Json, deprecated since v7
2023-03-02 15:35:13 +09:00
Clemens Schwaighofer
d952c5f774
Remove Jason class, now in Json, deprecated since v7
2023-03-02 15:26:40 +09:00
Clemens Schwaighofer
cd8351d761
Update composer package create readme
2023-03-02 11:51:39 +09:00
Clemens Schwaighofer
b992901072
Move all tests into sub folders for a more clear structure
2023-03-02 11:51:29 +09:00
Clemens Schwaighofer
1596654149
Moved minimum php version to 8.1
...
All PostgreSQL calls are now Connection/Resource object types and not
resource
All methods have parameter type set
2023-02-28 17:36:19 +09:00
Clemens Schwaighofer
44f37b7f74
Fix in EditUser Table Array query load for languages
...
Also split all queries into multi line ones
Fixes in Form\Generate for TableArray Interface location move
Update EditBase to new and old edit schema (scheme) file name
2023-02-28 10:31:34 +09:00
Clemens Schwaighofer
829f5c567f
Update composer autoload map files
2023-02-28 06:40:19 +09:00
Clemens Schwaighofer
710a48abcd
Move the TableArrays Interface to a sub folder in TableArrays
...
to avoid strange path lookups
2023-02-28 06:36:11 +09:00
Clemens Schwaighofer
f564c27319
Add readme file for composer package deploy flow
2023-02-24 16:44:21 +09:00
Clemens Schwaighofer
00b98e7230
phpunit test scritps fix
2023-02-24 09:45:52 +09:00
Clemens Schwaighofer
7cae3e701a
phpunit test fixes
2023-02-24 09:43:24 +09:00
Clemens Schwaighofer
da67d1bde3
phpstan update
2023-02-22 06:47:34 +09:00
Clemens Schwaighofer
16c3653cee
phpstan updates for Smarty move to composer package
2023-02-22 06:42:53 +09:00
Clemens Schwaighofer
47c4c5cb69
Install smarty from composer package
2023-02-22 06:36:34 +09:00
Clemens Schwaighofer
7b9dc9c8b2
Rename the VarSetType class to SetVarType
...
The old name made no sense and it was only used in two projects, so the
deprecation step has been skipped
2023-02-22 06:32:58 +09:00
Clemens Schwaighofer
6133da9069
phpunit test must be installed in www/ folder
...
Because www folder is source base, if phpunit is installed outside it
cannot find the classes
2023-02-22 06:31:50 +09:00
Clemens Schwaighofer
fa0b102d1a
Fix test file for Form\Generate
...
There is no global variable load anymore
Override table arrays have to be set on load
2023-02-17 13:19:59 +09:00
Clemens Schwaighofer
0e99700bbe
Composer vendor name change
2023-02-16 13:04:20 +09:00
Clemens Schwaighofer
2f0b9fb360
Move Fonts folder from lib to includes
2023-02-16 12:32:15 +09:00
Clemens Schwaighofer
c7cc3c2938
Move all dev tools from www composer to outside master composer
2023-02-13 16:36:51 +09:00
Clemens Schwaighofer
f508b607a6
Add new class for auto set vars to certain types or null
...
Convert\VarSetType for always return type expected (eg string will be string)
or Convert\VarSetTypeNull to return string or null on failure
The return value for failure if not matching type can be set for both, but
only for Convert\VarSetTypeNull the return value can be set to null.
2023-02-08 12:12:46 +09:00
Clemens Schwaighofer
f94b350ba4
Install phan/phpstan local
2023-02-08 12:02:18 +09:00
Clemens Schwaighofer
53eef03387
Fixes in DB\IO query detection regex
...
- start with allow whitespace in front
- returning allows more white space types between keyword and parameter list
2023-02-02 10:27:07 +09:00
Clemens Schwaighofer
5a81445a28
DB\IO table match regex fix
...
UPDATE with SET can have spaces with variable length before
2023-01-27 11:31:26 +09:00
Clemens Schwaighofer
4bbbd653cd
DB\IO fix for regex query detection
...
Fix for basic query detection:
Simeple starts with
SELECT/WITH/SHOW
INSERT INTO/UPDATE/DELETE FROM
UPDATE
Above does no complex query detection, just if the string starts with this
Fix form table detection for primary key auto set trial.
2023-01-27 11:12:46 +09:00
Clemens Schwaighofer
4c28e6d0ec
Change DB\IO Returning check regex
...
Better regex to only get last returning in query, with proper parameter
check
2023-01-26 16:37:22 +09:00
Clemens Schwaighofer
66b7e81463
Bug fix in DB\IO for EOM string build queries with returning
...
on EOM string build queries it was not checked that RETURNING could have
no space in front.
Fixed and updated test calls
2023-01-25 16:47:31 +09:00
Clemens Schwaighofer
cf58f86802
Remove not needed ?? '' in ACL\Login
2023-01-16 14:29:25 +09:00
Clemens Schwaighofer
ff644310cd
Readme file update
2023-01-11 09:22:18 +09:00
Clemens Schwaighofer
58988b9c0f
Rename edit schemes pages to schemas
2023-01-11 09:12:56 +09:00
Clemens Schwaighofer
fe75f1d724
Add missing table arrays and name fix schim
...
missed two table arrays as class EditVisibleGroup and EditAccess
also fix wrong name for EditSchemas (wrong: EditSchemes) with a shim
lookup.
edit_schemes.php file will stay the same for now.
2023-01-11 07:06:28 +09:00
Clemens Schwaighofer
0607cdc3be
Add logger $log public entry in Form class
...
We need that for sub calls to debugger from TableArray loads
2023-01-10 18:19:20 +09:00
Clemens Schwaighofer
6cb14daf49
Move includes/table_arrays to class Output\Form\TableArrays
...
also remove the legacy edit_base.LEGACY.php file
All previous includes/table_arrays load via include are now moved to a
class system so we have all implemented in one folder and can easy update
and add unit tests to it.
2023-01-10 18:04:29 +09:00
Clemens Schwaighofer
330582f273
Add $this identifier to class in array_edit_users
2023-01-10 16:42:42 +09:00
Clemens Schwaighofer
b0293b52bd
Fix edit_users load problem with removed globals
...
acl_admin/base_acl_leve
Added public access methods to read this when array_* files are included.
2023-01-10 16:01:02 +09:00
Clemens Schwaighofer
00591deb00
Add Check Color class
...
checks html/css color string for valid
eg, hex #, hex alpha #, rgb/rgba, hsl/hsla
2023-01-10 15:43:33 +09:00
Clemens Schwaighofer
737f70fac5
Fix phpdoc Exception name with missing \
2023-01-10 14:40:16 +09:00
Clemens Schwaighofer
0328ccd2fe
Convert\Colors fixes for from HSB/HSL Hue 360
...
If hue 360 is given, it is no longer an error but internally converted to 0
2023-01-10 14:07:01 +09:00
Clemens Schwaighofer
eba1e2885f
Convert\Byte add exception
...
And exception is thrown for invalid flags
2023-01-10 14:06:09 +09:00
Clemens Schwaighofer
53813261fb
Form\Generate update
...
- remove auto load _POST vars
- Update color settings to # leading 6/8 digit hex code
- remove any global variable calls/requests
- fix some isset/empty clean ups (isset + set = !empty)
- fix on delete of reference data that loaded data was not shown again
- fix on reference data save error that wrong data is still shown and not removed
2023-01-10 11:25:51 +09:00
Clemens Schwaighofer
df2ae66942
Bug fix for loading after new/save/delete
2023-01-06 15:16:01 +09:00
Clemens Schwaighofer
78e1d73cd9
Move code from edit_base.php to class file
2023-01-06 15:07:15 +09:00
Clemens Schwaighofer
620a5878c1
Update dotenv reader from Composer package
2023-01-06 10:51:12 +09:00
Clemens Schwaighofer
5a0b09a916
Add DB\IO get prepare cursor array entries
2023-01-05 17:26:26 +09:00
Clemens Schwaighofer
98c6033c75
mo to js script set exectueable
2023-01-05 15:31:35 +09:00
Clemens Schwaighofer
6dcebc9b67
mo to js shell script
2023-01-05 15:30:51 +09:00
Clemens Schwaighofer
c97520e186
Update flatpickr javascript lib
2023-01-05 15:14:08 +09:00
Clemens Schwaighofer
764ca1f098
fix Generate\Form test with missing session init
2023-01-05 11:32:39 +09:00
Clemens Schwaighofer
3d23e5b066
Composer update
2023-01-05 10:55:01 +09:00
Clemens Schwaighofer
90e418ba24
Smarty update to 4.3.0
2023-01-05 10:38:51 +09:00
Clemens Schwaighofer
b6a0937e0c
autoloader update
2022-12-28 17:46:40 +09:00
Clemens Schwaighofer
b3f6f8ef18
Raname Progressbar.php to ProgressBar.php
2022-12-28 16:14:38 +09:00
Clemens Schwaighofer
d9d5400498
Add Test for get run times for unrun queryies
2022-12-28 11:31:39 +09:00
Clemens Schwaighofer
b1be681afb
Bug fix in DB\IO for wrong array check
...
Did not use empty to check if query called hash entry exists
2022-12-28 11:26:56 +09:00
Clemens Schwaighofer
8ef309d479
PHP unit 8.2, cel builder br/input fix, doctype add, sync .user.ini
...
- do not sync .user.ini file in sync template
- add PHP 8.2 for test target phpunit
- cel/phfo builder update to not close br or img tags (besides input)
- psalm settings update
- add doctype to all base templates
2022-12-27 16:58:51 +09:00
Clemens Schwaighofer
6e59b63791
DB\IO phpdoc and phpstan fixes
2022-12-14 14:18:33 +09:00
Clemens Schwaighofer
9c7b3cea83
SQL Interface docstring fix
2022-12-14 13:53:54 +09:00
Clemens Schwaighofer
26af6a07f4
PHP unit tests updates for class changes
2022-12-09 16:53:10 +09:00
Clemens Schwaighofer
b7c6d4b478
DB\IO add unescape bytea data
2022-12-09 16:33:58 +09:00
Clemens Schwaighofer
9936fc04da
Convert\Byte class fix string in abs call
2022-12-09 16:33:47 +09:00
Clemens Schwaighofer
1e0dfa2106
Update documentation for Convert\Byte Class
...
add more info in parameters flag
2022-12-09 13:43:15 +09:00
Clemens Schwaighofer
3af6f6a8f0
edit interface, hard set edit.css style sheet
2022-12-07 06:56:47 +09:00
Clemens Schwaighofer
1e793c0d16
Switch all SQL from tab to spaces
2022-12-06 09:27:08 +09:00
Clemens Schwaighofer
5be34453ce
Fix in Smarty Template class and PAGE WIDTH set
2022-11-10 10:26:59 +09:00
Clemens Schwaighofer
7773b78e17
Fix in CoreLib Bytes for null to trim
2022-11-09 18:11:14 +09:00
Clemens Schwaighofer
2a3798c8c2
Create mo file update, basic edit css/javascript updates
2022-10-25 16:48:34 +09:00
Clemens Schwaighofer
bc8303fe5f
Composer update
2022-10-25 16:48:12 +09:00
Clemens Schwaighofer
ba89b188d9
Mo create script update, phpstan fixes, document updates
...
create_mo:
set auto base folder bases on current location so we do not need do
adjust paths in script
phpstan fixes:
edit_base.php
CoreLibs/Basci.php
CoreLibs/DB/SQL/PgSQL.php
Update documentation in method headers
CoreLibs/Combined/DateTime.php
2022-10-12 09:48:22 +09:00
Clemens Schwaighofer
d15618cde4
Add JS_TRANSLATE file to smart template flow
2022-10-04 17:35:46 +09:00
Clemens Schwaighofer
0fd89727e9
Update Output\Form to allow ACL controlled edit/view entries
...
Fixed phpunit test runs with encoding test run and not resetting the
subsitute character back to default
Note: There are mime encoding failures for php 7.4 and 8.0 and one ACL
login failure test for php 7.4
2022-09-06 11:17:03 +09:00
Clemens Schwaighofer
a8e75d158b
Update composer installed packages
2022-09-06 11:16:33 +09:00
Clemens Schwaighofer
4b3fbaa309
Updates based on latest phpstan run
2022-09-02 17:00:22 +09:00
Clemens Schwaighofer
1a6c65df0e
Minor test updates, comment typo updates, DB_CONFIG_SET for default
...
$DB_CONFIG_SET is now default current selcted db config instead of
$DB_CONFIG so to not overwrite the array itself
2022-08-05 12:43:57 +09:00
Clemens Schwaighofer
24f553a17e
Update comments for split element counter
2022-07-29 13:20:54 +09:00
Clemens Schwaighofer
9a3ea2f7db
update strings class with split counter method
2022-07-29 13:19:45 +09:00
Clemens Schwaighofer
bcdb877d90
Phan/phpstan fixes
2022-07-29 11:06:53 +09:00
Clemens Schwaighofer
6d0e528c38
Combined\Datetime date/number to weekday conversion
...
Convert functions for date or weekday number to weekday name or date to
weekday number
2022-07-29 11:02:25 +09:00
Clemens Schwaighofer
7e6474195b
String split format fix for non ascii characters
...
Currently just abort and return string as is
2022-07-29 10:38:32 +09:00
Clemens Schwaighofer
1795d3ba6c
String convert class added
...
Currently with one method: splitFormatString
Converts a string to a string with separater characters based on a
format string
2022-07-29 07:00:02 +09:00
Clemens Schwaighofer
e1340acf55
Class header info string fix
2022-07-29 06:59:33 +09:00
Clemens Schwaighofer
b5ead3e266
Minor code block comment clean ups
2022-07-15 17:42:38 +09:00
Clemens Schwaighofer
f5daaca598
Fixes for Create\Email docstrings
2022-07-08 17:25:45 +09:00
Clemens Schwaighofer
6b4f310cd2
Email\Sending add dedicated kv folding flag
...
kv folding is now done via flag and only if an encoded is detected that
is japanese or UTF-8
2022-07-04 15:45:51 +09:00
Clemens Schwaighofer
7b5bddb529
Create\Email fixes
...
Remove not needed reaplce content count for first global replace
Move logger out of test only and log if a logger class is attached
2022-07-01 08:57:14 +09:00
Clemens Schwaighofer
0a6fdf1248
Use logged encoding from JSON debug block for non UTF-8 tests
2022-06-30 18:18:17 +09:00
Clemens Schwaighofer
3220180d58
Bug fix in Email for encoding subject/body with empty replace
...
Also store encoding in json log if test and debug print is given
2022-06-30 18:16:28 +09:00
Clemens Schwaighofer
8c8f14ec74
Fix logging per run to be setable not only on start
...
Move per run set into method.
Add set/get method and add set method override (set new) flag
Update phpUnit testing and move providers to test methods
2022-06-30 18:15:36 +09:00
Clemens Schwaighofer
643991c3fd
Update Debug\Support, add Create\Email
...
update debug support to add html escape for html strings on request.
Default is keep as is. debugString gets new third parameter for this as
bool flag.
Add Create\Email to send basic text emails to several too addresses.
Content replace in subject and body is possible with {} entries.
Default encoding is UTF-8 but others can be set and content will be
converted to this.
The dynamic replace works on all data or can be set per receiver.
2022-06-28 17:29:31 +09:00
Clemens Schwaighofer
c81c46d426
Move read_env_file.php to deprecated folder
2022-06-23 14:46:19 +09:00
Clemens Schwaighofer
d97b173ee7
ACL\Login move public var to private: login
...
the former public var $login is now private and if it is set can be
checked with loginActionSet (true if login_login was in _POST as login
action.
Some info update for phpUnit ACL\Login test file
2022-06-23 09:12:46 +09:00
Clemens Schwaighofer
b61152f10e
Skipped/Incomplete tests update
2022-06-23 07:09:19 +09:00
Clemens Schwaighofer
0c68ebe652
Login\ACL revalidate flow fixes
...
- DB function had wrong column name
- Queries in ACL\Login had wrong column name
- Renamed from login_user_id_last_login to login_user_id_last_revalidate
to make it more clear what this column is
- add edit_user admin page output for this column
- add phpUnit test case for revalidate is needed and login with next
loginUserId is ok again
2022-06-23 06:50:07 +09:00
Clemens Schwaighofer
31d0cdb8ad
Fix revalidate after flow in ACL\Login
...
After revalidate time was reached, it was never reset because it used
the original loginUserId set date.
A new column has been added that gets reset every time the user logs in
with username and password if a loginUserId is set in the database
2022-06-22 19:38:03 +09:00
Clemens Schwaighofer
0f823bd283
Just minor line length fixes in ArrayIO class
2022-06-22 18:10:23 +09:00
Clemens Schwaighofer
6385a48824
add back unique constraint because null login_user_id are allowed
2022-06-22 16:56:51 +09:00
Clemens Schwaighofer
a754d897cf
Bug fixes for emptynull type in ArrayIO, Form\Generate interval
...
Form\Generate for intervals also allows day(s), month(s), year(s), call
case insensitive
ArrayIO fix for missing escale literal for
date/datetime/interval/emptynull text type
2022-06-22 16:17:16 +09:00
Clemens Schwaighofer
4600f8f7bf
Update edit_user form page and also minor updates to Form and ArraIO
...
login_user_id is unique if not null (as index, constraint only with
PostgreSQL 15)
login_user_id_revalidate_after is not longer not null and default set,
no need for this
DB\Extended\ArrayIO:
add sql_read for datetime fields to change amount of data (eg only up
to minute) with to_char() method. sample: YYYY-MM-DD HH24:MI
Add date/datetime/emptynull for setting empty fields to null and not
empty string
Output\From\Generate:
Remove all fill for spacer and change them to placeholder html types.
Add datetime check next to date, time only checks
edit_user Admin Form:
add all new columns there
2022-06-22 15:50:07 +09:00
Clemens Schwaighofer
04e4fe46f2
Update ACL\Login class with _GET/_POST login parameter
...
loginUserId parameter in _GET or _POST for direct login without username
and password.
This can be secured by:
- must login after x days from set loginUserId on
- can only login with loginUserId in given time range
- flag lock loginUserId
2022-06-22 13:52:47 +09:00
Clemens Schwaighofer
c35d3c9324
Remove constant from deprecated ReadEnvFile class (now dotEnv)
2022-06-14 16:27:00 +09:00
Clemens Schwaighofer
e92a682a8c
ACL\Login phpUnit tets update for ajax page tests
2022-06-14 16:24:17 +09:00
Clemens Schwaighofer
ea07e4b95b
Update ACL\Login with internal ajax_page flag override
...
Also ajax flag return method
2022-06-14 16:23:24 +09:00
Clemens Schwaighofer
88178cb08d
Rename class ReadEnvFile to DotEnv and add test cases
...
previous named Get\ReadEnvFile is no Get\DotEnv, static method is the
same.
Update for not parsing comments at the end of a line if the line was not
in quotes. Strips everything after comment mark and also right trims any
trailing spaces
Old:
FOO=Test # Comment -> $_ENV['FOO'] = "Test # Comment"
New:
FOO=Test # Comment -> $_ENV['FOO'] = "Test"
Add phpUnit tests for DotEnv class.
Update config.php with new class name
The old class name exists and is markted as deprecated until next major
release
2022-06-09 09:05:48 +09:00
Clemens Schwaighofer
5d98be06be
Code clean up for phan and phpstan
2022-06-07 18:16:23 +09:00
Clemens Schwaighofer
183cadb0fd
Class ACL\Login update with phpunit testing
...
Move logic from constructor to separate function
Add more public access methods for internal variable access (password
min length settings, error login code, error login string error)
All error messages are declared in constructor with wrapper function to
create html error string for template creation
Add wrapper function for exit/abort and page name read for easier mocking
in testing
Fixes for multi login main function caller and cached query problem: do
not cache query for login
Add reverse default access list SESSION variable and public readers
Update logout with unset of full SESSION array to empty, use external
session class for all session calls. Also unset euid on logout
2022-06-07 18:05:50 +09:00
Clemens Schwaighofer
2067a6fe1d
Config master SSL site detection update
2022-06-07 18:05:34 +09:00
Clemens Schwaighofer
f5b6c639fb
Fix primary key base number after more inserts are done
2022-06-03 11:13:35 +09:00
Clemens Schwaighofer
cde29c0362
Update DB\IO dbReturn and update connected tests
...
Switch the code point for these below for logic reasons
CLEAR_CACHE 1 => 2 (clear cache AFTER END read)
READ_NEW 2 => 1 (clear cache BEFORE first read)
in dbReturn cursor ext array:
remove firstcall entry because it is not needed
add new:
- cache_flag: $cache method call number
- assoc_flag: the assoc read flag from the method call
- cached: if there is data cached in the cursor ext array this is true
- finished: true if the last read was false
- db_read_finished: if true the db read has fiinished (read_rows =
num_rows)
- read_finished: if true the current read (cache or db) via pos =
num_rows is done
- log_pos: sequential number for each call with the same query hash
- log: array with current actions done in the last read
Update DB IO class test with all cursor, cursor ext, read single step,
read in loop, read again, etc tests
2022-06-03 11:03:06 +09:00
Clemens Schwaighofer
10234000b7
ACL\Login test class add
...
- db create shell script for ACL\Login to reset full database to known
good stated
- basic tests written to check core login class
2022-06-02 18:14:58 +09:00
Clemens Schwaighofer
a63a50a412
add tests for dbReturn only
...
dbReturn special call test file, update main db test file
Main class_test file with links update
2022-06-02 16:38:10 +09:00
Clemens Schwaighofer
59da10b649
Session class update with session destroy / start wrapper
...
session start wrapper as protected method
session destroy wrapper with _SESSION array unset
2022-06-02 16:35:40 +09:00
Clemens Schwaighofer
b714de498f
Add print boolean stand allone support function
...
in the Debug\Support add printBool to print out bool as string.
Same as printAsString with bool alone but you can control prefix name,
and true/false string names
Add printArray alias to prAr
2022-06-02 16:31:35 +09:00
Clemens Schwaighofer
aa11937ab2
Update Running time for better high resolution timer
...
Instead of ending with the second hr timer call, we print out difference
to the last one.
Add new method to print out from start time difference and add a reset
method
2022-06-02 16:30:22 +09:00
Clemens Schwaighofer
d64d5f081c
Add Class for Memory Usage tracking
2022-06-02 16:26:55 +09:00
Clemens Schwaighofer
3085b52714
Update PHPdoc parts
...
Add empty line between description and first @param entry.
Some other minor comment layout and text fixes
2022-06-02 16:07:38 +09:00
Clemens Schwaighofer
9949a5ef7f
Update core edit_* tables with various fixes
...
- import script with write to file option
- fix file names for functions
- add generic (non edit tables) for only set date, set uid or combine
- fix edit table edit_language insert data
- all trigger create remove the drop on exists, as in the flow the trigger will never exists
2022-05-31 20:17:32 +09:00
Clemens Schwaighofer
74ba935e96
Comment info update in L10n class
2022-05-27 15:01:30 +09:00
Clemens Schwaighofer
39a62ed59d
Update phpunit tests for Debug\Logging
2022-05-26 15:20:19 +09:00
Clemens Schwaighofer
1379cf1519
Add print bool in logging class
2022-05-26 14:31:48 +09:00
Clemens Schwaighofer
2d15b78d21
Composer update
2022-05-26 09:52:37 +09:00
Clemens Schwaighofer
92ebdb4b9e
Update session class and write session clas tester, update DB\IO Tester
...
DB\IO Tester now has correct testing for pgVersion string compare. Uses
mocked pgVersion return for this
Session class update with full magic set/get or method set/get for
_SESSION var. Also added full testing for this
2022-05-26 09:27:57 +09:00
Clemens Schwaighofer
a523a4e831
ACL\Login class update for phpstan check
2022-05-24 16:50:37 +09:00
Clemens Schwaighofer
db8e17ae7c
Convert static Session class to normal session class
...
All static Session:: calls (except for checking valid session name) are
converted to object type. This Object is passed on to Login, Admin
Backend and any other class that needs basic session checking
2022-05-24 15:00:04 +09:00
Clemens Schwaighofer
5b581c2ed6
Fix checkCLI call on false return from php_sapi_name()
2022-05-24 13:12:17 +09:00
Clemens Schwaighofer
1e734581d7
Session class update, cli check add, tests updates, edit table update
...
Update edit_access_data table and set unique check for edit_access_id +
name so we do not have two identical keys for one edit access set
Update config host and add more test domains for various access tests
Update Session and move cli check to Get\System class. Some other minor
session info updates
New method \Get\System::checkCLI() returns true if the sapi name has
cli inside, else false
2022-05-24 11:36:03 +09:00