Last active
October 13, 2016 12:41
-
-
Save alixaxel/5562152 to your computer and use it in GitHub Desktop.
Why...
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace alixaxel; | |
| class y | |
| { | |
| public static function Coalesce() | |
| { | |
| foreach (func_get_args() as $argument) { | |
| if (isset($argument) === true) { | |
| return $argument; | |
| } | |
| } | |
| return null; | |
| } | |
| public static function cURL($url, $data = null, $method = 'GET', $cookie = null, $options = null, $attempts = 3) | |
| { | |
| $result = false; | |
| if (is_resource($curl = curl_init()) === true) { | |
| $default = [ | |
| CURLOPT_AUTOREFERER => true, | |
| CURLOPT_ENCODING => '', | |
| CURLOPT_FAILONERROR => true, | |
| CURLOPT_FORBID_REUSE => true, | |
| CURLOPT_FRESH_CONNECT => true, | |
| CURLOPT_RETURNTRANSFER => true, | |
| CURLOPT_SSL_VERIFYHOST => false, | |
| CURLOPT_SSL_VERIFYPEER => false, | |
| CURLOPT_TIMEOUT => 30, | |
| ]; | |
| if (strpos($url, '#') !== false) { | |
| $url = strstr($url, '#', true); | |
| } | |
| $url = rtrim($url, '?&'); | |
| if (preg_match('~^(?:POST|PUT)$~i', $method) > 0) { | |
| if (is_array($data) === true) { | |
| foreach (preg_grep('~^@~', $data) as $key => $value) { | |
| $data[$key] = sprintf('@%s', realpath(ltrim($value, '@'))); | |
| } | |
| if (count($data) != count($data, COUNT_RECURSIVE)) { | |
| $data = http_build_query($data, '', '&'); | |
| } | |
| } | |
| $default += [CURLOPT_POSTFIELDS => $data]; | |
| } else if ((is_array($data) === true) && (strlen($data = http_build_query($data, '', '&')) > 0)) { | |
| $url = sprintf('%s%s%s', $url, (strpos($url, '?') === false) ? '?' : '&', $data); | |
| } | |
| if (preg_match('~^(?:HEAD|OPTIONS)$~i', $method) > 0) { | |
| $default += [CURLOPT_HEADER => true, CURLOPT_NOBODY => true]; | |
| } | |
| $default += [CURLOPT_URL => $url, CURLOPT_CUSTOMREQUEST => strtoupper($method)]; | |
| if (isset($cookie) === true) { | |
| if ($cookie === true) { | |
| $cookie = sprintf('%s.txt', parse_url($url, PHP_URL_HOST)); | |
| } | |
| if (strcmp('.', dirname($cookie)) === 0) { | |
| $cookie = sprintf('%s/%s', realpath(sys_get_temp_dir()), $cookie); | |
| } | |
| $default += array_fill_keys([CURLOPT_COOKIEJAR, CURLOPT_COOKIEFILE], $cookie); | |
| } | |
| if ((intval(ini_get('safe_mode')) == 0) && (ini_set('open_basedir', null) !== false)) { | |
| $default += [CURLOPT_MAXREDIRS => 3, CURLOPT_FOLLOWLOCATION => true]; | |
| } | |
| curl_setopt_array($curl, (array) $options + $default); | |
| if (empty($attempts) === true) { | |
| return $curl; | |
| } | |
| for ($i = 1; $i <= $attempts; ++$i) { | |
| $result = curl_exec($curl); | |
| if (($i == $attempts) || ($result !== false)) { | |
| break; | |
| } | |
| usleep(pow(2, $i - 2) * 1000000); | |
| } | |
| curl_close($curl); | |
| } | |
| return $result; | |
| } | |
| public static function DB($query = null) | |
| { | |
| static $db = null; | |
| static $result = []; | |
| try { | |
| if (isset($db, $query) === true) { | |
| if (empty($result[$hash = crc32($query)]) === true) { | |
| $result[$hash] = $db->prepare($query); | |
| } | |
| $data = array_slice(func_get_args(), 1); | |
| if (count($data, COUNT_RECURSIVE) > count($data)) { | |
| $data = iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveArrayIterator($data)), false); | |
| } | |
| if ($result[$hash]->execute($data) === true) { | |
| switch (strstr($query, ' ', true)) { | |
| case 'INSERT': | |
| case 'REPLACE': | |
| return $db->lastInsertId(); | |
| case 'UPDATE': | |
| case 'DELETE': | |
| return $result[$hash]->rowCount(); | |
| case 'SELECT': | |
| case 'EXPLAIN': | |
| case 'PRAGMA': | |
| case 'SHOW': | |
| return $result[$hash]; | |
| } | |
| return true; | |
| } | |
| return false; | |
| } else if (isset($query) === true) { | |
| $options = [ | |
| \PDO::ATTR_CASE => \PDO::CASE_NATURAL, | |
| \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_OBJ, | |
| \PDO::ATTR_EMULATE_PREPARES => false, | |
| \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, | |
| \PDO::ATTR_ORACLE_NULLS => \PDO::NULL_NATURAL, | |
| \PDO::ATTR_STRINGIFY_FETCHES => false, | |
| ]; | |
| if (preg_match('~^sqlite://([[:print:]]++)$~i', $query, $dsn) > 0) { | |
| $options += [ | |
| \PDO::ATTR_TIMEOUT => 3, | |
| ]; | |
| $db = new \PDO(sprintf('sqlite:%s', $dsn[1]), null, null, $options); | |
| $pragmas = [ | |
| 'automatic_index' => 'ON', | |
| 'cache_size' => '32768', | |
| 'foreign_keys' => 'ON', | |
| 'journal_size_limit' => '0', | |
| 'locking_mode' => 'NORMAL', | |
| 'page_size' => '4096', | |
| 'recursive_triggers' => 'ON', | |
| 'secure_delete' => 'ON', | |
| 'synchronous' => 'NORMAL', | |
| 'temp_store' => 'FILE', | |
| 'journal_mode' => 'WAL', | |
| 'wal_autocheckpoint' => '16384', | |
| ]; | |
| if (strncasecmp('WIN', PHP_OS, 3) !== 0) { | |
| $memory = 131072; | |
| if (($page = intval(shell_exec('getconf PAGESIZE'))) > 0) { | |
| $pragmas['page_size'] = $page; | |
| } | |
| if (is_readable('/proc/meminfo') === true) { | |
| if (is_resource($handle = fopen('/proc/meminfo', 'rb')) === true) { | |
| while (($line = fgets($handle, 1024)) !== false) { | |
| if (sscanf($line, 'MemTotal: %d kB', $memory) == 1) { | |
| $memory = round($memory / 131072) * 131072; break; | |
| } | |
| } | |
| fclose($handle); | |
| } | |
| } | |
| $pragmas['cache_size'] = intval($memory * 0.25 / ($pragmas['page_size'] / 1024)); | |
| $pragmas['wal_autocheckpoint'] = $pragmas['cache_size'] / 2; | |
| } | |
| foreach ($pragmas as $key => $value) { | |
| $db->exec(sprintf('PRAGMA %s=%s;', $key, $value)); | |
| } | |
| $db->sqliteCreateFunction('geo', | |
| function () | |
| { | |
| if (count($data = func_get_args()) < 4) { | |
| $data = explode(',', implode(',', $data)); | |
| } | |
| if (count($data = array_map('deg2rad', array_filter($data, 'is_numeric'))) != 4) { | |
| return null; | |
| } | |
| return round(6378.14 * acos(sin($data[0]) * sin($data[2]) + cos($data[0]) * cos($data[2]) * cos($data[1] - $data[3])), 3); | |
| } | |
| ); | |
| $db->sqliteCreateFunction('json', | |
| function ($data, $key) | |
| { | |
| if (preg_match('~^\x78[\x01\x5E\x9C\xDA]~', $data) > 0) { | |
| $data = gzuncompress($data); | |
| } | |
| $data = json_decode($data, true); | |
| foreach (array_filter(explode('.', $key), 'ord') as $key) { | |
| if (isset($data[$key]) !== true) { | |
| return null; | |
| } | |
| $data = $data[$key]; | |
| } | |
| return (is_array($data) === true) ? json_encode($data) : $data; | |
| }, | |
| 2); | |
| $db->sqliteCreateFunction('locale', | |
| function ($data, $locale = 'root') | |
| { | |
| static $collators = []; | |
| if (isset($collators[$locale]) !== true) { | |
| $attributes = [ | |
| \Collator::NUMERIC_COLLATION => \Collator::ON, | |
| ]; | |
| $collators[$locale] = new \Collator($locale); | |
| foreach ($attributes as $key => $value) { | |
| $collators[$locale]->setAttribute($key, $value); | |
| } | |
| } | |
| return $collators[$locale]->getSortKey($data); | |
| } | |
| ); | |
| $db->sqliteCreateFunction('php', | |
| function ($callback) | |
| { | |
| return call_user_func_array($callback, array_slice(func_get_args(), 1)); | |
| } | |
| ); | |
| $db->sqliteCreateFunction('regexp', | |
| function ($pattern, $data, $delimiter = '~', $modifiers = 'isuS') | |
| { | |
| if (isset($pattern, $data) !== true) { | |
| return null; | |
| } | |
| return (preg_match(sprintf('%1$s%2$s%1$s%3$s', $delimiter, $pattern, $modifiers), $data) > 0); | |
| } | |
| ); | |
| $db->sqliteCreateFunction('okapi_bm25f', | |
| function ($data) | |
| { | |
| $b = 0.75; | |
| $k1 = 2.0; | |
| $data = str_split($data, 4); | |
| foreach ($data as $key => $value) { | |
| $data[$key] = current(unpack('L', $value)); | |
| } | |
| $phrases = array_shift($data); | |
| $columns = array_shift($data); | |
| $weights = array_slice(func_get_args(), 1); | |
| $data = [ | |
| 'p' => $phrases, | |
| 'c' => $columns, | |
| 'x' => array_chunk(array_chunk(array_splice($data, 0, 3 * $columns * $phrases), 3), $columns), | |
| 'n' => array_shift($data), | |
| 'a' => array_splice($data, 0, $columns), | |
| 'l' => array_splice($data, 0, $columns), | |
| 's' => array_splice($data, 0, $columns), | |
| ]; | |
| $averageLength = 0; | |
| $documentLength = 0; | |
| for ($i = 0; $i < $columns; ++$i) { | |
| $averageLength += $data['a'][$i]; | |
| $documentLength += $data['l'][$i]; | |
| if (array_key_exists($i, $weights) !== true) { | |
| $weights[$i] = 1; | |
| } | |
| } | |
| $result = 0; | |
| $epsilon = 1 / ($data['n'] * $averageLength); | |
| for ($i = 0; $i < $phrases; ++$i) { | |
| for ($j = 0; $j < $columns; ++$j) { | |
| $idf = log(($data['n'] - $data['x'][$i][$j][2] + 0.5) / ($data['x'][$i][$j][2] + 0.5)); | |
| $beta = 1 + (($data['x'][$i][$j][0] * ($k1 + 1)) / ($data['x'][$i][$j][0] + ($k1 * (1 - $b + ($b * ($documentLength / $averageLength)))))); | |
| if ($idf < 0) { | |
| $idf = $epsilon; | |
| } | |
| $result += ($idf * $beta) * $weights[$j]; | |
| } | |
| } | |
| return $result; | |
| } | |
| ); | |
| $db->sqliteCreateAggregate('stddev_pop', | |
| function (&$context, $row, $data) | |
| { | |
| if (isset($context) !== true) { | |
| $context = [ | |
| 'k' => 0, | |
| 'm' => 0, | |
| 's' => 0, | |
| ]; | |
| } | |
| if (isset($data) === true) { | |
| $context['s'] += ($data - $context['m']) * ($data - ($context['m'] += ($data - $context['m']) / ++$context['k'])); | |
| } | |
| return $context; | |
| }, | |
| function (&$context, $row) | |
| { | |
| if (empty($context['k']) === true) { | |
| return null; | |
| } | |
| return sqrt($context['s'] / $context['k']); | |
| }, | |
| 1); | |
| $db->sqliteCreateAggregate('var_pop', | |
| function (&$context, $row, $data) | |
| { | |
| if (isset($context) !== true) { | |
| $context = [ | |
| 'k' => 0, | |
| 'm' => 0, | |
| 's' => 0, | |
| ]; | |
| } | |
| if (isset($data) === true) { | |
| $context['s'] += ($data - $context['m']) * ($data - ($context['m'] += ($data - $context['m']) / ++$context['k'])); | |
| } | |
| return $context; | |
| }, | |
| function (&$context, $row) | |
| { | |
| if (empty($context['k']) === true) { | |
| return null; | |
| } | |
| return $context['s'] / $context['k']; | |
| }, | |
| 1); | |
| $db->sqliteCreateCollation('UCA', function ($a, $b) | |
| { | |
| static $collator = null; | |
| if (isset($collator) !== true) { | |
| $collator = new \Collator('root'); | |
| foreach ([\Collator::NUMERIC_COLLATION => \Collator::ON] as $key => $value) { | |
| $collator->setAttribute($key, $value); | |
| } | |
| } | |
| return $collator->compare($a, $b); | |
| }); | |
| } else if (preg_match('~^mysql://(?:(.+?)(?::(.+?))?@)?([^/:@]++)(?::(\d++))?/(\w++)/?$~i', $query, $dsn) > 0) { | |
| $options += [ | |
| \PDO::ATTR_AUTOCOMMIT => true, | |
| \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES "utf8" COLLATE "utf8_unicode_ci", time_zone = "+00:00";', | |
| \PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, | |
| ]; | |
| $db = new \PDO(sprintf('mysql:host=%s;port=%s;dbname=%s', $dsn[3], $dsn[4], $dsn[5]), $dsn[1], $dsn[2], $options); | |
| } | |
| } | |
| } catch (\PDOException $exception) { | |
| if (is_null($db) === true) { | |
| return false; | |
| } | |
| throw $exception; | |
| } | |
| return (isset($db) === true) ? $db : false; | |
| } | |
| public static function DOM($html, $xpath = null, $key = null, $default = false) | |
| { | |
| if (is_string($html) === true) { | |
| $dom = new \DOMDocument(); | |
| if (libxml_use_internal_errors(true) === true) { | |
| libxml_clear_errors(); | |
| } | |
| $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'); | |
| if ((empty($html) !== true) && ($dom->loadHTML($html) === true) && (empty($dom->documentElement) !== true)) { | |
| return self::DOM(simplexml_import_dom($dom), $xpath, $key, $default); | |
| } | |
| } else if (is_object($html) === true) { | |
| if (isset($xpath) === true) { | |
| $html = $html->xpath($xpath); | |
| } | |
| if (isset($key) === true) { | |
| if (is_array($key) !== true) { | |
| $key = explode('.', $key); | |
| } | |
| foreach ((array) $key as $value) { | |
| $html = (is_object($html) === true) ? get_object_vars($html) : $html; | |
| if ((is_array($html) !== true) || (array_key_exists($value, $html) !== true)) { | |
| return $default; | |
| } | |
| $html = $html[$value]; | |
| } | |
| } | |
| return $html; | |
| } | |
| return $default; | |
| } | |
| public static function Dump() | |
| { | |
| foreach (func_get_args() as $argument) { | |
| switch (gettype($argument)) { | |
| case 'array': | |
| case 'object': | |
| $argument = rtrim(print_r($argument, true)); | |
| break; | |
| case 'resource': | |
| $argument = sprintf('%s (#%u)', get_resource_type($argument), $argument); | |
| break; | |
| default: | |
| $argument = stripslashes(preg_replace("~^'|'$~", '', var_export($argument, true))); | |
| break; | |
| } | |
| if (strcmp('cli', PHP_SAPI) !== 0) { | |
| $style = [ | |
| 'background: #ecf0f1', | |
| 'border: 1px solid #34495e', | |
| 'font: bold 12px monospace', | |
| 'margin: 0.6em', | |
| 'padding: 0.6em', | |
| 'text-align: left', | |
| ]; | |
| if (strpbrk($argument, '&<>') !== false) { | |
| $argument = str_replace(['&', '<', '>'], ['&', '<', '>'], $argument); | |
| } | |
| $argument = '<pre style="' . implode('; ', $style) . '">' . $argument . '</pre>'; | |
| } else if (strncasecmp('WIN', PHP_OS, 3) !== 0) { | |
| $argument = sprintf('%c[%s;%u;%um%s%c[0m', 27, 0, 36, 49, $argument, 27); | |
| } | |
| echo $argument . "\n"; | |
| } | |
| while (ob_get_level() > 0) { | |
| ob_end_flush(); | |
| } | |
| flush(); | |
| } | |
| public static function Filter($data, $control = true, $encoding = null) | |
| { | |
| if (is_array($data) === true) { | |
| foreach ($data as $key => $value) { | |
| $data[$key] = self::Filter($value, $control, $encoding); | |
| } | |
| } else if (is_string($data) === true) { | |
| if (preg_match('~[^\x00-\x7F]~', $data) > 0) { | |
| if ((empty($encoding) === true) && (function_exists('mb_detect_encoding') === true)) { | |
| $encoding = mb_detect_encoding($data, 'ASCII,ISO-8859-15,UTF-8', true); | |
| } | |
| $data = @iconv((empty($encoding) === true) ? 'UTF-8' : $encoding, 'UTF-8//IGNORE', $data); | |
| } | |
| return ($control === true) ? preg_replace('~\p{C}+~u', '', $data) : preg_replace(['~\R~u', '~[^\P{C}\t\n]+~u'], ["\n", ''], $data); | |
| } | |
| return $data; | |
| } | |
| public static function Flatten($data, $offset = null, $length = null) | |
| { | |
| try { | |
| if ((isset($offset) === true) && (is_array($data) === true)) { | |
| $data = array_slice($data, intval($offset), $length); | |
| } | |
| $data = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($data)); | |
| } catch (\Exception $exception) { | |
| return []; | |
| } | |
| return iterator_to_array($data, false); | |
| } | |
| public static function JSON($data) | |
| { | |
| static $bitmask = null; | |
| if (is_null($bitmask) === true) { | |
| $options = [ | |
| 'JSON_PRETTY_PRINT', | |
| 'JSON_UNESCAPED_SLASHES', | |
| 'JSON_UNESCAPED_UNICODE', | |
| ]; | |
| $bitmask = array_sum(array_map('constant', array_filter($options, 'defined'))); | |
| } | |
| return json_encode($data, $bitmask); | |
| } | |
| public static function Period($since, $until, $interval) | |
| { | |
| $since = new \DateTimeImmutable($since); | |
| if (is_int($until) !== true) { | |
| $until = new \DateTimeImmutable($until); | |
| } | |
| if (preg_match('~^P(?:[0-9]+[DMWY]){0,3}(?:T(?:[0-9]+[HMS]){0,3})$~', $interval) > 0) { | |
| $interval = new \DateInterval($interval); | |
| } else { | |
| $interval = \DateInterval::createFromDateString($interval); | |
| } | |
| return new \DatePeriod($since, $interval, $until); | |
| } | |
| public static function Profile($callbacks, $seconds = 15) | |
| { | |
| set_time_limit(0); | |
| if (is_array($callbacks) !== true) { | |
| $callbacks = explode('|', $callbacks); | |
| } | |
| $arguments = array_slice(func_get_args(), 2); | |
| if (count($callbacks = array_filter($callbacks, 'is_callable')) > 0) { | |
| $result = array_fill_keys($callbacks, [ | |
| 'absolute' => 0, | |
| 'relative' => 0, | |
| ]); | |
| foreach ($result as $key => $value) { | |
| $reflection = null; | |
| if (is_callable($key, true) === true) { | |
| $reflection = (strpos($key, '::') !== false) ? new \ReflectionMethod($key) : new \ReflectionFunction($key); | |
| } | |
| if ((isset($reflection) === true) && ($reflection->getFileName() !== false)) { | |
| if (($source = file($reflection->getFileName(), FILE_IGNORE_NEW_LINES)) !== false) { | |
| $source = implode("\n", array_slice($source, $reflection->getStartLine() - 1, $reflection->getEndLine() - ($reflection->getStartLine() - 1))); | |
| $result[$key]['source'] = [ | |
| 'ccn' => 1, | |
| 'opcodes' => null, | |
| 'statements' => 0, | |
| 'lines' => [ | |
| 'logical' => [], | |
| 'physical' => substr_count($source, "\n"), | |
| ], | |
| ]; | |
| if (function_exists('parsekit_compile_string') === true) { | |
| $parsekit = parsekit_compile_string($source); | |
| if ((is_array($parsekit) === true) && (array_key_exists('opcodes', $parsekit) === true)) { | |
| $result[$key]['source']['opcodes'] = max(0, count($parsekit['opcodes']) - 1); | |
| } | |
| } | |
| if (is_array($tokens = token_get_all(sprintf('<?php %s ?>', $source))) === true) { | |
| $points = array_map('constant', array_filter([ | |
| 'T_BOOLEAN_AND', | |
| 'T_BOOLEAN_OR', | |
| 'T_CASE', | |
| 'T_CATCH', | |
| 'T_ELSEIF', | |
| 'T_FINALLY', | |
| 'T_FOR', | |
| 'T_FOREACH', | |
| 'T_GOTO', | |
| 'T_IF', | |
| 'T_LOGICAL_AND', | |
| 'T_LOGICAL_OR', | |
| 'T_LOGICAL_XOR', | |
| 'T_WHILE', | |
| ], 'defined')); | |
| foreach ($tokens as $token) { | |
| if (is_array($token) === true) { | |
| if ((in_array($token[0], [T_CLOSE_TAG, T_COMMENT, T_DOC_COMMENT, T_INLINE_HTML, T_OPEN_TAG], true) !== true) && (strlen(trim($token[1])) > 0)) { | |
| if (in_array($token[0], $points, true) === true) { | |
| ++$result[$key]['source']['ccn']; | |
| } | |
| array_push($result[$key]['source']['lines']['logical'], $token[2]); | |
| } | |
| } else if (strncmp($token, '?', 1) === 0) { | |
| ++$result[$key]['source']['ccn']; | |
| } else if (strncmp($token, ';', 1) === 0) { | |
| ++$result[$key]['source']['statements']; | |
| } | |
| } | |
| $result[$key]['source']['lines']['logical'] = max(0, count(array_unique($result[$key]['source']['lines']['logical'])) - 1); | |
| } | |
| } | |
| } | |
| } | |
| if (extension_loaded('xhprof') === true) { | |
| $flags = [ | |
| XHPROF_FLAGS_CPU, | |
| XHPROF_FLAGS_MEMORY, | |
| ]; | |
| $options = [ | |
| 'ignored_functions' => [ | |
| 'call_user_func', | |
| 'call_user_func_array', | |
| 'xhprof_disable', | |
| ], | |
| ]; | |
| foreach ($result as $key => $value) { | |
| xhprof_enable(array_sum($flags), $options); call_user_func_array($key, $arguments); | |
| if ((count($profile = array_slice(xhprof_disable(), -2, 1)) == 1) && (is_null($profile = array_shift($profile)) !== true)) { | |
| $result[$key]['xhprof'] = [ | |
| 'cpu' => $profile['cpu'], | |
| 'time' => $profile['wt'], | |
| 'memory' => $profile['mu'], | |
| ]; | |
| } | |
| } | |
| } | |
| $i = 0; | |
| $omega = microtime(true) + $seconds; | |
| while ((microtime(true) <= $omega) && (++$i < PHP_INT_MAX)) { | |
| foreach ($result as $key => $value) { | |
| $value = microtime(true); call_user_func_array($key, $arguments); $result[$key]['absolute'] += microtime(true) - $value; | |
| } | |
| } | |
| uasort($result, | |
| function ($a, $b) | |
| { | |
| if ($a['absolute'] == $b['absolute']) { | |
| return 0; | |
| } | |
| return ($a['absolute'] > $b['absolute']) ? 1 : -1; | |
| } | |
| ); | |
| $base = null; | |
| foreach (array_keys($result) as $key) { | |
| if (is_null($base) === true) { | |
| $base = $result[$key]['absolute']; | |
| } | |
| foreach (['relative', 'absolute'] as $value) { | |
| switch ($value) { | |
| case 'absolute': | |
| $result[$key][$value] /= $i; | |
| break; | |
| case 'relative': | |
| $result[$key][$value] = $result[$key]['absolute'] / $base; | |
| break; | |
| } | |
| $result[$key][$value] = number_format($result[$key][$value], ini_get('precision'), '.', ''); | |
| } | |
| if (array_key_exists('xhprof', $result[$key]) === true) { | |
| foreach (['cpu', 'time', 'memory'] as $value) { | |
| $result[$key]['xhprof'][$value] = number_format($result[$key]['xhprof'][$value], 0, '.', ' '); | |
| } | |
| } | |
| } | |
| $result = [ | |
| $i => $result, | |
| ]; | |
| if (method_exists(__CLASS__, 'Dump') === true) { | |
| self::Dump($result); | |
| } | |
| return $result; | |
| } | |
| return []; | |
| } | |
| public static function Render($path, $data = null, $return = false) | |
| { | |
| if (is_file($path) === true) { | |
| extract((array) $data); | |
| if (ob_start() === true) { | |
| require($path); | |
| if (($buffer = ob_get_clean()) !== false) { | |
| if ($return === true) { | |
| return $buffer; | |
| } | |
| echo $buffer; | |
| } | |
| } | |
| } | |
| return false; | |
| } | |
| public static function Romanize($string) | |
| { | |
| if (strpos($string = htmlentities(str_replace('ß', 'ss', $string), ENT_NOQUOTES | ENT_HTML5, 'UTF-8'), '&') !== false) { | |
| $string = html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|caron|cedil|circ|grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $string), ENT_NOQUOTES | ENT_HTML5, 'UTF-8'); | |
| } | |
| if (preg_match('~[^[:ascii:]]~', $string) > 0) { | |
| $latin = [ | |
| 'a' => '~[ǎăāǻąǟắằẳẵặ]~u', | |
| 'A' => '~[ǍĂĀǺĄǞẮẰẲẴẶ]~u', | |
| 'ae' => '~[ǽǣ]~u', | |
| 'Ae' => '~[ǼǢ]~u', | |
| 'b' => '~[ɓ]~u', | |
| 'B' => '~[Ɓ]~u', | |
| 'c' => '~[ćċĉč]~u', | |
| 'C' => '~[ĆĊĈČ]~u', | |
| 'd' => '~[ďḍđɗð]~u', | |
| 'D' => '~[ĎḌĐƊÐ]~u', | |
| 'e' => '~[ėěĕēęẹǝəɛḝ]~u', | |
| 'E' => '~[ĖĚĔĒĘẸƎƏƐḜ]~u', | |
| 'g' => '~[ġĝǧğģɣ]~u', | |
| 'G' => '~[ĠĜǦĞĢƔ]~u', | |
| 'h' => '~[ĥḥħḧḫ]~u', | |
| 'H' => '~[ĤḤĦḦḪ]~u', | |
| 'I' => '~[İǏĬĪĨĮỊḮĬ]~u', | |
| 'i' => '~[ıǐĭīĩįịḯĬ]~u', | |
| 'ij' => '~[ij]~u', | |
| 'Ij' => '~[IJ]~u', | |
| 'j' => '~[ĵ]~u', | |
| 'J' => '~[Ĵ]~u', | |
| 'k' => '~[ķƙ]~u', | |
| 'K' => '~[ĶƘ]~u', | |
| 'l' => '~[ĺļłľŀ]~u', | |
| 'L' => '~[ĹĻŁĽĿ]~u', | |
| 'n' => '~[ńňņŋ]~u', | |
| 'N' => '~[ŃŇŅŊ]~u', | |
| 'o' => '~[ǒŏōőǫọǿơȫṏ]~u', | |
| 'O' => '~[ǑŎŌŐǪỌǾƠȪṎ]~u', | |
| 'r' => '~[ŕřŗ]~u', | |
| 'R' => '~[ŔŘŖ]~u', | |
| 'S' => '~[ŚŜŞȘṢ]~u', | |
| 's' => '~[śŝşșṣ]~u', | |
| 't' => '~[ťţṭŧ]~u', | |
| 'T' => '~[ŤŢṬŦ]~u', | |
| 'u' => '~[ǔŭūũűůųụưǖǘǚǜṳṻ]~u', | |
| 'U' => '~[ǓŬŪŨŰŮŲỤƯǕǗǙǛṲṺ]~u', | |
| 'w' => '~[ẃẁŵẅƿ]~u', | |
| 'W' => '~[ẂẀŴẄǷ]~u', | |
| 'x' => '~[ẍ]~u', | |
| 'X' => '~[Ẍ]~u', | |
| 'y' => '~[ỳŷȳỹƴ]~u', | |
| 'Y' => '~[ỲŶȲỸƳ]~u', | |
| 'z' => '~[źżžẓ]~u', | |
| 'Z' => '~[ŹŻŽẒ]~u', | |
| ]; | |
| $string = preg_replace($latin, array_keys($latin), $string); | |
| } | |
| return $string; | |
| } | |
| public static function Serve($on = null, $route = null, $callback = null) | |
| { | |
| static $root = null; | |
| if (isset($_SERVER['REQUEST_METHOD']) !== true) { | |
| $_SERVER['REQUEST_METHOD'] = 'CLI'; | |
| } | |
| if ((empty($on) === true) || (strcasecmp($on, $_SERVER['REQUEST_METHOD']) === 0)) { | |
| if (is_null($root) === true) { | |
| $root = preg_replace('~/++~', '/', substr($_SERVER['PHP_SELF'], strlen($_SERVER['SCRIPT_NAME'])) . '/'); | |
| } | |
| if (preg_match('~^' . str_replace(['#any', '#num'], ['[^/]++', '[0-9]++'], $route) . '~i', $root, $parts) > 0) { | |
| return (empty($callback) === true) ? true : exit(call_user_func_array($callback, array_slice($parts, 1))); | |
| } | |
| } | |
| return false; | |
| } | |
| public static function Slug($string, $slug = '-', $extra = null) | |
| { | |
| return strtolower(trim(preg_replace('~[^0-9a-z' . preg_quote($extra, '~') . ']++~i', $slug, self::Romanize($string)), $slug)); | |
| } | |
| public static function Tree($path, $pattern = null, $recursive = true, $mode = \RecursiveIteratorIterator::SELF_FIRST) | |
| { | |
| if (is_dir($path = rtrim(str_replace('\\', '/', realpath($path)), '/')) === true) { | |
| $result = new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS); | |
| if ($recursive === true) { | |
| $result = new \RecursiveIteratorIterator($result, $mode); | |
| } | |
| $result = array_keys(iterator_to_array($result, true)); | |
| if (isset($pattern) === true) { | |
| $result = preg_grep('~' . trim($pattern, '~') . '~i', $result); | |
| } | |
| return $result; | |
| } | |
| return (strlen($path) > 0) ? [$path] : false; | |
| } | |
| public static function With($data, $key = null, $default = false) | |
| { | |
| if (isset($key) === true) { | |
| if (is_array($key) !== true) { | |
| $key = explode('.', $key); | |
| } | |
| foreach ((array) $key as $value) { | |
| $data = (is_object($data) === true) ? get_object_vars($data) : $data; | |
| if ((is_array($data) !== true) || (array_key_exists($value, $data) !== true)) { | |
| return $default; | |
| } | |
| $data = $data[$value]; | |
| } | |
| } | |
| return $data; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment