hexydec /
agentzero
| 1 | <?php |
||
| 2 | declare(strict_types = 1); |
||
| 3 | namespace hexydec\agentzero; |
||
| 4 | |||
| 5 | class frameworks { |
||
| 6 | |||
| 7 | /** |
||
| 8 | * Generates a configuration array for matching app frameworks |
||
| 9 | * |
||
| 10 | * @return array<string,props> An array with keys representing the string to match, and values a props object defining how to generate the match and which properties to set |
||
| 11 | */ |
||
| 12 | 6 | public static function get() : array { |
|
| 13 | 1 | return [ |
|
| 14 | 1 | 'Electron/' => new props('start', fn (string $value) : array => [ |
|
| 15 | 5 | 'framework' => 'Electron', |
|
| 16 | 5 | 'frameworkversion' => \explode('/', $value, 3)[1] |
|
| 17 | 5 | ]), |
|
| 18 | 1 | 'MAUI' => new props('start', [ |
|
| 19 | 1 | 'framework' => 'MAUI' |
|
| 20 | 1 | ]), |
|
| 21 | 1 | 'Cordova' => new props('start', fn (string $value) : array => [ |
|
| 22 | 2 | 'framework' => 'Cordova', |
|
| 23 | 2 | 'frameworkversion' => \explode('/', $value, 3)[1] |
|
| 24 | 2 | ]), |
|
| 25 | 1 | 'Alamofire/' => new props('start', fn (string $value) : array => [ |
|
| 26 | 1 | 'framework' => 'Alamofire', |
|
| 27 | 1 | 'frameworkversion' => \explode('/', $value, 3)[1] |
|
| 28 | 1 | ]), |
|
| 29 | 1 | '.NET CLR ' => new props('start', function (string $value, int $i, array $tokens) : array { |
|
| 30 | |||
| 31 | // find latest version as often specifdies many versions |
||
| 32 | 6 | $levels = []; |
|
| 33 | 6 | for ($n = $i; $n < \count($tokens); $n++) { // may happen multiple times if there are multiple captures, but only look forward as only the first will be written |
|
|
0 ignored issues
–
show
|
|||
| 34 | 6 | if (\mb_stripos($tokens[$n], '.NET CLR ') === 0) { |
|
| 35 | 6 | $ver = \array_map('\\intval', \explode('.', \mb_substr($tokens[$n], 9))); |
|
| 36 | 6 | foreach ($ver AS $key => $item) { |
|
| 37 | 6 | if ($item > ($levels[$key] ?? 0)) { |
|
| 38 | 6 | $levels = $ver; |
|
| 39 | 6 | } elseif ($item < ($levels[$key] ?? 0)) { |
|
| 40 | 4 | break; |
|
| 41 | } |
||
| 42 | } |
||
| 43 | } |
||
| 44 | } |
||
| 45 | 6 | return [ |
|
| 46 | 6 | 'framework' => '.NET Common Language Runtime', |
|
| 47 | 6 | 'frameworkversion' => \implode('.', $levels) |
|
| 48 | 6 | ]; |
|
| 49 | 1 | }), |
|
| 50 | 1 | 'libwww-perl/' => new props('start', fn (string $value) : array => [ |
|
| 51 | 2 | 'type' => 'robot', |
|
| 52 | 2 | 'category' => 'scraper', |
|
| 53 | 2 | 'app' => 'LibWWW Perl', |
|
| 54 | 2 | 'appname' => 'libwww-perl', |
|
| 55 | 2 | 'appversion' => \explode('/', $value, 3)[1], |
|
| 56 | 2 | 'framework' => 'LibWWW Perl', |
|
| 57 | 2 | 'frameworkversion' => \explode('/', $value, 3)[1] |
|
| 58 | 2 | ]) |
|
| 59 | 1 | ]; |
|
| 60 | } |
||
| 61 | } |
If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration: