Файл: vendor/whichbrowser/parser/bin/update-indices.php
Строк: 90
<?php
include_once __DIR__ . '/bootstrap.php';
use WhichBrowserDataDeviceModels;
use ReverseRegexLexer;
$command = 'list';
$types = [];
$options = [];
array_shift($argv);
if (count($argv)) {
foreach ($argv as $argument) {
if (in_array($argument, [ 'list' ])) {
$command = $argument;
} elseif (substr($argument, 0, 2) == '--') {
$options[] = substr($argument, 2);
} else {
$types[] = $argument;
}
}
}
if (in_array('all', $options)) {
$types = [
'android', 'asha', 'bada', 'brew', 'feature', 'firefoxos',
'kddi', 'palmos', 's30plus', 's40', 'symbian', 'tizen',
'touchwiz', 'wm', 'wp'
];
}
foreach ($types as $i => $type) {
command($command, $type);
}
function command($command, $type) {
switch($command) {
case 'list':
command_list($type);
break;
}
}
function command_list($type) {
echo "Creating index for 'data/models-{$type}.php'...n";
require_once __DIR__ . '/../data/models-' . $type . '.php';
$name = strtoupper($type) . '_MODELS';
$list = DeviceModels::$$name;
$index = [];
foreach ($list as $key => $value) {
if (substr($key, -2) == '!!') {
$keys = getKeysFromRegexp(substr($key, 0, -2));
}
elseif (substr($key, -1) == '!') {
$keys = getKeysFromRegexp(substr($key, 0, -1));
}
else {
$keys = [ substr(strtoupper($key), 0, 2) ];
}
foreach ($keys as $k => $v) {
if ($v == '**') {
$v = '';
}
if (!isset($index['@'.$v])) {
$index['@'.$v] = [];
}
$index['@'.$v][] = $key;
}
}
ksort($index);
$file = "<" . "?phpn";
$file .= "n";
$file .= "namespace WhichBrowser\Data;n";
$file .= "n";
$file .= "DeviceModels::$" . strtoupper($type) . "_INDEX = " . var_export($index, true) . ";n";
file_put_contents(__DIR__ . '/../data/indices/models-' . $type . '.php', $file);
}
function getKeysFromRegexp($regexp) {
$lexer = new Lexer($regexp);
$lexer->moveNext();
$keys = readKeysFromLexer($lexer);
return array_unique($keys);
}
function readKeysFromLexer($lexer) {
$keys = [];
if ($lexer->isNextTokenAny([ Lexer::T_LITERAL_CHAR,Lexer::T_LITERAL_NUMERIC ])) {
$current = strtoupper($lexer->lookahead['value']);
$lexer->moveNext();
if ($lexer->isNextTokenAny([ Lexer::T_LITERAL_CHAR,Lexer::T_LITERAL_NUMERIC ])) {
$keys[] = $current . strtoupper($lexer->lookahead['value']);
}
else {
$keys[] = '**';
}
}
else if ($lexer->isNextToken(Lexer::T_GROUP_OPEN)) {
$current = '';
$active = true;
while ($lexer->moveNext()) {
if ($lexer->isNextTokenAny([ Lexer::T_LITERAL_CHAR,Lexer::T_LITERAL_NUMERIC ])) {
if ($active && strlen($current) < 2) {
$current .= strtoupper($lexer->lookahead['value']);
}
}
else if ($lexer->isNextToken(Lexer::T_CHOICE_BAR)) {
$keys[] = $current;
$current = '';
$active = true;
}
else if ($lexer->isNextToken(Lexer::T_GROUP_OPEN)) {
if ($lexer->moveNext()) {
$more = readKeysFromLexer($lexer);
if (count($more)) {
$keys = array_merge($keys, $more);
} else {
break;
}
}
}
else if ($lexer->isNextToken(Lexer::T_GROUP_CLOSE)) {
if (strlen($current) == 2) {
$keys[] = $current;
} else {
$keys[] = '**';
}
$current = '';
$active = true;
break;
}
else if ($lexer->isNextToken(Lexer::T_DOT)) {
$keys[] = '**';
$current = '';
$active = false;
break;
}
else {
$active = false;
}
}
while ($lexer->moveNext()) {
if ($lexer->isNextToken(Lexer::T_QUANTIFIER_QUESTION)) {
if ($lexer->moveNext()) {
$more = readKeysFromLexer($lexer);
if (count($more)) {
$keys = array_merge($keys, $more);
} else {
break;
}
}
}
else {
break;
}
}
}
else if ($lexer->isNextToken(Lexer::T_SET_OPEN)) {
$keys[] = '**';
}
else if ($lexer->isNextToken(Lexer::T_DOT)) {
$keys[] = '**';
}
return array_unique($keys);
}