Compare commits
16
Commits
c095fd663f
...
v9.36.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
157169d3ba | ||
|
|
60fe0e0def | ||
|
|
e473e7899d | ||
|
|
8af71b70a3 | ||
|
|
7d10b4c5af | ||
|
|
c81b602657 | ||
|
|
59cc5f2060 | ||
|
|
e072aaf4d6 | ||
|
|
259f9cebf3 | ||
|
|
bd4f674f0f | ||
|
|
87293bf633 | ||
|
|
be46d6e101 | ||
|
|
433bc3d539 | ||
|
|
4ed645bac3 | ||
|
|
908376c1a5 | ||
|
|
c329e7a2da |
No files matched your search
@@ -7,3 +7,4 @@ www/composer.lock
|
|||||||
www/vendor
|
www/vendor
|
||||||
**/.env
|
**/.env
|
||||||
**/.target
|
**/.target
|
||||||
|
package-lock.json
|
||||||
@@ -9,5 +9,6 @@
|
|||||||
CREATE TABLE generic (
|
CREATE TABLE generic (
|
||||||
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
||||||
date_updated TIMESTAMP WITHOUT TIME ZONE,
|
date_updated TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
uuid UUID DEFAULT gen_random_uuid(),
|
||||||
uid VARCHAR
|
uid VARCHAR
|
||||||
);
|
);
|
||||||
@@ -24,12 +24,12 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
'get email regex invalid -1, will be 0' => [
|
'get email regex invalid -1, will be 0' => [
|
||||||
-1,
|
-1,
|
||||||
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
. "(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$"
|
||||||
],
|
],
|
||||||
'get email regex invalid 10, will be 0' => [
|
'get email regex invalid 10, will be 0' => [
|
||||||
10,
|
10,
|
||||||
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
. "(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$"
|
||||||
],
|
],
|
||||||
'get email regex valid 1, will be 1' => [
|
'get email regex valid 1, will be 1' => [
|
||||||
1,
|
1,
|
||||||
@@ -157,7 +157,7 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
'error' => 0,
|
'error' => 0,
|
||||||
'message' => 'Invalid email address',
|
'message' => 'Invalid email address',
|
||||||
'regex' => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
'regex' => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
. "(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'error 1 will return double @ error' => [
|
'error 1 will return double @ error' => [
|
||||||
@@ -181,7 +181,7 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
[
|
[
|
||||||
'error' => 3,
|
'error' => 3,
|
||||||
'message' => 'Invalid domain part after @ sign',
|
'message' => 'Invalid domain part after @ sign',
|
||||||
'regex' => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
'regex' => "@(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'error 4 will be invalid domain' => [
|
'error 4 will be invalid domain' => [
|
||||||
@@ -189,7 +189,7 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
[
|
[
|
||||||
'error' => 4,
|
'error' => 4,
|
||||||
'message' => 'Invalid domain name part',
|
'message' => 'Invalid domain name part',
|
||||||
'regex' => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\."
|
'regex' => "@(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\."
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'error 5 will be invalid domain top level only' => [
|
'error 5 will be invalid domain top level only' => [
|
||||||
@@ -197,7 +197,7 @@ final class CoreLibsCheckEmailTest extends TestCase
|
|||||||
[
|
[
|
||||||
'error' => 5,
|
'error' => 5,
|
||||||
'message' => 'Wrong domain top level part',
|
'message' => 'Wrong domain top level part',
|
||||||
'regex' => "\.([a-zA-Z]{2,6}){1}$"
|
'regex' => "\.[a-zA-Z]{2,6}$"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'error 6 will be domain double dot' => [
|
'error 6 will be domain double dot' => [
|
||||||
|
|||||||
@@ -105,11 +105,15 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'log_folder' => self::LOG_FOLDER,
|
'log_folder' => self::LOG_FOLDER,
|
||||||
'log_level' => Level::Error,
|
'log_level' => Level::Error,
|
||||||
]);
|
]);
|
||||||
|
$errorLogTmpfile = tmpfile();
|
||||||
|
$errorLogLocationBackup = ini_set('error_log', stream_get_meta_data($errorLogTmpfile)['uri']);
|
||||||
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
||||||
$em->setMessage(
|
$em->setMessage(
|
||||||
$level,
|
$level,
|
||||||
$str
|
$str
|
||||||
);
|
);
|
||||||
|
// for exceptions if log level is set to catch them
|
||||||
|
$error_log_content = stream_get_contents($errorLogTmpfile);
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
[
|
[
|
||||||
'level' => $expected,
|
'level' => $expected,
|
||||||
@@ -377,6 +381,8 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
?bool $log_warning,
|
?bool $log_warning,
|
||||||
string $expected
|
string $expected
|
||||||
): void {
|
): void {
|
||||||
|
$errorLogTmpfile = tmpfile();
|
||||||
|
$errorLogLocationBackup = ini_set('error_log', stream_get_meta_data($errorLogTmpfile)['uri']);
|
||||||
$log = new \CoreLibs\Logging\Logging([
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
'log_file_id' => 'testErrorMessagesLogError',
|
'log_file_id' => 'testErrorMessagesLogError',
|
||||||
'log_folder' => self::LOG_FOLDER,
|
'log_folder' => self::LOG_FOLDER,
|
||||||
@@ -392,6 +398,9 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
log_error: $log_error,
|
log_error: $log_error,
|
||||||
log_warning: $log_warning
|
log_warning: $log_warning
|
||||||
);
|
);
|
||||||
|
ini_set('error_log', $errorLogLocationBackup);
|
||||||
|
// for exceptions if log level is set to catch them
|
||||||
|
$error_log_content = stream_get_contents($errorLogTmpfile);
|
||||||
$file_content = '';
|
$file_content = '';
|
||||||
if (is_file($log->getLogFolder() . $log->getLogFile())) {
|
if (is_file($log->getLogFolder() . $log->getLogFile())) {
|
||||||
$file_content = file_get_contents(
|
$file_content = file_get_contents(
|
||||||
@@ -447,6 +456,8 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
'log_level' => Level::Debug,
|
'log_level' => Level::Debug,
|
||||||
'log_per_run' => true
|
'log_per_run' => true
|
||||||
]);
|
]);
|
||||||
|
$errorLogTmpfile = tmpfile();
|
||||||
|
$errorLogLocationBackup = ini_set('error_log', stream_get_meta_data($errorLogTmpfile)['uri']);
|
||||||
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
$em = new \CoreLibs\Logging\ErrorMessage($log);
|
||||||
$em->setErrorMsg(
|
$em->setErrorMsg(
|
||||||
$id,
|
$id,
|
||||||
@@ -456,6 +467,9 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
|
|||||||
log_error: $log_error,
|
log_error: $log_error,
|
||||||
log_warning: $log_warning
|
log_warning: $log_warning
|
||||||
);
|
);
|
||||||
|
ini_set('error_log', $errorLogLocationBackup);
|
||||||
|
// for exceptions if log level is set to catch them
|
||||||
|
$error_log_content = stream_get_contents($errorLogTmpfile);
|
||||||
$file_content = '';
|
$file_content = '';
|
||||||
if (is_file($log->getLogFolder() . $log->getLogFile())) {
|
if (is_file($log->getLogFolder() . $log->getLogFile())) {
|
||||||
$file_content = file_get_contents(
|
$file_content = file_get_contents(
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ use CoreLibs\Logging\Logger\Flag;
|
|||||||
final class CoreLibsLoggingLoggingTest extends TestCase
|
final class CoreLibsLoggingLoggingTest extends TestCase
|
||||||
{
|
{
|
||||||
private const LOG_FOLDER = __DIR__ . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR;
|
private const LOG_FOLDER = __DIR__ . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR;
|
||||||
private const REGEX_BASE = "\[[\d\-\s\.:]+\]\s{1}" // date
|
private const REGEX_BASE = "\[[\d\-\s\.:+T]+\]\s{1}" // date, just basic checks
|
||||||
. "\[[\w\.]+(:\d+)?\]\s{1}" // host:port
|
. "\[[\w\.]+(:\d+)?\]\s{1}" // host:port
|
||||||
. "\[(phar:\/\/)?[\w\-\.\/]+:\d+\]\s{1}" // folder/file [note phar:// is for phpunit]
|
. "\[(phar:\/\/)?[\w\-\.\/]+:\d+\]\s{1}" // folder/file [note phar:// is for phpunit]
|
||||||
. "\[\w+\]\s{1}" // run id
|
. "\[\w+\]\s{1}" // run id
|
||||||
|
|||||||
@@ -119,6 +119,8 @@ On a version update the old phpunit folder in .libs has to be removed and the ne
|
|||||||
|
|
||||||
The original edit.js javascript functions are now in utils.js or utils.min.js.
|
The original edit.js javascript functions are now in utils.js or utils.min.js.
|
||||||
|
|
||||||
The development for thos files is located in a different repository
|
The development for those files is located in a different repository
|
||||||
|
|
||||||
https://[service]/CodeBlocks/javascript-utils
|
General: <https://[service]/CodeBlocks/JavaScript.utils>
|
||||||
|
|
||||||
|
Org: <https://[serverice]/[org]/Code-Blocks.JavaScript.utils>
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
This software follows the [Semver 2.0 scheme](https://semver.org/).
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
Only the latest version is supported
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
Open a ticket to report a secuirty problem
|
||||||
Generated
-1567
File diff suppressed because it is too large.
Load diff
@@ -332,7 +332,7 @@ print "(kosrt, lower case, reverse): "
|
|||||||
|
|
||||||
print "<hr>";
|
print "<hr>";
|
||||||
$nested = [
|
$nested = [
|
||||||
'B' => 'foo', 'a', '0', 9,
|
'B' => 'foo', 'a', '0', 9, /** @phpstan-ignore-line This is a test for wrong index */
|
||||||
'1' => ['z', 'b', 'a'],
|
'1' => ['z', 'b', 'a'],
|
||||||
'd' => ['zaip', 'bar', 'baz']
|
'd' => ['zaip', 'bar', 'baz']
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -68,6 +68,14 @@ function test2(): array
|
|||||||
return DebugSupport::getCallerMethodList(1);
|
return DebugSupport::getCallerMethodList(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// date stueff
|
||||||
|
print "printTime(-1): " . DebugSupport::printTime() . "<br>";
|
||||||
|
print "printTime(2): " . DebugSupport::printTime(2) . "<br>";
|
||||||
|
print "printTime(3): " . DebugSupport::printTime(3) . "<br>";
|
||||||
|
print "printTime(5): " . DebugSupport::printTime(5) . "<br>";
|
||||||
|
print "printIsoTime(): " . DebugSupport::printIsoTime() . "<br>";
|
||||||
|
print "printIsoTime(false): " . DebugSupport::printIsoTime(false) . "<br>";
|
||||||
|
|
||||||
print "S::GETCALLERMETHOD: " . DebugSupport::getCallerMethod(0) . "<br>";
|
print "S::GETCALLERMETHOD: " . DebugSupport::getCallerMethod(0) . "<br>";
|
||||||
print "S::GETCALLERMETHOD: " . test() . "<br>";
|
print "S::GETCALLERMETHOD: " . test() . "<br>";
|
||||||
print "S::GETCALLERMETHODLIST: <pre>" . print_r(test2(), true) . "</pre><br>";
|
print "S::GETCALLERMETHODLIST: <pre>" . print_r(test2(), true) . "</pre><br>";
|
||||||
@@ -146,7 +154,7 @@ print "LOG LEVEL: " . DebugSupport::printAr(\CoreLibs\Convert\SetVarType::setAr
|
|||||||
$new_log->getLogLevel('debug', 'on')
|
$new_log->getLogLevel('debug', 'on')
|
||||||
)) . "<br>";
|
)) . "<br>";
|
||||||
|
|
||||||
echo "<b>CLASS DEBUG CALL</b><br>";
|
echo "<b>CLASS DEBUG CALL LEGACY</b><br>";
|
||||||
|
|
||||||
// @codingStandardsIgnoreLine
|
// @codingStandardsIgnoreLine
|
||||||
class TestL
|
class TestL
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ print "Log ERROR: " . $log->prAr($em->getFlagLogError()) . "<br>";
|
|||||||
print "FN: " . ml::fromName('Affe')->name . "<br>";
|
print "FN: " . ml::fromName('Affe')->name . "<br>";
|
||||||
print "NU: " . ml::fromValue(100)->name . "<br>";
|
print "NU: " . ml::fromValue(100)->name . "<br>";
|
||||||
print "NU: " . ml::fromValue(1000)->name . "<br>";
|
print "NU: " . ml::fromValue(1000)->name . "<br>";
|
||||||
|
print "OK.: " . ml::ok->name . "<br>";
|
||||||
|
print "OK^: " . ml::fromName('OK')->name . "<br>";
|
||||||
|
|
||||||
$em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug');
|
$em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug');
|
||||||
$em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug', 'target-id', 'other-style');
|
$em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug', 'target-id', 'other-style');
|
||||||
@@ -56,6 +58,14 @@ $em->setErrorMsg('100-2', 'error', 'Input wring', jump_target:['target' => 'foo-
|
|||||||
$em->setMessage('error', 'I have no id set', jump_target:['target' => 'bar-123', 'info' => 'Jump Bar']);
|
$em->setMessage('error', 'I have no id set', jump_target:['target' => 'bar-123', 'info' => 'Jump Bar']);
|
||||||
$em->setMessage('error', 'Jump empty', jump_target:['target' => 'bar-empty']);
|
$em->setMessage('error', 'Jump empty', jump_target:['target' => 'bar-empty']);
|
||||||
|
|
||||||
|
function inLine(\CoreLibs\Logging\ErrorMessage $em): void
|
||||||
|
{
|
||||||
|
$em->log->error('Direct log before from ', context:['function' => __FUNCTION__]);
|
||||||
|
$em->setMessage('error', 'Inline call', context:['test' => 'inLine Function']);
|
||||||
|
$em->log->error('Direct log from ', context:['function' => __FUNCTION__]);
|
||||||
|
}
|
||||||
|
inLine($em);
|
||||||
|
|
||||||
print "ErrorsLast: <pre>" . $log->prAr($em->getLastErrorMsg()) . "</pre>";
|
print "ErrorsLast: <pre>" . $log->prAr($em->getLastErrorMsg()) . "</pre>";
|
||||||
print "ErrorsIds: <pre>" . $log->prAr($em->getErrorIds()) . "</pre>";
|
print "ErrorsIds: <pre>" . $log->prAr($em->getErrorIds()) . "</pre>";
|
||||||
print "Errors: <pre>" . $log->prAr($em->getErrorMsg()) . "</pre>";
|
print "Errors: <pre>" . $log->prAr($em->getErrorMsg()) . "</pre>";
|
||||||
|
|||||||
@@ -121,6 +121,12 @@ Class TestP
|
|||||||
public function test(): void
|
public function test(): void
|
||||||
{
|
{
|
||||||
$this->log->info('TestL::test call');
|
$this->log->info('TestL::test call');
|
||||||
|
$this->subCall();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function subCall(): void
|
||||||
|
{
|
||||||
|
$this->log->info('TestL::sub_call call');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ print "UNIQU ID LONG : " . Uids::uniqIdLong() . "<br>";
|
|||||||
$uuidv4 = Uids::uuidv4();
|
$uuidv4 = Uids::uuidv4();
|
||||||
if (!Uids::validateUuuidv4($uuidv4)) {
|
if (!Uids::validateUuuidv4($uuidv4)) {
|
||||||
print "Invalid UUIDv4: " . $uuidv4 . "<br>";
|
print "Invalid UUIDv4: " . $uuidv4 . "<br>";
|
||||||
|
} else {
|
||||||
|
print "Valid UUIDv4: " . $uuidv4 . "<br>";
|
||||||
}
|
}
|
||||||
if (!Uids::validateUuuidv4("foobar")) {
|
if (!Uids::validateUuuidv4("foobar")) {
|
||||||
print "Invalid UUIDv4: hard coded<Br>";
|
print "Invalid UUIDv4: hard coded<Br>";
|
||||||
|
|||||||
@@ -134,8 +134,8 @@ function setCenter(id, left, top)
|
|||||||
{
|
{
|
||||||
// get size of id
|
// get size of id
|
||||||
var dimensions = {
|
var dimensions = {
|
||||||
height: $('#' + id).height(),
|
height: $('#' + id).height() ?? 0,
|
||||||
width: $('#' + id).width()
|
width: $('#' + id).width() ?? 0
|
||||||
};
|
};
|
||||||
var type = $('#' + id).css('position');
|
var type = $('#' + id).css('position');
|
||||||
var viewport = getWindowSize();
|
var viewport = getWindowSize();
|
||||||
@@ -146,14 +146,14 @@ function setCenter(id, left, top)
|
|||||||
// console.log('Left: %s, Top: %s (%s)', parseInt((viewport.width / 2) - (dimensions.width / 2) + offset.left), parseInt((viewport.height / 2) - (dimensions.height / 2) + offset.top), parseInt((viewport.height / 2) - (dimensions.height / 2)));
|
// console.log('Left: %s, Top: %s (%s)', parseInt((viewport.width / 2) - (dimensions.width / 2) + offset.left), parseInt((viewport.height / 2) - (dimensions.height / 2) + offset.top), parseInt((viewport.height / 2) - (dimensions.height / 2)));
|
||||||
if (left) {
|
if (left) {
|
||||||
$('#' + id).css({
|
$('#' + id).css({
|
||||||
left: parseInt((viewport.width / 2) - (dimensions.width / 2) + offset.left) + 'px'
|
left: ((viewport.width / 2) - (dimensions.width / 2) + offset.left) + 'px'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (top) {
|
if (top) {
|
||||||
// if we have fixed, we do not add the offset, else it moves out of the screen
|
// if we have fixed, we do not add the offset, else it moves out of the screen
|
||||||
var top_pos = type == 'fixed' ?
|
var top_pos = type == 'fixed' ?
|
||||||
parseInt((viewport.height / 2) - (dimensions.height / 2)) :
|
(viewport.height / 2) - (dimensions.height / 2) :
|
||||||
parseInt((viewport.height / 2) - (dimensions.height / 2) + offset.top);
|
(viewport.height / 2) - (dimensions.height / 2) + offset.top;
|
||||||
$('#' + id).css({
|
$('#' + id).css({
|
||||||
top: top_pos + 'px'
|
top: top_pos + 'px'
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -46,10 +46,15 @@ function runFunctionArgsArray(name, args) {
|
|||||||
fn.apply(window, args);
|
fn.apply(window, args);
|
||||||
}
|
}
|
||||||
function isObject(val) {
|
function isObject(val) {
|
||||||
if (val === null) {
|
return val !== null && typeof val === "object" && !Array.isArray(val);
|
||||||
return false;
|
}
|
||||||
}
|
function isArray(val) {
|
||||||
return typeof val === "function" || typeof val === "object";
|
return val !== null && Array.isArray(val);
|
||||||
|
}
|
||||||
|
function isIterable(val) {
|
||||||
|
if (val == null) return false;
|
||||||
|
if (typeof val[Symbol.iterator] === "function" && typeof val !== "string") return true;
|
||||||
|
return typeof val === "object" && val.constructor === Object;
|
||||||
}
|
}
|
||||||
function getObjectCount(object) {
|
function getObjectCount(object) {
|
||||||
if (!isObject(object)) {
|
if (!isObject(object)) {
|
||||||
@@ -158,7 +163,7 @@ var HtmlElementCreator = class {
|
|||||||
if (base.id == id) {
|
if (base.id == id) {
|
||||||
base.sub.push(deepCopyFunction(attach));
|
base.sub.push(deepCopyFunction(attach));
|
||||||
} else {
|
} else {
|
||||||
if (isObject(base.sub) && base.sub.length > 0) {
|
if (isArray(base.sub) && base.sub.length > 0) {
|
||||||
for (var i = 0; i < base.sub.length; i++) {
|
for (var i = 0; i < base.sub.length; i++) {
|
||||||
this.ael(base.sub[i], attach, id);
|
this.ael(base.sub[i], attach, id);
|
||||||
}
|
}
|
||||||
@@ -297,7 +302,7 @@ var HtmlElementCreator = class {
|
|||||||
line += ' name="' + (tree.name ? tree.name : tree.id) + '"';
|
line += ' name="' + (tree.name ? tree.name : tree.id) + '"';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isObject(tree.css) && tree.css.length > 0) {
|
if (isArray(tree.css) && tree.css.length > 0) {
|
||||||
line += ' class="';
|
line += ' class="';
|
||||||
for (i = 0; i < tree.css.length; i++) {
|
for (i = 0; i < tree.css.length; i++) {
|
||||||
line += tree.css[i] + " ";
|
line += tree.css[i] + " ";
|
||||||
@@ -314,7 +319,7 @@ var HtmlElementCreator = class {
|
|||||||
}
|
}
|
||||||
line += ">";
|
line += ">";
|
||||||
content.push(line);
|
content.push(line);
|
||||||
if (isObject(tree.sub) && tree.sub.length > 0) {
|
if (isArray(tree.sub) && tree.sub.length > 0) {
|
||||||
if (tree.content) {
|
if (tree.content) {
|
||||||
content.push(tree.content);
|
content.push(tree.content);
|
||||||
}
|
}
|
||||||
@@ -1331,6 +1336,17 @@ var LoginNavMenu = class {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// src/utils/BrowserDetect.mjs
|
||||||
|
function isWebkit() {
|
||||||
|
return "GestureEvent" in window;
|
||||||
|
}
|
||||||
|
function isMobileWebKit() {
|
||||||
|
return "ongesturechange" in window;
|
||||||
|
}
|
||||||
|
function isDesktopWebKit() {
|
||||||
|
return typeof window !== "undefined" && "safari" in window && "pushNotification" in window.safari;
|
||||||
|
}
|
||||||
|
|
||||||
// src/utils.mjs
|
// src/utils.mjs
|
||||||
var aiob = new ActionIndicatorOverlayBox();
|
var aiob = new ActionIndicatorOverlayBox();
|
||||||
var hec = new HtmlElementCreator();
|
var hec = new HtmlElementCreator();
|
||||||
@@ -1433,6 +1449,12 @@ function executeFunctionByName2(functionName, context) {
|
|||||||
function isObject2(val) {
|
function isObject2(val) {
|
||||||
return isObject(val);
|
return isObject(val);
|
||||||
}
|
}
|
||||||
|
function isArray2(val) {
|
||||||
|
return isArray(val);
|
||||||
|
}
|
||||||
|
function isIterable2(val) {
|
||||||
|
return isIterable(val);
|
||||||
|
}
|
||||||
function getObjectCount2(object) {
|
function getObjectCount2(object) {
|
||||||
return getObjectCount(object);
|
return getObjectCount(object);
|
||||||
}
|
}
|
||||||
@@ -1613,3 +1635,12 @@ function createActionBox(target_id = "actionBox", title = "", contents = {}, hea
|
|||||||
function adjustActionBoxHeight(target_id = "actionBox", override = 0, content_override = 0) {
|
function adjustActionBoxHeight(target_id = "actionBox", override = 0, content_override = 0) {
|
||||||
ab.adjustActionBoxHeight(target_id, override, content_override);
|
ab.adjustActionBoxHeight(target_id, override, content_override);
|
||||||
}
|
}
|
||||||
|
function isWebkit2() {
|
||||||
|
return isWebkit();
|
||||||
|
}
|
||||||
|
function isMobileWebKit2() {
|
||||||
|
return isMobileWebKit();
|
||||||
|
}
|
||||||
|
function isDesktopWebKit2() {
|
||||||
|
return isDesktopWebKit();
|
||||||
|
}
|
||||||
+2
-2
@@ -1,3 +1,3 @@
|
|||||||
function errorCatch(err){err.stack?err.lineNumber?console.error("ERROR[%s:%s] ",err.name,err.lineNumber,err):err.line?console.error("ERROR[%s:%s] ",err.name,err.line,err):console.error("ERROR[%s] ",err.name,err):err.number?(console.error("ERROR[%s:%s] %s",err.name,err.number,err.message),console.error("ERROR[description] %s",err.description)):console.error("ERROR[%s] %s",err.name,err.message)}function isFunction(name){return typeof window[name]<"u"&&typeof window[name]=="function"}function executeFunctionByName(functionName,context){var args=Array.prototype.slice.call(arguments,2),namespaces=functionName.split("."),func=namespaces.pop();if(func==null)throw new Error("Cannot get function from namespaces: "+functionName);for(var i=0;i<namespaces.length;i++)context=context[namespaces[i]];return context[func].apply(context,args)}function runFunction(name){var args=Array.prototype.slice.call(arguments,1);runFunctionArgsArray(name,args)}function runFunctionArgsArray(name,args){var fn=window[name];typeof fn=="function"&&fn.apply(window,args)}function isObject(val){return val===null?!1:typeof val=="function"||typeof val=="object"}function getObjectCount(object){return isObject(object)?Object.keys(object).length:-1}function keyInObject(key,object){return objectKeyExists(object,key)}function objectKeyExists(object,key){return!!Object.prototype.hasOwnProperty.call(object,key)}function getKeyByValue(object,value){return Object.keys(object).find(key=>object[key]===value)??""}function valueInObject(object,value){return objectValueExists(object,value)}function objectValueExists(object,value){return!!Object.keys(object).find(key=>object[key]===value)}function deepCopyFunction(inObject){var outObject,value,key;if(typeof inObject!="object"||inObject===null)return inObject;outObject=Array.isArray(inObject)?[]:{};for(key in inObject)value=inObject[key],outObject[key]=deepCopyFunction(value);return outObject}function loadEl(el_id){let el=document.getElementById(el_id);if(el===null)throw new Error("Cannot find: "+el_id);return el}function pop(theURL,winName,features){let __winName=window.open(theURL,winName,features);__winName?.focus()}function expandTA(ta_id){let ta=this.loadEl(ta_id);if(ta instanceof HTMLElement&&ta.getAttribute("type")!=="textarea")throw new Error("Element is not a textarea: "+ta_id);let maxChars=parseInt(ta.getAttribute("cols")??"0"),ta_value=ta.getAttribute("value"),theRows=[];ta_value!=null&&(theRows=ta_value.split(`
|
function errorCatch(err){err.stack?err.lineNumber?console.error("ERROR[%s:%s] ",err.name,err.lineNumber,err):err.line?console.error("ERROR[%s:%s] ",err.name,err.line,err):console.error("ERROR[%s] ",err.name,err):err.number?(console.error("ERROR[%s:%s] %s",err.name,err.number,err.message),console.error("ERROR[description] %s",err.description)):console.error("ERROR[%s] %s",err.name,err.message)}function isFunction(name){return typeof window[name]<"u"&&typeof window[name]=="function"}function executeFunctionByName(functionName,context){var args=Array.prototype.slice.call(arguments,2),namespaces=functionName.split("."),func=namespaces.pop();if(func==null)throw new Error("Cannot get function from namespaces: "+functionName);for(var i=0;i<namespaces.length;i++)context=context[namespaces[i]];return context[func].apply(context,args)}function runFunction(name){var args=Array.prototype.slice.call(arguments,1);runFunctionArgsArray(name,args)}function runFunctionArgsArray(name,args){var fn=window[name];typeof fn=="function"&&fn.apply(window,args)}function isObject(val){return val!==null&&typeof val=="object"&&!Array.isArray(val)}function isArray(val){return val!==null&&Array.isArray(val)}function isIterable(val){return val==null?!1:typeof val[Symbol.iterator]=="function"&&typeof val!="string"?!0:typeof val=="object"&&val.constructor===Object}function getObjectCount(object){return isObject(object)?Object.keys(object).length:-1}function keyInObject(key,object){return objectKeyExists(object,key)}function objectKeyExists(object,key){return!!Object.prototype.hasOwnProperty.call(object,key)}function getKeyByValue(object,value){return Object.keys(object).find(key=>object[key]===value)??""}function valueInObject(object,value){return objectValueExists(object,value)}function objectValueExists(object,value){return!!Object.keys(object).find(key=>object[key]===value)}function deepCopyFunction(inObject){var outObject,value,key;if(typeof inObject!="object"||inObject===null)return inObject;outObject=Array.isArray(inObject)?[]:{};for(key in inObject)value=inObject[key],outObject[key]=deepCopyFunction(value);return outObject}function loadEl(el_id){let el=document.getElementById(el_id);if(el===null)throw new Error("Cannot find: "+el_id);return el}function pop(theURL,winName,features){let __winName=window.open(theURL,winName,features);__winName?.focus()}function expandTA(ta_id){let ta=this.loadEl(ta_id);if(ta instanceof HTMLElement&&ta.getAttribute("type")!=="textarea")throw new Error("Element is not a textarea: "+ta_id);let maxChars=parseInt(ta.getAttribute("cols")??"0"),ta_value=ta.getAttribute("value"),theRows=[];ta_value!=null&&(theRows=ta_value.split(`
|
||||||
`));for(var numNewRows=0,i=0;i<theRows.length;i++)theRows[i].length+2>maxChars&&(numNewRows+=Math.ceil((theRows[i].length+2)/maxChars));ta.setAttribute("row",(numNewRows+theRows.length).toString())}function exists(id){return $("#"+id).length>0}var HtmlElementCreator=class{cel(tag,id="",content="",css=[],options={}){return{tag,id,name:options.name,content,css,options,sub:[]}}ael(base,attach,id=""){if(id){if(base.id==id)base.sub.push(deepCopyFunction(attach));else if(isObject(base.sub)&&base.sub.length>0)for(var i=0;i<base.sub.length;i++)this.ael(base.sub[i],attach,id)}else base.sub.push(deepCopyFunction(attach));return base}aelx(base,...attach){for(var i=0;i<attach.length;i++)base.sub.push(deepCopyFunction(attach[i]));return base}aelxar(base,attach){for(var i=0;i<attach.length;i++)base.sub.push(deepCopyFunction(attach[i]));return base}rel(base){return base.sub=[],base}rcssel(_element,css){var css_index=_element.css.indexOf(css);return css_index>-1&&_element.css.splice(css_index,1),_element}acssel(_element,css){var css_index=_element.css.indexOf(css);return css_index==-1&&_element.css.push(css),_element}scssel(_element,rcss,acss){return this.rcssel(_element,rcss),this.acssel(_element,acss),_element}phfo(tree){let name_elements=["button","fieldset","form","iframe","input","map","meta","object","output","param","select","textarea"],skip_options=["id","name","class"],no_close=["input","br","img","hr","area","col","keygen","wbr","track","source","param","command","base","meta","link","embed"];var content=[],line="<"+tree.tag,i;if(tree.id&&(line+=' id="'+tree.id+'"',name_elements.includes(tree.tag)&&(line+=' name="'+(tree.name?tree.name:tree.id)+'"')),isObject(tree.css)&&tree.css.length>0){for(line+=' class="',i=0;i<tree.css.length;i++)line+=tree.css[i]+" ";line=line.slice(0,-1),line+='"'}if(isObject(tree.options))for(let[key,item]of Object.entries(tree.options))skip_options.includes(key)||(line+=" "+key+'="'+item+'"');if(line+=">",content.push(line),isObject(tree.sub)&&tree.sub.length>0)for(tree.content&&content.push(tree.content),i=0;i<tree.sub.length;i++)content.push(this.phfo(tree.sub[i]));else tree.content&&content.push(tree.content);return no_close.includes(tree.tag)||content.push("</"+tree.tag+">"),content.join("")}phfa(list){for(var content=[],i=0;i<list.length;i++)content.push(this.phfo(list[i]));return content.join("")}};var dom=new HtmlElementCreator;function escapeHtml(string){return string.replace(/[&<>"'/]/g,function(s){var entityMap={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};return entityMap[s]})}function unescapeHtml(string){return string.replace(/&[#\w]+;/g,function(s){var entityMap={"&":"&","<":"<",">":">",""":'"',"'":"'","/":"/"};return entityMap[s]})}function html_options(name,data,selected="",options_only=!1,return_string=!1,sort=""){return this.html_options_block(name,data,selected,0,options_only,return_string,sort)}function html_options_block(name,data,selected="",multiple=0,options_only=!1,return_string=!1,sort="",onchange=""){var content=[],element_select,select_options={},element_option,data_list=[],value,options={};multiple>0&&(select_options.multiple="",multiple>1&&(select_options.size=multiple)),onchange&&(select_options.OnChange=onchange),element_select=dom.cel("select",name,"",[],select_options),sort=="keys"?data_list=Object.keys(data).sort():sort=="values"?data_list=Object.keys(data).sort((a,b)=>(""+data[a]).localeCompare(data[b])):data_list=Object.keys(data);for(let key of data_list)value=data[key],options={label:value,value:key,selected:""},multiple==0&&!Array.isArray(selected)&&selected==key&&(options.selected=""),multiple==1&&Array.isArray(selected)&&selected.indexOf(key)!=-1&&(options.selected=""),element_option=dom.cel("option","",value,[],options),dom.ael(element_select,element_option);if(options_only)if(return_string){for(var i=0;i<element_select.sub.length;i++)content.push(dom.phfo(element_select.sub[i]));return content.join("")}else return element_select.sub;else return return_string?(content.push(dom.phfo(element_select)),content.join("")):element_select}function html_options_refill(name,data,sort=""){var element_option,option_selected,data_list=[],value;if(document.getElementById(name)){sort=="keys"?data_list=Object.keys(data).sort():sort=="values"?data_list=Object.keys(data).sort((a,b)=>(""+data[a]).localeCompare(data[b])):data_list=Object.keys(data),[].forEach.call(document.querySelectorAll("#"+name+" :checked"),function(elm){option_selected=elm.value}),loadEl(name).innerHTML="";for(let key of data_list)value=data[key],element_option=document.createElement("option"),element_option.label=value,element_option.value=key,element_option.innerHTML=value,key==option_selected&&(element_option.selected=!0),loadEl(name).appendChild(element_option)}}function dec2hex(dec){return("0x"+dec.toString(16)).substring(-2)}function getRandomIntInclusive(min,max){return min=Math.ceil(min),max=Math.floor(max),Math.floor(Math.random()*(
Line truncated
|
`));for(var numNewRows=0,i=0;i<theRows.length;i++)theRows[i].length+2>maxChars&&(numNewRows+=Math.ceil((theRows[i].length+2)/maxChars));ta.setAttribute("row",(numNewRows+theRows.length).toString())}function exists(id){return $("#"+id).length>0}var HtmlElementCreator=class{cel(tag,id="",content="",css=[],options={}){return{tag,id,name:options.name,content,css,options,sub:[]}}ael(base,attach,id=""){if(id){if(base.id==id)base.sub.push(deepCopyFunction(attach));else if(isArray(base.sub)&&base.sub.length>0)for(var i=0;i<base.sub.length;i++)this.ael(base.sub[i],attach,id)}else base.sub.push(deepCopyFunction(attach));return base}aelx(base,...attach){for(var i=0;i<attach.length;i++)base.sub.push(deepCopyFunction(attach[i]));return base}aelxar(base,attach){for(var i=0;i<attach.length;i++)base.sub.push(deepCopyFunction(attach[i]));return base}rel(base){return base.sub=[],base}rcssel(_element,css){var css_index=_element.css.indexOf(css);return css_index>-1&&_element.css.splice(css_index,1),_element}acssel(_element,css){var css_index=_element.css.indexOf(css);return css_index==-1&&_element.css.push(css),_element}scssel(_element,rcss,acss){return this.rcssel(_element,rcss),this.acssel(_element,acss),_element}phfo(tree){let name_elements=["button","fieldset","form","iframe","input","map","meta","object","output","param","select","textarea"],skip_options=["id","name","class"],no_close=["input","br","img","hr","area","col","keygen","wbr","track","source","param","command","base","meta","link","embed"];var content=[],line="<"+tree.tag,i;if(tree.id&&(line+=' id="'+tree.id+'"',name_elements.includes(tree.tag)&&(line+=' name="'+(tree.name?tree.name:tree.id)+'"')),isArray(tree.css)&&tree.css.length>0){for(line+=' class="',i=0;i<tree.css.length;i++)line+=tree.css[i]+" ";line=line.slice(0,-1),line+='"'}if(isObject(tree.options))for(let[key,item]of Object.entries(tree.options))skip_options.includes(key)||(line+=" "+key+'="'+item+'"');if(line+=">",content.push(line),isArray(tree.sub)&&tree.sub.length>0)for(tree.content&&content.push(tree.content),i=0;i<tree.sub.length;i++)content.push(this.phfo(tree.sub[i]));else tree.content&&content.push(tree.content);return no_close.includes(tree.tag)||content.push("</"+tree.tag+">"),content.join("")}phfa(list){for(var content=[],i=0;i<list.length;i++)content.push(this.phfo(list[i]));return content.join("")}};var dom=new HtmlElementCreator;function escapeHtml(string){return string.replace(/[&<>"'/]/g,function(s){var entityMap={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};return entityMap[s]})}function unescapeHtml(string){return string.replace(/&[#\w]+;/g,function(s){var entityMap={"&":"&","<":"<",">":">",""":'"',"'":"'","/":"/"};return entityMap[s]})}function html_options(name,data,selected="",options_only=!1,return_string=!1,sort=""){return this.html_options_block(name,data,selected,0,options_only,return_string,sort)}function html_options_block(name,data,selected="",multiple=0,options_only=!1,return_string=!1,sort="",onchange=""){var content=[],element_select,select_options={},element_option,data_list=[],value,options={};multiple>0&&(select_options.multiple="",multiple>1&&(select_options.size=multiple)),onchange&&(select_options.OnChange=onchange),element_select=dom.cel("select",name,"",[],select_options),sort=="keys"?data_list=Object.keys(data).sort():sort=="values"?data_list=Object.keys(data).sort((a,b)=>(""+data[a]).localeCompare(data[b])):data_list=Object.keys(data);for(let key of data_list)value=data[key],options={label:value,value:key,selected:""},multiple==0&&!Array.isArray(selected)&&selected==key&&(options.selected=""),multiple==1&&Array.isArray(selected)&&selected.indexOf(key)!=-1&&(options.selected=""),element_option=dom.cel("option","",value,[],options),dom.ael(element_select,element_option);if(options_only)if(return_string){for(var i=0;i<element_select.sub.length;i++)content.push(dom.phfo(element_select.sub[i]));return content.join("")}else return element_select.sub;else return return_string?(content.push(dom.phfo(element_select)),content.join("")):element_select}function html_options_refill(name,data,sort=""){var element_option,option_selected,data_list=[],value;if(document.getElementById(name)){sort=="keys"?data_list=Object.keys(data).sort():sort=="values"?data_list=Object.keys(data).sort((a,b)=>(""+data[a]).localeCompare(data[b])):data_list=Object.keys(data),[].forEach.call(document.querySelectorAll("#"+name+" :checked"),function(elm){option_selected=elm.value}),loadEl(name).innerHTML="";for(let key of data_list)value=data[key],element_option=document.createElement("option"),element_option.label=value,element_option.value=key,element_option.innerHTML=value,key==option_selected&&(element_option.selected=!0),loadEl(name).appendChild(element_option)}}function dec2hex(dec){return("0x"+dec.toString(16)).substring(-2)}function getRandomIntInclusive(min,max){return min=Math.ceil(min),max=Math.floor(max),Math.floor(Math.random()*(max
Line truncated
|
||||||
//# sourceMappingURL=utils.min.js.map
|
//# sourceMappingURL=utils.min.js.map
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"version": 3,
|
"version": 3,
|
||||||
"sources": ["../../../src/utils/JavaScriptHelpers.mjs", "../../../src/utils/DomHelpers.mjs", "../../../src/utils/HtmlElementCreator.mjs", "../../../src/utils/HtmlHelpers.mjs", "../../../src/utils/MathHelpers.mjs", "../../../src/utils/StringHelpers.mjs", "../../../src/utils/DateTimeHelpers.mjs", "../../../src/utils/UniqIdGenerators.mjs", "../../../src/utils/ResizingAndMove.mjs", "../../../src/utils/FormatBytes.mjs", "../../../src/utils/UrlParser.mjs", "../../../src/utils/LoginLogout.mjs", "../../../src/utils/ActionIndicatorOverlayBox.mjs", "../../../src/utils/l10nTranslation.mjs", "../../../src/utils/ActionBox.mjs", "../../../src/utils/LoginNavMenu.mjs", "../../../src/utils.mjs"],
|
"sources": ["../../../src/utils/JavaScriptHelpers.mjs", "../../../src/utils/DomHelpers.mjs", "../../../src/utils/HtmlElementCreator.mjs", "../../../src/utils/HtmlHelpers.mjs", "../../../src/utils/MathHelpers.mjs", "../../../src/utils/StringHelpers.mjs", "../../../src/utils/DateTimeHelpers.mjs", "../../../src/utils/UniqIdGenerators.mjs", "../../../src/utils/ResizingAndMove.mjs", "../../../src/utils/FormatBytes.mjs", "../../../src/utils/UrlParser.mjs", "../../../src/utils/LoginLogout.mjs", "../../../src/utils/ActionIndicatorOverlayBox.mjs", "../../../src/utils/l10nTranslation.mjs", "../../../src/utils/ActionBox.mjs", "../../../src/utils/LoginNavMenu.mjs", "../../../src/utils/BrowserDetect.mjs", "../../../src/utils.mjs"],
|
||||||
"sourcesContent": ["/*\nDescription: JavaScript Helpers\nDate: 2025//3/6\nCreator: Clemens Schwaighofer\n*/\n\nexport {\n\terrorCatch, isFunction,\n\texecuteFunctionByName, runFunction, runFunctionArgsArray,\n\tisObject, getObjectCount,\n\tkeyInObject, objectKeyExists,\n\tgetKeyByValue, valueInObject, objectValueExists,\n\tdeepCopyFunction\n};\n\n/**\n * prints out error messages based on data available from the browser\n * @param {Object} err error from try/catch block\n */\nfunction errorCatch(err)\n{\n\t// for FF & Chrome\n\tif (err.stack) {\n\t\t// only FF\n\t\tif (err.lineNumber) {\n\t\t\tconsole.error('ERROR[%s:%s] ', err.name, err.lineNumber, err);\n\t\t} else if (err.line) {\n\t\t\t// only Safari\n\t\t\tconsole.error('ERROR[%s:%s] ', err.name, err.line, err);\n\t\t} else {\n\t\t\tconsole.error('ERROR[%s] ', err.name, err);\n\t\t}\n\t} else if (err.number) {\n\t\t// IE\n\t\tconsole.error('ERROR[%s:%s] %s', err.name, err.number, err.message);\n\t\tconsole.error('ERROR[description] %s', err.description);\n\t} else {\n\t\t// the rest\n\t\tconsole.error('ERROR[%s] %s', err.name, err.message);\n\t}\n}\n\n/**\n * check if name is a function\n * @param {string} name Name of function to check if exists\n * @return {Boolean} true/false\n */\nfunction isFunction(name)\n{\n\tif (typeof window[name] !== 'undefined' &&\n\t\ttypeof window[name] === 'function') {\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\n/**\n * call a function by its string name\n * https://stackoverflow.com/a/359910\n * example: executeFunctionByName(\"My.Namespace.functionName\", window, arguments);\n * @param {string} functionName The function name or namespace + function\n * @param {any} context context (window or first namespace)\n * hidden next are all the arguments\n * @return {any} Return values from functon\n */\nfunction executeFunctionByName(functionName, context /*, args */)\n{\n\tvar args = Array.prototype.slice.call(arguments, 2);\n\tvar namespaces = functionName.split('.');\n\tvar func = namespaces.pop();\n\tif (func == undefined) {\n\t\tthrow new Error(\"Cannot get function from namespaces: \" + functionName);\n\t}\n\tfor (var i = 0; i < namespaces.length; i++) {\n\t\tcontext = context[namespaces[i]];\n\t}\n\treturn context[func].apply(context, args);\n}\n\n/**\n * call a function by string\n * call runFunctionArgArray\n * @param {string} name Function name to call\n * @param {Array} arguments all next function arguments are passed on as argument to the function\n * @returns void\n */\nfunction runFunction(name)\n{\n\tvar args = Array.prototype.slice.call(arguments, 1);\n\trunFunctionArgsArray(name, args);\n}\n\n/**\n * call a function with a string, argumens as array\n * @param {string} name Function name to call\n * @param {array} args function arguments as arry\n * @returns void\n */\nfunction runFunctionArgsArray(name, args)\n{\n\tvar fn = window[name];\n\tif(typeof fn !== 'function') {\n\t\treturn;\n\t}\n\n\tfn.apply(window, args);\n}\n\n/**\n * checks if a variable is an object\n * @param {any} val possible object\n * @return {Boolean} true/false if it is an object or not\n */\nfunction isObject(val)\n{\n\tif (val === null) {\n\t\treturn false;\n\t}\n\treturn ((typeof val === 'function') || (typeof val === 'object'));\n}\n\n/**\n * get the length of an object (entries)\n * @param {Object} object object to check\n * @return {Number} number of entry, or -1 if not object\n */\nfunction getObjectCount(object)\n{\n\tif (!isObject(object)) {\n\t\treturn -1;\n\t}\n\treturn Object.keys(object).length;\n}\n\n/**\n * checks if a key exists in a given object\n * @param {String} key key name\n * @param {Object} object object to search key in\n * @return {Boolean} true/false if key exists in object\n * @deprecated Use objectKeyExists\n */\nfunction keyInObject(key, object)\n{\n\treturn objectKeyExists(object, key);\n}\n\n/**\n * This is the correct order and will superseed keyInObject\n * @param {Object} object object to search key in\n * @param {String} key key name\n * @returns {Boolean} true/false if key exists in object\n */\nfunction objectKeyExists(object, key)\n{\n\treturn Object.prototype.hasOwnProperty.call(object, key) ? true : false;\n}\n\n/**\n * returns matching key of value\n * @param {Object} object object to search value in\n * @param {any} value any value (String, Number, etc)\n * @return {String} the key found for the first matching value\n */\nfunction getKeyByValue(object, value)\n{\n\treturn Object.keys(object).find(key => object[key] === value) ?? '';\n}\n\n/**\n * returns true if value is found in object with a key\n * @param {Object} object object to search value in\n * @param {any} value any value (String, Number, etc)\n * @return {Boolean} true on value found, false on not found\n * @deprecated use objectValueExists\n */\nfunction valueInObject(object, value)\n{\n\Line truncated
|
"sourcesContent": ["/*\nDescription: JavaScript Helpers\nDate: 2025/3/6\nCreator: Clemens Schwaighofer\n*/\n\nexport {\n\terrorCatch, isFunction,\n\texecuteFunctionByName, runFunction, runFunctionArgsArray,\n\tisObject, isIterable, isArray, getObjectCount,\n\tkeyInObject, objectKeyExists,\n\tgetKeyByValue, valueInObject, objectValueExists,\n\tdeepCopyFunction\n};\n\n/**\n * prints out error messages based on data available from the browser\n * @param {Object} err error from try/catch block\n */\nfunction errorCatch(err)\n{\n\t// for FF & Chrome\n\tif (err.stack) {\n\t\t// only FF\n\t\tif (err.lineNumber) {\n\t\t\tconsole.error('ERROR[%s:%s] ', err.name, err.lineNumber, err);\n\t\t} else if (err.line) {\n\t\t\t// only Safari\n\t\t\tconsole.error('ERROR[%s:%s] ', err.name, err.line, err);\n\t\t} else {\n\t\t\tconsole.error('ERROR[%s] ', err.name, err);\n\t\t}\n\t} else if (err.number) {\n\t\t// IE\n\t\tconsole.error('ERROR[%s:%s] %s', err.name, err.number, err.message);\n\t\tconsole.error('ERROR[description] %s', err.description);\n\t} else {\n\t\t// the rest\n\t\tconsole.error('ERROR[%s] %s', err.name, err.message);\n\t}\n}\n\n/**\n * check if name is a function\n * @param {string} name Name of function to check if exists\n * @return {Boolean} true/false\n */\nfunction isFunction(name)\n{\n\tif (typeof window[name] !== 'undefined' &&\n\t\ttypeof window[name] === 'function') {\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\n/**\n * call a function by its string name\n * https://stackoverflow.com/a/359910\n * example: executeFunctionByName(\"My.Namespace.functionName\", window, arguments);\n * @param {string} functionName The function name or namespace + function\n * @param {any} context context (window or first namespace)\n * hidden next are all the arguments\n * @return {any} Return values from functon\n */\nfunction executeFunctionByName(functionName, context /*, args */)\n{\n\tvar args = Array.prototype.slice.call(arguments, 2);\n\tvar namespaces = functionName.split('.');\n\tvar func = namespaces.pop();\n\tif (func == undefined) {\n\t\tthrow new Error(\"Cannot get function from namespaces: \" + functionName);\n\t}\n\tfor (var i = 0; i < namespaces.length; i++) {\n\t\tcontext = context[namespaces[i]];\n\t}\n\treturn context[func].apply(context, args);\n}\n\n/**\n * call a function by string\n * call runFunctionArgArray\n * @param {string} name Function name to call\n * @param {Array} arguments all next function arguments are passed on as argument to the function\n * @returns void\n */\nfunction runFunction(name)\n{\n\tvar args = Array.prototype.slice.call(arguments, 1);\n\trunFunctionArgsArray(name, args);\n}\n\n/**\n * call a function with a string, argumens as array\n * @param {string} name Function name to call\n * @param {array} args function arguments as arry\n * @returns void\n */\nfunction runFunctionArgsArray(name, args)\n{\n\tvar fn = window[name];\n\tif(typeof fn !== 'function') {\n\t\treturn;\n\t}\n\n\tfn.apply(window, args);\n}\n\n/**\n * checks if a variable is an object\n * @param {any} val possible object\n * @return {Boolean} true/false if it is an object or not\n */\nfunction isObject(val)\n{\n\treturn val !== null && typeof val === 'object' && !Array.isArray(val);\n}\n\n/**\n * Check if variable is array\n * @param {any} val possible array\n * @returns {Boolean} true/false if it an array\n */\nfunction isArray(val)\n{\n\treturn val !== null && Array.isArray(val);\n}\n\n/**\n * Check if any iterable type\n * @param {any} val possible iteratable object/array\n * @returns {Boolean} true/false if it is iterable\n */\nfunction isIterable(val)\n{\n\tif (val == null) return false;\n\n\t// Check if it's iterable, but excldue strings\n\tif (typeof val[Symbol.iterator] === 'function' && typeof val !== 'string') return true;\n\n\t// Check if it's a plain object\n\treturn typeof val === 'object' && val.constructor === Object;\n}\n\n/**\n * get the length of an object (entries)\n * @param {Object} object object to check\n * @return {Number} number of entry, or -1 if not object\n */\nfunction getObjectCount(object)\n{\n\tif (!isObject(object)) {\n\t\treturn -1;\n\t}\n\treturn Object.keys(object).length;\n}\n\n/**\n * checks if a key exists in a given object\n * @param {String} key key name\n * @param {Object} object object to search key in\n * @return {Boolean} true/false if key exists in object\n * @deprecated Use objectKeyExists\n */\nfunction keyInObject(key, object)\n{\n\treturn objectKeyExists(object, key);\n}\n\n/**\n * This is the correct order and will superseed keyInObject\n * @param {Object} object object to search key in\n * @param {String} key key name\n * @returns {Boolean} true/false if key exists in object\n */\nfunction objectKeyExists(object, key)\n{\n\treturn Object.prototype.hasOwnProperty.call(object, key) ? true : false;\n}\n\n/**\n * returns matching key of vaLine truncated
|
||||||
"mappings": "AAmBA,SAAS,WAAW,IACpB,CAEK,IAAI,MAEH,IAAI,WACP,QAAQ,MAAM,gBAAiB,IAAI,KAAM,IAAI,WAAY,GAAG,EAClD,IAAI,KAEd,QAAQ,MAAM,gBAAiB,IAAI,KAAM,IAAI,KAAM,GAAG,EAEtD,QAAQ,MAAM,aAAc,IAAI,KAAM,GAAG,EAEhC,IAAI,QAEd,QAAQ,MAAM,kBAAmB,IAAI,KAAM,IAAI,OAAQ,IAAI,OAAO,EAClE,QAAQ,MAAM,wBAAyB,IAAI,WAAW,GAGtD,QAAQ,MAAM,eAAgB,IAAI,KAAM,IAAI,OAAO,CAErD,CAOA,SAAS,WAAW,KACpB,CACC,OAAI,OAAO,OAAO,IAAI,EAAM,KAC3B,OAAO,OAAO,IAAI,GAAM,UAK1B,CAWA,SAAS,sBAAsB,aAAc,QAC7C,CACC,IAAI,KAAO,MAAM,UAAU,MAAM,KAAK,UAAW,CAAC,EAC9C,WAAa,aAAa,MAAM,GAAG,EACnC,KAAO,WAAW,IAAI,EAC1B,GAAI,MAAQ,KACX,MAAM,IAAI,MAAM,wCAA0C,YAAY,EAEvE,QAAS,EAAI,EAAG,EAAI,WAAW,OAAQ,IACtC,QAAU,QAAQ,WAAW,CAAC,CAAC,EAEhC,OAAO,QAAQ,IAAI,EAAE,MAAM,QAAS,IAAI,CACzC,CASA,SAAS,YAAY,KACrB,CACC,IAAI,KAAO,MAAM,UAAU,MAAM,KAAK,UAAW,CAAC,EAClD,qBAAqB,KAAM,IAAI,CAChC,CAQA,SAAS,qBAAqB,KAAM,KACpC,CACC,IAAI,GAAK,OAAO,IAAI,EACjB,OAAO,IAAO,YAIjB,GAAG,MAAM,OAAQ,IAAI,CACtB,CAOA,SAAS,SAAS,IAClB,CACC,OAAI,MAAQ,KACJ,GAEC,OAAO,KAAQ,YAAgB,OAAO,KAAQ,QACxD,CAOA,SAAS,eAAe,OACxB,CACC,OAAK,SAAS,MAAM,EAGb,OAAO,KAAK,MAAM,EAAE,OAFnB,EAGT,CASA,SAAS,YAAY,IAAK,OAC1B,CACC,OAAO,gBAAgB,OAAQ,GAAG,CACnC,CAQA,SAAS,gBAAgB,OAAQ,IACjC,CACC,MAAO,SAAO,UAAU,eAAe,KAAK,OAAQ,GAAG,CACxD,CAQA,SAAS,cAAc,OAAQ,MAC/B,CACC,OAAO,OAAO,KAAK,MAAM,EAAE,KAAK,KAAO,OAAO,GAAG,IAAM,KAAK,GAAK,EAClE,CASA,SAAS,cAAc,OAAQ,MAC/B,CACC,OAAO,kBAAkB,OAAQ,KAAK,CACvC,CAQA,SAAS,kBAAkB,OAAQ,MACnC,CACC,MAAO,SAAO,KAAK,MAAM,EAAE,KAAK,KAAO,OAAO,GAAG,IAAM,KAAK,CAC7D,CASA,SAAS,iBAAiB,SAC1B,CACC,IAAI,UAAW,MAAO,IACtB,GAAI,OAAO,UAAa,UAAY,WAAa,KAEhD,OAAO,SAGR,UAAY,MAAM,QAAQ,QAAQ,EAAI,CAAC,EAAI,CAAC,EAE5C,IAAK,OAAO,SACX,MAAQ,SAAS,GAAG,EAEpB,UAAU,GAAG,EAAI,iBAAiB,KAAK,EAGxC,OAAO,SACR,CC1MA,SAAS,OAAO,MAChB,CACC,IAAI,GAAK,SAAS,eAAe,KAAK,EACtC,GAAI,KAAO,KACV,MAAM,IAAI,MAAM,gBAAkB,KAAK,EAExC,OAAO,EACR,CAQA,SAAS,IAAI,OAAQ,QAAS,SAC9B,CACC,IAAI,UAAY,OAAO,KAAK,OAAQ,QAAS,QAAQ,EAIrD,WAAU,MAAM,CACjB,CAMA,SAAS,SAAS,MAClB,CACC,IAAI,GAAK,KAAK,OAAO,KAAK,EAC1B,GAAI,cAAc,aAAe,GAAG,aAAa,MAAM,IAAM,WAC5D,MAAM,IAAI,MAAM,8BAAgC,KAAK,EAEtD,IAAI,SAAW,SAAS,GAAG,aAAa,MAAM,GAAK,GAAG,EAClD,SAAW,GAAG,aAAa,OAAO,EAClC,QAAU,CAAC,EACX,UAAY,OACf,QAAU,SAAS,MAAM;AAAA,CAAI,GAI9B,QAFI,WAAa,EAEP,EAAI,EAAG,EAAI,QAAQ,OAAQ,IAC/B,QAAQ,CAAC,EAAE,OAAO,EAAK,WAC3B,YAAc,KAAK,MAAO,QAAQ,CAAC,EAAE,OAAO,GAAK,QAAS,GAG5D,GAAG,aAAa,OAAQ,WAAa,QAAQ,QAAQ,SAAS,CAAC,CAChE,CAOA,SAAS,OAAO,GAChB,CACC,OAAO,EAAE,IAAM,EAAE,EAAE,OAAS,CAC7B,CC3DA,IAAM,mBAAN,KAAyB,CAUxB,IAAI,IAAK,GAAK,GAAI,QAAU,GAAI,IAAM,CAAC,EAAG,QAAU,CAAC,EACrD,CACC,MAAO,CACN,IACA,GAEA,KAAM,QAAQ,KACd,QACA,IACA,QACA,IAAK,CAAC,CACP,CACD,CASA,IAAI,KAAM,OAAQ,GAAK,GACvB,CACC,GAAI,IAEH,GAAI,KAAK,IAAM,GACd,KAAK,IAAI,KAAK,iBAAiB,MAAM,CAAC,UAGlC,SAAS,KAAK,GAAG,GAAK,KAAK,IAAI,OAAS,EAC3C,QAAS,EAAI,EAAG,EAAI,KAAK,IAAI,OAAQ,IAEpC,KAAK,IAAI,KAAK,IAAI,CAAC,EAAG,OAAQ,EAAE,OAKnC,KAAK,IAAI,KAAK,iBAAiB,MAAM,CAAC,EAEvC,OAAO,IACR,CASA,KAAK,QAAS,OACd,CACC,QAAS,EAAI,EAAG,EAAI,OAAO,OAAQ,IAClC,KAAK,IAAI,KAAK,iBAAiB,OAAO,CAAC,CAAC,CAAC,EAE1C,OAAO,IACR,CASA,OAAO,KAAM,OACb,CACC,QAAS,EAAI,EAAG,EAAI,OAAO,OAAQ,IAClC,KAAK,IAAI,KAAK,iBAAiB,OAAO,CAAC,CAAC,CAAC,EAE1C,OAAO,IACR,CAOA,IAAI,KACJ,CACC,YAAK,IAAM,CAAC,EACL,IACR,CAQA,OAAO,SAAU,IACjB,CACC,IAAI,UAAY,SAAS,IAAI,QAAQ,GAAG,EACxC,OAAI,UAAY,IACf,SAAS,IAAI,OAAO,UAAW,CAAC,EAE1B,QACR,CAQA,OAAO,SAAU,IACjB,CACC,IAAI,UAAY,SAAS,IAAI,QAAQ,GAAG,EACxC,OAAI,WAAa,IAChB,SAAS,IAAI,KAAK,GAAG,EAEf,QACR,CAUA,OAAO,SAAU,KAAM,KACvB,CACC,YAAK,OAAO,SAAU,IAAI,EAC1B,KAAK,OAAO,SAAU,IAAI,EACnB,QACR,CAQA,KAAK,KACL,CACC,IAAI,cAAgB,CACnB,SACA,WACA,OACA,SACA,QACA,MACA,OACA,SACA,SACA,QACA,SACA,UACD,EACI,aAAe,CAClB,KACA,OACA,OACD,EACI,SAAW,CACd,QACA,KACA,MACA,KACA,OACA,MACA,SACA,MACA,QACA,SACA,QACA,UAEA,OACA,OACA,OACA,OACD,EAEA,IAAI,QAAU,CAAC,EAEX,KAAO,IAAM,KAAK,IAClB,EAUJ,GARI,KAAK,KACR,MAAQ,QAAU,KAAK,GAAK,IAExB,cAAc,SAAS,KAAK,GAAG,IAClC,MAAQ,WAAa,KAAK,KAAO,KAAK,KAAO,KAAK,IAAM,MAItD,SAAS,KAAK,GAAG,GAAK,KAAK,IAAI,OAAS,EAAG,CAE9C,IADA,MAAQ,WACH,EAAI,EAAG,EAAI,KAAK,IAAI,OAAQ,IAChC,MAAQ,KAAK,IAAI,CAAC,EAAI,IAGvB,KAAO,KAAK,MAAM,EAAG,EAAE,EACvB,MAAQ,GACT,CAEA,GAAI,SAAS,KAAK,OAAO,EAExB,OAAW,CAAC,IAAK,IAAI,IAAK,OAAO,QAAQ,KAAK,OAAO,EAC/C,aAAa,SAAS,GAAG,IAC7B,MAAQ,IAAM,IAAM,KAAO,KAAO,KAWrC,GANA,MAAQ,IAER,QAAQ,KAAK,IAAI,EAIb,SAAS,KAAK,GAAG,GAAK,KAAK,IAAI,OAAS,EAI3C,IAHI,KAAK,SACR,QAAQ,KAAK,KAAK,OAAO,EAErB,EAAI,EAAG,EAAI,KAAK,IAAI,OAAQ,IAChC,QAAQ,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,OAE1B,KAAK,SACf,QAAQ,KAAK,KAAK,OAAO,EAG1B,OACE,SAAS,SAAS,KAAK,GAAG,GAE3B,QAAQ,KAAK,KAAO,KAAK,IAAM,GAAG,EAG5B,QAAQ,KAAK,EAAE,CACvB,CASA,KAAK,KACL,CAEC,QADI,QAAU,CAAC,EACN,EAAI,EAAG,EAAI,KAAK,OAAQ,IAChC,QAAQ,KAAK,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,EAEhC,OAAO,QAAQ,KAAK,EAAE,CACvB,CACD,ECtQA,IAAI,IAAM,IAAI,mBAOd,SAAS,WAAW,OACpB,CACC,OAAO,OAAO,QAAQ,YAAa,SAAU,EAAG,CAC/C,IAAI,UAAY,CACf,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAM,QACN,IAAK,QACN,EAEA,OAAO,UAAU,CAAC,CACnB,CAAC,CACF,CAOA,SAAS,aAAa,OACtB,CACC,OAAO,OAAO,QAAQ,YAAa,SAAU,EAAG,CAC/C,IAAI,UAAY,CACf,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,SAAU,IACV,QAAS,IACT,SAAU,GACX,EAEA,OAAO,UAAU,CAAC,CACnB,CAAC,CACF,CAmBA,SAAS,aAAa,KAAM,KAAM,SAAW,GAAI,aAAe,GAAO,cAAgB,GAAO,KAAO,GACrG,Line truncated
|
"mappings": "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 truncated
|
||||||
"names": ["i18n", "hec", "l10n", "hec", "l10n", "escapeHtml", "roundPrecision", "formatString", "unescapeHtml", "loadEl", "pop", "expandTA", "getWindowSize", "getScrollOffset", "getScrollOffsetOpener", "setCenter", "goToPos", "goTo", "numberWithCommas", "convertLBtoBR", "getTimestamp", "dec2hex", "generateId", "randomIdF", "getRandomIntInclusive", "isFunction", "executeFunctionByName", "isObject", "getObjectCount", "keyInObject", "getKeyByValue", "valueInObject", "deepCopyFunction", "exists", "formatBytes", "formatBytesLong", "stringByteFormat", "errorCatch", "actionIndicator", "actionIndicatorShow", "actionIndicatorHide", "overlayBoxShow", "overlayBoxHide", "setOverlayBox", "hideOverlayBox", "ClearCall", "html_options", "html_options_block", "html_options_refill", "parseQueryString", "getQueryStringParam", "updateUrlParameter", "removeUrlParameter", "hasUrlParameter", "getUrlParameter", "loginLogout"]
|
"names": ["i18n", "hec", "l10n", "hec", "l10n", "escapeHtml", "roundPrecision", "formatString", "unescapeHtml", "loadEl", "pop", "expandTA", "getWindowSize", "getScrollOffset", "getScrollOffsetOpener", "setCenter", "goToPos", "goTo", "numberWithCommas", "convertLBtoBR", "getTimestamp", "dec2hex", "generateId", "randomIdF", "getRandomIntInclusive", "isFunction", "executeFunctionByName", "isObject", "isArray", "isIterable", "getObjectCount", "keyInObject", "getKeyByValue", "valueInObject", "deepCopyFunction", "exists", "formatBytes", "formatBytesLong", "stringByteFormat", "errorCatch", "actionIndicator", "actionIndicatorShow", "actionIndicatorHide", "overlayBoxShow", "overlayBoxHide", "setOverlayBox", "hideOverlayBox", "ClearCall", "html_options", "html_options_block", "html_options_refill", "parseQueryString", "getQueryStringParam", "updateUrlParameter", "removeUrlParameter", "hasUrlParameter", "getUrlParameter", "loginLogout", "isWebkit", "isMobileWebKit", "isDesktopWebKit"]
|
||||||
}
|
}
|
||||||
@@ -10,12 +10,16 @@ class Email
|
|||||||
/** @var array<int,string> */
|
/** @var array<int,string> */
|
||||||
private static array $email_regex_check = [
|
private static array $email_regex_check = [
|
||||||
0 => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
0 => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$", // MASTER
|
// . "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$", // MASTER
|
||||||
|
// fixed pattern matching for domain
|
||||||
|
. "(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$", // MASTER
|
||||||
1 => "@(.*)@(.*)", // double @
|
1 => "@(.*)@(.*)", // double @
|
||||||
2 => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@", // wrong part before @
|
2 => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@", // wrong part before @
|
||||||
3 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.([a-zA-Z]{2,}){1}$", // wrong part after @
|
// 3 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.([a-zA-Z]{2,}){1}$", // wrong part after @
|
||||||
4 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.", // wrong domain name part
|
3 => "@(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.[a-zA-Z]{2,6}$", // wrong part after @
|
||||||
5 => "\.([a-zA-Z]{2,6}){1}$", // wrong top level part
|
// 4 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.", // wrong domain name part
|
||||||
|
4 => "@(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.[A-Za-z0-9-]{1,63}(?<!-))*\.", // wrong domain name part
|
||||||
|
5 => "\.[a-zA-Z]{2,6}$", // wrong top level part
|
||||||
6 => "@(.*)\.{2,}", // double .. in domain name part
|
6 => "@(.*)\.{2,}", // double .. in domain name part
|
||||||
7 => "@.*\.$" // ends with a dot, top level, domain missing
|
7 => "@.*\.$" // ends with a dot, top level, domain missing
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -150,14 +150,14 @@ class ArrayHandler
|
|||||||
* array search simple. looks for key, value combination, if found, returns true
|
* array search simple. looks for key, value combination, if found, returns true
|
||||||
* on default does not strict check, so string '4' will match int 4 and vica versa
|
* on default does not strict check, so string '4' will match int 4 and vica versa
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array search in as array
|
* @param array<mixed> $in_array search in as array
|
||||||
* @param string|int $key key (key to search in)
|
* @param string|int $key key (key to search in)
|
||||||
* @param string|int|bool|array<string|int|bool> $value values list (what to find)
|
* @param string|int|bool|array<string|int|bool> $value values list (what to find)
|
||||||
* @param bool $strict [false], if set to true, will strict check key/value
|
* @param bool $strict [false], if set to true, will strict check key/value
|
||||||
* @return bool true on found, false on not found
|
* @return bool true on found, false on not found
|
||||||
*/
|
*/
|
||||||
public static function arraySearchSimple(
|
public static function arraySearchSimple(
|
||||||
array $array,
|
array $in_array,
|
||||||
string|int $key,
|
string|int $key,
|
||||||
string|int|bool|array $value,
|
string|int|bool|array $value,
|
||||||
bool $strict = false
|
bool $strict = false
|
||||||
@@ -166,7 +166,7 @@ class ArrayHandler
|
|||||||
if (!is_array($value)) {
|
if (!is_array($value)) {
|
||||||
$value = [$value];
|
$value = [$value];
|
||||||
}
|
}
|
||||||
foreach ($array as $_key => $_value) {
|
foreach ($in_array as $_key => $_value) {
|
||||||
// if value is an array, we search
|
// if value is an array, we search
|
||||||
if (is_array($_value)) {
|
if (is_array($_value)) {
|
||||||
// call recursive, and return result if it is true, else continue
|
// call recursive, and return result if it is true, else continue
|
||||||
@@ -189,19 +189,19 @@ class ArrayHandler
|
|||||||
* If prefix is turned on each found group will be prefixed with the
|
* If prefix is turned on each found group will be prefixed with the
|
||||||
* search key
|
* search key
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array array to search in
|
* @param array<mixed> $in_array array to search in
|
||||||
* @param array<mixed> $needles keys to find in array
|
* @param array<mixed> $needles keys to find in array
|
||||||
* @param bool $flat [false] Turn on flat output
|
* @param bool $flat [false] Turn on flat output
|
||||||
* @param bool $prefix [false] Prefix found with needle key
|
* @param bool $prefix [false] Prefix found with needle key
|
||||||
* @return array<mixed> Found values
|
* @return array<mixed> Found values
|
||||||
*/
|
*/
|
||||||
public static function arraySearchKey(
|
public static function arraySearchKey(
|
||||||
array $array,
|
array $in_array,
|
||||||
array $needles,
|
array $needles,
|
||||||
bool $flat = false,
|
bool $flat = false,
|
||||||
bool $prefix = false
|
bool $prefix = false
|
||||||
): array {
|
): array {
|
||||||
$iterator = new \RecursiveArrayIterator($array);
|
$iterator = new \RecursiveArrayIterator($in_array);
|
||||||
$recursive = new \RecursiveIteratorIterator(
|
$recursive = new \RecursiveIteratorIterator(
|
||||||
$iterator,
|
$iterator,
|
||||||
\RecursiveIteratorIterator::SELF_FIRST
|
\RecursiveIteratorIterator::SELF_FIRST
|
||||||
@@ -248,7 +248,7 @@ class ArrayHandler
|
|||||||
* If not found return an array with the array block there the required key is missing,
|
* If not found return an array with the array block there the required key is missing,
|
||||||
* the path as string with seperator block set and the missing key entry
|
* the path as string with seperator block set and the missing key entry
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array
|
* @param array<mixed> $in_array
|
||||||
* @param string|int|float|bool $search_value
|
* @param string|int|float|bool $search_value
|
||||||
* @param string|array<string> $required_key
|
* @param string|array<string> $required_key
|
||||||
* @param ?string $search_key [null]
|
* @param ?string $search_key [null]
|
||||||
@@ -257,7 +257,7 @@ class ArrayHandler
|
|||||||
* @return array<array{content?:array<mixed>,path?:string,missing_key?:array<string>}>
|
* @return array<array{content?:array<mixed>,path?:string,missing_key?:array<string>}>
|
||||||
*/
|
*/
|
||||||
public static function findArraysMissingKey(
|
public static function findArraysMissingKey(
|
||||||
array $array,
|
array $in_array,
|
||||||
string|int|float|bool $search_value,
|
string|int|float|bool $search_value,
|
||||||
string|array $required_key,
|
string|array $required_key,
|
||||||
?string $search_key = null,
|
?string $search_key = null,
|
||||||
@@ -265,7 +265,7 @@ class ArrayHandler
|
|||||||
string $current_path = ''
|
string $current_path = ''
|
||||||
): array {
|
): array {
|
||||||
$results = [];
|
$results = [];
|
||||||
foreach ($array as $key => $value) {
|
foreach ($in_array as $key => $value) {
|
||||||
$path = $current_path ? $current_path . $path_separator . $key : $key;
|
$path = $current_path ? $current_path . $path_separator . $key : $key;
|
||||||
|
|
||||||
if (is_array($value)) {
|
if (is_array($value)) {
|
||||||
@@ -321,7 +321,7 @@ class ArrayHandler
|
|||||||
* Find key => value entry and return set with key for all matching
|
* Find key => value entry and return set with key for all matching
|
||||||
* Can search recursively through nested arrays if recursive flag is set
|
* Can search recursively through nested arrays if recursive flag is set
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array
|
* @param array<mixed> $in_array
|
||||||
* @param string $lookup
|
* @param string $lookup
|
||||||
* @param int|string|float|bool $search
|
* @param int|string|float|bool $search
|
||||||
* @param bool $strict [false]
|
* @param bool $strict [false]
|
||||||
@@ -332,7 +332,7 @@ class ArrayHandler
|
|||||||
* @return array<mixed>
|
* @return array<mixed>
|
||||||
*/
|
*/
|
||||||
public static function selectArrayFromOption(
|
public static function selectArrayFromOption(
|
||||||
array $array,
|
array $in_array,
|
||||||
string $lookup,
|
string $lookup,
|
||||||
int|string|float|bool $search,
|
int|string|float|bool $search,
|
||||||
bool $strict = false,
|
bool $strict = false,
|
||||||
@@ -342,7 +342,7 @@ class ArrayHandler
|
|||||||
string $flat_separator = self::DATA_SEPARATOR
|
string $flat_separator = self::DATA_SEPARATOR
|
||||||
): array {
|
): array {
|
||||||
// skip on empty
|
// skip on empty
|
||||||
if ($array == []) {
|
if ($in_array == []) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
// init return result
|
// init return result
|
||||||
@@ -352,7 +352,7 @@ class ArrayHandler
|
|||||||
$search = strtolower($search);
|
$search = strtolower($search);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($array as $key => $value) {
|
foreach ($in_array as $key => $value) {
|
||||||
// Handle current level search
|
// Handle current level search
|
||||||
if (isset($value[$lookup])) {
|
if (isset($value[$lookup])) {
|
||||||
$compareValue = $value[$lookup];
|
$compareValue = $value[$lookup];
|
||||||
@@ -399,14 +399,14 @@ class ArrayHandler
|
|||||||
/**
|
/**
|
||||||
* main wrapper function for next/prev key
|
* main wrapper function for next/prev key
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array array to search in
|
* @param array<mixed> $in_array array to search in
|
||||||
* @param int|string $key key for next/prev
|
* @param int|string $key key for next/prev
|
||||||
* @param bool $next [=true] if to search next or prev
|
* @param bool $next [=true] if to search next or prev
|
||||||
* @return int|string|null Next/prev key or null for end/first
|
* @return int|string|null Next/prev key or null for end/first
|
||||||
*/
|
*/
|
||||||
private static function arrayGetKey(array $array, int|string $key, bool $next = true): int|string|null
|
private static function arrayGetKey(array $in_array, int|string $key, bool $next = true): int|string|null
|
||||||
{
|
{
|
||||||
$keys = array_keys($array);
|
$keys = array_keys($in_array);
|
||||||
if (($position = array_search($key, $keys, true)) === false) {
|
if (($position = array_search($key, $keys, true)) === false) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -422,26 +422,26 @@ class ArrayHandler
|
|||||||
* Get previous array key from an array
|
* Get previous array key from an array
|
||||||
* null on not found
|
* null on not found
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array
|
* @param array<mixed> $in_array
|
||||||
* @param int|string $key
|
* @param int|string $key
|
||||||
* @return int|string|null Next key, or null for not found
|
* @return int|string|null Next key, or null for not found
|
||||||
*/
|
*/
|
||||||
public static function arrayGetPrevKey(array $array, int|string $key): int|string|null
|
public static function arrayGetPrevKey(array $in_array, int|string $key): int|string|null
|
||||||
{
|
{
|
||||||
return self::arrayGetKey($array, $key, false);
|
return self::arrayGetKey($in_array, $key, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get next array key from an array
|
* Get next array key from an array
|
||||||
* null on not found
|
* null on not found
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array
|
* @param array<mixed> $in_array
|
||||||
* @param int|string $key
|
* @param int|string $key
|
||||||
* @return int|string|null Next key, or null for not found
|
* @return int|string|null Next key, or null for not found
|
||||||
*/
|
*/
|
||||||
public static function arrayGetNextKey(array $array, int|string $key): int|string|null
|
public static function arrayGetNextKey(array $in_array, int|string $key): int|string|null
|
||||||
{
|
{
|
||||||
return self::arrayGetKey($array, $key, true);
|
return self::arrayGetKey($in_array, $key, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -463,27 +463,27 @@ class ArrayHandler
|
|||||||
}
|
}
|
||||||
// default key is not string
|
// default key is not string
|
||||||
$key_is_string = false;
|
$key_is_string = false;
|
||||||
$arrays = func_get_args();
|
$in_arrays = func_get_args();
|
||||||
// if last is not array, then assume it is trigger for key is always string
|
// if last is not array, then assume it is trigger for key is always string
|
||||||
if (!is_array(end($arrays))) {
|
if (!is_array(end($in_arrays))) {
|
||||||
if (array_pop($arrays)) {
|
if (array_pop($in_arrays)) {
|
||||||
$key_is_string = true;
|
$key_is_string = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// check that arrays count is at least two, else we don't have enough to do anything
|
// check that arrays count is at least two, else we don't have enough to do anything
|
||||||
if (count($arrays) < 2) {
|
if (count($in_arrays) < 2) {
|
||||||
throw new \ArgumentCountError(__FUNCTION__ . ' needs two or more array arguments');
|
throw new \ArgumentCountError(__FUNCTION__ . ' needs two or more array arguments');
|
||||||
}
|
}
|
||||||
$merged = [];
|
$merged = [];
|
||||||
while ($arrays) {
|
while ($in_arrays) {
|
||||||
$array = array_shift($arrays);
|
$in_array = array_shift($in_arrays);
|
||||||
if (!is_array($array)) {
|
if (!is_array($in_array)) {
|
||||||
throw new \TypeError(__FUNCTION__ . ' encountered a non array argument');
|
throw new \TypeError(__FUNCTION__ . ' encountered a non array argument');
|
||||||
}
|
}
|
||||||
if (!$array) {
|
if (!$in_array) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
foreach ($array as $key => $value) {
|
foreach ($in_array as $key => $value) {
|
||||||
// if string or if key is assumed to be string do key match
|
// if string or if key is assumed to be string do key match
|
||||||
// else add new entry
|
// else add new entry
|
||||||
if (is_string($key) || $key_is_string === false) {
|
if (is_string($key) || $key_is_string === false) {
|
||||||
@@ -589,14 +589,14 @@ class ArrayHandler
|
|||||||
* converts multi dimensional array to a flat array
|
* converts multi dimensional array to a flat array
|
||||||
* does NOT preserve keys
|
* does NOT preserve keys
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array multi dimensionial array
|
* @param array<mixed> $in_array multi dimensionial array
|
||||||
* @return array<mixed> flattened array
|
* @return array<mixed> flattened array
|
||||||
*/
|
*/
|
||||||
public static function flattenArray(array $array): array
|
public static function flattenArray(array $in_array): array
|
||||||
{
|
{
|
||||||
$return = [];
|
$return = [];
|
||||||
array_walk_recursive(
|
array_walk_recursive(
|
||||||
$array,
|
$in_array,
|
||||||
function ($value) use (&$return) {
|
function ($value) use (&$return) {
|
||||||
$return[] = $value;
|
$return[] = $value;
|
||||||
}
|
}
|
||||||
@@ -607,13 +607,13 @@ class ArrayHandler
|
|||||||
/**
|
/**
|
||||||
* will loop through an array recursivly and write the array keys back
|
* will loop through an array recursivly and write the array keys back
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array multidemnsional array to flatten
|
* @param array<mixed> $in_array multidemnsional array to flatten
|
||||||
* @param array<mixed> $return recoursive pass on array of keys
|
* @param array<mixed> $return recoursive pass on array of keys
|
||||||
* @return array<mixed> flattened keys array
|
* @return array<mixed> flattened keys array
|
||||||
*/
|
*/
|
||||||
public static function flattenArrayKey(array $array, array $return = []): array
|
public static function flattenArrayKey(array $in_array, array $return = []): array
|
||||||
{
|
{
|
||||||
foreach ($array as $key => $sub) {
|
foreach ($in_array as $key => $sub) {
|
||||||
$return[] = $key;
|
$return[] = $key;
|
||||||
if (is_array($sub) && count($sub) > 0) {
|
if (is_array($sub) && count($sub) > 0) {
|
||||||
$return = self::flattenArrayKey($sub, $return);
|
$return = self::flattenArrayKey($sub, $return);
|
||||||
@@ -626,14 +626,14 @@ class ArrayHandler
|
|||||||
* as above will flatten an array, but in this case only the outmost
|
* as above will flatten an array, but in this case only the outmost
|
||||||
* leave nodes, all other keyswill be skipped
|
* leave nodes, all other keyswill be skipped
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array multidemnsional array to flatten
|
* @param array<mixed> $in_array multidemnsional array to flatten
|
||||||
* @return array<mixed> flattened keys array
|
* @return array<mixed> flattened keys array
|
||||||
*/
|
*/
|
||||||
public static function flattenArrayKeyLeavesOnly(array $array): array
|
public static function flattenArrayKeyLeavesOnly(array $in_array): array
|
||||||
{
|
{
|
||||||
$return = [];
|
$return = [];
|
||||||
array_walk_recursive(
|
array_walk_recursive(
|
||||||
$array,
|
$in_array,
|
||||||
function ($value, $key) use (&$return) {
|
function ($value, $key) use (&$return) {
|
||||||
$return[] = $key;
|
$return[] = $key;
|
||||||
}
|
}
|
||||||
@@ -645,14 +645,14 @@ class ArrayHandler
|
|||||||
* searches for key -> value in an array tree and writes the value one level up
|
* searches for key -> value in an array tree and writes the value one level up
|
||||||
* this will remove this leaf will all other values
|
* this will remove this leaf will all other values
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array nested array
|
* @param array<mixed> $in_array nested array
|
||||||
* @param string|int $search key to find that has no sub leaf
|
* @param string|int $search key to find that has no sub leaf
|
||||||
* and will be pushed up
|
* and will be pushed up
|
||||||
* @return array<mixed> modified, flattened array
|
* @return array<mixed> modified, flattened array
|
||||||
*/
|
*/
|
||||||
public static function arrayFlatForKey(array $array, string|int $search): array
|
public static function arrayFlatForKey(array $in_array, string|int $search): array
|
||||||
{
|
{
|
||||||
foreach ($array as $key => $value) {
|
foreach ($in_array as $key => $value) {
|
||||||
// if it is not an array do just nothing
|
// if it is not an array do just nothing
|
||||||
if (!is_array($value)) {
|
if (!is_array($value)) {
|
||||||
continue;
|
continue;
|
||||||
@@ -660,14 +660,14 @@ class ArrayHandler
|
|||||||
// probe it has search key
|
// probe it has search key
|
||||||
if (isset($value[$search])) {
|
if (isset($value[$search])) {
|
||||||
// set as current
|
// set as current
|
||||||
$array[$key] = $value[$search];
|
$in_array[$key] = $value[$search];
|
||||||
} else {
|
} else {
|
||||||
// call up next node down
|
// call up next node down
|
||||||
// $array[$key] = call_user_func(__METHOD__, $value, $search);
|
// $in_array[$key] = call_user_func(__METHOD__, $value, $search);
|
||||||
$array[$key] = self::arrayFlatForKey($value, $search);
|
$in_array[$key] = self::arrayFlatForKey($value, $search);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $array;
|
return $in_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -677,13 +677,13 @@ class ArrayHandler
|
|||||||
*
|
*
|
||||||
* https://stackoverflow.com/a/369608
|
* https://stackoverflow.com/a/369608
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array Array where elements are located
|
* @param array<mixed> $in_array Array where elements are located
|
||||||
* @param array<mixed> $remove Elements to remove
|
* @param array<mixed> $remove Elements to remove
|
||||||
* @return array<mixed> Array with $remove elements removed
|
* @return array<mixed> Array with $remove elements removed
|
||||||
*/
|
*/
|
||||||
public static function arrayRemoveEntry(array $array, array $remove): array
|
public static function arrayRemoveEntry(array $in_array, array $remove): array
|
||||||
{
|
{
|
||||||
return array_diff($array, $remove);
|
return array_diff($in_array, $remove);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -693,20 +693,20 @@ class ArrayHandler
|
|||||||
* key list is a list[string]
|
* key list is a list[string]
|
||||||
* if key list is empty, return array as is
|
* if key list is empty, return array as is
|
||||||
*
|
*
|
||||||
* @param array<string,mixed> $array
|
* @param array<string,mixed> $in_array
|
||||||
* @param array<string> $key_list
|
* @param array<string> $key_list
|
||||||
* @return array<string,mixed>
|
* @return array<string,mixed>
|
||||||
*/
|
*/
|
||||||
public static function arrayReturnMatchingKeyOnly(
|
public static function arrayReturnMatchingKeyOnly(
|
||||||
array $array,
|
array $in_array,
|
||||||
array $key_list
|
array $key_list
|
||||||
): array {
|
): array {
|
||||||
// on empty return as is
|
// on empty return as is
|
||||||
if (empty($key_list)) {
|
if (empty($key_list)) {
|
||||||
return $array;
|
return $in_array;
|
||||||
}
|
}
|
||||||
return array_filter(
|
return array_filter(
|
||||||
$array,
|
$in_array,
|
||||||
fn($key) => in_array($key, $key_list),
|
fn($key) => in_array($key, $key_list),
|
||||||
ARRAY_FILTER_USE_KEY
|
ARRAY_FILTER_USE_KEY
|
||||||
);
|
);
|
||||||
@@ -748,16 +748,19 @@ class ArrayHandler
|
|||||||
* sort ascending or descending with or without lower case convert
|
* sort ascending or descending with or without lower case convert
|
||||||
* value only, will loose key connections unless preserve_keys is set to true
|
* value only, will loose key connections unless preserve_keys is set to true
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array array to sort by values
|
* @param array<mixed> $in_array Array to sort by values
|
||||||
* @param int $params sort flags
|
* @param bool $case_insensitive [false] Sort case insensitive
|
||||||
|
* @param bool $reverse [false] Reverse sort
|
||||||
|
* @param bool $maintain_keys [false] Maintain keys
|
||||||
|
* @param int $flag [SORT_REGULAR] Sort flags
|
||||||
* @return array<mixed>
|
* @return array<mixed>
|
||||||
*/
|
*/
|
||||||
public static function sortArray(
|
public static function sortArray(
|
||||||
array $array,
|
array $in_array,
|
||||||
bool $case_insensitive = false,
|
bool $case_insensitive = false,
|
||||||
bool $reverse = false,
|
bool $reverse = false,
|
||||||
bool $maintain_keys = false,
|
bool $maintain_keys = false,
|
||||||
int $params = SORT_REGULAR
|
int $flag = SORT_REGULAR
|
||||||
): array {
|
): array {
|
||||||
$fk_sort_lower_case = function (string $a, string $b): int {
|
$fk_sort_lower_case = function (string $a, string $b): int {
|
||||||
return strtolower($a) <=> strtolower($b);
|
return strtolower($a) <=> strtolower($b);
|
||||||
@@ -767,26 +770,26 @@ class ArrayHandler
|
|||||||
};
|
};
|
||||||
$case_insensitive ? (
|
$case_insensitive ? (
|
||||||
$maintain_keys ?
|
$maintain_keys ?
|
||||||
(uasort($array, $reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case)) :
|
(uasort($in_array, $reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case)) :
|
||||||
(usort($array, $reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case))
|
(usort($in_array, $reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case))
|
||||||
) :
|
) :
|
||||||
(
|
(
|
||||||
$maintain_keys ?
|
$maintain_keys ?
|
||||||
($reverse ? arsort($array, $params) : asort($array, $params)) :
|
($reverse ? arsort($in_array, $flag) : asort($in_array, $flag)) :
|
||||||
($reverse ? rsort($array, $params) : sort($array, $params))
|
($reverse ? rsort($in_array, $flag) : sort($in_array, $flag))
|
||||||
);
|
);
|
||||||
return $array;
|
return $in_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sort by key ascending or descending and return
|
* sort by key ascending or descending and return
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array
|
* @param array<mixed> $in_array Array to srt
|
||||||
* @param bool $case_insensitive [false]
|
* @param bool $case_insensitive [false] Sort keys case insenstive
|
||||||
* @param bool $reverse [false]
|
* @param bool $reverse [false] Reverse key sort
|
||||||
* @return array<mixed>
|
* @return array<mixed>
|
||||||
*/
|
*/
|
||||||
public static function ksortArray(array $array, bool $case_insensitive = false, bool $reverse = false): array
|
public static function ksortArray(array $in_array, bool $case_insensitive = false, bool $reverse = false): array
|
||||||
{
|
{
|
||||||
$fk_sort_lower_case = function (string $a, string $b): int {
|
$fk_sort_lower_case = function (string $a, string $b): int {
|
||||||
return strtolower($a) <=> strtolower($b);
|
return strtolower($a) <=> strtolower($b);
|
||||||
@@ -801,12 +804,12 @@ class ArrayHandler
|
|||||||
return $b <=> $a;
|
return $b <=> $a;
|
||||||
};
|
};
|
||||||
uksort(
|
uksort(
|
||||||
$array,
|
$in_array,
|
||||||
$case_insensitive ?
|
$case_insensitive ?
|
||||||
($reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case) :
|
($reverse ? $fk_sort_lower_case_reverse : $fk_sort_lower_case) :
|
||||||
($reverse ? $fk_sort_reverse : $fk_sort)
|
($reverse ? $fk_sort_reverse : $fk_sort)
|
||||||
);
|
);
|
||||||
return $array;
|
return $in_array;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ class Byte
|
|||||||
// labels in order of size [Y, Z]
|
// labels in order of size [Y, Z]
|
||||||
$labels = ['', 'K', 'M', 'G', 'T', 'P', 'E'];
|
$labels = ['', 'K', 'M', 'G', 'T', 'P', 'E'];
|
||||||
// exp position calculation
|
// exp position calculation
|
||||||
$exp = floor(log($abs_bytes, $unit));
|
$exp = (int)floor(log($abs_bytes, $unit));
|
||||||
// avoid printing out anything larger than max labels
|
// avoid printing out anything larger than max labels
|
||||||
if ($exp >= count($labels)) {
|
if ($exp >= count($labels)) {
|
||||||
$exp = count($labels) - 1;
|
$exp = count($labels) - 1;
|
||||||
|
|||||||
@@ -55,10 +55,10 @@ class Json
|
|||||||
* Deos not throw errors
|
* Deos not throw errors
|
||||||
*
|
*
|
||||||
* @param array<mixed> $data
|
* @param array<mixed> $data
|
||||||
* @param int $flags json_encode flags as is
|
* @param int $flags [JSON_UNESCAPED_UNICODE] json_encode flags as is
|
||||||
* @return string JSON string or '{}' if false
|
* @return string JSON string or '{}' if false
|
||||||
*/
|
*/
|
||||||
public static function jsonConvertArrayTo(array $data, int $flags = 0): string
|
public static function jsonConvertArrayTo(array $data, int $flags = JSON_UNESCAPED_UNICODE): string
|
||||||
{
|
{
|
||||||
$json_string = json_encode($data, $flags) ?: '{}';
|
$json_string = json_encode($data, $flags) ?: '{}';
|
||||||
self::$json_last_error = json_last_error();
|
self::$json_last_error = json_last_error();
|
||||||
|
|||||||
@@ -199,15 +199,17 @@ class Math
|
|||||||
callback: fn ($col) => is_array($row) ?
|
callback: fn ($col) => is_array($row) ?
|
||||||
array_reduce(
|
array_reduce(
|
||||||
array: $row,
|
array: $row,
|
||||||
callback: fn ($a, $v, $i = null) => $a + $v * (
|
// TODO check that v is not an array
|
||||||
|
callback: fn ($a, $v, $i = null) => $a + $v * ( /** @phpstan-ignore-line Possible array + int */
|
||||||
// if last entry missing for full copy add a 0 to it
|
// if last entry missing for full copy add a 0 to it
|
||||||
$col[$i ?? array_search($v, $row, true)] ?? 0 /** @phpstan-ignore-line */
|
$col[$i ?? array_search($v, $row, true)] ?? 0
|
||||||
),
|
),
|
||||||
initial: 0,
|
initial: 0,
|
||||||
) :
|
) :
|
||||||
array_reduce(
|
array_reduce(
|
||||||
array: $col,
|
array: $col,
|
||||||
callback: fn ($a, $v) => $a + $v * $row,
|
// TODO check that v is not an array
|
||||||
|
callback: fn ($a, $v) => $a + $v * $row, /** @phpstan-ignore-line Possible array + int */
|
||||||
initial: 0,
|
initial: 0,
|
||||||
),
|
),
|
||||||
array: $bCols,
|
array: $bCols,
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ class Uids
|
|||||||
*/
|
*/
|
||||||
public static function validateUuuidv4(string $uuidv4): bool
|
public static function validateUuuidv4(string $uuidv4): bool
|
||||||
{
|
{
|
||||||
if (!preg_match("/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/", $uuidv4)) {
|
if (!preg_match("/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i", $uuidv4)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -263,11 +263,11 @@ class ConvertPlaceholder
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// add the connectors back (1), and the data sets only if no replacement will be done
|
// add the connectors back (1), and the data sets only if no replacement will be done
|
||||||
return $params_lookup[$match] ??
|
return $params_lookup[$match]/* ??
|
||||||
throw new \RuntimeException(
|
throw new \RuntimeException(
|
||||||
'Cannot lookup ' . $match . ' in params lookup list',
|
'Cannot lookup ' . $match . ' in params lookup list',
|
||||||
211
|
211
|
||||||
);
|
)*/;
|
||||||
},
|
},
|
||||||
$converted_placeholders['original']['query']
|
$converted_placeholders['original']['query']
|
||||||
);
|
);
|
||||||
@@ -327,11 +327,11 @@ class ConvertPlaceholder
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// add the connectors back (1), and the data sets only if no replacement will be done
|
// add the connectors back (1), and the data sets only if no replacement will be done
|
||||||
return $params_lookup[$match] ??
|
return $params_lookup[$match]/* ??
|
||||||
throw new \RuntimeException(
|
throw new \RuntimeException(
|
||||||
'Cannot lookup ' . $match . ' in params lookup list',
|
'Cannot lookup ' . $match . ' in params lookup list',
|
||||||
231
|
231
|
||||||
);
|
)*/;
|
||||||
},
|
},
|
||||||
$converted_placeholders['original']['query']
|
$converted_placeholders['original']['query']
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -33,6 +33,36 @@ class Support
|
|||||||
return $string;
|
return $string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* print ISO type datetime with microseconds and timezone
|
||||||
|
* Y-m-dTH:i:s.uP
|
||||||
|
* if no micro time the ".u" part is omitted
|
||||||
|
*
|
||||||
|
* @param bool $set_micro_time
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function printIsoTime(bool $set_micro_time = true): string
|
||||||
|
{
|
||||||
|
$datetime = new \DateTime();
|
||||||
|
|
||||||
|
// Format the DateTime object to ISO 8601 with microseconds
|
||||||
|
// 'Y-m-d\TH:i:s.uP' is the format string:
|
||||||
|
// Y: Full year (e.g., 2025)
|
||||||
|
// m: Month (01-12)
|
||||||
|
// d: Day of the month (01-31)
|
||||||
|
// T: Literal 'T' to separate date and time (escaped with a backslash)
|
||||||
|
// H: Hour (00-23)
|
||||||
|
// i: Minute (00-59)
|
||||||
|
// s: Second (00-59)
|
||||||
|
// u: Microseconds (e.g., 654321)
|
||||||
|
// P: Difference to Greenwich time (GMT) with colon (e.g., +09:00)
|
||||||
|
if ($set_micro_time) {
|
||||||
|
return $datetime->format('Y-m-d\TH:i:s.uP');
|
||||||
|
} else {
|
||||||
|
return $datetime->format('Y-m-d\TH:i:sP');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* prints a html formatted (pre) data
|
* prints a html formatted (pre) data
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ class ErrorMessage
|
|||||||
// set a jump target
|
// set a jump target
|
||||||
$this->setJumpTarget($jump_target['target'] ?? null, $jump_target['info'] ?? null, $level);
|
$this->setJumpTarget($jump_target['target'] ?? null, $jump_target['info'] ?? null, $level);
|
||||||
// write to log for abort/crash
|
// write to log for abort/crash
|
||||||
|
$this->log->setErrorMessageCallSetErrorMsg();
|
||||||
switch ($level) {
|
switch ($level) {
|
||||||
case 'notice':
|
case 'notice':
|
||||||
$this->log->notice($message ?? $str, array_merge([
|
$this->log->notice($message ?? $str, array_merge([
|
||||||
@@ -210,6 +211,7 @@ class ErrorMessage
|
|||||||
?bool $log_error = null,
|
?bool $log_error = null,
|
||||||
?bool $log_warning = null,
|
?bool $log_warning = null,
|
||||||
): void {
|
): void {
|
||||||
|
$this->log->setErrorMessageCallSetMessage();
|
||||||
$this->setErrorMsg(
|
$this->setErrorMsg(
|
||||||
$error_id ?? '',
|
$error_id ?? '',
|
||||||
$level,
|
$level,
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ enum Level: int
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the passed $level is higher or equal to $this
|
* Returns true if the passed $level is included in set level
|
||||||
*
|
*
|
||||||
* @param Level $level
|
* @param Level $level
|
||||||
* @return bool
|
* @return bool
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ namespace CoreLibs\Logging\Logger;
|
|||||||
|
|
||||||
enum MessageLevel: int
|
enum MessageLevel: int
|
||||||
{
|
{
|
||||||
|
case noset = 0;
|
||||||
case ok = 100;
|
case ok = 100;
|
||||||
case success = 150; // special for file uploads
|
case success = 150; // special for file uploads
|
||||||
case info = 200;
|
case info = 200;
|
||||||
|
|||||||
@@ -29,11 +29,19 @@ use Stringable;
|
|||||||
class Logging
|
class Logging
|
||||||
{
|
{
|
||||||
/** @var int minimum size for a max file size, so we don't set 1 byte, 10kb */
|
/** @var int minimum size for a max file size, so we don't set 1 byte, 10kb */
|
||||||
public const MIN_LOG_MAX_FILESIZE = 10 * 1024;
|
public const int MIN_LOG_MAX_FILESIZE = 10 * 1024;
|
||||||
/** @var string log file extension, not changeable */
|
/** @var string log file extension, not changeable */
|
||||||
private const LOG_FILE_NAME_EXT = "log";
|
private const string LOG_FILE_NAME_EXT = "log";
|
||||||
/** @var string log file block separator, not changeable */
|
/** @var string log file block separator, not changeable */
|
||||||
private const LOG_FILE_BLOCK_SEPARATOR = '.';
|
private const string LOG_FILE_BLOCK_SEPARATOR = '.';
|
||||||
|
/** @var int the base stack trace level for the line number */
|
||||||
|
private const int DEFAULT_STACK_TRACE_LEVEL_LINE = 1;
|
||||||
|
|
||||||
|
/** @var array<string,int> */
|
||||||
|
private const array STACK_OVERRIDE_CHECK = [
|
||||||
|
'setErrorMsg' => 2,
|
||||||
|
'setMessage' => 3,
|
||||||
|
];
|
||||||
|
|
||||||
// MARK: OPTION array
|
// MARK: OPTION array
|
||||||
// NOTE: the second party array{} hs some errors
|
// NOTE: the second party array{} hs some errors
|
||||||
@@ -96,6 +104,11 @@ class Logging
|
|||||||
'type' => 'bool', 'mandatory' => false,
|
'type' => 'bool', 'mandatory' => false,
|
||||||
'default' => false, 'deprecated' => true, 'use' => 'log_per_date'
|
'default' => false, 'deprecated' => true, 'use' => 'log_per_date'
|
||||||
],
|
],
|
||||||
|
// if turned off uses old time format without time zone
|
||||||
|
'log_time_format_iso' => [
|
||||||
|
'type' => 'bool', 'mandatory' => false,
|
||||||
|
'default' => true, 'deprecated' => false
|
||||||
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
// options
|
// options
|
||||||
@@ -133,6 +146,12 @@ class Logging
|
|||||||
/** @var string Y-m-d file in file name */
|
/** @var string Y-m-d file in file name */
|
||||||
private string $log_file_date = '';
|
private string $log_file_date = '';
|
||||||
|
|
||||||
|
// speical flags for ErrorMessage calls
|
||||||
|
/** @var bool Flag to set if called from ErrorMessage::setErrorMsg */
|
||||||
|
private bool $error_message_call_set_error_msg = false;
|
||||||
|
/** @var bool Flag to set if called from ErrorMessage::setMessage */
|
||||||
|
private bool $error_message_call_set_message = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 1: create a new log file per run (time stamp + unique ID)
|
* 1: create a new log file per run (time stamp + unique ID)
|
||||||
* 2: add Y-m-d and do automatic daily rotation
|
* 2: add Y-m-d and do automatic daily rotation
|
||||||
@@ -622,31 +641,65 @@ class Logging
|
|||||||
$file_line = '';
|
$file_line = '';
|
||||||
$caller_class_method = '-';
|
$caller_class_method = '-';
|
||||||
$traces = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
|
$traces = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
|
||||||
// print "[" . $level->getName() . "] [$message] prepareLog:<br>" . Support::printAr($traces);
|
$stack_trace_start_level_line = self::DEFAULT_STACK_TRACE_LEVEL_LINE;
|
||||||
// file + line: call not this but one before (the one that calls this)
|
// set stack trace level +1 if called from ErrorMessage::setMessage
|
||||||
// start from this level, if unset fall down until we are at null
|
if ($this->error_message_call_set_message) {
|
||||||
$start_trace_level = 2;
|
$stack_trace_start_level_line = 3;
|
||||||
for ($trace_level = $start_trace_level; $trace_level >= 0; $trace_level--) {
|
} elseif ($this->error_message_call_set_error_msg) {
|
||||||
if (isset($traces[$trace_level])) {
|
$stack_trace_start_level_line = 2;
|
||||||
$file_line = ($traces[$trace_level]['file'] ?? $traces[$trace_level]['function'])
|
}
|
||||||
. ':' . ($traces[$trace_level]['line'] ?? '-');
|
// if we have line > default, then check if valid, else reset to default
|
||||||
// as namespace\class->method
|
if ($stack_trace_start_level_line > self::DEFAULT_STACK_TRACE_LEVEL_LINE) {
|
||||||
$caller_class_method =
|
// check if function at level is one of the override checks
|
||||||
// get the last call before we are in the Logging class
|
$fn_check = $traces[$stack_trace_start_level_line]['function'] ?? '';
|
||||||
($traces[$trace_level]['class'] ?? '')
|
if (
|
||||||
// connector, if unkown use ==
|
!isset(self::STACK_OVERRIDE_CHECK[$fn_check]) ||
|
||||||
. ($traces[$trace_level]['type'] ?? '')
|
self::STACK_OVERRIDE_CHECK[$fn_check] != $stack_trace_start_level_line
|
||||||
// method/function: prepareLog->(debug|info|...)->[THIS]
|
) {
|
||||||
. $traces[$trace_level]['function'];
|
$stack_trace_start_level_line = self::DEFAULT_STACK_TRACE_LEVEL_LINE;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$this->error_message_call_set_message = false;
|
||||||
|
$this->error_message_call_set_error_msg = false;
|
||||||
|
// set stack trace level +1 if called from ErrorMessage::setMessage
|
||||||
|
// print "[" . $level->getName() . "] [$message] [" . $stack_trace_start_level_line . "] "
|
||||||
|
// . "prepareLog:<br>" . Support::printAr($traces);
|
||||||
|
// file + line: call not this but one before (the one that calls this)
|
||||||
|
// start from this level, if unset fall down until we are at null
|
||||||
|
// NOTE this has to be pushed to 3 for setMessage wrap calls
|
||||||
|
for ($trace_level = $stack_trace_start_level_line; $trace_level >= 0; $trace_level--) {
|
||||||
|
if (!isset($traces[$trace_level])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$file_line = ($traces[$trace_level]['file'] ?? $traces[$trace_level]['function'])
|
||||||
|
. ':' . ($traces[$trace_level]['line'] ?? '-');
|
||||||
|
// call function is one stack level above
|
||||||
|
$trace_level++;
|
||||||
|
// skip setting if we are in the top level already
|
||||||
|
if (!isset($traces[$trace_level])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// as namespace\class->method
|
||||||
|
$caller_class_method =
|
||||||
|
// get the last call before we are in the Logging class
|
||||||
|
($traces[$trace_level]['class'] ?? '')
|
||||||
|
// connector, if unkown use ==
|
||||||
|
. ($traces[$trace_level]['type'] ?? '')
|
||||||
|
// method/function: prepareLog->(debug|info|...)->[THIS]
|
||||||
|
. $traces[$trace_level]['function'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// if not line is set
|
||||||
if (empty($file_line)) {
|
if (empty($file_line)) {
|
||||||
$file_line = System::getPageName(System::FULL_PATH);
|
$file_line = System::getPageName(System::FULL_PATH);
|
||||||
}
|
}
|
||||||
// print "CLASS: " . $class . "<br>";
|
// print "CLASS: " . $class . "<br>";
|
||||||
// get timestamp
|
// get timestamp
|
||||||
$timestamp = Support::printTime();
|
if (!empty($this->options['log_time_format_iso'])) {
|
||||||
|
$timestamp = Support::printIsoTime();
|
||||||
|
} else {
|
||||||
|
$timestamp = Support::printTime();
|
||||||
|
}
|
||||||
|
|
||||||
// if group id is empty replace it with current level
|
// if group id is empty replace it with current level
|
||||||
$group_str = $level->getName();
|
$group_str = $level->getName();
|
||||||
@@ -1008,6 +1061,30 @@ class Logging
|
|||||||
return $this->log_max_filesize;
|
return $this->log_max_filesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// *********************************************************************
|
||||||
|
// MARK: ErrorMessage class overrides
|
||||||
|
// *********************************************************************
|
||||||
|
|
||||||
|
/**
|
||||||
|
* call if called from Error Message setMessage wrapper
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setErrorMessageCallSetMessage(): void
|
||||||
|
{
|
||||||
|
$this->error_message_call_set_message = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* call if called from Error Message setMessage wrapper
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setErrorMessageCallSetErrorMsg(): void
|
||||||
|
{
|
||||||
|
$this->error_message_call_set_error_msg = true;
|
||||||
|
}
|
||||||
|
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
// MARK: OPTIONS CALLS
|
// MARK: OPTIONS CALLS
|
||||||
// *********************************************************************
|
// *********************************************************************
|
||||||
@@ -1475,14 +1552,15 @@ class Logging
|
|||||||
Level::Error, Level::Critical, Level::Alert, Level::Emergency
|
Level::Error, Level::Critical, Level::Alert, Level::Emergency
|
||||||
] as $l
|
] as $l
|
||||||
) {
|
) {
|
||||||
|
print "Check: " . $this->log_level->getName() . " | " . $l->getName() . "<br>";
|
||||||
if ($this->log_level->isHigherThan($l)) {
|
if ($this->log_level->isHigherThan($l)) {
|
||||||
print "L: " . $this->log_level->getName() . " > " . $l->getName() . "<br>";
|
print "L(gt): " . $this->log_level->getName() . " > " . $l->getName() . "<br>";
|
||||||
}
|
}
|
||||||
if ($this->log_level->includes($l)) {
|
if ($this->log_level->includes($l)) {
|
||||||
print "L: " . $this->log_level->getName() . " <= " . $l->getName() . "<br>";
|
print "L(le): " . $this->log_level->getName() . " <= " . $l->getName() . "<br>";
|
||||||
}
|
}
|
||||||
if ($this->log_level->isLowerThan($l)) {
|
if ($this->log_level->isLowerThan($l)) {
|
||||||
print "L: " . $this->log_level->getName() . " < " . $l->getName() . "<br>";
|
print "L(lt): " . $this->log_level->getName() . " < " . $l->getName() . "<br>";
|
||||||
}
|
}
|
||||||
echo "<br>";
|
echo "<br>";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user