200 lines
3.9 KiB
PHP
Executable File
200 lines
3.9 KiB
PHP
Executable File
<?php
|
|
|
|
include_once __DIR__ . '/bootstrap.php';
|
|
|
|
use WhichBrowser\Data\DeviceModels;
|
|
use ReverseRegex\Lexer;
|
|
|
|
$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 = "<" . "?php\n";
|
|
$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);
|
|
}
|