From: Vincent Vanwaelscappel Date: Thu, 3 Dec 2020 12:42:21 +0000 (+0100) Subject: wip #3753 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=ef8932e7d1876acd52e02ef21e22a70ef529790e;p=cubist_util.git wip #3753 --- diff --git a/composer.json b/composer.json index a6a4862..88bcf58 100644 --- a/composer.json +++ b/composer.json @@ -11,8 +11,8 @@ } ], "autoload": { - "psr-0": { - "Cubist\\Util": "src\/" + "psr-4": { + "Cubist\\Util": "src" } }, "authors": [ diff --git a/src/ArrayUtil.php b/src/ArrayUtil.php new file mode 100644 index 0000000..aef58b4 --- /dev/null +++ b/src/ArrayUtil.php @@ -0,0 +1,161 @@ + $v) { + if (is_array($v)) { + $res = array_merge($res, self::flatten($v)); + } else { + $res[$k] = $v; + } + } + return $res; + } + + + public static function removeValues(&$input, $values, $strict = false) { + if (!is_array($values)) { + $values = array($values); + } + foreach ($values as $value) { + self::removeValue($input, $value, $strict); + } + } + + public static function implodeMulti($glue, $arr) { + if (is_string($arr)) { + return $arr; + } + + if (!is_array($arr) && !is_object($arr)) { + return $arr; + } + + $flat = array(); + foreach ($arr as $a) { + if (is_array($a)) { + $flat[] = self::implodeMulti($glue, $a); + } else { + $flat[] = $a; + } + } + return implode($glue, $flat); + } + + public static function shuffle(&$arr) { + uasort($arr, function ($a, $b) { + return mt_rand(0, 1) > 0 ? 1 : -1; + }); + } + + public static function pickRandom($arr, &$key, &$value) { + $rand = $arr; + self::shuffle($rand); + foreach ($rand as $k => $v) { + $key = $k; + $value = $v; + return; + } + } + + public static function average($array) { + $nb = count($array); + if (!$nb) { + return false; + } + + $nb = 0; + $sum = 0; + foreach ($array as $v) { + if (is_null($v)) { + continue; + } + $nb++; + $sum += $v; + } + if (!$nb) { + return false; + } + + $res = $sum / $nb; + return $res; + } + + public static function multidimensionnalSort(&$input, $way = SORT_ASC, $sort_flags = SORT_STRING) { + if (!is_array($input)) { + return; + } + + if (is_callable($way)) { + uksort($input, $way); + } else { + $func = 'sort'; + if ($way == SORT_DESC) { + $func = 'r' . $func; + } + $func = 'k' . $func; + $func($input, $sort_flags); + } + + foreach ($input as $k => $v) { + self::multidimensionnalSort($input[$k], $way, $sort_flags); + } + } + + public static function unsetKeys(&$input, $keys) { + foreach ($keys as $k) { + if (isset($input[$k])) { + unset($input[$k]); + } + } + } + + public static function asArray($input) { + if (is_array($input)) { + return $input; + } + if (is_object($input)) { + return ObjectUtil::toArray($input); + } + return array($input); + } + + public static function array_key_exists_recursive($needle, $haystack) { + if (!is_array($haystack)) { + return false; + } + if (array_key_exists($needle, $haystack)) { + return true; + } + foreach ($haystack as $k => $v) { + if (self::array_key_exists_recursive($needle, $v)) { + return true; + } + } + return false; + } + + public static function merge() { + $args = func_get_args(); + $res = array(); + foreach ($args as $arg) { + if (!is_array($arg)) { + $arg = array($arg); + } + $res = array_merge($res, $arg); + } + return $res; + } + +} diff --git a/src/Base64.php b/src/Base64.php new file mode 100644 index 0000000..5cf8dd2 --- /dev/null +++ b/src/Base64.php @@ -0,0 +1,13 @@ +program = $program; + $this->commande = null; + if (null === $output) { + $this->output = tempnam(sys_get_temp_dir(), 'Cubist'); + } else { + $this->temp_output = false; + $this->output = $output; + } + $this->error = $error; + } + + public function setArg($name = null, $val = null) + { + if (null === $name && null === $val) { + return; + } + if (stristr($val, ' ') && !stristr($val, '>') && !stristr($val, '<')) { + $val = '"' . $val . '"'; + } + $this->args[] = array($name, $val); + } + + public function __get($varname) + { + if ($varname == 'output') { + return file_get_contents($this->output); + } elseif ($varname == 'outputfile') { + return $this->output; + } elseif ($varname == 'commande' || $varname == 'command') { + if (null === $this->commande) { + $this->makeCommande($this->output, $this->error); + } + return $this->commande; + } elseif ($varname == 'execTime') { + return $this->execTime; + } + return null; + } + + public function cd($path) + { + $this->cd = $path; + } + + public function setLang($lang) + { + $this->setEnv('LANG', $lang); + } + + public function setEnv($name, $val) + { + if (PATH_SEPARATOR == ':') { + $this->env[$name] = $val; + } + } + + public function setPath($val) + { + if (PATH_SEPARATOR == ':') { + $this->setEnv('PATH', $val); + } else { + $this->program = $val . '' . $this->program; + } + } + + public function setNohup($val) + { + $this->nohup = $val; + } + + public function setManualArg($val) + { + $this->args[] = array(null, $val); + } + + protected function _preExecute() + { + + } + + public function execute($fonction = 'shell_exec') + { + $startTime = microtime(true); + $this->_preExecute(); + if ($fonction instanceof SSH2) { + $this->makeCommande(); + $o = $fonction->exec($this->commande); + file_put_contents($this->output, $o['output'] . "\n\n---\n\n" . $o['error']); + } else if (null === $this->ssh) { + $this->makeCommande($this->output, $this->error); + $fonction($this->commande); + } else { + $this->makeCommande(); + + $key = ''; + if (null !== $this->ssh['key']) { + $key = ' -i ' . $this->ssh['key']; + } + + $c = 'echo "' . $this->commande . '" | ssh ' . $key . ' -p ' . $this->ssh['port'] . ' ' . $this->ssh['username'] . '@' . $this->ssh['host'] . ' \'bash -s\''; + $c .= ' > ' . $this->output; + if ($this->error) { + $c .= ' 2>&1 '; + } + + $fonction($c); + } + $endTime = microtime(true); + $this->execTime = $endTime - $startTime; + } + + public function __set($varname, $value) + { + $this->setArg($varname, $value); + } + + public function __destruct() + { +// if ($this->temp_output && file_exists($this->output)) { +// unlink($this->output); +// } + return; + } + + public function setLongArgumentSeparator($separator = "=") + { + $this->longArgSeparator = $separator; + return $this; + } + + public function makeCommande($output = false, $error = false) + { + $commande = $this->program; + $commandes = array(); + foreach ($this->args as $arg) { + if (strlen($arg[0]) == 1) { + $commande .= ' -' . $arg[0]; + if (null !== $arg[1]) { + $commande .= ' ' . $arg[1]; + } + } elseif (null === $arg[0]) { + $commande .= ' ' . $arg[1]; + } else { + if (substr($arg[0], 0, 1) == '-') { + $commande .= ' ' . $arg[0]; + if (null !== $arg[1]) { + $commande .= ' ' . $arg[1]; + } + } else { + $commande .= ' --' . $arg[0]; + if (null !== $arg[1]) { + $commande .= $this->longArgSeparator . $arg[1]; + } + } + } + } + + if (null !== $this->cd) { + $commandes[] = 'cd ' . $this->cd; + } + if (count($this->env) > 0) { + foreach ($this->env as $var => $val) { + if ($var == 'PATH') { + $commandes[] = 'export ' . $var . '=$' . $var . ':' . $val; + } else { + $commandes[] = 'export ' . $var . '=' . $val; + } + } + } + + if ($this->nohup) { + $commande = 'nohup ' . $commande; + } + + $commandes[] = $commande; + + $this->commande = implode(';', $commandes); + + if ($output) { + $this->commande .= ' > ' . $output; + } + if ($error) { + $this->commande .= ' 2>&1 '; + } + if ($this->nohup) { + $this->commande .= ' & echo $!'; + } + } + + public static function getArgs($argv) + { + array_shift($argv); + + $i = 0; + $res = array(); + $skip = false; + foreach ($argv as $j => $v) { + if ($skip) { + $skip = false; + continue; + } + if (substr($v, 0, 2) == '--') { + list($k, $value) = explode('=', $v); + $res[trim($k, '-')] = trim($value, ' "\''); + } elseif (substr($v, 0, 1) == '-') { + $res[trim($v, '-')] = trim($argv[$j + 1], ' \'"'); + $skip = true; + } else { + $res[$i] = trim($v, "'\" "); + } + $i++; + } + return $res; + } + + public function setSSH($host, $username, $password, $port = 22, $key = null) + { + $this->ssh = array('host' => $host, 'username' => $username, 'password' => $password, 'port' => $port, 'key' => $key); + } + + public function debug() + { + + $e = explode('/', $this->program); + $p = array_pop($e); + file_put_contents('/tmp/' . $p . '.' . microtime(true) . '.txt', $this->commande . "\n\n" . file_get_contents($this->output)); + } + +} diff --git a/src/Cubist/Util/ArrayUtil.php b/src/Cubist/Util/ArrayUtil.php deleted file mode 100644 index aef58b4..0000000 --- a/src/Cubist/Util/ArrayUtil.php +++ /dev/null @@ -1,161 +0,0 @@ - $v) { - if (is_array($v)) { - $res = array_merge($res, self::flatten($v)); - } else { - $res[$k] = $v; - } - } - return $res; - } - - - public static function removeValues(&$input, $values, $strict = false) { - if (!is_array($values)) { - $values = array($values); - } - foreach ($values as $value) { - self::removeValue($input, $value, $strict); - } - } - - public static function implodeMulti($glue, $arr) { - if (is_string($arr)) { - return $arr; - } - - if (!is_array($arr) && !is_object($arr)) { - return $arr; - } - - $flat = array(); - foreach ($arr as $a) { - if (is_array($a)) { - $flat[] = self::implodeMulti($glue, $a); - } else { - $flat[] = $a; - } - } - return implode($glue, $flat); - } - - public static function shuffle(&$arr) { - uasort($arr, function ($a, $b) { - return mt_rand(0, 1) > 0 ? 1 : -1; - }); - } - - public static function pickRandom($arr, &$key, &$value) { - $rand = $arr; - self::shuffle($rand); - foreach ($rand as $k => $v) { - $key = $k; - $value = $v; - return; - } - } - - public static function average($array) { - $nb = count($array); - if (!$nb) { - return false; - } - - $nb = 0; - $sum = 0; - foreach ($array as $v) { - if (is_null($v)) { - continue; - } - $nb++; - $sum += $v; - } - if (!$nb) { - return false; - } - - $res = $sum / $nb; - return $res; - } - - public static function multidimensionnalSort(&$input, $way = SORT_ASC, $sort_flags = SORT_STRING) { - if (!is_array($input)) { - return; - } - - if (is_callable($way)) { - uksort($input, $way); - } else { - $func = 'sort'; - if ($way == SORT_DESC) { - $func = 'r' . $func; - } - $func = 'k' . $func; - $func($input, $sort_flags); - } - - foreach ($input as $k => $v) { - self::multidimensionnalSort($input[$k], $way, $sort_flags); - } - } - - public static function unsetKeys(&$input, $keys) { - foreach ($keys as $k) { - if (isset($input[$k])) { - unset($input[$k]); - } - } - } - - public static function asArray($input) { - if (is_array($input)) { - return $input; - } - if (is_object($input)) { - return ObjectUtil::toArray($input); - } - return array($input); - } - - public static function array_key_exists_recursive($needle, $haystack) { - if (!is_array($haystack)) { - return false; - } - if (array_key_exists($needle, $haystack)) { - return true; - } - foreach ($haystack as $k => $v) { - if (self::array_key_exists_recursive($needle, $v)) { - return true; - } - } - return false; - } - - public static function merge() { - $args = func_get_args(); - $res = array(); - foreach ($args as $arg) { - if (!is_array($arg)) { - $arg = array($arg); - } - $res = array_merge($res, $arg); - } - return $res; - } - -} diff --git a/src/Cubist/Util/Base64.php b/src/Cubist/Util/Base64.php deleted file mode 100644 index 5cf8dd2..0000000 --- a/src/Cubist/Util/Base64.php +++ /dev/null @@ -1,13 +0,0 @@ -program = $program; - $this->commande = null; - if (null === $output) { - $this->output = tempnam(sys_get_temp_dir(), 'Cubist'); - } else { - $this->temp_output = false; - $this->output = $output; - } - $this->error = $error; - } - - public function setArg($name = null, $val = null) - { - if (null === $name && null === $val) { - return; - } - if (stristr($val, ' ') && !stristr($val, '>') && !stristr($val, '<')) { - $val = '"' . $val . '"'; - } - $this->args[] = array($name, $val); - } - - public function __get($varname) - { - if ($varname == 'output') { - return file_get_contents($this->output); - } elseif ($varname == 'outputfile') { - return $this->output; - } elseif ($varname == 'commande' || $varname == 'command') { - if (null === $this->commande) { - $this->makeCommande($this->output, $this->error); - } - return $this->commande; - } elseif ($varname == 'execTime') { - return $this->execTime; - } - return null; - } - - public function cd($path) - { - $this->cd = $path; - } - - public function setLang($lang) - { - $this->setEnv('LANG', $lang); - } - - public function setEnv($name, $val) - { - if (PATH_SEPARATOR == ':') { - $this->env[$name] = $val; - } - } - - public function setPath($val) - { - if (PATH_SEPARATOR == ':') { - $this->setEnv('PATH', $val); - } else { - $this->program = $val . '' . $this->program; - } - } - - public function setNohup($val) - { - $this->nohup = $val; - } - - public function setManualArg($val) - { - $this->args[] = array(null, $val); - } - - protected function _preExecute() - { - - } - - public function execute($fonction = 'shell_exec') - { - $startTime = microtime(true); - $this->_preExecute(); - if ($fonction instanceof SSH2) { - $this->makeCommande(); - $o = $fonction->exec($this->commande); - file_put_contents($this->output, $o['output'] . "\n\n---\n\n" . $o['error']); - } else if (null === $this->ssh) { - $this->makeCommande($this->output, $this->error); - $fonction($this->commande); - } else { - $this->makeCommande(); - - $key = ''; - if (null !== $this->ssh['key']) { - $key = ' -i ' . $this->ssh['key']; - } - - $c = 'echo "' . $this->commande . '" | ssh ' . $key . ' -p ' . $this->ssh['port'] . ' ' . $this->ssh['username'] . '@' . $this->ssh['host'] . ' \'bash -s\''; - $c .= ' > ' . $this->output; - if ($this->error) { - $c .= ' 2>&1 '; - } - - $fonction($c); - } - $endTime = microtime(true); - $this->execTime = $endTime - $startTime; - } - - public function __set($varname, $value) - { - $this->setArg($varname, $value); - } - - public function __destruct() - { -// if ($this->temp_output && file_exists($this->output)) { -// unlink($this->output); -// } - return; - } - - public function setLongArgumentSeparator($separator = "=") - { - $this->longArgSeparator = $separator; - return $this; - } - - public function makeCommande($output = false, $error = false) - { - $commande = $this->program; - $commandes = array(); - foreach ($this->args as $arg) { - if (strlen($arg[0]) == 1) { - $commande .= ' -' . $arg[0]; - if (null !== $arg[1]) { - $commande .= ' ' . $arg[1]; - } - } elseif (null === $arg[0]) { - $commande .= ' ' . $arg[1]; - } else { - if (substr($arg[0], 0, 1) == '-') { - $commande .= ' ' . $arg[0]; - if (null !== $arg[1]) { - $commande .= ' ' . $arg[1]; - } - } else { - $commande .= ' --' . $arg[0]; - if (null !== $arg[1]) { - $commande .= $this->longArgSeparator . $arg[1]; - } - } - } - } - - if (null !== $this->cd) { - $commandes[] = 'cd ' . $this->cd; - } - if (count($this->env) > 0) { - foreach ($this->env as $var => $val) { - if ($var == 'PATH') { - $commandes[] = 'export ' . $var . '=$' . $var . ':' . $val; - } else { - $commandes[] = 'export ' . $var . '=' . $val; - } - } - } - - if ($this->nohup) { - $commande = 'nohup ' . $commande; - } - - $commandes[] = $commande; - - $this->commande = implode(';', $commandes); - - if ($output) { - $this->commande .= ' > ' . $output; - } - if ($error) { - $this->commande .= ' 2>&1 '; - } - if ($this->nohup) { - $this->commande .= ' & echo $!'; - } - } - - public static function getArgs($argv) - { - array_shift($argv); - - $i = 0; - $res = array(); - $skip = false; - foreach ($argv as $j => $v) { - if ($skip) { - $skip = false; - continue; - } - if (substr($v, 0, 2) == '--') { - list($k, $value) = explode('=', $v); - $res[trim($k, '-')] = trim($value, ' "\''); - } elseif (substr($v, 0, 1) == '-') { - $res[trim($v, '-')] = trim($argv[$j + 1], ' \'"'); - $skip = true; - } else { - $res[$i] = trim($v, "'\" "); - } - $i++; - } - return $res; - } - - public function setSSH($host, $username, $password, $port = 22, $key = null) - { - $this->ssh = array('host' => $host, 'username' => $username, 'password' => $password, 'port' => $port, 'key' => $key); - } - - public function debug() - { - - $e = explode('/', $this->program); - $p = array_pop($e); - file_put_contents('/tmp/' . $p . '.' . microtime(true) . '.txt', $this->commande . "\n\n" . file_get_contents($this->output)); - } - -} diff --git a/src/Cubist/Util/Files/Files.php b/src/Cubist/Util/Files/Files.php deleted file mode 100644 index 420aeec..0000000 --- a/src/Cubist/Util/Files/Files.php +++ /dev/null @@ -1,218 +0,0 @@ -isFile()) { - unlink($file->__toString()); - } elseif ($file->isDir()) { - rmdir($file->__toString()); - } - } - if (file_exists($dir)) { - rmdir($dir); - } - } - - public static function humanReadableSize($size, $precision = 2) - { - $base = log($size) / log(1024); - $suffixes = array('', 'k', 'M', 'G', 'T'); - - return round(pow(1024, $base - floor($base)), $precision) . $suffixes[intval(floor($base))]; - } - - /** - * @param $path - * @param int $mode - * @param array $exclude - * @return array|\RecursiveIteratorIterator - */ - public static function getRecursiveDirectoryIterator($path, $mode = \RecursiveIteratorIterator::SELF_FIRST, $exclude = array()) - { - $path = realpath($path); - if (!file_exists($path)) { - return array(); - } - $res = new \RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, $exclude), $mode); - return $res; - } - - public static function getDirectoryIterator($path, $recursive = false, $recursiveMode = \RecursiveIteratorIterator::SELF_FIRST) - { - if ($recursive) { - return self::getRecursiveDirectoryIterator($path, $recursiveMode); - } - - $path = realpath($path); - if (!file_exists($path)) { - return array(); - } - return new \DirectoryIterator($path); - } - - public static function getFilename($file) - { - $f = new \SplFileInfo($file); - return $f->getFilename(); - } - - public static function getExtension($file) - { - $p = parse_url($file); - if (isset($p['path']) && $p['path']) { - $file = $p['path']; - } - - - $f = new \SplFileInfo($file); - if (method_exists($f, 'getExtension')) { - $res = $f->getExtension(); - } else { - $e = explode('.', $file); - $res = array_pop($e); - } - return mb_strtolower($res); - } - - public static function getBasename($file, $suffix = null) - { - - $f = new \SplFileInfo($file); - if ($suffix == 'auto') { - $suffix = '.' . self::getExtension($file); - } - return $f->getBasename($suffix); - } - - public static function copy($from, $to, $context = null) - { - - if (!file_exists($to)) { - mkdir($to, 0777, true); - } - - if (is_file($from)) { - copy($from, $to); - } - - if (!is_null($context)) { - $dr = opendir($from, $context); - } else { - $dr = opendir($from); - } - if ($dr !== false) { - while ($file = readdir($dr)) { - if ($file == '.' || $file == '..') { - continue; - } - $f = $from . '/' . $file; - if (is_dir($f)) { - self::copy($f, $to . '/' . $file); - } elseif (is_file($f)) { - $dest = $to . '/' . $file; - if (!file_exists($dest) || - filesize($f) != filesize($dest) || - filemtime($f) > filemtime($dest) - ) { - copy($f, $dest); - } - } - } - } - } - - protected static function _getMimeTypes() - { - if (is_null(self::$_mimeTypes)) { - $list = self::_getMimeTypesFromApacheFile(); - self::$_mimeTypes = $list; - } - - return self::$_mimeTypes; - } - - protected static function _getMimeTypesFromApacheFile() - { - $list = array(); - $fp = fopen(__DIR__ . '/mime.types', 'rb'); - while (($line = fgets($fp)) !== false) { - $line = trim($line); - if (substr($line, 0, 1) == '#') { - continue; - } - $e = explode("\t", $line); - $type = array_shift($e); - $exts = array_pop($e); - $exts = explode(' ', $exts); - foreach ($exts as $ext) { - $list[$ext] = $type; - } - } - fclose($fp); - $list['webvideo'] = 'video/webvideo'; - return $list; - } - - public static function getMimeType($f) - { - return self::_getMimeType($f); - } - - public static function _getMimeType($f) - { - $ext = mb_strtolower(self::getExtension($f)); - $types = self::_getMimeTypes(); - - if (isset($types[$ext])) { - return $types[$ext]; - } else { - return 'application/octet-stream'; - } - } - - public static function tmpdir($dir = null, $prefix = 'cubeist_', $create = true) - { - if (is_null($dir)) { - $dir = sys_get_temp_dir(); - } - - do { - $gen = rtrim($prefix, '_') . '_' . substr(hash('sha256', uniqid($prefix, true)), 0, 10); - $res = $dir . '/' . $gen; - } while (file_exists($res)); - - if ($create) { - mkdir($res, 0777, true); - } - - return $res; - } - - public static function tempnam($dir = null, $prefix = 'cubeist') - { - if (is_null($dir)) { - $dir = sys_get_temp_dir(); - } - return tempnam($dir, $prefix); - } - - public static function dirmtime($dir, $recursive = false) - { - $time = filemtime($dir); - $files = self::getDirectoryIterator($dir, $recursive); - foreach ($files as $f) { - $time = max($time, $f->getMTime()); - } - return $time; - } - -} \ No newline at end of file diff --git a/src/Cubist/Util/Files/RecursiveDirectoryIterator.php b/src/Cubist/Util/Files/RecursiveDirectoryIterator.php deleted file mode 100644 index b9ab558..0000000 --- a/src/Cubist/Util/Files/RecursiveDirectoryIterator.php +++ /dev/null @@ -1,23 +0,0 @@ -_exclude = $exclude; - - parent::__construct($it); - } - - public function accept() { - return !in_array($this->current()->getFilename(), $this->_exclude); - } - -} \ No newline at end of file diff --git a/src/Cubist/Util/Files/VirtualDirectory.php b/src/Cubist/Util/Files/VirtualDirectory.php deleted file mode 100644 index 35d8de2..0000000 --- a/src/Cubist/Util/Files/VirtualDirectory.php +++ /dev/null @@ -1,154 +0,0 @@ -_path = $path; - $this->_copy = array(); - $this->_contents = array(); - $this->_directories = array(); - $this->_tmp = array(); - } - - public function copy($from, $to) - { - $realto = $this->path($to); - if (!$realto) { - return; - } - $this->_copy[$realto] = $from; - return $this; - } - - public function copyDirectory($from, $to) - { - $this->_directories[$this->path($to)] = $from; - return $this; - } - - public function file_put_contents($to, $data) - { - $this->_contents[$this->path($to)] = $data; - return $this; - } - - public function sync($delete = false) - { - $existing = array(); - - foreach ($this->_directories as $to => $from) { - $this->_addDirectory($from, $to); - } - - // Create dirs before copying - foreach ($this->_dirs as $dir => $t) { - if (!file_exists($dir)) { - mkdir($dir, 0777, true); - } - } - - foreach ($this->_contents as $to => $data) { - if ($delete) { - $existing[$to] = true; - } - - file_put_contents($to, $data); - } - - foreach ($this->_copy as $to => $from) { - if (!file_exists($from)) { - continue; - } - if ($delete) { - $existing[$to] = true; - } - if (!file_exists($to) || filesize($from) != filesize($to) || filemtime($from) > filemtime($to)) { - copy($from, $to); - } - } - - if ($delete) { - $this->_delete($existing); - } - $this->cleanTemp(); - } - - protected function _addDirectory($from, $to) - { - if (!file_exists($from)) { - return; - } - - $from = realpath($from); - $files = Files::getRecursiveDirectoryIterator($from); - - foreach ($files as $file) { - /* @var $file SplFileInfo */ - if ($file->isDir()) { - continue; - } - $path = $file->getRealPath(); - $dest = str_replace($from, '', $path); - $this->copy($path, $this->relativePath($to) . '/' . ltrim($dest, '/')); - } - } - - protected function _delete($existing = array()) - { - $files = Files::getRecursiveDirectoryIterator($this->_path); - foreach ($files as $file) { - if ($file->isDir()) { - continue; - } - $path = $file->getRealPath(); - if (!isset($existing[$path])) { - unlink($path); - } - } - } - - public function path($local) - { - $res = str_replace('//', '/', - $this->_path . '/' . ltrim($local, '/')); - $this->_dirs[dirname($res)] = true; - return $res; - } - - public function relativePath($absolute) - { - return str_replace($this->_path, '', $absolute); - } - - public function cleanTemp() - { - foreach ($this->_tmp as $tmp) { - if (is_file($tmp)) { - unlink($tmp); - } - if (is_dir($tmp)) { - Files::rmdir($tmp); - } - } - } - - public function addTemp($temp) - { - $this->_tmp[] = $temp; - } -} \ No newline at end of file diff --git a/src/Cubist/Util/Files/mime.types b/src/Cubist/Util/Files/mime.types deleted file mode 100644 index da8cd69..0000000 --- a/src/Cubist/Util/Files/mime.types +++ /dev/null @@ -1,1588 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -application/docbook+xml dbk -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -application/gml+xml gml -application/gpx+xml gpx -application/gxf gxf -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -application/jsonml+json jsonml -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink+xml metalink -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/omdoc+xml omdoc -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssdl+xml ssdl -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.ds-keypoint kpxx -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -# application/vnd.hzn-3d-crossword -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -# application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.newsmessage+xml -# application/vnd.iptc.g2.packageitem+xml -# application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -# application/vnd.ms-color.iccprofile -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -# application/vnd.ms-opentype -# application/vnd.ms-package.obfuscated-opentype -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -# application/vnd.ms-printing.printticket+xml -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.nitf ntf nitf -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.rn-realmedia-vbr rmvb -application/vnd.route66.link66+xml link66 -# application/vnd.rs-274x -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -# application/x-amf -application/x-apple-diskimage dmg -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-blorb blb blorb -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cbr cbr cba cbt cbz cb7 -application/x-cdlink vcd -application/x-cfs-compressed cfs -application/x-chat chat -application/x-chess-pgn pgn -application/x-conference nsc -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-dgc-compressed dgc -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-envoy evy -application/x-eva eva -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/font-woff woff -# application/x-font-vfont -application/x-freearc arc -application/x-futuresplash spl -application/x-gca-compressed gca -application/x-glulx ulx -application/x-gnumeric gnumeric -application/x-gramps-xml gramps -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-install-instructions install -application/x-iso9660-image iso -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-lzh-compressed lzh lha -application/x-mie mie -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-shortcut lnk -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf wmz emf emz -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-nzb nzb -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-research-info-systems ris -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-sql sql -application/x-stuffit sit -application/x-stuffitx sitx -application/x-subrip srt -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-t3vm-image t3 -application/x-tads gam -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-tgif obj -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xliff+xml xlf -application/x-xpinstall xpi -application/x-xz xz -application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 -# application/x400-bp -application/xaml+xml xaml -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xproc+xml xpl -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/isac -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -# audio/musepack -audio/ogg oga ogg spx -# audio/opus -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -audio/s3m s3m -audio/silk sil -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-caf caf -audio/x-flac flac -audio/x-matroska mka -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -# audio/x-tta -audio/x-wav wav -audio/xm xm -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/sgi sgi -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.ms-photo wdp -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-3ds 3ds -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-mrsid-image sid -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-tga tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -model/x3d+binary x3db x3dbz -model/x3d+vrml x3dv x3dvz -model/x3d+xml x3d x3dz -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/cache-manifest appcache -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-java-source java -text/x-opml opml -text/x-pascal p pas -text/x-nfo nfo -text/x-setext etx -text/x-sfv sfv -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-matroska mkv mk3d mks -video/x-mng mng -video/x-ms-asf asf asx -video/x-ms-vob vob -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -video/x-smv smv -x-conference/x-cooltalk ice diff --git a/src/Cubist/Util/Gzip.php b/src/Cubist/Util/Gzip.php deleted file mode 100644 index 290ebc3..0000000 --- a/src/Cubist/Util/Gzip.php +++ /dev/null @@ -1,93 +0,0 @@ -= filemtime($filename . '.gz')) { - unlink($filename . '.gz'); - } else { - unlink($filename); - } - } - - if (file_exists($filename) && !file_exists($filename . '.gz')) { - `gzip $filename`; - } - } - - public static function unlink($filename) - { - if (file_exists($filename)) { - unlink($filename); - } - if (file_exists($filename . '.gz')) { - unlink($filename . '.gz'); - } - } - - public static function file_exists($filename) - { - return file_exists($filename . '.gz') || file_exists($filename); - } - - public static function filemtime($filename) - { - if (file_exists($filename . '.gz')) { - return filemtime($filename . '.gz'); - } else if (file_exists($filename)) { - return filemtime($filename); - } else { - return false; - } - } - - public static function file_get_contents($filename) - { - self::_filename($filename); - $fp = self::_fopen($filename, 'rb'); - $res = stream_get_contents($fp); - fclose($fp); - return $res; - } - - public static function file_put_contents($filename, $data, $compression = 7, $mode = 'w') - { - self::_filename($filename, true); - $fp = self::_fopen($filename, $mode, $compression); - $res = fwrite($fp, $data); - fclose($fp); - return $res; - } - - protected static function _fopen($filename, $mode, $compression = 7) - { - $protocol = self::_protocol($filename); - if ($protocol == 'compress.zlib://') { - $mode .= $compression; - } - return fopen($protocol . $filename, $mode); - } - - protected static function _protocol($filename) - { - if (Files::getExtension($filename) == 'gz') { - $protocol = 'compress.zlib://'; - } else { - $protocol = ''; - } - return $protocol; - } - - protected static function _filename(&$filename, $forceGzip = false) - { - if ($forceGzip || (!file_exists($filename) && file_exists($filename . '.gz'))) { - $filename .= '.gz'; - } - } - -} diff --git a/src/Cubist/Util/Html.php b/src/Cubist/Util/Html.php deleted file mode 100644 index 06e9ec8..0000000 --- a/src/Cubist/Util/Html.php +++ /dev/null @@ -1,15 +0,0 @@ - $value) { - $col = floor($i / $perPart); - $res[$col][] = $value; - $i++; - } - - if ($flatten) { - $r = array(); - for ($i = 0; $i < $perPart; $i++) { - foreach ($res as $col => $elements) { - if (isset($elements[$i])) { - $r[] = $elements[$i]; - } - } - } - - $res = $r; - } - - return $res; - } - -} diff --git a/src/Cubist/Util/Math.php b/src/Cubist/Util/Math.php deleted file mode 100644 index 357326e..0000000 --- a/src/Cubist/Util/Math.php +++ /dev/null @@ -1,154 +0,0 @@ - $max) { - $s = $min; - $min = $max; - $max = $s; - } - - return max(min($val, 100), 0); - } - - public static function round($val, $precision = 0) { - if (is_int($precision)) { - return round($val, $precision); - } - return round($val * $precision) / $precision; - } - - public static function fill($val, $nb, $fill = '0') { - return str_pad((string) $val, $nb, $fill, STR_PAD_LEFT); - } - - public static function isOdd($i) { - return abs($i) % 2 == 1; - } - - public static function toRoman($i, $upper = false) { - $entier = intval($i); - if ($entier < 1 || $entier > 9999) { - return ''; - } - - $rom[3] = array("M", "", "", ""); - $rom[2] = array("C", "CD", "D", "CM"); - $rom[1] = array("X", "XL", "L", "XC"); - $rom[0] = array("I", "IV", "V", "IX"); - - $i = 1; - $n = 0; - $romain = ""; - - for ($n = 0; $n < 4; $n++) { - $chiffre = intval(($entier % ($i * 10)) / $i); - if ($n < 3) { - if ($chiffre < 4) { - while ($chiffre > 0) { - $romain = $rom[$n][0] . $romain; - $chiffre--; - } - } elseif ($chiffre == 4) - $romain = $rom[$n][1] . $romain; - elseif ($chiffre < 9) { - while ($chiffre > 5) { - $romain = $rom[$n][0] . $romain; - $chiffre--; - } - $romain = $rom[$n][2] . $romain; - } else - $romain = $rom[$n][3] . $romain; - } else { - while ($chiffre > 0) { - $romain = $rom[$n][0] . $romain; - $chiffre--; - } - } - $i = $i * 10; - } - if (!$upper) { - $romain = strtolower($romain); - } - return $romain; - } - - public static function toPDFLetter($i, $upper = false) { - $dividende = floor($i / 26) + 1; - $reste = ($i % 26) + 1; - - $char = chr(64 + $reste); - if (!$upper) { - $char = strtolower($char); - } - - return str_repeat($char, $dividende); - } - - public static function moyenne() { - $args = func_get_args(); - if (!count($args)) { - return 0; - } - if (is_array($args[0])) { - $args = $args[0]; - if (!count($args)) { - return 0; - } - } - return array_sum($args) / count($args); - } - - // # http://www.php.net/manual/fr/function.stats-standard-deviation.php#66447 - // The average function can be use independantly but the deviation function uses the average function. - public static function ecart_type($array) { - if (!count($array)) { - return 0; - } - $avg = self::moyenne($array); - $variance = 0; - foreach ($array as $value) { - $variance += pow($value - $avg, 2); - } - $deviation = sqrt($variance / (count($array))); - return $deviation; - } - - public static function is_int($val) { - if (is_int($val)) { - return true; - } - if (is_string($val)) { - $v = (string) (int) $val; - if ($val == $v) { - return true; - } - } - return false; - } - - public static function compare($x, $y, $tolerance = 1) { - $diff = $x / $y; - if ($diff < 1) { - $diff = 1 / $diff; - } - if ($tolerance < 1) { - $tolerance = 1 / $tolerance; - } - - return ($diff <= $tolerance); - } - - /** - * - * @param int $n - * @return string - */ - public static function num2alpha($n) { - for ($r = ""; $n >= 0; $n = intval($n / 26) - 1) - $r = chr($n % 26 + 0x41) . $r; - return $r; - } - -} diff --git a/src/Cubist/Util/ObjectUtil.php b/src/Cubist/Util/ObjectUtil.php deleted file mode 100644 index cbc196b..0000000 --- a/src/Cubist/Util/ObjectUtil.php +++ /dev/null @@ -1,33 +0,0 @@ -getFileName(); - } - - public static function neverStop($ignoreUserAbort = true) - { - set_time_limit(0); - if ($ignoreUserAbort) { - ignore_user_abort(true); - } - } - - /** - * @param $file - * @return mixed - */ - public static function instanciateClassInFile($file) - { - $content = file_get_contents($file); - $tokens = token_get_all($content); - $namespace = ''; - for ($index = 0; isset($tokens[$index]); $index++) { - if (!isset($tokens[$index][0])) { - continue; - } - if (T_NAMESPACE === $tokens[$index][0]) { - $index += 2; // Skip namespace keyword and whitespace - while (isset($tokens[$index]) && is_array($tokens[$index])) { - $namespace .= $tokens[$index++][1]; - } - } - if (T_CLASS === $tokens[$index][0] && T_WHITESPACE === $tokens[$index + 1][0] && T_STRING === $tokens[$index + 2][0]) { - $index += 2; // Skip class keyword and whitespace - $fqcns[] = $namespace . '\\' . $tokens[$index][1]; - - # break if you have one class per file (psr-4 compliant) - # otherwise you'll need to handle class constants (Foo::class) - break; - } - } - if (count($fqcns) > 0) { - $class = array_shift($fqcns); - } else { - return null; - } - if (null !== $class) { - return new $class(); - } - return null; - } -} diff --git a/src/Cubist/Util/Serializer.php b/src/Cubist/Util/Serializer.php deleted file mode 100644 index 0c7ebe1..0000000 --- a/src/Cubist/Util/Serializer.php +++ /dev/null @@ -1,47 +0,0 @@ - $val) { - $o = $i; - if ($way == self::ASCENDING) { - $o = $count - $i; - } - - if (is_object($val)) { - $datas[$id]->$p = $o; - } else { - $datas[$id][$p] = $o; - } - $i++; - } - } - - protected static function natural($a, $b) { - $ca = self::getAttrib($a); - $cb = self::getAttrib($b); - - if (is_numeric($ca)) { - return $ca - $cb; - } else if (is_string($ca)) { - return strcmp(strtolower(Text::removeAccents($ca)), strtolower(Text::removeAccents($cb))); - } - } - - public static function getAttrib($v) { - if (is_array($v)) { - return $v[self::$_on]; - } else { - return $v->{self::$_on}; - } - } - -} diff --git a/src/Cubist/Util/Str.php b/src/Cubist/Util/Str.php deleted file mode 100644 index 53ef969..0000000 --- a/src/Cubist/Util/Str.php +++ /dev/null @@ -1,37 +0,0 @@ - $p) { - $str = preg_replace('|[' . $p . ']|u', $r, $str); - } - return $str; - } - - public static function getAccentsPattern() - { - $pattern = array(); - $pattern['A'] = '\x{00C0}-\x{00C5}'; - $pattern['AE'] = '\x{00C6}'; - $pattern['C'] = '\x{00C7}'; - $pattern['D'] = '\x{00D0}'; - $pattern['E'] = '\x{00C8}-\x{00CB}'; - $pattern['I'] = '\x{00CC}-\x{00CF}'; - $pattern['N'] = '\x{00D1}'; - $pattern['O'] = '\x{00D2}-\x{00D6}\x{00D8}'; - $pattern['OE'] = '\x{0152}'; - $pattern['S'] = '\x{0160}'; - $pattern['U'] = '\x{00D9}-\x{00DC}'; - $pattern['Y'] = '\x{00DD}'; - $pattern['Z'] = '\x{017D}'; - - $pattern['a'] = '\x{00E0}-\x{00E5}'; - $pattern['ae'] = '\x{00E6}'; - $pattern['c'] = '\x{00E7}'; - $pattern['d'] = '\x{00F0}'; - $pattern['e'] = '\x{00E8}-\x{00EB}'; - $pattern['i'] = '\x{00EC}-\x{00EF}'; - $pattern['n'] = '\x{00F1}'; - $pattern['o'] = '\x{00F2}-\x{00F6}\x{00F8}'; - $pattern['oe'] = '\x{0153}'; - $pattern['s'] = '\x{0161}'; - $pattern['u'] = '\x{00F9}-\x{00FC}'; - $pattern['y'] = '\x{00FD}\x{00FF}'; - $pattern['z'] = '\x{017E}'; - - $pattern['ss'] = '\x{00DF}'; - return $pattern; - } - - public static function removeAccents($str, $clean = true) - { - $pattern = self::getAccentsPattern(); - if ($clean) { - $str = self::cleanUTF8($str); - $del = array('’' => ' ', '”' => ' ', '“' => ' ', '•' => ' ', '…' => ' ', '€' => ' ', - '–' => ' ', '‘' => ' '); - foreach ($del as $d => $p) { - $str = str_replace($d, $p, $str); - } - } - foreach ($pattern as $r => $p) { - $str = preg_replace('/[' . $p . ']/u', $r, $str); - } - - $from = 'o'; - $to = 'o'; - - $str = strtr($str, $from, $to); - - return $str; - } - - public static function keepOnlyLettersAndDigits($str) - { - return self::condenseWhite(preg_replace('|[^0-9A-Za-z]|ui', ' ', self::removeAccents($str))); - } - - public static function makeAccentInsensiblePattern($str) - { - $patterns = self::getAccentsPattern(); - $chars = preg_split('//ui', $str, -1, PREG_SPLIT_NO_EMPTY); - $pattern = '|'; - foreach ($chars as $char) { - if (isset($patterns[$char])) { - $pattern .= '['; - $pattern .= $char; - $pattern .= $patterns[$char]; - $pattern .= ']{1}'; - } else { - $pattern .= $char; - } - } - $pattern .= '|iu'; - return $pattern; - } - - public static function preg_areplace($search, $replace, $subject) - { - $pattern = self::makeAccentInsensiblePattern($search); - return preg_replace($pattern, $replace, $subject); - } - - public static function multiExplode($separator, $str, $limit = null) - { - $seps = array('§', '£', '¤', '#', '¨', '^', '%'); - foreach ($seps as $sep) { - if (stristr($str, $sep)) { - continue; - } - break; - } - - $str = preg_replace('|[' . preg_quote($separator, '-') . ']|', $sep, $str); - if (is_null($limit)) { - return explode($sep, $str); - } else { - return explode($sep, $str, $limit); - } - } - - public static function countWords($str) - { - return count(preg_split('|\s|', $str)); - } - - public static function explodeNewLines($str) - { - $str = trim($str); - if ($str === '') { - return []; - } - $str = self::condenseNewLines($str); - return preg_split('|\v|', $str); - } - - public static function substrWord($str, $words, $end = '', $wordsorig = null) - { - if (is_null($wordsorig)) { - $wordsorig = $words; - } - - $maxchars = $wordsorig * 6; - - $o = self::countWords($str); - if ($o <= $words) { - $res = $str; - $addend = false; - } else { - $e = self::multiExplode(" \n", $str, $words); - array_pop($e); - $res = implode(' ', $e); - $addend = true; - } - if (mb_strlen($res) > $maxchars) { - return self::substrWord($str, $words - 1, $end, $wordsorig); - } - - if ($addend) { - $res .= $end; - } - - return $res; - } - - public static function substrWordChars($str, $chars, $end = '') - { - if (strlen($str) <= $chars) { - return $str; - } - - $str = trim(substr($str, 0, $chars)); - $s = preg_split('|\s+|', $str); - array_pop($s); - return implode(' ', $s) . $end; - } - - public static function ucfirst($str, $lower = false) - { - if ($lower) { - $str = mb_strtolower($str); - } - $first = mb_substr($str, 0, 1); - $suite = mb_substr($str, 1); - return mb_strtoupper($first) . $suite; - } - - public static function removeNl($str) - { - $trans = array("\n" => ' ', "\r" => ' '); - $str = strtr($str, $trans); - return self::condenseWhite($str); - } - - public static function condenseWhite($str) - { - return preg_replace('|[\s]{2,100}|u', ' ', $str); - } - - public static function condenseNewLines($str) - { - $str = self::normalizeLines($str); - $str = preg_replace('|\n{2,100}|', "\n", $str); - return $str; - } - - public static function html2text($str) - { - $res = self::strip_tags($str); - $res = str_replace(' ', ' ', $res); - - return $res; - } - - public static function strip_tags($str, $allowed_tags = array(), $trim = false) - { - // return preg_replace('|\<.*\>|uU', '', $str); - // http://www.php.net/manual/fr/function.strip-tags.php#86463 - if (!is_array($allowed_tags)) { - $allowed_tags = !empty($allowed_tags) ? array($allowed_tags) : array(); - } - $tags = implode('|', $allowed_tags); - - if (empty($tags)) { - $tags = '[a-z]+'; - } - - preg_match_all('@@i', $str, $matches); - - $full_tags = $matches[0]; - $tag_names = $matches[1]; - - foreach ($full_tags as $i => $full_tag) { - if (!in_array($tag_names[$i], $allowed_tags)) { - if ($trim) { - unset($full_tags[$i]); - } else { - $str = str_replace($full_tag, '', $str); - } - } - } - - return $trim ? implode('', $full_tags) : $str; - } - - public static function str2URL($str, $replace = '-', $exclude_slashs = false, $exclude_dots = false) - { - if (is_object($str)) { - $str = json_encode($str); - } - $str = str_replace('&', '&', $str); - $str = str_replace(':', ' ', $str); - if (!$exclude_slashs) { - $str = str_replace('/', ' ', $str); - } - - $str = self::deaccent($str); - $str = preg_replace('/[^A-Za-z0-9_\s\'\:\/[\]-]/', '', $str); - - return self::tidyURL($str, true); - - } - - public static function cleanUTF8($str, $replace = '?') - { - while (($bad_index = self::utf8badFind($str)) !== false) { - $str = substr_replace($str, $replace, $bad_index, 1); - } - $str = str_replace('', $replace, $str); - $str = str_replace('', $replace, $str); - return $str; - } - - public static function getChar($code) - { - $code = trim($code, '&;'); - return html_entity_decode('&' . $code . ';', ENT_QUOTES, 'UTF-8'); - } - - public static function randText($length = 300) - { - $str = 'aeiouy azertyuiopqsdfghjklmwxcvbn eaiouaeiou '; - $list = str_split($str); - $nb = strlen($str) - 1; - $res = ''; - for ($i = 0; $i <= $length; $i++) { - $pos = rand(0, $nb); - $res .= $list[$pos]; - } - return $res; - } - - public static function splitWordsWithCase($str) - { - $non_word = '\x{0000}-\x{002F}\x{003A}-\x{0040}\x{005b}-\x{0060}\x{007B}-\x{007E}\x{00A0}-\x{00BF}\s'; - if (preg_match_all('/([^' . $non_word . ']{3,})/msu', html::clean($str), $match)) { - foreach ($match[1] as $i => $v) { - $match[1][$i] = $v; - } - return $match[1]; - } - return array(); - } - - public static function find_words_from_list($str, $list) - { - $words = array_unique(self::splitWordsWithCase($str));; - if (is_array($list)) { - $liste = $list; - } else { - $liste = array_unique(self::splitWords($list)); - } - - $l = array(); - foreach ($words as $ll) { - $lll = self::removeAccents($ll); - $lll = strtolower($lll); - $liste_real[$lll][] = $ll; - $l[] = $lll; - } - - $diff = array_intersect($liste, $l); - $res = array(); - if ($diff) { - foreach ($diff as $d) { - $res = array_merge($res, $liste_real[$d]); - } - return $res; - } - return false; - } - - public static function mb_str_split($string) - { - $stop = mb_strlen($string); - $result = array(); - - for ($idx = 0; $idx < $stop; $idx++) { - $result[] = mb_substr($string, $idx, 1); - } - - return $result; - } - - public static function strToArray($str) - { - return self::mb_str_split($str); - } - - public static function utf8ToUnicode($str) - { - $mState = 0; // cached expected number of octets after the current octet - // until the beginning of the next UTF8 character sequence - $mUcs4 = 0; // cached Unicode character - $mBytes = 1; // cached expected number of octets in the current sequence - - $out = array(); - - $len = strlen($str); - for ($i = 0; $i < $len; $i++) { - $in = ord($str{$i}); - if (0 == $mState) { - // When mState is zero we expect either a US-ASCII character or a - // multi-octet sequence. - if (0 == (0x80 & ($in))) { - // US-ASCII, pass straight through. - $out[] = $in; - $mBytes = 1; - } else if (0xC0 == (0xE0 & ($in))) { - // First octet of 2 octet sequence - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x1F) << 6; - $mState = 1; - $mBytes = 2; - } else if (0xE0 == (0xF0 & ($in))) { - // First octet of 3 octet sequence - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x0F) << 12; - $mState = 2; - $mBytes = 3; - } else if (0xF0 == (0xF8 & ($in))) { - // First octet of 4 octet sequence - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x07) << 18; - $mState = 3; - $mBytes = 4; - } else if (0xF8 == (0xFC & ($in))) { - /* First octet of 5 octet sequence. - * - * This is illegal because the encoded codepoint must be either - * (a) not the shortest form or - * (b) outside the Unicode range of 0-0x10FFFF. - * Rather than trying to resynchronize, we will carry on until the end - * of the sequence and let the later error handling code catch it. - */ - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x03) << 24; - $mState = 4; - $mBytes = 5; - } else if (0xFC == (0xFE & ($in))) { - // First octet of 6 octet sequence, see comments for 5 octet sequence. - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 1) << 30; - $mState = 5; - $mBytes = 6; - } else { - /* Current octet is neither in the US-ASCII range nor a legal first - * octet of a multi-octet sequence. - */ - return false; - } - } else { - // When mState is non-zero, we expect a continuation of the multi-octet - // sequence - if (0x80 == (0xC0 & ($in))) { - // Legal continuation. - $shift = ($mState - 1) * 6; - $tmp = $in; - $tmp = ($tmp & 0x0000003F) << $shift; - $mUcs4 |= $tmp; - - if (0 == --$mState) { - /* End of the multi-octet sequence. mUcs4 now contains the final - * Unicode codepoint to be output - * - * Check for illegal sequences and codepoints. - */ - // From Unicode 3.1, non-shortest form is illegal - if (((2 == $mBytes) && ($mUcs4 < 0x0080)) || - ((3 == $mBytes) && ($mUcs4 < 0x0800)) || - ((4 == $mBytes) && ($mUcs4 < 0x10000)) || - (4 < $mBytes) || - // From Unicode 3.2, surrogate characters are illegal - (($mUcs4 & 0xFFFFF800) == 0xD800) || - // Codepoints outside the Unicode range are illegal - ($mUcs4 > 0x10FFFF) - ) { - return false; - } - if (0xFEFF != $mUcs4) { - // BOM is legal but we don't want to output it - $out[] = $mUcs4; - } - // initialize UTF8 cache - $mState = 0; - $mUcs4 = 0; - $mBytes = 1; - } - } else { - /* ((0xC0 & (*in) != 0x80) && (mState != 0)) - * - * Incomplete multi-octet sequence. - */ - return false; - } - } - } - return $out; - } - - /** - * Takes an array of ints representing the Unicode characters and returns - * a UTF-8 string. Astral planes are supported ie. the ints in the - * input can be > 0xFFFF. Occurrances of the BOM are ignored. Surrogates - * are not allowed. - * - * Returns false if the input array contains ints that represent - * surrogates or are outside the Unicode range. - */ - public static function unicodeToUtf8($arr) - { - $dest = ''; - foreach ($arr as $src) { - if ($src < 0) { - return false; - } else if ($src <= 0x007f) { - $dest .= chr($src); - } else if ($src <= 0x07ff) { - $dest .= chr(0xc0 | ($src >> 6)); - $dest .= chr(0x80 | ($src & 0x003f)); - } else if ($src == 0xFEFF) { - // nop -- zap the BOM - } else if ($src >= 0xD800 && $src <= 0xDFFF) { - // found a surrogate - return false; - } else if ($src <= 0xffff) { - $dest .= chr(0xe0 | ($src >> 12)); - $dest .= chr(0x80 | (($src >> 6) & 0x003f)); - $dest .= chr(0x80 | ($src & 0x003f)); - } else if ($src <= 0x10ffff) { - $dest .= chr(0xf0 | ($src >> 18)); - $dest .= chr(0x80 | (($src >> 12) & 0x3f)); - $dest .= chr(0x80 | (($src >> 6) & 0x3f)); - $dest .= chr(0x80 | ($src & 0x3f)); - } else { - // out of range - return false; - } - } - return $dest; - } - - public static function uchr($n) - { - return self::unicodeToUtf8(array($n)); - } - - public static function uord($c) - { - $r = self::utf8ToUnicode($c); - return array_shift($r); - } - - public static function strcmp($s1, $s2, $ignoreCase = false, $ignoreAccents = false, $trim = false) - { - if ($trim !== false) { - $s1 = trim($s1, $trim); - $s2 = trim($s2, $trim); - } - if ($ignoreAccents) { - $s1 = self::removeAccents($s1); - $s2 = self::removeAccents($s2); - } - if ($ignoreCase) { - $s1 = mb_strtolower($s1); - $s2 = mb_strtolower($s2); - } - - return strcmp($s1, $s2); - } - - public static function removeNewLines($input) - { - $res = preg_replace("|\s+|", ' ', $input); - return $res; - } - - /** - * - * @param string $str - * @param boolean $compact - * @return array - */ - public static function splitLines($str, $compact = true) - { - $str = str_replace("\r\n", "\n", $str); - $str = str_replace("\r", "\n", $str); - $str = explode("\n", $str); - - if (!$compact) { - return $str; - } - - $res = array(); - foreach ($str as $s) { - $s = trim($s); - if ($s == '') { - continue; - } - $res[] = $s; - } - return $res; - } - - public static function parseUrl($url, $forceScheme = true) - { - $url = trim($url); - if (substr($url, 0, 2) == '//') { - $url = 'http:' . $url; - } - $res = parse_url($url); - if ($forceScheme && !isset($res['scheme'])) { - $url = 'http://' . $url; - $res = parse_url($url); - } - - if (isset($res['query'])) { - parse_str($res['query'], $tmp); - $res['query_params'] = $tmp; - } - - if (isset($res['path'])) { - $components = explode('/', trim($res['path'], '/')); - $filteredComponents = array(); - foreach ($components as $c) { - if ($c == '') { - continue; - } - $filteredComponents[] = $c; - } - $res['path_components'] = $filteredComponents; - } - return $res; - } - - public static function pluriel($nb, $singulier, $pluriel, $zero = false, $displayNb = true) - { - $nb = intval($nb); - $res = ''; - if ($displayNb) { - $res .= $nb . ' '; - } - if ($nb == 0 && $zero) { - return $zero; - } - if ($nb <= 1) { - $res .= $singulier; - } else { - $res .= $pluriel; - } - return $res; - } - - public static function normalizeLines($text, $os = 'nix') - { - $text = str_replace("\r\n", "\n", $text); - $text = str_replace("\r", "\n", $text); - if ($os == 'win') { - return str_replace("\n", "\r\n", $text); - } - return $text; - } - - public static function underscoreToCamelCase($str, $upperFirst = false) - { - return Str::camel($str); - } - - public static function camelCaseToUnderscore($str) - { - return Str::snake($str); - } - - // Stops orphans in HTML by replacing the last space with a   - public static function preventOrphans($str) - { - - $find = ' '; // What to search for - $replace = ' '; // What to replace it with - - $last_space = strrpos($str, $find); // Find last occurrence in string - - if ($last_space !== false) { - $str = substr_replace($str, $replace, $last_space, strlen($find)); - } - - // Also replace punctuation that has spaces before it (eg. in French) - $punctuations = array(' :', ' !', ' ?', '« ', ' »'); - $replacements = array("{$replace}:", "{$replace}!", "{$replace}?", "«{$replace}", "{$replace}»"); - $str = str_replace($punctuations, $replacements, $str); - - return $str; - } - - /** - * Check email address - * - * Returns true if $email is a valid email address. - * - * @param string $email Email string - * @return boolean - * @link http://www.iamcal.com/publish/articles/php/parsing_email/ - * - * @copyright Cal Henderson - * @license http://creativecommons.org/licenses/by-sa/2.5/ CC-BY-SA - */ - public static function isEmail($email) - { - $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'; - $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]'; - $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+'; - $quoted_pair = '\\x5c[\\x00-\\x7f]'; - $domain_literal = "\\x5b($dtext|$quoted_pair)*\\x5d"; - $quoted_string = "\\x22($qtext|$quoted_pair)*\\x22"; - $domain_ref = $atom; - $sub_domain = "($domain_ref|$domain_literal)"; - $word = "($atom|$quoted_string)"; - $domain = "$sub_domain(\\x2e$sub_domain)*"; - $local_part = "$word(\\x2e$word)*"; - $addr_spec = "$local_part\\x40$domain"; - - return (boolean)preg_match("!^$addr_spec$!", $email); - } - - /** - * Accents replacement - * - * Replaces some occidental accentuated characters by their ASCII - * representation. - * - * @param string $str String to deaccent - * @return string - */ - public static function deaccent($str) - { - $pattern['A'] = '\x{00C0}-\x{00C5}'; - $pattern['AE'] = '\x{00C6}'; - $pattern['C'] = '\x{00C7}'; - $pattern['D'] = '\x{00D0}'; - $pattern['E'] = '\x{00C8}-\x{00CB}'; - $pattern['I'] = '\x{00CC}-\x{00CF}'; - $pattern['N'] = '\x{00D1}'; - $pattern['O'] = '\x{00D2}-\x{00D6}\x{00D8}'; - $pattern['OE'] = '\x{0152}'; - $pattern['S'] = '\x{0160}'; - $pattern['U'] = '\x{00D9}-\x{00DC}'; - $pattern['Y'] = '\x{00DD}'; - $pattern['Z'] = '\x{017D}'; - - $pattern['a'] = '\x{00E0}-\x{00E5}'; - $pattern['ae'] = '\x{00E6}'; - $pattern['c'] = '\x{00E7}'; - $pattern['d'] = '\x{00F0}'; - $pattern['e'] = '\x{00E8}-\x{00EB}'; - $pattern['i'] = '\x{00EC}-\x{00EF}'; - $pattern['n'] = '\x{00F1}'; - $pattern['o'] = '\x{00F2}-\x{00F6}\x{00F8}'; - $pattern['oe'] = '\x{0153}'; - $pattern['s'] = '\x{0161}'; - $pattern['u'] = '\x{00F9}-\x{00FC}'; - $pattern['y'] = '\x{00FD}\x{00FF}'; - $pattern['z'] = '\x{017E}'; - - $pattern['ss'] = '\x{00DF}'; - - foreach ($pattern as $r => $p) { - $str = preg_replace('/[' . $p . ']/u', $r, $str); - } - - return $str; - } - - /** - * URL cleanup - * - * @param string $str URL to tidy - * @param boolean $keep_slashes Keep slashes in URL - * @param boolean $keep_spaces Keep spaces in URL - * @return string - */ - public static function tidyURL($str, $keep_slashes = true, $keep_spaces = false) - { - $str = strip_tags($str); - $str = str_replace(array('?', '&', '#', '=', '+', '<', '>', '"', '%'), '', $str); - $str = str_replace("'", ' ', $str); - $str = preg_replace('/[\s]+/u', ' ', trim($str)); - - if (!$keep_slashes) { - $str = str_replace('/', '-', $str); - } - - if (!$keep_spaces) { - $str = str_replace(' ', '-', $str); - } - - $str = preg_replace('/[-]+/', '-', $str); - - # Remove path changes in URL - $str = preg_replace('%^/%', '', $str); - $str = preg_replace('%\.+/%', '', $str); - - return $str; - } - - /** - * Cut string - * - * Returns a cuted string on spaced at given length $l. - * - * @param string $str String to cut - * @param integer $l Length to keep - * @return string - */ - public static function cutString($str, $l) - { - $s = preg_split('/([\s]+)/u', $str, -1, PREG_SPLIT_DELIM_CAPTURE); - - $res = ''; - $L = 0; - - if (mb_strlen($s[0]) >= $l) { - return mb_substr($s[0], 0, $l); - } - - foreach ($s as $v) { - $L = $L + mb_strlen($v); - - if ($L > $l) { - break; - } else { - $res .= $v; - } - } - - return trim($res); - } - - /** - * Split words - * - * Returns an array of words from a given string. - * - * @param string $str Words to split - * @return array - */ - public static function splitWords($str, $minChar = 3) - { - $non_word = '\x{0000}-\x{002F}\x{003A}-\x{0040}\x{005b}-\x{0060}\x{007B}-\x{007E}\x{00A0}-\x{00BF}\s'; - if (preg_match_all('/([^' . $non_word . ']{' . $minChar . ',})/msu', html::clean($str), $match)) { - foreach ($match[1] as $i => $v) { - $match[1][$i] = mb_strtolower($v); - } - return $match[1]; - } - return array(); - } - - /** - * Encoding detection - * - * Returns the encoding (in lowercase) of given $str. - * - * @param string $str String - * @return string - */ - public static function detectEncoding($str) - { - return strtolower(mb_detect_encoding($str . ' ', - 'UTF-8,ISO-8859-1,ISO-8859-2,ISO-8859-3,' . - 'ISO-8859-4,ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8,' . - 'ISO-8859-9,ISO-8859-10,ISO-8859-13,ISO-8859-14,ISO-8859-15')); - } - - /** - * Find bad UTF8 tokens - * - * Locates the first bad byte in a UTF-8 string returning it's - * byte index in the string - * PCRE Pattern to locate bad bytes in a UTF-8 string - * Comes from W3 FAQ: Multilingual Forms - * Note: modified to include full ASCII range including control chars - * - * @param string $str String to search - * @return integer|false - * @link http://phputf8.sourceforge.net - * - * @copyright Harry Fuecks - * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU LGPL 2.1 - */ - public static function utf8badFind($str) - { - $UTF8_BAD = - '([\x00-\x7F]' . # ASCII (including control chars) - '|[\xC2-\xDF][\x80-\xBF]' . # non-overlong 2-byte - '|\xE0[\xA0-\xBF][\x80-\xBF]' . # excluding overlongs - '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}' . # straight 3-byte - '|\xED[\x80-\x9F][\x80-\xBF]' . # excluding surrogates - '|\xF0[\x90-\xBF][\x80-\xBF]{2}' . # planes 1-3 - '|[\xF1-\xF3][\x80-\xBF]{3}' . # planes 4-15 - '|\xF4[\x80-\x8F][\x80-\xBF]{2}' . # plane 16 - '|(.{1}))'; # invalid byte - $pos = 0; - $badList = array(); - - while (preg_match('/' . $UTF8_BAD . '/S', $str, $matches)) { - $bytes = strlen($matches[0]); - if (isset($matches[2])) { - return $pos; - } - $pos += $bytes; - $str = substr($str, $bytes); - } - return false; - } - - - /** - * BOM removal - * - * Removes BOM from the begining of a string if present. - * - * @param string $str String to clean - * @return string - */ - public static function removeBOM($str) - { - if (substr_count($str, '')) { - return str_replace('', '', $str); - } - - return $str; - } - - /** - * Quoted printable conversion - * - * Encodes given str to quoted printable - * - * @param string $str String to encode - * @return string - */ - public static function QPEncode($str) - { - $res = ''; - - foreach (preg_split("/\r?\n/msu", $str) as $line) { - $l = ''; - preg_match_all('/./', $line, $m); - - foreach ($m[0] as $c) { - $a = ord($c); - - if ($a < 32 || $a == 61 || $a > 126) { - $c = sprintf('=%02X', $a); - } - - $l .= $c; - } - - $res .= $l . "\r\n"; - } - return $res; - } - -} \ No newline at end of file diff --git a/src/Cubist/Util/Url.php b/src/Cubist/Util/Url.php deleted file mode 100644 index 53eee9b..0000000 --- a/src/Cubist/Util/Url.php +++ /dev/null @@ -1,80 +0,0 @@ - $v) { - $o[] = $k . '=' . rawurlencode($v); - } - if (count($o)) { - $res .= '?' . implode('&', $o); - } - return $res; - } - - public static function sameDomain($url, $domain, $site_url, $acceptSubdomain = false) - { - if (self::isLocal($url, $site_url)) { - return true; - } - - $host = parse_url($url, PHP_URL_HOST); - if (!$acceptSubdomain) { - return $host == $domain; - } - return preg_match("/" . $domain . "$/", $host); - } - - public static function getFilePath($url, $site_url, $public_path) - { - if (self::isLocal($url, $site_url)) { - return $public_path . $url; - } - } - -} diff --git a/src/Cubist/Util/WebVideo.php b/src/Cubist/Util/WebVideo.php deleted file mode 100644 index 850086d..0000000 --- a/src/Cubist/Util/WebVideo.php +++ /dev/null @@ -1,127 +0,0 @@ -filter($url); - list($service, $videoId) = explode(':', $urlf); - if ($service == 'http' || $service == 'https') { - $service = 'generic'; - $videoId = $urlf; - } - $finalUrl = self::getIframeUrl($service, $videoId); - if (!$finalUrl) { - return false; - } - return true; - } - - public static function getIframeUrl($service, $id = null, $options = array()) { - if (null === $id || stristr($service, ':')) { - $filter = new CubeIT_Filter_WebVideo(); - $urlf = $filter->filter($service); - list($service, $id) = explode(':', $urlf); - } - - $s = Text::ucfirst($service, true); - $f = '_get' . $s . 'Url'; - $refl = new \ReflectionClass(get_class()); - if (!$refl->hasMethod($f)) { - return false; - } - return self::$f($id, $options); - } - - protected static function _getGenericUrl($url) { - $meta = Html::getMicrodata($url); - - $res = ''; - foreach ($meta->getElementsByTagName('*') as $m) { - /** @var $m MicrodataDOM\DOMElement */ - if (strcasecmp($m->getAttribute('itemtype'), 'http://schema.org/VideoObject') === 0) { - foreach ($m->getElementsByTagName('*') as $e) { - if (strcasecmp($e->getAttribute('itemprop'), 'embedUrl') === 0) { - /** @var $e MicrodataDOM\DOMElement */ - $res = $e->getAttribute('content'); - } - } - } - } - - if (!$res) { - return false; - } - - if (stristr($url, 'bfmtv')) { - $res = str_replace('idVideo', 'videoId', $res); - } - - return $res; - } - - protected static function _getYoutubeUrl($id, $options = array()) { - $url = 'https://www.youtube.com/embed/' . $id; - return self::_getUrl($url, $options); - } - - protected static function _getCnbcUrl($id, $options = array()) { - $url = 'http://player.cnbc.com/p/gZWlPC/cnbc_global?playertype=synd&byGuid=' . $id; - return self::_getUrl($url, $options); - } - - protected static function _getKalturaUrl($id, $options = array()) { - $confid = $options['playerId']; - $options['playerId'] = 'p_' . rand(1, 100000); - $options['wid'] = $options['widgetId'] = '_' . $options['partnerId']; - - $url = 'http://cdnapi.kaltura.com/html5/html5lib/v1.6.12.40/mwEmbedFrame.php/p/' . $options['partnerId'] - . '/uiconf_id/' . $confid . '/entry_id/' . $id; - - return self::_getUrl($url, $options); - } - - protected static function _getDantubeUrl($id, $options = array()) { - $options['playerId'] = '10247951'; - $options['partnerId'] = '1073192'; - $options['widgetId'] = '1_d89zinhy'; - return self::_getKalturaUrl($id, $options); - } - - protected static function _getDailymotionUrl($id, $options = array()) { - $url = 'https://www.dailymotion.com/embed/video/' . $id; - return self::_getUrl($url, $options); - } - - protected static function _getVimeoUrl($id, $options = array()) { - $url = 'https://player.vimeo.com/video/' . $id; - return self::_getUrl($url, $options); - } - - protected static function _getCubetubeUrl($id, $options = array()) { - $url = 'https://extranet.cubedesigners.com/tools/tube'; - return self::_getUrl($url, $options); - } - - protected static function _getFacebookUrl($id, $options) { - $url = 'https://www.facebook.com/video/embed'; - $options['video_id'] = $id; - return self::_getUrl($url, $options); - } - - protected static function _getUrl($url, $options) { - $res = $url; - $o = array(); - foreach ($options as $k => $v) { - $o[] = $k . '=' . rawurldecode($v); - } - if (count($o)) { - $res .= '?' . implode('&', $o); - } - return $res; - } - -} diff --git a/src/Cubist/Util/XML/DOMSelector.php b/src/Cubist/Util/XML/DOMSelector.php deleted file mode 100644 index a375218..0000000 --- a/src/Cubist/Util/XML/DOMSelector.php +++ /dev/null @@ -1,179 +0,0 @@ -_dom = $data; - } else { - libxml_use_internal_errors(true); - $this->_dom = new DOMDocument(); - @$this->_dom->loadHTML('' . $data); - } - - $this->xpath = new DOMXpath($this->_dom); - } - - /** - * @return DOMDocument - */ - public function getDOM() - { - return $this->_dom; - } - - public function select($selector, $as_array = true) - { - $elements = $this->xpath->evaluate(self::selector_to_xpath($selector)); - return $as_array ? self::elements_to_array($elements) : $elements; - } - - /** - * Select elements from $html using the css $selector. - * When $as_array is true elements and their children will - * be converted to array's containing the following keys (defaults to true): - * - * - name : element name - * - text : element text - * - children : array of children elements - * - attributes : attributes array - * - * Otherwise regular DOMElement's will be returned. - */ - public static function select_elements($selector, $html, $as_array = true) - { - $dom = new DOMSelector($html); - return $dom->select($selector, $as_array); - } - - /** - * Convert $elements to an array. - */ - public static function elements_to_array($elements) - { - $array = array(); - for ($i = 0, $length = $elements->length; $i < $length; ++$i) - if ($elements->item($i)->nodeType == XML_ELEMENT_NODE) - array_push($array, self::element_to_array($elements->item($i))); - return $array; - } - - /** - * Convert $element to an array. - */ - public static function element_to_array($element) - { - $array = array( - 'name' => $element->nodeName, - 'attributes' => array(), - 'text' => $element->textContent, - 'children' => self::elements_to_array($element->childNodes) - ); - if ($element->attributes->length) - foreach ($element->attributes as $key => $attr) - $array['attributes'][$key] = $attr->value; - return $array; - } - - /** - * Convert $selector into an XPath string. - */ - function selector_to_xpath($selector) - { - // remove spaces around operators - $selector = preg_replace('/\s*>\s*/', '>', $selector); - $selector = preg_replace('/\s*~\s*/', '~', $selector); - $selector = preg_replace('/\s*\+\s*/', '+', $selector); - $selector = preg_replace('/\s*,\s*/', ',', $selector); - $selectors = preg_split('/\s+(?![^\[]+\])/', $selector); - foreach ($selectors as &$selector) { - // , - $selector = preg_replace('/,/', '|descendant-or-self::', $selector); - // input:checked, :disabled, etc. - $selector = preg_replace('/(.+)?:(checked|disabled|required|autofocus)/', '\1[@\2="\2"]', $selector); - // input:autocomplete, :autocomplete - $selector = preg_replace('/(.+)?:(autocomplete)/', '\1[@\2="on"]', $selector); - // input:button, input:submit, etc. - $selector = preg_replace('/:(text|password|checkbox|radio|button|submit|reset|file|hidden|image|datetime|datetime-local|date|month|time|week|number|range|email|url|search|tel|color)/', 'input[@type="\1"]', $selector); - // foo[id] - $selector = preg_replace('/(\w+)\[([_\w-]+[_\w\d-]*)\]/', '\1[@\2]', $selector); - // [id] - $selector = preg_replace('/\[([_\w-]+[_\w\d-]*)\]/', '*[@\1]', $selector); - // foo[id=foo] - $selector = preg_replace('/\[([_\w-]+[_\w\d-]*)=[\'"]?(.*?)[\'"]?\]/', '[@\1="\2"]', $selector); - // [id=foo] - $selector = preg_replace('/^\[/', '*[', $selector); - // div#foo - $selector = preg_replace('/([_\w-]+[_\w\d-]*)\#([_\w-]+[_\w\d-]*)/', '\1[@id="\2"]', $selector); - // #foo - $selector = preg_replace('/\#([_\w-]+[_\w\d-]*)/', '*[@id="\1"]', $selector); - // div.foo - $selector = preg_replace('/([_\w-]+[_\w\d-]*)\.([_\w-]+[_\w\d-]*)/', '\1[contains(concat(" ",@class," ")," \2 ")]', $selector); - // .foo - $selector = preg_replace('/\.([_\w-]+[_\w\d-]*)/', '*[contains(concat(" ",@class," ")," \1 ")]', $selector); - // div:first-child - $selector = preg_replace('/([_\w-]+[_\w\d-]*):first-child/', '*/\1[position()=1]', $selector); - // div:last-child - $selector = preg_replace('/([_\w-]+[_\w\d-]*):last-child/', '*/\1[position()=last()]', $selector); - // :first-child - $selector = str_replace(':first-child', '*/*[position()=1]', $selector); - // :last-child - $selector = str_replace(':last-child', '*/*[position()=last()]', $selector); - // :nth-last-child - $selector = preg_replace('/:nth-last-child\((\d+)\)/', '[position()=(last() - (\1 - 1))]', $selector); - // div:nth-child - $selector = preg_replace('/([_\w-]+[_\w\d-]*):nth-child\((\d+)\)/', '*/*[position()=\2 and self::\1]', $selector); - // :nth-child - $selector = preg_replace('/:nth-child\((\d+)\)/', '*/*[position()=\1]', $selector); - // :contains(Foo) - $selector = preg_replace('/([_\w-]+[_\w\d-]*):contains\((.*?)\)/', '\1[contains(string(.),"\2")]', $selector); - // > - $selector = preg_replace('/>/', '/', $selector); - // ~ - $selector = preg_replace('/~/', '/following-sibling::', $selector); - // + - $selector = preg_replace('/\+([_\w-]+[_\w\d-]*)/', '/following-sibling::\1[position()=1]', $selector); - $selector = str_replace(']*', ']', $selector); - $selector = str_replace(']/*', ']', $selector); - } - // ' ' - $selector = implode('/descendant::', $selectors); - $selector = 'descendant-or-self::' . $selector; - // :scope - $selector = preg_replace('/(((\|)?descendant-or-self::):scope)/', '.\3', $selector); - // $element - $sub_selectors = explode(',', $selector); - foreach ($sub_selectors as $key => $sub_selector) { - $parts = explode('$', $sub_selector); - $sub_selector = array_shift($parts); - if (count($parts) && preg_match_all('/((?:[^\/]*\/?\/?)|$)/', $parts[0], $matches)) { - $results = $matches[0]; - $results[] = str_repeat('/..', count($results) - 2); - $sub_selector .= implode('', $results); - } - $sub_selectors[$key] = $sub_selector; - } - $selector = implode(',', $sub_selectors); - - return $selector; - } -} diff --git a/src/Cubist/Util/Xml.php b/src/Cubist/Util/Xml.php deleted file mode 100644 index 49a05dc..0000000 --- a/src/Cubist/Util/Xml.php +++ /dev/null @@ -1,100 +0,0 @@ -loadHTML('' . $str); - $res = simplexml_import_dom($doc); - return $res; - } - - public static function toObject(\SimpleXMLElement $xml) { - self::$_empty = new \stdClass(); - - $e = json_encode($xml); - $o = json_decode($e); - self::_fixAttributes($o); - self::_fixComments($o); - self::_fixEmpty($o); - return $o; - } - - public static function tidyXML(\SimpleXMLElement $xml, $filename = null) { - $dom = dom_import_simplexml($xml)->ownerDocument; - $dom->formatOutput = true; - $tidy = $dom->saveXML(); - if (is_null($filename)) { - return $tidy; - } - file_put_contents($filename, $tidy); - } - - protected static function _fixAttributes(&$o) { - foreach ($o as $k => $v) { - if (is_object($o) && $k == "@attributes") { - foreach ($v as $ak => $av) { - $ak = '_' . $ak; - $o->$ak = $av; - } - unset($o->{"@attributes"}); - } elseif (is_array($v) || is_object($v)) { - if (is_array($o)) { - self::_fixAttributes($o[$k]); - } else { - self::_fixAttributes($o->$k); - } - } - } - } - - protected static function _fixComments(&$o) { - foreach ($o as $k => $v) { - if ($k == 'comment') { - unset($o->$k); - } elseif (is_array($v) || is_object($v)) { - if (is_array($o)) { - self::_fixComments($o[$k]); - } else { - self::_fixComments($o->$k); - } - } - } - } - - protected static function _fixEmpty(&$o) { - foreach ($o as $k => $v) { - if (is_object($v)) { - if ($v == self::$_empty) { - $o->$k = ''; - continue; - } - } - - if (is_array($v) || is_object($v)) { - if (is_array($o)) { - self::_fixEmpty($o[$k]); - } else { - self::_fixEmpty($o->$k); - } - } - } - } - - public static function innerXML(\DOMElement $e){ - $innerHTML= ''; - $children = $e->childNodes; - foreach ($children as $child) { - $innerHTML .= $child->ownerDocument->saveXML( $child ); - } - - return $innerHTML; - } - -} \ No newline at end of file diff --git a/src/Cubist/Util/Zip.php b/src/Cubist/Util/Zip.php deleted file mode 100644 index 498b902..0000000 --- a/src/Cubist/Util/Zip.php +++ /dev/null @@ -1,47 +0,0 @@ -cd($dir); - $cl->setArg('o'); - $cl->setArg(null, $zip); - $cl->execute(); - } else if (class_exists('ZipArchive')) { - $za = new \ZipArchive(); - $za->open($zip); - $za->extractTo($dir); - $za->close(); - } - } - - public static function archive($source, $zip) - { - $zipexe = 'zip'; - - $cl = new CommandLine($zipexe); - if (is_array($source)) { - $cl->setArg('j'); - $cl->setArg(null, $zip); - foreach ($source as $item) { - $cl->setArg(null, $item); - } - } else if (@is_dir($source)) { - $cl->cd($source); - $cl->setArg('r'); - $cl->setArg(null, $zip); - $cl->setArg(null, '*'); - } - $cl->execute(); - } - -} \ No newline at end of file diff --git a/src/Files/Files.php b/src/Files/Files.php new file mode 100644 index 0000000..420aeec --- /dev/null +++ b/src/Files/Files.php @@ -0,0 +1,218 @@ +isFile()) { + unlink($file->__toString()); + } elseif ($file->isDir()) { + rmdir($file->__toString()); + } + } + if (file_exists($dir)) { + rmdir($dir); + } + } + + public static function humanReadableSize($size, $precision = 2) + { + $base = log($size) / log(1024); + $suffixes = array('', 'k', 'M', 'G', 'T'); + + return round(pow(1024, $base - floor($base)), $precision) . $suffixes[intval(floor($base))]; + } + + /** + * @param $path + * @param int $mode + * @param array $exclude + * @return array|\RecursiveIteratorIterator + */ + public static function getRecursiveDirectoryIterator($path, $mode = \RecursiveIteratorIterator::SELF_FIRST, $exclude = array()) + { + $path = realpath($path); + if (!file_exists($path)) { + return array(); + } + $res = new \RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, $exclude), $mode); + return $res; + } + + public static function getDirectoryIterator($path, $recursive = false, $recursiveMode = \RecursiveIteratorIterator::SELF_FIRST) + { + if ($recursive) { + return self::getRecursiveDirectoryIterator($path, $recursiveMode); + } + + $path = realpath($path); + if (!file_exists($path)) { + return array(); + } + return new \DirectoryIterator($path); + } + + public static function getFilename($file) + { + $f = new \SplFileInfo($file); + return $f->getFilename(); + } + + public static function getExtension($file) + { + $p = parse_url($file); + if (isset($p['path']) && $p['path']) { + $file = $p['path']; + } + + + $f = new \SplFileInfo($file); + if (method_exists($f, 'getExtension')) { + $res = $f->getExtension(); + } else { + $e = explode('.', $file); + $res = array_pop($e); + } + return mb_strtolower($res); + } + + public static function getBasename($file, $suffix = null) + { + + $f = new \SplFileInfo($file); + if ($suffix == 'auto') { + $suffix = '.' . self::getExtension($file); + } + return $f->getBasename($suffix); + } + + public static function copy($from, $to, $context = null) + { + + if (!file_exists($to)) { + mkdir($to, 0777, true); + } + + if (is_file($from)) { + copy($from, $to); + } + + if (!is_null($context)) { + $dr = opendir($from, $context); + } else { + $dr = opendir($from); + } + if ($dr !== false) { + while ($file = readdir($dr)) { + if ($file == '.' || $file == '..') { + continue; + } + $f = $from . '/' . $file; + if (is_dir($f)) { + self::copy($f, $to . '/' . $file); + } elseif (is_file($f)) { + $dest = $to . '/' . $file; + if (!file_exists($dest) || + filesize($f) != filesize($dest) || + filemtime($f) > filemtime($dest) + ) { + copy($f, $dest); + } + } + } + } + } + + protected static function _getMimeTypes() + { + if (is_null(self::$_mimeTypes)) { + $list = self::_getMimeTypesFromApacheFile(); + self::$_mimeTypes = $list; + } + + return self::$_mimeTypes; + } + + protected static function _getMimeTypesFromApacheFile() + { + $list = array(); + $fp = fopen(__DIR__ . '/mime.types', 'rb'); + while (($line = fgets($fp)) !== false) { + $line = trim($line); + if (substr($line, 0, 1) == '#') { + continue; + } + $e = explode("\t", $line); + $type = array_shift($e); + $exts = array_pop($e); + $exts = explode(' ', $exts); + foreach ($exts as $ext) { + $list[$ext] = $type; + } + } + fclose($fp); + $list['webvideo'] = 'video/webvideo'; + return $list; + } + + public static function getMimeType($f) + { + return self::_getMimeType($f); + } + + public static function _getMimeType($f) + { + $ext = mb_strtolower(self::getExtension($f)); + $types = self::_getMimeTypes(); + + if (isset($types[$ext])) { + return $types[$ext]; + } else { + return 'application/octet-stream'; + } + } + + public static function tmpdir($dir = null, $prefix = 'cubeist_', $create = true) + { + if (is_null($dir)) { + $dir = sys_get_temp_dir(); + } + + do { + $gen = rtrim($prefix, '_') . '_' . substr(hash('sha256', uniqid($prefix, true)), 0, 10); + $res = $dir . '/' . $gen; + } while (file_exists($res)); + + if ($create) { + mkdir($res, 0777, true); + } + + return $res; + } + + public static function tempnam($dir = null, $prefix = 'cubeist') + { + if (is_null($dir)) { + $dir = sys_get_temp_dir(); + } + return tempnam($dir, $prefix); + } + + public static function dirmtime($dir, $recursive = false) + { + $time = filemtime($dir); + $files = self::getDirectoryIterator($dir, $recursive); + foreach ($files as $f) { + $time = max($time, $f->getMTime()); + } + return $time; + } + +} \ No newline at end of file diff --git a/src/Files/RecursiveDirectoryIterator.php b/src/Files/RecursiveDirectoryIterator.php new file mode 100644 index 0000000..b9ab558 --- /dev/null +++ b/src/Files/RecursiveDirectoryIterator.php @@ -0,0 +1,23 @@ +_exclude = $exclude; + + parent::__construct($it); + } + + public function accept() { + return !in_array($this->current()->getFilename(), $this->_exclude); + } + +} \ No newline at end of file diff --git a/src/Files/VirtualDirectory.php b/src/Files/VirtualDirectory.php new file mode 100644 index 0000000..35d8de2 --- /dev/null +++ b/src/Files/VirtualDirectory.php @@ -0,0 +1,154 @@ +_path = $path; + $this->_copy = array(); + $this->_contents = array(); + $this->_directories = array(); + $this->_tmp = array(); + } + + public function copy($from, $to) + { + $realto = $this->path($to); + if (!$realto) { + return; + } + $this->_copy[$realto] = $from; + return $this; + } + + public function copyDirectory($from, $to) + { + $this->_directories[$this->path($to)] = $from; + return $this; + } + + public function file_put_contents($to, $data) + { + $this->_contents[$this->path($to)] = $data; + return $this; + } + + public function sync($delete = false) + { + $existing = array(); + + foreach ($this->_directories as $to => $from) { + $this->_addDirectory($from, $to); + } + + // Create dirs before copying + foreach ($this->_dirs as $dir => $t) { + if (!file_exists($dir)) { + mkdir($dir, 0777, true); + } + } + + foreach ($this->_contents as $to => $data) { + if ($delete) { + $existing[$to] = true; + } + + file_put_contents($to, $data); + } + + foreach ($this->_copy as $to => $from) { + if (!file_exists($from)) { + continue; + } + if ($delete) { + $existing[$to] = true; + } + if (!file_exists($to) || filesize($from) != filesize($to) || filemtime($from) > filemtime($to)) { + copy($from, $to); + } + } + + if ($delete) { + $this->_delete($existing); + } + $this->cleanTemp(); + } + + protected function _addDirectory($from, $to) + { + if (!file_exists($from)) { + return; + } + + $from = realpath($from); + $files = Files::getRecursiveDirectoryIterator($from); + + foreach ($files as $file) { + /* @var $file SplFileInfo */ + if ($file->isDir()) { + continue; + } + $path = $file->getRealPath(); + $dest = str_replace($from, '', $path); + $this->copy($path, $this->relativePath($to) . '/' . ltrim($dest, '/')); + } + } + + protected function _delete($existing = array()) + { + $files = Files::getRecursiveDirectoryIterator($this->_path); + foreach ($files as $file) { + if ($file->isDir()) { + continue; + } + $path = $file->getRealPath(); + if (!isset($existing[$path])) { + unlink($path); + } + } + } + + public function path($local) + { + $res = str_replace('//', '/', + $this->_path . '/' . ltrim($local, '/')); + $this->_dirs[dirname($res)] = true; + return $res; + } + + public function relativePath($absolute) + { + return str_replace($this->_path, '', $absolute); + } + + public function cleanTemp() + { + foreach ($this->_tmp as $tmp) { + if (is_file($tmp)) { + unlink($tmp); + } + if (is_dir($tmp)) { + Files::rmdir($tmp); + } + } + } + + public function addTemp($temp) + { + $this->_tmp[] = $temp; + } +} \ No newline at end of file diff --git a/src/Files/mime.types b/src/Files/mime.types new file mode 100644 index 0000000..da8cd69 --- /dev/null +++ b/src/Files/mime.types @@ -0,0 +1,1588 @@ +# This file maps Internet media types to unique file extension(s). +# Although created for httpd, this file is used by many software systems +# and has been placed in the public domain for unlimited redisribution. +# +# The table below contains both registered and (common) unregistered types. +# A type that has no unique extension can be ignored -- they are listed +# here to guide configurations toward known types and to make it easier to +# identify "new" types. File extensions are also commonly used to indicate +# content languages and encodings, so choose them carefully. +# +# Internet media types should be registered as described in RFC 4288. +# The registry is at . +# +# MIME type (lowercased) Extensions +# ============================================ ========== +# application/1d-interleaved-parityfec +# application/3gpp-ims+xml +# application/activemessage +application/andrew-inset ez +# application/applefile +application/applixware aw +application/atom+xml atom +application/atomcat+xml atomcat +# application/atomicmail +application/atomsvc+xml atomsvc +# application/auth-policy+xml +# application/batch-smtp +# application/beep+xml +# application/calendar+xml +# application/cals-1840 +# application/ccmp+xml +application/ccxml+xml ccxml +application/cdmi-capability cdmia +application/cdmi-container cdmic +application/cdmi-domain cdmid +application/cdmi-object cdmio +application/cdmi-queue cdmiq +# application/cea-2018+xml +# application/cellml+xml +# application/cfw +# application/cnrp+xml +# application/commonground +# application/conference-info+xml +# application/cpl+xml +# application/csta+xml +# application/cstadata+xml +application/cu-seeme cu +# application/cybercash +application/davmount+xml davmount +# application/dca-rft +# application/dec-dx +# application/dialog-info+xml +# application/dicom +# application/dns +application/docbook+xml dbk +# application/dskpp+xml +application/dssc+der dssc +application/dssc+xml xdssc +# application/dvcs +application/ecmascript ecma +# application/edi-consent +# application/edi-x12 +# application/edifact +application/emma+xml emma +# application/epp+xml +application/epub+zip epub +# application/eshop +# application/example +application/exi exi +# application/fastinfoset +# application/fastsoap +# application/fits +application/font-tdpfr pfr +# application/framework-attributes+xml +application/gml+xml gml +application/gpx+xml gpx +application/gxf gxf +# application/h224 +# application/held+xml +# application/http +application/hyperstudio stk +# application/ibe-key-request+xml +# application/ibe-pkg-reply+xml +# application/ibe-pp-data +# application/iges +# application/im-iscomposing+xml +# application/index +# application/index.cmd +# application/index.obj +# application/index.response +# application/index.vnd +application/inkml+xml ink inkml +# application/iotp +application/ipfix ipfix +# application/ipp +# application/isup +application/java-archive jar +application/java-serialized-object ser +application/java-vm class +application/javascript js +application/json json +application/jsonml+json jsonml +# application/kpml-request+xml +# application/kpml-response+xml +application/lost+xml lostxml +application/mac-binhex40 hqx +application/mac-compactpro cpt +# application/macwriteii +application/mads+xml mads +application/marc mrc +application/marcxml+xml mrcx +application/mathematica ma nb mb +# application/mathml-content+xml +# application/mathml-presentation+xml +application/mathml+xml mathml +# application/mbms-associated-procedure-description+xml +# application/mbms-deregister+xml +# application/mbms-envelope+xml +# application/mbms-msk+xml +# application/mbms-msk-response+xml +# application/mbms-protection-description+xml +# application/mbms-reception-report+xml +# application/mbms-register+xml +# application/mbms-register-response+xml +# application/mbms-user-service-description+xml +application/mbox mbox +# application/media_control+xml +application/mediaservercontrol+xml mscml +application/metalink+xml metalink +application/metalink4+xml meta4 +application/mets+xml mets +# application/mikey +application/mods+xml mods +# application/moss-keys +# application/moss-signature +# application/mosskey-data +# application/mosskey-request +application/mp21 m21 mp21 +application/mp4 mp4s +# application/mpeg4-generic +# application/mpeg4-iod +# application/mpeg4-iod-xmt +# application/msc-ivr+xml +# application/msc-mixer+xml +application/msword doc dot +application/mxf mxf +# application/nasdata +# application/news-checkgroups +# application/news-groupinfo +# application/news-transmission +# application/nss +# application/ocsp-request +# application/ocsp-response +application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy +application/oda oda +application/oebps-package+xml opf +application/ogg ogx +application/omdoc+xml omdoc +application/onenote onetoc onetoc2 onetmp onepkg +application/oxps oxps +# application/parityfec +application/patch-ops-error+xml xer +application/pdf pdf +application/pgp-encrypted pgp +# application/pgp-keys +application/pgp-signature asc sig +application/pics-rules prf +# application/pidf+xml +# application/pidf-diff+xml +application/pkcs10 p10 +application/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +application/pkcs8 p8 +application/pkix-attr-cert ac +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp pki +application/pls+xml pls +# application/poc-settings+xml +application/postscript ai eps ps +# application/prs.alvestrand.titrax-sheet +application/prs.cww cww +# application/prs.nprend +# application/prs.plucker +# application/prs.rdf-xml-crypt +# application/prs.xsf+xml +application/pskc+xml pskcxml +# application/qsig +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +# application/remote-printing +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +# application/riscos +# application/rlmi+xml +application/rls-services+xml rs +application/rpki-ghostbusters gbr +application/rpki-manifest mft +application/rpki-roa roa +# application/rpki-updown +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +# application/rtx +# application/samlassertion+xml +# application/samlmetadata+xml +application/sbml+xml sbml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +# application/set-payment +application/set-payment-initiation setpay +# application/set-registration +application/set-registration-initiation setreg +# application/sgml +# application/sgml-open-catalog +application/shf+xml shf +# application/sieve +# application/simple-filter+xml +# application/simple-message-summary +# application/simplesymbolcontainer +# application/slate +# application/smil +application/smil+xml smi smil +# application/soap+fastinfoset +# application/soap+xml +application/sparql-query rq +application/sparql-results+xml srx +# application/spirits-event+xml +application/srgs gram +application/srgs+xml grxml +application/sru+xml sru +application/ssdl+xml ssdl +application/ssml+xml ssml +# application/tamp-apex-update +# application/tamp-apex-update-confirm +# application/tamp-community-update +# application/tamp-community-update-confirm +# application/tamp-error +# application/tamp-sequence-adjust +# application/tamp-sequence-adjust-confirm +# application/tamp-status-query +# application/tamp-status-response +# application/tamp-update +# application/tamp-update-confirm +application/tei+xml tei teicorpus +application/thraud+xml tfi +# application/timestamp-query +# application/timestamp-reply +application/timestamped-data tsd +# application/tve-trigger +# application/ulpfec +# application/vcard+xml +# application/vemmi +# application/vividence.scriptfile +# application/vnd.3gpp.bsf+xml +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +# application/vnd.3gpp.sms +# application/vnd.3gpp2.bcmcsinfo+xml +# application/vnd.3gpp2.sms +application/vnd.3gpp2.tcap tcap +application/vnd.3m.post-it-notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp atc acutc +application/vnd.adobe.air-application-installer-package+zip air +application/vnd.adobe.formscentral.fcdt fcdt +application/vnd.adobe.fxp fxp fxpl +# application/vnd.adobe.partial-upload +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +# application/vnd.aether.imp +# application/vnd.ah-barcode +application/vnd.ahead.space ahead +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +# application/vnd.amundsen.maze+xml +application/vnd.android.package-archive apk +application/vnd.anser-web-certificate-issue-initiation cii +application/vnd.anser-web-funds-transfer-initiation fti +application/vnd.antix.game-component atx +application/vnd.apple.installer+xml mpkg +application/vnd.apple.mpegurl m3u8 +# application/vnd.arastra.swi +application/vnd.aristanetworks.swi swi +application/vnd.astraea-software.iota iota +application/vnd.audiograph aep +# application/vnd.autopackage +# application/vnd.avistar+xml +application/vnd.blueice.multipass mpm +# application/vnd.bluetooth.ep.oob +application/vnd.bmi bmi +application/vnd.businessobjects rep +# application/vnd.cab-jscript +# application/vnd.canon-cpdl +# application/vnd.canon-lips +# application/vnd.cendio.thinlinc.clientconf +application/vnd.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +# application/vnd.cirpack.isdn-ext +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +application/vnd.cluetrust.cartomobile-config c11amc +application/vnd.cluetrust.cartomobile-config-pkg c11amz +# application/vnd.collection+json +# application/vnd.commerce-battelle +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +# application/vnd.ctct.ws+xml +# application/vnd.cups-pdf +# application/vnd.cups-postscript +application/vnd.cups-ppd ppd +# application/vnd.cups-raster +# application/vnd.cups-raw +# application/vnd.curl +application/vnd.curl.car car +application/vnd.curl.pcurl pcurl +# application/vnd.cybank +application/vnd.dart dart +application/vnd.data-vision.rdz rdz +application/vnd.dece.data uvf uvvf uvd uvvd +application/vnd.dece.ttml+xml uvt uvvt +application/vnd.dece.unspecified uvx uvvx +application/vnd.dece.zip uvz uvvz +application/vnd.denovo.fcselayout-link fe_launch +# application/vnd.dir-bi.plate-dl-nosuffix +application/vnd.dna dna +application/vnd.dolby.mlp mlp +# application/vnd.dolby.mobile.1 +# application/vnd.dolby.mobile.2 +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +application/vnd.ds-keypoint kpxx +application/vnd.dvb.ait ait +# application/vnd.dvb.dvbj +# application/vnd.dvb.esgcontainer +# application/vnd.dvb.ipdcdftnotifaccess +# application/vnd.dvb.ipdcesgaccess +# application/vnd.dvb.ipdcesgaccess2 +# application/vnd.dvb.ipdcesgpdd +# application/vnd.dvb.ipdcroaming +# application/vnd.dvb.iptv.alfec-base +# application/vnd.dvb.iptv.alfec-enhancement +# application/vnd.dvb.notif-aggregate-root+xml +# application/vnd.dvb.notif-container+xml +# application/vnd.dvb.notif-generic+xml +# application/vnd.dvb.notif-ia-msglist+xml +# application/vnd.dvb.notif-ia-registration-request+xml +# application/vnd.dvb.notif-ia-registration-response+xml +# application/vnd.dvb.notif-init+xml +# application/vnd.dvb.pfr +application/vnd.dvb.service svc +# application/vnd.dxr +application/vnd.dynageo geo +# application/vnd.easykaraoke.cdgdownload +# application/vnd.ecdis-update +application/vnd.ecowin.chart mag +# application/vnd.ecowin.filerequest +# application/vnd.ecowin.fileupdate +# application/vnd.ecowin.series +# application/vnd.ecowin.seriesrequest +# application/vnd.ecowin.seriesupdate +# application/vnd.emclient.accessrequest+xml +application/vnd.enliven nml +# application/vnd.eprints.data+xml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +# application/vnd.ericsson.quickcall +application/vnd.eszigno3+xml es3 et3 +# application/vnd.etsi.aoc+xml +# application/vnd.etsi.cug+xml +# application/vnd.etsi.iptvcommand+xml +# application/vnd.etsi.iptvdiscovery+xml +# application/vnd.etsi.iptvprofile+xml +# application/vnd.etsi.iptvsad-bc+xml +# application/vnd.etsi.iptvsad-cod+xml +# application/vnd.etsi.iptvsad-npvr+xml +# application/vnd.etsi.iptvservice+xml +# application/vnd.etsi.iptvsync+xml +# application/vnd.etsi.iptvueprofile+xml +# application/vnd.etsi.mcid+xml +# application/vnd.etsi.overload-control-policy-dataset+xml +# application/vnd.etsi.sci+xml +# application/vnd.etsi.simservs+xml +# application/vnd.etsi.tsl+xml +# application/vnd.etsi.tsl.der +# application/vnd.eudora.data +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +# application/vnd.f-secure.mobile +application/vnd.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed seed dataless +# application/vnd.ffsns +# application/vnd.fints +application/vnd.flographit gph +application/vnd.fluxtime.clip ftc +# application/vnd.font-fontforge-sfd +application/vnd.framemaker fm frame maker book +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +# application/vnd.fujixerox.art-ex +# application/vnd.fujixerox.art4 +# application/vnd.fujixerox.hbpl +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +# application/vnd.fut-misnet +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +# application/vnd.geocube+xml +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.geonext gxt +application/vnd.geoplan g2w +application/vnd.geospace g3w +# application/vnd.globalplatform.card-content-mgt +# application/vnd.globalplatform.card-content-mgt-response +application/vnd.gmx gmx +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq gqf gqs +# application/vnd.gridmp +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +# application/vnd.hal+json +application/vnd.hal+xml hal +application/vnd.handheld-entertainment+xml zmm +application/vnd.hbci hbci +# application/vnd.hcl-bireports +application/vnd.hhe.lesson-player les +application/vnd.hp-hpgl hpgl +application/vnd.hp-hpid hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-pcl pcl +application/vnd.hp-pclxl pclxl +# application/vnd.httphone +application/vnd.hydrostatix.sof-data sfd-hdstx +# application/vnd.hzn-3d-crossword +# application/vnd.ibm.afplinedata +# application/vnd.ibm.electronic-media +application/vnd.ibm.minipay mpy +application/vnd.ibm.modcap afp listafp list3820 +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +# application/vnd.informedcontrol.rms+xml +# application/vnd.informix-visionary +# application/vnd.infotech.project +# application/vnd.infotech.project+xml +# application/vnd.innopath.wamp.notification +application/vnd.insors.igm igm +application/vnd.intercon.formnet xpw xpx +application/vnd.intergeo i2g +# application/vnd.intertrust.digibox +# application/vnd.intertrust.nncp +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +# application/vnd.iptc.g2.conceptitem+xml +# application/vnd.iptc.g2.knowledgeitem+xml +# application/vnd.iptc.g2.newsitem+xml +# application/vnd.iptc.g2.newsmessage+xml +# application/vnd.iptc.g2.packageitem+xml +# application/vnd.iptc.g2.planningitem+xml +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.isac.fcs fcs +application/vnd.jam jam +# application/vnd.japannet-directory-service +# application/vnd.japannet-jpnstore-wakeup +# application/vnd.japannet-payment-wakeup +# application/vnd.japannet-registration +# application/vnd.japannet-registration-wakeup +# application/vnd.japannet-setstore-wakeup +# application/vnd.japannet-verification +# application/vnd.japannet-verification-wakeup +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +application/vnd.kahootz ktz ktr +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.kinar kne knp +application/vnd.koan skp skd skt skm +application/vnd.kodak-descriptor sse +application/vnd.las.las+xml lasxml +# application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 +application/vnd.lotus-approach apr +application/vnd.lotus-freelance pre +application/vnd.lotus-notes nsf +application/vnd.lotus-organizer org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp +application/vnd.macports.portpkg portpkg +# application/vnd.marlin.drm.actiontoken+xml +# application/vnd.marlin.drm.conftoken+xml +# application/vnd.marlin.drm.license+xml +# application/vnd.marlin.drm.mdcf +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +# application/vnd.meridian-slingshot +application/vnd.mfer mwf +application/vnd.mfmp mfm +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +application/vnd.mif mif +# application/vnd.minisoft-hp3000-save +# application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf daf +application/vnd.mobius.dis dis +application/vnd.mobius.mbk mbk +application/vnd.mobius.mqy mqy +application/vnd.mobius.msl msl +application/vnd.mobius.plc plc +application/vnd.mobius.txf txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +# application/vnd.motorola.flexsuite +# application/vnd.motorola.flexsuite.adsi +# application/vnd.motorola.flexsuite.fis +# application/vnd.motorola.flexsuite.gotap +# application/vnd.motorola.flexsuite.kmr +# application/vnd.motorola.flexsuite.ttc +# application/vnd.motorola.flexsuite.wem +# application/vnd.motorola.iprm +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry cil +# application/vnd.ms-asf +application/vnd.ms-cab-compressed cab +# application/vnd.ms-color.iccprofile +application/vnd.ms-excel xls xlm xla xlc xlt xlw +application/vnd.ms-excel.addin.macroenabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb +application/vnd.ms-excel.sheet.macroenabled.12 xlsm +application/vnd.ms-excel.template.macroenabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +# application/vnd.ms-office.activex+xml +application/vnd.ms-officetheme thmx +# application/vnd.ms-opentype +# application/vnd.ms-package.obfuscated-opentype +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +# application/vnd.ms-playready.initiator+xml +application/vnd.ms-powerpoint ppt pps pot +application/vnd.ms-powerpoint.addin.macroenabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm +application/vnd.ms-powerpoint.slide.macroenabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm +application/vnd.ms-powerpoint.template.macroenabled.12 potm +# application/vnd.ms-printing.printticket+xml +application/vnd.ms-project mpp mpt +# application/vnd.ms-tnef +# application/vnd.ms-wmdrm.lic-chlg-req +# application/vnd.ms-wmdrm.lic-resp +# application/vnd.ms-wmdrm.meter-chlg-req +# application/vnd.ms-wmdrm.meter-resp +application/vnd.ms-word.document.macroenabled.12 docm +application/vnd.ms-word.template.macroenabled.12 dotm +application/vnd.ms-works wps wks wcm wdb +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +application/vnd.mseq mseq +# application/vnd.msign +# application/vnd.multiad.creator +# application/vnd.multiad.creator.cif +# application/vnd.music-niff +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.mynfc taglet +# application/vnd.ncd.control +# application/vnd.ncd.reference +# application/vnd.nervana +# application/vnd.netfpx +application/vnd.neurolanguage.nlu nlu +application/vnd.nitf ntf nitf +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +# application/vnd.nokia.catalogs +# application/vnd.nokia.conml+wbxml +# application/vnd.nokia.conml+xml +# application/vnd.nokia.isds-radio-presets +# application/vnd.nokia.iptv.config+xml +# application/vnd.nokia.landmark+wbxml +# application/vnd.nokia.landmark+xml +# application/vnd.nokia.landmarkcollection+xml +# application/vnd.nokia.n-gage.ac+xml +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +# application/vnd.nokia.ncd +# application/vnd.nokia.pcd+wbxml +# application/vnd.nokia.pcd+xml +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.edm edm +application/vnd.novadigm.edx edx +application/vnd.novadigm.ext ext +# application/vnd.ntt-local.file-transfer +# application/vnd.ntt-local.sip-ta_remote +# application/vnd.ntt-local.sip-ta_tcp_stream +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template odft +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +# application/vnd.obn +# application/vnd.oftn.l10n+json +# application/vnd.oipf.contentaccessdownload+xml +# application/vnd.oipf.contentaccessstreaming+xml +# application/vnd.oipf.cspg-hexbinary +# application/vnd.oipf.dae.svg+xml +# application/vnd.oipf.dae.xhtml+xml +# application/vnd.oipf.mippvcontrolmessage+xml +# application/vnd.oipf.pae.gem +# application/vnd.oipf.spdiscovery+xml +# application/vnd.oipf.spdlist+xml +# application/vnd.oipf.ueprofile+xml +# application/vnd.oipf.userprofile+xml +application/vnd.olpc-sugar xo +# application/vnd.oma-scws-config +# application/vnd.oma-scws-http-request +# application/vnd.oma-scws-http-response +# application/vnd.oma.bcast.associated-procedure-parameter+xml +# application/vnd.oma.bcast.drm-trigger+xml +# application/vnd.oma.bcast.imd+xml +# application/vnd.oma.bcast.ltkm +# application/vnd.oma.bcast.notification+xml +# application/vnd.oma.bcast.provisioningtrigger +# application/vnd.oma.bcast.sgboot +# application/vnd.oma.bcast.sgdd+xml +# application/vnd.oma.bcast.sgdu +# application/vnd.oma.bcast.simple-symbol-container +# application/vnd.oma.bcast.smartcard-trigger+xml +# application/vnd.oma.bcast.sprov+xml +# application/vnd.oma.bcast.stkm +# application/vnd.oma.cab-address-book+xml +# application/vnd.oma.cab-feature-handler+xml +# application/vnd.oma.cab-pcc+xml +# application/vnd.oma.cab-user-prefs+xml +# application/vnd.oma.dcd +# application/vnd.oma.dcdc +application/vnd.oma.dd2+xml dd2 +# application/vnd.oma.drm.risd+xml +# application/vnd.oma.group-usage-list+xml +# application/vnd.oma.pal+xml +# application/vnd.oma.poc.detailed-progress-report+xml +# application/vnd.oma.poc.final-report+xml +# application/vnd.oma.poc.groups+xml +# application/vnd.oma.poc.invocation-descriptor+xml +# application/vnd.oma.poc.optimized-progress-report+xml +# application/vnd.oma.push +# application/vnd.oma.scidm.messages+xml +# application/vnd.oma.xcap-directory+xml +# application/vnd.omads-email+xml +# application/vnd.omads-file+xml +# application/vnd.omads-folder+xml +# application/vnd.omaloc-supl-init +application/vnd.openofficeorg.extension oxt +# application/vnd.openxmlformats-officedocument.custom-properties+xml +# application/vnd.openxmlformats-officedocument.customxmlproperties+xml +# application/vnd.openxmlformats-officedocument.drawing+xml +# application/vnd.openxmlformats-officedocument.drawingml.chart+xml +# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml +# application/vnd.openxmlformats-officedocument.extended-properties+xml +# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml +# application/vnd.openxmlformats-officedocument.presentationml.comments+xml +# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +# application/vnd.openxmlformats-officedocument.presentationml.slide+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml +# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml +# application/vnd.openxmlformats-officedocument.presentationml.tags+xml +application/vnd.openxmlformats-officedocument.presentationml.template potx +# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml +# application/vnd.openxmlformats-officedocument.theme+xml +# application/vnd.openxmlformats-officedocument.themeoverride+xml +# application/vnd.openxmlformats-officedocument.vmldrawing +# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml +# application/vnd.openxmlformats-package.core-properties+xml +# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml +# application/vnd.openxmlformats-package.relationships+xml +# application/vnd.quobject-quoxdocument +# application/vnd.osa.netdeploy +application/vnd.osgeo.mapguide.package mgp +# application/vnd.osgi.bundle +application/vnd.osgi.dp dp +application/vnd.osgi.subsystem esa +# application/vnd.otps.ct-kip+xml +application/vnd.palm pdb pqa oprc +# application/vnd.paos.xml +application/vnd.pawaafile paw +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +# application/vnd.piaccess.application-licence +application/vnd.picsel efif +application/vnd.pmi.widget wg +# application/vnd.poc.group-advertisement+xml +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +# application/vnd.powerbuilder6-s +# application/vnd.powerbuilder7 +# application/vnd.powerbuilder7-s +# application/vnd.powerbuilder75 +# application/vnd.powerbuilder75-s +# application/vnd.preminet +application/vnd.previewsystems.box box +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +application/vnd.pvi.ptid1 ptid +# application/vnd.pwg-multiplexed +# application/vnd.pwg-xhtml-print+xml +# application/vnd.qualcomm.brew-app-res +application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb +# application/vnd.radisys.moml+xml +# application/vnd.radisys.msml+xml +# application/vnd.radisys.msml-audit+xml +# application/vnd.radisys.msml-audit-conf+xml +# application/vnd.radisys.msml-audit-conn+xml +# application/vnd.radisys.msml-audit-dialog+xml +# application/vnd.radisys.msml-audit-stream+xml +# application/vnd.radisys.msml-conf+xml +# application/vnd.radisys.msml-dialog+xml +# application/vnd.radisys.msml-dialog-base+xml +# application/vnd.radisys.msml-dialog-fax-detect+xml +# application/vnd.radisys.msml-dialog-fax-sendrecv+xml +# application/vnd.radisys.msml-dialog-group+xml +# application/vnd.radisys.msml-dialog-speech+xml +# application/vnd.radisys.msml-dialog-transform+xml +# application/vnd.rainstor.data +# application/vnd.rapid +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +# application/vnd.renlearn.rlprint +application/vnd.rig.cryptonote cryptonote +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.rn-realmedia-vbr rmvb +application/vnd.route66.link66+xml link66 +# application/vnd.rs-274x +# application/vnd.ruckus.download +# application/vnd.s3sms +application/vnd.sailingtracker.track st +# application/vnd.sbm.cid +# application/vnd.sbm.mid2 +# application/vnd.scribus +# application/vnd.sealed.3df +# application/vnd.sealed.csf +# application/vnd.sealed.doc +# application/vnd.sealed.eml +# application/vnd.sealed.mht +# application/vnd.sealed.net +# application/vnd.sealed.ppt +# application/vnd.sealed.tiff +# application/vnd.sealed.xls +# application/vnd.sealedmedia.softseal.html +# application/vnd.sealedmedia.softseal.pdf +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.simtech-mindmapper twd twds +application/vnd.smaf mmf +# application/vnd.smart.notebook +application/vnd.smart.teacher teacher +# application/vnd.software602.filler.form+xml +# application/vnd.software602.filler.form-xml-zip +application/vnd.solent.sdkm+xml sdkm sdkd +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +# application/vnd.sss-cod +# application/vnd.sss-dtf +# application/vnd.sss-ntf +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd +application/vnd.stardivision.math smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.stepmania.package smzip +application/vnd.stepmania.stepchart sm +# application/vnd.street-stream +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +# application/vnd.sun.wadl+xml +application/vnd.sus-calendar sus susp +application/vnd.svd svd +# application/vnd.swiftview-ics +application/vnd.symbian.install sis sisx +application/vnd.syncml+xml xsm +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +# application/vnd.syncml.dm.notification +# application/vnd.syncml.ds.notification +application/vnd.tao.intent-module-archive tao +application/vnd.tcpdump.pcap pcap cap dmp +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +# application/vnd.truedoc +# application/vnd.ubisoft.webplayer +application/vnd.ufdl ufd ufdl +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml +# application/vnd.uplanet.alert +# application/vnd.uplanet.alert-wbxml +# application/vnd.uplanet.bearer-choice +# application/vnd.uplanet.bearer-choice-wbxml +# application/vnd.uplanet.cacheop +# application/vnd.uplanet.cacheop-wbxml +# application/vnd.uplanet.channel +# application/vnd.uplanet.channel-wbxml +# application/vnd.uplanet.list +# application/vnd.uplanet.list-wbxml +# application/vnd.uplanet.listcmd +# application/vnd.uplanet.listcmd-wbxml +# application/vnd.uplanet.signal +application/vnd.vcx vcx +# application/vnd.vd-study +# application/vnd.vectorworks +# application/vnd.verimatrix.vcas +# application/vnd.vidsoft.vidconference +application/vnd.visio vsd vst vss vsw +application/vnd.visionary vis +# application/vnd.vividence.scriptfile +application/vnd.vsf vsf +# application/vnd.wap.sic +# application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +# application/vnd.wfa.wsc +# application/vnd.wmc +# application/vnd.wmf.bootstrap +# application/vnd.wolfram.mathematica +# application/vnd.wolfram.mathematica.package +application/vnd.wolfram.player nbp +application/vnd.wordperfect wpd +application/vnd.wqd wqd +# application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf stf +# application/vnd.wv.csp+wbxml +# application/vnd.wv.csp+xml +# application/vnd.wv.ssp+xml +application/vnd.xara xar +application/vnd.xfdl xfdl +# application/vnd.xfdl.webform +# application/vnd.xmi+xml +# application/vnd.xmpie.cpkg +# application/vnd.xmpie.dpkg +# application/vnd.xmpie.plan +# application/vnd.xmpie.ppkg +# application/vnd.xmpie.xlim +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg +# application/vnd.yamaha.remote-setup +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +# application/vnd.yamaha.through-ngn +# application/vnd.yamaha.tunnel-udpencap +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +# application/vq-rtcpxr +# application/watcherinfo+xml +# application/whoispp-query +# application/whoispp-response +application/widget wgt +application/winhlp hlp +# application/wita +# application/wordperfect5.1 +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-7z-compressed 7z +application/x-abiword abw +application/x-ace-compressed ace +# application/x-amf +application/x-apple-diskimage dmg +application/x-authorware-bin aab x32 u32 vox +application/x-authorware-map aam +application/x-authorware-seg aas +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-blorb blb blorb +application/x-bzip bz +application/x-bzip2 bz2 boz +application/x-cbr cbr cba cbt cbz cb7 +application/x-cdlink vcd +application/x-cfs-compressed cfs +application/x-chat chat +application/x-chess-pgn pgn +application/x-conference nsc +# application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb udeb +application/x-dgc-compressed dgc +application/x-director dir dcr dxr cst cct cxt w3d fgd swa +application/x-doom wad +application/x-dtbncx+xml ncx +application/x-dtbook+xml dtb +application/x-dtbresource+xml res +application/x-dvi dvi +application/x-envoy evy +application/x-eva eva +application/x-font-bdf bdf +# application/x-font-dos +# application/x-font-framemaker +application/x-font-ghostscript gsf +# application/x-font-libgrx +application/x-font-linux-psf psf +application/x-font-otf otf +application/x-font-pcf pcf +application/x-font-snf snf +# application/x-font-speedo +# application/x-font-sunos-news +application/x-font-ttf ttf ttc +application/x-font-type1 pfa pfb pfm afm +application/font-woff woff +# application/x-font-vfont +application/x-freearc arc +application/x-futuresplash spl +application/x-gca-compressed gca +application/x-glulx ulx +application/x-gnumeric gnumeric +application/x-gramps-xml gramps +application/x-gtar gtar +# application/x-gzip +application/x-hdf hdf +application/x-install-instructions install +application/x-iso9660-image iso +application/x-java-jnlp-file jnlp +application/x-latex latex +application/x-lzh-compressed lzh lha +application/x-mie mie +application/x-mobipocket-ebook prc mobi +application/x-ms-application application +application/x-ms-shortcut lnk +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-ms-xbap xbap +application/x-msaccess mdb +application/x-msbinder obd +application/x-mscardfile crd +application/x-msclip clp +application/x-msdownload exe dll com bat msi +application/x-msmediaview mvb m13 m14 +application/x-msmetafile wmf wmz emf emz +application/x-msmoney mny +application/x-mspublisher pub +application/x-msschedule scd +application/x-msterminal trm +application/x-mswrite wri +application/x-netcdf nc cdf +application/x-nzb nzb +application/x-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-rar-compressed rar +application/x-research-info-systems ris +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-silverlight-app xap +application/x-sql sql +application/x-stuffit sit +application/x-stuffitx sitx +application/x-subrip srt +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-t3vm-image t3 +application/x-tads gam +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-tex-tfm tfm +application/x-texinfo texinfo texi +application/x-tgif obj +application/x-ustar ustar +application/x-wais-source src +application/x-x509-ca-cert der crt +application/x-xfig fig +application/x-xliff+xml xlf +application/x-xpinstall xpi +application/x-xz xz +application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 +# application/x400-bp +application/xaml+xml xaml +# application/xcap-att+xml +# application/xcap-caps+xml +application/xcap-diff+xml xdf +# application/xcap-el+xml +# application/xcap-error+xml +# application/xcap-ns+xml +# application/xcon-conference-info-diff+xml +# application/xcon-conference-info+xml +application/xenc+xml xenc +application/xhtml+xml xhtml xht +# application/xhtml-voice+xml +application/xml xml xsl +application/xml-dtd dtd +# application/xml-external-parsed-entity +# application/xmpp+xml +application/xop+xml xop +application/xproc+xml xpl +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvml xvm +application/yang yang +application/yin+xml yin +application/zip zip +# audio/1d-interleaved-parityfec +# audio/32kadpcm +# audio/3gpp +# audio/3gpp2 +# audio/ac3 +audio/adpcm adp +# audio/amr +# audio/amr-wb +# audio/amr-wb+ +# audio/asc +# audio/atrac-advanced-lossless +# audio/atrac-x +# audio/atrac3 +audio/basic au snd +# audio/bv16 +# audio/bv32 +# audio/clearmode +# audio/cn +# audio/dat12 +# audio/dls +# audio/dsr-es201108 +# audio/dsr-es202050 +# audio/dsr-es202211 +# audio/dsr-es202212 +# audio/dv +# audio/dvi4 +# audio/eac3 +# audio/evrc +# audio/evrc-qcp +# audio/evrc0 +# audio/evrc1 +# audio/evrcb +# audio/evrcb0 +# audio/evrcb1 +# audio/evrcwb +# audio/evrcwb0 +# audio/evrcwb1 +# audio/example +# audio/fwdred +# audio/g719 +# audio/g722 +# audio/g7221 +# audio/g723 +# audio/g726-16 +# audio/g726-24 +# audio/g726-32 +# audio/g726-40 +# audio/g728 +# audio/g729 +# audio/g7291 +# audio/g729d +# audio/g729e +# audio/gsm +# audio/gsm-efr +# audio/gsm-hr-08 +# audio/ilbc +# audio/ip-mr_v2.5 +# audio/isac +# audio/l16 +# audio/l20 +# audio/l24 +# audio/l8 +# audio/lpc +audio/midi mid midi kar rmi +# audio/mobile-xmf +audio/mp4 mp4a +# audio/mp4a-latm +# audio/mpa +# audio/mpa-robust +audio/mpeg mpga mp2 mp2a mp3 m2a m3a +# audio/mpeg4-generic +# audio/musepack +audio/ogg oga ogg spx +# audio/opus +# audio/parityfec +# audio/pcma +# audio/pcma-wb +# audio/pcmu-wb +# audio/pcmu +# audio/prs.sid +# audio/qcelp +# audio/red +# audio/rtp-enc-aescm128 +# audio/rtp-midi +# audio/rtx +audio/s3m s3m +audio/silk sil +# audio/smv +# audio/smv0 +# audio/smv-qcp +# audio/sp-midi +# audio/speex +# audio/t140c +# audio/t38 +# audio/telephone-event +# audio/tone +# audio/uemclip +# audio/ulpfec +# audio/vdvi +# audio/vmr-wb +# audio/vnd.3gpp.iufp +# audio/vnd.4sb +# audio/vnd.audiokoz +# audio/vnd.celp +# audio/vnd.cisco.nse +# audio/vnd.cmles.radio-events +# audio/vnd.cns.anp1 +# audio/vnd.cns.inf1 +audio/vnd.dece.audio uva uvva +audio/vnd.digital-winds eol +# audio/vnd.dlna.adts +# audio/vnd.dolby.heaac.1 +# audio/vnd.dolby.heaac.2 +# audio/vnd.dolby.mlp +# audio/vnd.dolby.mps +# audio/vnd.dolby.pl2 +# audio/vnd.dolby.pl2x +# audio/vnd.dolby.pl2z +# audio/vnd.dolby.pulse.1 +audio/vnd.dra dra +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +# audio/vnd.dvb.file +# audio/vnd.everad.plj +# audio/vnd.hns.audio +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +# audio/vnd.nokia.mobile-xmf +# audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +# audio/vnd.octel.sbc +# audio/vnd.qcelp +# audio/vnd.rhetorex.32kadpcm +audio/vnd.rip rip +# audio/vnd.sealedmedia.softseal.mpeg +# audio/vnd.vmx.cvsd +# audio/vorbis +# audio/vorbis-config +audio/webm weba +audio/x-aac aac +audio/x-aiff aif aiff aifc +audio/x-caf caf +audio/x-flac flac +audio/x-matroska mka +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin rmp +# audio/x-tta +audio/x-wav wav +audio/xm xm +chemical/x-cdx cdx +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-csml csml +# chemical/x-pdb +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +# image/example +# image/fits +image/g3fax g3 +image/gif gif +image/ief ief +# image/jp2 +image/jpeg jpeg jpg jpe +# image/jpm +# image/jpx +image/ktx ktx +# image/naplps +image/png png +image/prs.btif btif +# image/prs.pti +image/sgi sgi +image/svg+xml svg svgz +# image/t38 +image/tiff tiff tif +# image/tiff-fx +image/vnd.adobe.photoshop psd +# image/vnd.cns.inf2 +image/vnd.dece.graphic uvi uvvi uvg uvvg +image/vnd.dvb.subtitle sub +image/vnd.djvu djvu djv +image/vnd.dwg dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +# image/vnd.globalgraphics.pgb +# image/vnd.microsoft.icon +# image/vnd.mix +image/vnd.ms-modi mdi +image/vnd.ms-photo wdp +image/vnd.net-fpx npx +# image/vnd.radiance +# image/vnd.sealed.png +# image/vnd.sealedmedia.softseal.gif +# image/vnd.sealedmedia.softseal.jpg +# image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +image/webp webp +image/x-3ds 3ds +image/x-cmu-raster ras +image/x-cmx cmx +image/x-freehand fh fhc fh4 fh5 fh7 +image/x-icon ico +image/x-mrsid-image sid +image/x-pcx pcx +image/x-pict pic pct +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-tga tga +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +# message/cpim +# message/delivery-status +# message/disposition-notification +# message/example +# message/external-body +# message/feedback-report +# message/global +# message/global-delivery-status +# message/global-disposition-notification +# message/global-headers +# message/http +# message/imdn+xml +# message/news +# message/partial +message/rfc822 eml mime +# message/s-http +# message/sip +# message/sipfrag +# message/tracking-status +# message/vnd.si.simp +# model/example +model/iges igs iges +model/mesh msh mesh silo +model/vnd.collada+xml dae +model/vnd.dwf dwf +# model/vnd.flatland.3dml +model/vnd.gdl gdl +# model/vnd.gs-gdl +# model/vnd.gs.gdl +model/vnd.gtw gtw +# model/vnd.moml+xml +model/vnd.mts mts +# model/vnd.parasolid.transmit.binary +# model/vnd.parasolid.transmit.text +model/vnd.vtu vtu +model/vrml wrl vrml +model/x3d+binary x3db x3dbz +model/x3d+vrml x3dv x3dvz +model/x3d+xml x3d x3dz +# multipart/alternative +# multipart/appledouble +# multipart/byteranges +# multipart/digest +# multipart/encrypted +# multipart/example +# multipart/form-data +# multipart/header-set +# multipart/mixed +# multipart/parallel +# multipart/related +# multipart/report +# multipart/signed +# multipart/voice-message +# text/1d-interleaved-parityfec +text/cache-manifest appcache +text/calendar ics ifb +text/css css +text/csv csv +# text/directory +# text/dns +# text/ecmascript +# text/enriched +# text/example +# text/fwdred +text/html html htm +# text/javascript +text/n3 n3 +# text/parityfec +text/plain txt text conf def list log in +# text/prs.fallenstein.rst +text/prs.lines.tag dsc +# text/vnd.radisys.msml-basic-layout +# text/red +# text/rfc822-headers +text/richtext rtx +# text/rtf +# text/rtp-enc-aescm128 +# text/rtx +text/sgml sgml sgm +# text/t140 +text/tab-separated-values tsv +text/troff t tr roff man me ms +text/turtle ttl +# text/ulpfec +text/uri-list uri uris urls +text/vcard vcard +# text/vnd.abc +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.scurl scurl +text/vnd.curl.mcurl mcurl +# text/vnd.dmclientscript +text/vnd.dvb.subtitle sub +# text/vnd.esmertec.theme-descriptor +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv +text/vnd.in3d.3dml 3dml +text/vnd.in3d.spot spot +# text/vnd.iptc.newsml +# text/vnd.iptc.nitf +# text/vnd.latex-z +# text/vnd.motorola.reflex +# text/vnd.ms-mediapackage +# text/vnd.net2phone.commcenter.command +# text/vnd.si.uricatalogue +text/vnd.sun.j2me.app-descriptor jad +# text/vnd.trolltech.linguist +# text/vnd.wap.si +# text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-asm s asm +text/x-c c cc cxx cpp h hh dic +text/x-fortran f for f77 f90 +text/x-java-source java +text/x-opml opml +text/x-pascal p pas +text/x-nfo nfo +text/x-setext etx +text/x-sfv sfv +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +# text/xml +# text/xml-external-parsed-entity +# video/1d-interleaved-parityfec +video/3gpp 3gp +# video/3gpp-tt +video/3gpp2 3g2 +# video/bmpeg +# video/bt656 +# video/celb +# video/dv +# video/example +video/h261 h261 +video/h263 h263 +# video/h263-1998 +# video/h263-2000 +video/h264 h264 +# video/h264-rcdo +# video/h264-svc +video/jpeg jpgv +# video/jpeg2000 +video/jpm jpm jpgm +video/mj2 mj2 mjp2 +# video/mp1s +# video/mp2p +# video/mp2t +video/mp4 mp4 mp4v mpg4 +# video/mp4v-es +video/mpeg mpeg mpg mpe m1v m2v +# video/mpeg4-generic +# video/mpv +# video/nv +video/ogg ogv +# video/parityfec +# video/pointer +video/quicktime qt mov +# video/raw +# video/rtp-enc-aescm128 +# video/rtx +# video/smpte292m +# video/ulpfec +# video/vc1 +# video/vnd.cctv +video/vnd.dece.hd uvh uvvh +video/vnd.dece.mobile uvm uvvm +# video/vnd.dece.mp4 +video/vnd.dece.pd uvp uvvp +video/vnd.dece.sd uvs uvvs +video/vnd.dece.video uvv uvvv +# video/vnd.directv.mpeg +# video/vnd.directv.mpeg-tts +# video/vnd.dlna.mpeg-tts +video/vnd.dvb.file dvb +video/vnd.fvt fvt +# video/vnd.hns.video +# video/vnd.iptvforum.1dparityfec-1010 +# video/vnd.iptvforum.1dparityfec-2005 +# video/vnd.iptvforum.2dparityfec-1010 +# video/vnd.iptvforum.2dparityfec-2005 +# video/vnd.iptvforum.ttsavc +# video/vnd.iptvforum.ttsmpeg2 +# video/vnd.motorola.video +# video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.ms-playready.media.pyv pyv +# video/vnd.nokia.interleaved-multimedia +# video/vnd.nokia.videovoip +# video/vnd.objectvideo +# video/vnd.sealed.mpeg1 +# video/vnd.sealed.mpeg4 +# video/vnd.sealed.swf +# video/vnd.sealedmedia.softseal.mov +video/vnd.uvvu.mp4 uvu uvvu +video/vnd.vivo viv +video/webm webm +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-m4v m4v +video/x-matroska mkv mk3d mks +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-vob vob +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +video/x-smv smv +x-conference/x-cooltalk ice diff --git a/src/Gzip.php b/src/Gzip.php new file mode 100644 index 0000000..290ebc3 --- /dev/null +++ b/src/Gzip.php @@ -0,0 +1,93 @@ += filemtime($filename . '.gz')) { + unlink($filename . '.gz'); + } else { + unlink($filename); + } + } + + if (file_exists($filename) && !file_exists($filename . '.gz')) { + `gzip $filename`; + } + } + + public static function unlink($filename) + { + if (file_exists($filename)) { + unlink($filename); + } + if (file_exists($filename . '.gz')) { + unlink($filename . '.gz'); + } + } + + public static function file_exists($filename) + { + return file_exists($filename . '.gz') || file_exists($filename); + } + + public static function filemtime($filename) + { + if (file_exists($filename . '.gz')) { + return filemtime($filename . '.gz'); + } else if (file_exists($filename)) { + return filemtime($filename); + } else { + return false; + } + } + + public static function file_get_contents($filename) + { + self::_filename($filename); + $fp = self::_fopen($filename, 'rb'); + $res = stream_get_contents($fp); + fclose($fp); + return $res; + } + + public static function file_put_contents($filename, $data, $compression = 7, $mode = 'w') + { + self::_filename($filename, true); + $fp = self::_fopen($filename, $mode, $compression); + $res = fwrite($fp, $data); + fclose($fp); + return $res; + } + + protected static function _fopen($filename, $mode, $compression = 7) + { + $protocol = self::_protocol($filename); + if ($protocol == 'compress.zlib://') { + $mode .= $compression; + } + return fopen($protocol . $filename, $mode); + } + + protected static function _protocol($filename) + { + if (Files::getExtension($filename) == 'gz') { + $protocol = 'compress.zlib://'; + } else { + $protocol = ''; + } + return $protocol; + } + + protected static function _filename(&$filename, $forceGzip = false) + { + if ($forceGzip || (!file_exists($filename) && file_exists($filename . '.gz'))) { + $filename .= '.gz'; + } + } + +} diff --git a/src/Html.php b/src/Html.php new file mode 100644 index 0000000..06e9ec8 --- /dev/null +++ b/src/Html.php @@ -0,0 +1,15 @@ + $value) { + $col = floor($i / $perPart); + $res[$col][] = $value; + $i++; + } + + if ($flatten) { + $r = array(); + for ($i = 0; $i < $perPart; $i++) { + foreach ($res as $col => $elements) { + if (isset($elements[$i])) { + $r[] = $elements[$i]; + } + } + } + + $res = $r; + } + + return $res; + } + +} diff --git a/src/Math.php b/src/Math.php new file mode 100644 index 0000000..357326e --- /dev/null +++ b/src/Math.php @@ -0,0 +1,154 @@ + $max) { + $s = $min; + $min = $max; + $max = $s; + } + + return max(min($val, 100), 0); + } + + public static function round($val, $precision = 0) { + if (is_int($precision)) { + return round($val, $precision); + } + return round($val * $precision) / $precision; + } + + public static function fill($val, $nb, $fill = '0') { + return str_pad((string) $val, $nb, $fill, STR_PAD_LEFT); + } + + public static function isOdd($i) { + return abs($i) % 2 == 1; + } + + public static function toRoman($i, $upper = false) { + $entier = intval($i); + if ($entier < 1 || $entier > 9999) { + return ''; + } + + $rom[3] = array("M", "", "", ""); + $rom[2] = array("C", "CD", "D", "CM"); + $rom[1] = array("X", "XL", "L", "XC"); + $rom[0] = array("I", "IV", "V", "IX"); + + $i = 1; + $n = 0; + $romain = ""; + + for ($n = 0; $n < 4; $n++) { + $chiffre = intval(($entier % ($i * 10)) / $i); + if ($n < 3) { + if ($chiffre < 4) { + while ($chiffre > 0) { + $romain = $rom[$n][0] . $romain; + $chiffre--; + } + } elseif ($chiffre == 4) + $romain = $rom[$n][1] . $romain; + elseif ($chiffre < 9) { + while ($chiffre > 5) { + $romain = $rom[$n][0] . $romain; + $chiffre--; + } + $romain = $rom[$n][2] . $romain; + } else + $romain = $rom[$n][3] . $romain; + } else { + while ($chiffre > 0) { + $romain = $rom[$n][0] . $romain; + $chiffre--; + } + } + $i = $i * 10; + } + if (!$upper) { + $romain = strtolower($romain); + } + return $romain; + } + + public static function toPDFLetter($i, $upper = false) { + $dividende = floor($i / 26) + 1; + $reste = ($i % 26) + 1; + + $char = chr(64 + $reste); + if (!$upper) { + $char = strtolower($char); + } + + return str_repeat($char, $dividende); + } + + public static function moyenne() { + $args = func_get_args(); + if (!count($args)) { + return 0; + } + if (is_array($args[0])) { + $args = $args[0]; + if (!count($args)) { + return 0; + } + } + return array_sum($args) / count($args); + } + + // # http://www.php.net/manual/fr/function.stats-standard-deviation.php#66447 + // The average function can be use independantly but the deviation function uses the average function. + public static function ecart_type($array) { + if (!count($array)) { + return 0; + } + $avg = self::moyenne($array); + $variance = 0; + foreach ($array as $value) { + $variance += pow($value - $avg, 2); + } + $deviation = sqrt($variance / (count($array))); + return $deviation; + } + + public static function is_int($val) { + if (is_int($val)) { + return true; + } + if (is_string($val)) { + $v = (string) (int) $val; + if ($val == $v) { + return true; + } + } + return false; + } + + public static function compare($x, $y, $tolerance = 1) { + $diff = $x / $y; + if ($diff < 1) { + $diff = 1 / $diff; + } + if ($tolerance < 1) { + $tolerance = 1 / $tolerance; + } + + return ($diff <= $tolerance); + } + + /** + * + * @param int $n + * @return string + */ + public static function num2alpha($n) { + for ($r = ""; $n >= 0; $n = intval($n / 26) - 1) + $r = chr($n % 26 + 0x41) . $r; + return $r; + } + +} diff --git a/src/ObjectUtil.php b/src/ObjectUtil.php new file mode 100644 index 0000000..cbc196b --- /dev/null +++ b/src/ObjectUtil.php @@ -0,0 +1,33 @@ +getFileName(); + } + + public static function neverStop($ignoreUserAbort = true) + { + set_time_limit(0); + if ($ignoreUserAbort) { + ignore_user_abort(true); + } + } + + /** + * @param $file + * @return mixed + */ + public static function instanciateClassInFile($file) + { + $content = file_get_contents($file); + $tokens = token_get_all($content); + $namespace = ''; + for ($index = 0; isset($tokens[$index]); $index++) { + if (!isset($tokens[$index][0])) { + continue; + } + if (T_NAMESPACE === $tokens[$index][0]) { + $index += 2; // Skip namespace keyword and whitespace + while (isset($tokens[$index]) && is_array($tokens[$index])) { + $namespace .= $tokens[$index++][1]; + } + } + if (T_CLASS === $tokens[$index][0] && T_WHITESPACE === $tokens[$index + 1][0] && T_STRING === $tokens[$index + 2][0]) { + $index += 2; // Skip class keyword and whitespace + $fqcns[] = $namespace . '\\' . $tokens[$index][1]; + + # break if you have one class per file (psr-4 compliant) + # otherwise you'll need to handle class constants (Foo::class) + break; + } + } + if (count($fqcns) > 0) { + $class = array_shift($fqcns); + } else { + return null; + } + if (null !== $class) { + return new $class(); + } + return null; + } +} diff --git a/src/Serializer.php b/src/Serializer.php new file mode 100644 index 0000000..0c7ebe1 --- /dev/null +++ b/src/Serializer.php @@ -0,0 +1,47 @@ + $val) { + $o = $i; + if ($way == self::ASCENDING) { + $o = $count - $i; + } + + if (is_object($val)) { + $datas[$id]->$p = $o; + } else { + $datas[$id][$p] = $o; + } + $i++; + } + } + + protected static function natural($a, $b) { + $ca = self::getAttrib($a); + $cb = self::getAttrib($b); + + if (is_numeric($ca)) { + return $ca - $cb; + } else if (is_string($ca)) { + return strcmp(strtolower(Text::removeAccents($ca)), strtolower(Text::removeAccents($cb))); + } + } + + public static function getAttrib($v) { + if (is_array($v)) { + return $v[self::$_on]; + } else { + return $v->{self::$_on}; + } + } + +} diff --git a/src/Str.php b/src/Str.php new file mode 100644 index 0000000..53ef969 --- /dev/null +++ b/src/Str.php @@ -0,0 +1,37 @@ + $p) { + $str = preg_replace('|[' . $p . ']|u', $r, $str); + } + return $str; + } + + public static function getAccentsPattern() + { + $pattern = array(); + $pattern['A'] = '\x{00C0}-\x{00C5}'; + $pattern['AE'] = '\x{00C6}'; + $pattern['C'] = '\x{00C7}'; + $pattern['D'] = '\x{00D0}'; + $pattern['E'] = '\x{00C8}-\x{00CB}'; + $pattern['I'] = '\x{00CC}-\x{00CF}'; + $pattern['N'] = '\x{00D1}'; + $pattern['O'] = '\x{00D2}-\x{00D6}\x{00D8}'; + $pattern['OE'] = '\x{0152}'; + $pattern['S'] = '\x{0160}'; + $pattern['U'] = '\x{00D9}-\x{00DC}'; + $pattern['Y'] = '\x{00DD}'; + $pattern['Z'] = '\x{017D}'; + + $pattern['a'] = '\x{00E0}-\x{00E5}'; + $pattern['ae'] = '\x{00E6}'; + $pattern['c'] = '\x{00E7}'; + $pattern['d'] = '\x{00F0}'; + $pattern['e'] = '\x{00E8}-\x{00EB}'; + $pattern['i'] = '\x{00EC}-\x{00EF}'; + $pattern['n'] = '\x{00F1}'; + $pattern['o'] = '\x{00F2}-\x{00F6}\x{00F8}'; + $pattern['oe'] = '\x{0153}'; + $pattern['s'] = '\x{0161}'; + $pattern['u'] = '\x{00F9}-\x{00FC}'; + $pattern['y'] = '\x{00FD}\x{00FF}'; + $pattern['z'] = '\x{017E}'; + + $pattern['ss'] = '\x{00DF}'; + return $pattern; + } + + public static function removeAccents($str, $clean = true) + { + $pattern = self::getAccentsPattern(); + if ($clean) { + $str = self::cleanUTF8($str); + $del = array('’' => ' ', '”' => ' ', '“' => ' ', '•' => ' ', '…' => ' ', '€' => ' ', + '–' => ' ', '‘' => ' '); + foreach ($del as $d => $p) { + $str = str_replace($d, $p, $str); + } + } + foreach ($pattern as $r => $p) { + $str = preg_replace('/[' . $p . ']/u', $r, $str); + } + + $from = 'o'; + $to = 'o'; + + $str = strtr($str, $from, $to); + + return $str; + } + + public static function keepOnlyLettersAndDigits($str) + { + return self::condenseWhite(preg_replace('|[^0-9A-Za-z]|ui', ' ', self::removeAccents($str))); + } + + public static function makeAccentInsensiblePattern($str) + { + $patterns = self::getAccentsPattern(); + $chars = preg_split('//ui', $str, -1, PREG_SPLIT_NO_EMPTY); + $pattern = '|'; + foreach ($chars as $char) { + if (isset($patterns[$char])) { + $pattern .= '['; + $pattern .= $char; + $pattern .= $patterns[$char]; + $pattern .= ']{1}'; + } else { + $pattern .= $char; + } + } + $pattern .= '|iu'; + return $pattern; + } + + public static function preg_areplace($search, $replace, $subject) + { + $pattern = self::makeAccentInsensiblePattern($search); + return preg_replace($pattern, $replace, $subject); + } + + public static function multiExplode($separator, $str, $limit = null) + { + $seps = array('§', '£', '¤', '#', '¨', '^', '%'); + foreach ($seps as $sep) { + if (stristr($str, $sep)) { + continue; + } + break; + } + + $str = preg_replace('|[' . preg_quote($separator, '-') . ']|', $sep, $str); + if (is_null($limit)) { + return explode($sep, $str); + } else { + return explode($sep, $str, $limit); + } + } + + public static function countWords($str) + { + return count(preg_split('|\s|', $str)); + } + + public static function explodeNewLines($str) + { + $str = trim($str); + if ($str === '') { + return []; + } + $str = self::condenseNewLines($str); + return preg_split('|\v|', $str); + } + + public static function substrWord($str, $words, $end = '', $wordsorig = null) + { + if (is_null($wordsorig)) { + $wordsorig = $words; + } + + $maxchars = $wordsorig * 6; + + $o = self::countWords($str); + if ($o <= $words) { + $res = $str; + $addend = false; + } else { + $e = self::multiExplode(" \n", $str, $words); + array_pop($e); + $res = implode(' ', $e); + $addend = true; + } + if (mb_strlen($res) > $maxchars) { + return self::substrWord($str, $words - 1, $end, $wordsorig); + } + + if ($addend) { + $res .= $end; + } + + return $res; + } + + public static function substrWordChars($str, $chars, $end = '') + { + if (strlen($str) <= $chars) { + return $str; + } + + $str = trim(substr($str, 0, $chars)); + $s = preg_split('|\s+|', $str); + array_pop($s); + return implode(' ', $s) . $end; + } + + public static function ucfirst($str, $lower = false) + { + if ($lower) { + $str = mb_strtolower($str); + } + $first = mb_substr($str, 0, 1); + $suite = mb_substr($str, 1); + return mb_strtoupper($first) . $suite; + } + + public static function removeNl($str) + { + $trans = array("\n" => ' ', "\r" => ' '); + $str = strtr($str, $trans); + return self::condenseWhite($str); + } + + public static function condenseWhite($str) + { + return preg_replace('|[\s]{2,100}|u', ' ', $str); + } + + public static function condenseNewLines($str) + { + $str = self::normalizeLines($str); + $str = preg_replace('|\n{2,100}|', "\n", $str); + return $str; + } + + public static function html2text($str) + { + $res = self::strip_tags($str); + $res = str_replace(' ', ' ', $res); + + return $res; + } + + public static function strip_tags($str, $allowed_tags = array(), $trim = false) + { + // return preg_replace('|\<.*\>|uU', '', $str); + // http://www.php.net/manual/fr/function.strip-tags.php#86463 + if (!is_array($allowed_tags)) { + $allowed_tags = !empty($allowed_tags) ? array($allowed_tags) : array(); + } + $tags = implode('|', $allowed_tags); + + if (empty($tags)) { + $tags = '[a-z]+'; + } + + preg_match_all('@@i', $str, $matches); + + $full_tags = $matches[0]; + $tag_names = $matches[1]; + + foreach ($full_tags as $i => $full_tag) { + if (!in_array($tag_names[$i], $allowed_tags)) { + if ($trim) { + unset($full_tags[$i]); + } else { + $str = str_replace($full_tag, '', $str); + } + } + } + + return $trim ? implode('', $full_tags) : $str; + } + + public static function str2URL($str, $replace = '-', $exclude_slashs = false, $exclude_dots = false) + { + if (is_object($str)) { + $str = json_encode($str); + } + $str = str_replace('&', '&', $str); + $str = str_replace(':', ' ', $str); + if (!$exclude_slashs) { + $str = str_replace('/', ' ', $str); + } + + $str = self::deaccent($str); + $str = preg_replace('/[^A-Za-z0-9_\s\'\:\/[\]-]/', '', $str); + + return self::tidyURL($str, true); + + } + + public static function cleanUTF8($str, $replace = '?') + { + while (($bad_index = self::utf8badFind($str)) !== false) { + $str = substr_replace($str, $replace, $bad_index, 1); + } + $str = str_replace('', $replace, $str); + $str = str_replace('', $replace, $str); + return $str; + } + + public static function getChar($code) + { + $code = trim($code, '&;'); + return html_entity_decode('&' . $code . ';', ENT_QUOTES, 'UTF-8'); + } + + public static function randText($length = 300) + { + $str = 'aeiouy azertyuiopqsdfghjklmwxcvbn eaiouaeiou '; + $list = str_split($str); + $nb = strlen($str) - 1; + $res = ''; + for ($i = 0; $i <= $length; $i++) { + $pos = rand(0, $nb); + $res .= $list[$pos]; + } + return $res; + } + + public static function splitWordsWithCase($str) + { + $non_word = '\x{0000}-\x{002F}\x{003A}-\x{0040}\x{005b}-\x{0060}\x{007B}-\x{007E}\x{00A0}-\x{00BF}\s'; + if (preg_match_all('/([^' . $non_word . ']{3,})/msu', html::clean($str), $match)) { + foreach ($match[1] as $i => $v) { + $match[1][$i] = $v; + } + return $match[1]; + } + return array(); + } + + public static function find_words_from_list($str, $list) + { + $words = array_unique(self::splitWordsWithCase($str));; + if (is_array($list)) { + $liste = $list; + } else { + $liste = array_unique(self::splitWords($list)); + } + + $l = array(); + foreach ($words as $ll) { + $lll = self::removeAccents($ll); + $lll = strtolower($lll); + $liste_real[$lll][] = $ll; + $l[] = $lll; + } + + $diff = array_intersect($liste, $l); + $res = array(); + if ($diff) { + foreach ($diff as $d) { + $res = array_merge($res, $liste_real[$d]); + } + return $res; + } + return false; + } + + public static function mb_str_split($string) + { + $stop = mb_strlen($string); + $result = array(); + + for ($idx = 0; $idx < $stop; $idx++) { + $result[] = mb_substr($string, $idx, 1); + } + + return $result; + } + + public static function strToArray($str) + { + return self::mb_str_split($str); + } + + public static function utf8ToUnicode($str) + { + $mState = 0; // cached expected number of octets after the current octet + // until the beginning of the next UTF8 character sequence + $mUcs4 = 0; // cached Unicode character + $mBytes = 1; // cached expected number of octets in the current sequence + + $out = array(); + + $len = strlen($str); + for ($i = 0; $i < $len; $i++) { + $in = ord($str{$i}); + if (0 == $mState) { + // When mState is zero we expect either a US-ASCII character or a + // multi-octet sequence. + if (0 == (0x80 & ($in))) { + // US-ASCII, pass straight through. + $out[] = $in; + $mBytes = 1; + } else if (0xC0 == (0xE0 & ($in))) { + // First octet of 2 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x1F) << 6; + $mState = 1; + $mBytes = 2; + } else if (0xE0 == (0xF0 & ($in))) { + // First octet of 3 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x0F) << 12; + $mState = 2; + $mBytes = 3; + } else if (0xF0 == (0xF8 & ($in))) { + // First octet of 4 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x07) << 18; + $mState = 3; + $mBytes = 4; + } else if (0xF8 == (0xFC & ($in))) { + /* First octet of 5 octet sequence. + * + * This is illegal because the encoded codepoint must be either + * (a) not the shortest form or + * (b) outside the Unicode range of 0-0x10FFFF. + * Rather than trying to resynchronize, we will carry on until the end + * of the sequence and let the later error handling code catch it. + */ + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x03) << 24; + $mState = 4; + $mBytes = 5; + } else if (0xFC == (0xFE & ($in))) { + // First octet of 6 octet sequence, see comments for 5 octet sequence. + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 1) << 30; + $mState = 5; + $mBytes = 6; + } else { + /* Current octet is neither in the US-ASCII range nor a legal first + * octet of a multi-octet sequence. + */ + return false; + } + } else { + // When mState is non-zero, we expect a continuation of the multi-octet + // sequence + if (0x80 == (0xC0 & ($in))) { + // Legal continuation. + $shift = ($mState - 1) * 6; + $tmp = $in; + $tmp = ($tmp & 0x0000003F) << $shift; + $mUcs4 |= $tmp; + + if (0 == --$mState) { + /* End of the multi-octet sequence. mUcs4 now contains the final + * Unicode codepoint to be output + * + * Check for illegal sequences and codepoints. + */ + // From Unicode 3.1, non-shortest form is illegal + if (((2 == $mBytes) && ($mUcs4 < 0x0080)) || + ((3 == $mBytes) && ($mUcs4 < 0x0800)) || + ((4 == $mBytes) && ($mUcs4 < 0x10000)) || + (4 < $mBytes) || + // From Unicode 3.2, surrogate characters are illegal + (($mUcs4 & 0xFFFFF800) == 0xD800) || + // Codepoints outside the Unicode range are illegal + ($mUcs4 > 0x10FFFF) + ) { + return false; + } + if (0xFEFF != $mUcs4) { + // BOM is legal but we don't want to output it + $out[] = $mUcs4; + } + // initialize UTF8 cache + $mState = 0; + $mUcs4 = 0; + $mBytes = 1; + } + } else { + /* ((0xC0 & (*in) != 0x80) && (mState != 0)) + * + * Incomplete multi-octet sequence. + */ + return false; + } + } + } + return $out; + } + + /** + * Takes an array of ints representing the Unicode characters and returns + * a UTF-8 string. Astral planes are supported ie. the ints in the + * input can be > 0xFFFF. Occurrances of the BOM are ignored. Surrogates + * are not allowed. + * + * Returns false if the input array contains ints that represent + * surrogates or are outside the Unicode range. + */ + public static function unicodeToUtf8($arr) + { + $dest = ''; + foreach ($arr as $src) { + if ($src < 0) { + return false; + } else if ($src <= 0x007f) { + $dest .= chr($src); + } else if ($src <= 0x07ff) { + $dest .= chr(0xc0 | ($src >> 6)); + $dest .= chr(0x80 | ($src & 0x003f)); + } else if ($src == 0xFEFF) { + // nop -- zap the BOM + } else if ($src >= 0xD800 && $src <= 0xDFFF) { + // found a surrogate + return false; + } else if ($src <= 0xffff) { + $dest .= chr(0xe0 | ($src >> 12)); + $dest .= chr(0x80 | (($src >> 6) & 0x003f)); + $dest .= chr(0x80 | ($src & 0x003f)); + } else if ($src <= 0x10ffff) { + $dest .= chr(0xf0 | ($src >> 18)); + $dest .= chr(0x80 | (($src >> 12) & 0x3f)); + $dest .= chr(0x80 | (($src >> 6) & 0x3f)); + $dest .= chr(0x80 | ($src & 0x3f)); + } else { + // out of range + return false; + } + } + return $dest; + } + + public static function uchr($n) + { + return self::unicodeToUtf8(array($n)); + } + + public static function uord($c) + { + $r = self::utf8ToUnicode($c); + return array_shift($r); + } + + public static function strcmp($s1, $s2, $ignoreCase = false, $ignoreAccents = false, $trim = false) + { + if ($trim !== false) { + $s1 = trim($s1, $trim); + $s2 = trim($s2, $trim); + } + if ($ignoreAccents) { + $s1 = self::removeAccents($s1); + $s2 = self::removeAccents($s2); + } + if ($ignoreCase) { + $s1 = mb_strtolower($s1); + $s2 = mb_strtolower($s2); + } + + return strcmp($s1, $s2); + } + + public static function removeNewLines($input) + { + $res = preg_replace("|\s+|", ' ', $input); + return $res; + } + + /** + * + * @param string $str + * @param boolean $compact + * @return array + */ + public static function splitLines($str, $compact = true) + { + $str = str_replace("\r\n", "\n", $str); + $str = str_replace("\r", "\n", $str); + $str = explode("\n", $str); + + if (!$compact) { + return $str; + } + + $res = array(); + foreach ($str as $s) { + $s = trim($s); + if ($s == '') { + continue; + } + $res[] = $s; + } + return $res; + } + + public static function parseUrl($url, $forceScheme = true) + { + $url = trim($url); + if (substr($url, 0, 2) == '//') { + $url = 'http:' . $url; + } + $res = parse_url($url); + if ($forceScheme && !isset($res['scheme'])) { + $url = 'http://' . $url; + $res = parse_url($url); + } + + if (isset($res['query'])) { + parse_str($res['query'], $tmp); + $res['query_params'] = $tmp; + } + + if (isset($res['path'])) { + $components = explode('/', trim($res['path'], '/')); + $filteredComponents = array(); + foreach ($components as $c) { + if ($c == '') { + continue; + } + $filteredComponents[] = $c; + } + $res['path_components'] = $filteredComponents; + } + return $res; + } + + public static function pluriel($nb, $singulier, $pluriel, $zero = false, $displayNb = true) + { + $nb = intval($nb); + $res = ''; + if ($displayNb) { + $res .= $nb . ' '; + } + if ($nb == 0 && $zero) { + return $zero; + } + if ($nb <= 1) { + $res .= $singulier; + } else { + $res .= $pluriel; + } + return $res; + } + + public static function normalizeLines($text, $os = 'nix') + { + $text = str_replace("\r\n", "\n", $text); + $text = str_replace("\r", "\n", $text); + if ($os == 'win') { + return str_replace("\n", "\r\n", $text); + } + return $text; + } + + public static function underscoreToCamelCase($str, $upperFirst = false) + { + return Str::camel($str); + } + + public static function camelCaseToUnderscore($str) + { + return Str::snake($str); + } + + // Stops orphans in HTML by replacing the last space with a   + public static function preventOrphans($str) + { + + $find = ' '; // What to search for + $replace = ' '; // What to replace it with + + $last_space = strrpos($str, $find); // Find last occurrence in string + + if ($last_space !== false) { + $str = substr_replace($str, $replace, $last_space, strlen($find)); + } + + // Also replace punctuation that has spaces before it (eg. in French) + $punctuations = array(' :', ' !', ' ?', '« ', ' »'); + $replacements = array("{$replace}:", "{$replace}!", "{$replace}?", "«{$replace}", "{$replace}»"); + $str = str_replace($punctuations, $replacements, $str); + + return $str; + } + + /** + * Check email address + * + * Returns true if $email is a valid email address. + * + * @param string $email Email string + * @return boolean + * @link http://www.iamcal.com/publish/articles/php/parsing_email/ + * + * @copyright Cal Henderson + * @license http://creativecommons.org/licenses/by-sa/2.5/ CC-BY-SA + */ + public static function isEmail($email) + { + $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'; + $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]'; + $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+'; + $quoted_pair = '\\x5c[\\x00-\\x7f]'; + $domain_literal = "\\x5b($dtext|$quoted_pair)*\\x5d"; + $quoted_string = "\\x22($qtext|$quoted_pair)*\\x22"; + $domain_ref = $atom; + $sub_domain = "($domain_ref|$domain_literal)"; + $word = "($atom|$quoted_string)"; + $domain = "$sub_domain(\\x2e$sub_domain)*"; + $local_part = "$word(\\x2e$word)*"; + $addr_spec = "$local_part\\x40$domain"; + + return (boolean)preg_match("!^$addr_spec$!", $email); + } + + /** + * Accents replacement + * + * Replaces some occidental accentuated characters by their ASCII + * representation. + * + * @param string $str String to deaccent + * @return string + */ + public static function deaccent($str) + { + $pattern['A'] = '\x{00C0}-\x{00C5}'; + $pattern['AE'] = '\x{00C6}'; + $pattern['C'] = '\x{00C7}'; + $pattern['D'] = '\x{00D0}'; + $pattern['E'] = '\x{00C8}-\x{00CB}'; + $pattern['I'] = '\x{00CC}-\x{00CF}'; + $pattern['N'] = '\x{00D1}'; + $pattern['O'] = '\x{00D2}-\x{00D6}\x{00D8}'; + $pattern['OE'] = '\x{0152}'; + $pattern['S'] = '\x{0160}'; + $pattern['U'] = '\x{00D9}-\x{00DC}'; + $pattern['Y'] = '\x{00DD}'; + $pattern['Z'] = '\x{017D}'; + + $pattern['a'] = '\x{00E0}-\x{00E5}'; + $pattern['ae'] = '\x{00E6}'; + $pattern['c'] = '\x{00E7}'; + $pattern['d'] = '\x{00F0}'; + $pattern['e'] = '\x{00E8}-\x{00EB}'; + $pattern['i'] = '\x{00EC}-\x{00EF}'; + $pattern['n'] = '\x{00F1}'; + $pattern['o'] = '\x{00F2}-\x{00F6}\x{00F8}'; + $pattern['oe'] = '\x{0153}'; + $pattern['s'] = '\x{0161}'; + $pattern['u'] = '\x{00F9}-\x{00FC}'; + $pattern['y'] = '\x{00FD}\x{00FF}'; + $pattern['z'] = '\x{017E}'; + + $pattern['ss'] = '\x{00DF}'; + + foreach ($pattern as $r => $p) { + $str = preg_replace('/[' . $p . ']/u', $r, $str); + } + + return $str; + } + + /** + * URL cleanup + * + * @param string $str URL to tidy + * @param boolean $keep_slashes Keep slashes in URL + * @param boolean $keep_spaces Keep spaces in URL + * @return string + */ + public static function tidyURL($str, $keep_slashes = true, $keep_spaces = false) + { + $str = strip_tags($str); + $str = str_replace(array('?', '&', '#', '=', '+', '<', '>', '"', '%'), '', $str); + $str = str_replace("'", ' ', $str); + $str = preg_replace('/[\s]+/u', ' ', trim($str)); + + if (!$keep_slashes) { + $str = str_replace('/', '-', $str); + } + + if (!$keep_spaces) { + $str = str_replace(' ', '-', $str); + } + + $str = preg_replace('/[-]+/', '-', $str); + + # Remove path changes in URL + $str = preg_replace('%^/%', '', $str); + $str = preg_replace('%\.+/%', '', $str); + + return $str; + } + + /** + * Cut string + * + * Returns a cuted string on spaced at given length $l. + * + * @param string $str String to cut + * @param integer $l Length to keep + * @return string + */ + public static function cutString($str, $l) + { + $s = preg_split('/([\s]+)/u', $str, -1, PREG_SPLIT_DELIM_CAPTURE); + + $res = ''; + $L = 0; + + if (mb_strlen($s[0]) >= $l) { + return mb_substr($s[0], 0, $l); + } + + foreach ($s as $v) { + $L = $L + mb_strlen($v); + + if ($L > $l) { + break; + } else { + $res .= $v; + } + } + + return trim($res); + } + + /** + * Split words + * + * Returns an array of words from a given string. + * + * @param string $str Words to split + * @return array + */ + public static function splitWords($str, $minChar = 3) + { + $non_word = '\x{0000}-\x{002F}\x{003A}-\x{0040}\x{005b}-\x{0060}\x{007B}-\x{007E}\x{00A0}-\x{00BF}\s'; + if (preg_match_all('/([^' . $non_word . ']{' . $minChar . ',})/msu', html::clean($str), $match)) { + foreach ($match[1] as $i => $v) { + $match[1][$i] = mb_strtolower($v); + } + return $match[1]; + } + return array(); + } + + /** + * Encoding detection + * + * Returns the encoding (in lowercase) of given $str. + * + * @param string $str String + * @return string + */ + public static function detectEncoding($str) + { + return strtolower(mb_detect_encoding($str . ' ', + 'UTF-8,ISO-8859-1,ISO-8859-2,ISO-8859-3,' . + 'ISO-8859-4,ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8,' . + 'ISO-8859-9,ISO-8859-10,ISO-8859-13,ISO-8859-14,ISO-8859-15')); + } + + /** + * Find bad UTF8 tokens + * + * Locates the first bad byte in a UTF-8 string returning it's + * byte index in the string + * PCRE Pattern to locate bad bytes in a UTF-8 string + * Comes from W3 FAQ: Multilingual Forms + * Note: modified to include full ASCII range including control chars + * + * @param string $str String to search + * @return integer|false + * @link http://phputf8.sourceforge.net + * + * @copyright Harry Fuecks + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU LGPL 2.1 + */ + public static function utf8badFind($str) + { + $UTF8_BAD = + '([\x00-\x7F]' . # ASCII (including control chars) + '|[\xC2-\xDF][\x80-\xBF]' . # non-overlong 2-byte + '|\xE0[\xA0-\xBF][\x80-\xBF]' . # excluding overlongs + '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}' . # straight 3-byte + '|\xED[\x80-\x9F][\x80-\xBF]' . # excluding surrogates + '|\xF0[\x90-\xBF][\x80-\xBF]{2}' . # planes 1-3 + '|[\xF1-\xF3][\x80-\xBF]{3}' . # planes 4-15 + '|\xF4[\x80-\x8F][\x80-\xBF]{2}' . # plane 16 + '|(.{1}))'; # invalid byte + $pos = 0; + $badList = array(); + + while (preg_match('/' . $UTF8_BAD . '/S', $str, $matches)) { + $bytes = strlen($matches[0]); + if (isset($matches[2])) { + return $pos; + } + $pos += $bytes; + $str = substr($str, $bytes); + } + return false; + } + + + /** + * BOM removal + * + * Removes BOM from the begining of a string if present. + * + * @param string $str String to clean + * @return string + */ + public static function removeBOM($str) + { + if (substr_count($str, '')) { + return str_replace('', '', $str); + } + + return $str; + } + + /** + * Quoted printable conversion + * + * Encodes given str to quoted printable + * + * @param string $str String to encode + * @return string + */ + public static function QPEncode($str) + { + $res = ''; + + foreach (preg_split("/\r?\n/msu", $str) as $line) { + $l = ''; + preg_match_all('/./', $line, $m); + + foreach ($m[0] as $c) { + $a = ord($c); + + if ($a < 32 || $a == 61 || $a > 126) { + $c = sprintf('=%02X', $a); + } + + $l .= $c; + } + + $res .= $l . "\r\n"; + } + return $res; + } + +} \ No newline at end of file diff --git a/src/Url.php b/src/Url.php new file mode 100644 index 0000000..53eee9b --- /dev/null +++ b/src/Url.php @@ -0,0 +1,80 @@ + $v) { + $o[] = $k . '=' . rawurlencode($v); + } + if (count($o)) { + $res .= '?' . implode('&', $o); + } + return $res; + } + + public static function sameDomain($url, $domain, $site_url, $acceptSubdomain = false) + { + if (self::isLocal($url, $site_url)) { + return true; + } + + $host = parse_url($url, PHP_URL_HOST); + if (!$acceptSubdomain) { + return $host == $domain; + } + return preg_match("/" . $domain . "$/", $host); + } + + public static function getFilePath($url, $site_url, $public_path) + { + if (self::isLocal($url, $site_url)) { + return $public_path . $url; + } + } + +} diff --git a/src/WebVideo.php b/src/WebVideo.php new file mode 100644 index 0000000..850086d --- /dev/null +++ b/src/WebVideo.php @@ -0,0 +1,127 @@ +filter($url); + list($service, $videoId) = explode(':', $urlf); + if ($service == 'http' || $service == 'https') { + $service = 'generic'; + $videoId = $urlf; + } + $finalUrl = self::getIframeUrl($service, $videoId); + if (!$finalUrl) { + return false; + } + return true; + } + + public static function getIframeUrl($service, $id = null, $options = array()) { + if (null === $id || stristr($service, ':')) { + $filter = new CubeIT_Filter_WebVideo(); + $urlf = $filter->filter($service); + list($service, $id) = explode(':', $urlf); + } + + $s = Text::ucfirst($service, true); + $f = '_get' . $s . 'Url'; + $refl = new \ReflectionClass(get_class()); + if (!$refl->hasMethod($f)) { + return false; + } + return self::$f($id, $options); + } + + protected static function _getGenericUrl($url) { + $meta = Html::getMicrodata($url); + + $res = ''; + foreach ($meta->getElementsByTagName('*') as $m) { + /** @var $m MicrodataDOM\DOMElement */ + if (strcasecmp($m->getAttribute('itemtype'), 'http://schema.org/VideoObject') === 0) { + foreach ($m->getElementsByTagName('*') as $e) { + if (strcasecmp($e->getAttribute('itemprop'), 'embedUrl') === 0) { + /** @var $e MicrodataDOM\DOMElement */ + $res = $e->getAttribute('content'); + } + } + } + } + + if (!$res) { + return false; + } + + if (stristr($url, 'bfmtv')) { + $res = str_replace('idVideo', 'videoId', $res); + } + + return $res; + } + + protected static function _getYoutubeUrl($id, $options = array()) { + $url = 'https://www.youtube.com/embed/' . $id; + return self::_getUrl($url, $options); + } + + protected static function _getCnbcUrl($id, $options = array()) { + $url = 'http://player.cnbc.com/p/gZWlPC/cnbc_global?playertype=synd&byGuid=' . $id; + return self::_getUrl($url, $options); + } + + protected static function _getKalturaUrl($id, $options = array()) { + $confid = $options['playerId']; + $options['playerId'] = 'p_' . rand(1, 100000); + $options['wid'] = $options['widgetId'] = '_' . $options['partnerId']; + + $url = 'http://cdnapi.kaltura.com/html5/html5lib/v1.6.12.40/mwEmbedFrame.php/p/' . $options['partnerId'] + . '/uiconf_id/' . $confid . '/entry_id/' . $id; + + return self::_getUrl($url, $options); + } + + protected static function _getDantubeUrl($id, $options = array()) { + $options['playerId'] = '10247951'; + $options['partnerId'] = '1073192'; + $options['widgetId'] = '1_d89zinhy'; + return self::_getKalturaUrl($id, $options); + } + + protected static function _getDailymotionUrl($id, $options = array()) { + $url = 'https://www.dailymotion.com/embed/video/' . $id; + return self::_getUrl($url, $options); + } + + protected static function _getVimeoUrl($id, $options = array()) { + $url = 'https://player.vimeo.com/video/' . $id; + return self::_getUrl($url, $options); + } + + protected static function _getCubetubeUrl($id, $options = array()) { + $url = 'https://extranet.cubedesigners.com/tools/tube'; + return self::_getUrl($url, $options); + } + + protected static function _getFacebookUrl($id, $options) { + $url = 'https://www.facebook.com/video/embed'; + $options['video_id'] = $id; + return self::_getUrl($url, $options); + } + + protected static function _getUrl($url, $options) { + $res = $url; + $o = array(); + foreach ($options as $k => $v) { + $o[] = $k . '=' . rawurldecode($v); + } + if (count($o)) { + $res .= '?' . implode('&', $o); + } + return $res; + } + +} diff --git a/src/XML/DOMSelector.php b/src/XML/DOMSelector.php new file mode 100644 index 0000000..a375218 --- /dev/null +++ b/src/XML/DOMSelector.php @@ -0,0 +1,179 @@ +_dom = $data; + } else { + libxml_use_internal_errors(true); + $this->_dom = new DOMDocument(); + @$this->_dom->loadHTML('' . $data); + } + + $this->xpath = new DOMXpath($this->_dom); + } + + /** + * @return DOMDocument + */ + public function getDOM() + { + return $this->_dom; + } + + public function select($selector, $as_array = true) + { + $elements = $this->xpath->evaluate(self::selector_to_xpath($selector)); + return $as_array ? self::elements_to_array($elements) : $elements; + } + + /** + * Select elements from $html using the css $selector. + * When $as_array is true elements and their children will + * be converted to array's containing the following keys (defaults to true): + * + * - name : element name + * - text : element text + * - children : array of children elements + * - attributes : attributes array + * + * Otherwise regular DOMElement's will be returned. + */ + public static function select_elements($selector, $html, $as_array = true) + { + $dom = new DOMSelector($html); + return $dom->select($selector, $as_array); + } + + /** + * Convert $elements to an array. + */ + public static function elements_to_array($elements) + { + $array = array(); + for ($i = 0, $length = $elements->length; $i < $length; ++$i) + if ($elements->item($i)->nodeType == XML_ELEMENT_NODE) + array_push($array, self::element_to_array($elements->item($i))); + return $array; + } + + /** + * Convert $element to an array. + */ + public static function element_to_array($element) + { + $array = array( + 'name' => $element->nodeName, + 'attributes' => array(), + 'text' => $element->textContent, + 'children' => self::elements_to_array($element->childNodes) + ); + if ($element->attributes->length) + foreach ($element->attributes as $key => $attr) + $array['attributes'][$key] = $attr->value; + return $array; + } + + /** + * Convert $selector into an XPath string. + */ + function selector_to_xpath($selector) + { + // remove spaces around operators + $selector = preg_replace('/\s*>\s*/', '>', $selector); + $selector = preg_replace('/\s*~\s*/', '~', $selector); + $selector = preg_replace('/\s*\+\s*/', '+', $selector); + $selector = preg_replace('/\s*,\s*/', ',', $selector); + $selectors = preg_split('/\s+(?![^\[]+\])/', $selector); + foreach ($selectors as &$selector) { + // , + $selector = preg_replace('/,/', '|descendant-or-self::', $selector); + // input:checked, :disabled, etc. + $selector = preg_replace('/(.+)?:(checked|disabled|required|autofocus)/', '\1[@\2="\2"]', $selector); + // input:autocomplete, :autocomplete + $selector = preg_replace('/(.+)?:(autocomplete)/', '\1[@\2="on"]', $selector); + // input:button, input:submit, etc. + $selector = preg_replace('/:(text|password|checkbox|radio|button|submit|reset|file|hidden|image|datetime|datetime-local|date|month|time|week|number|range|email|url|search|tel|color)/', 'input[@type="\1"]', $selector); + // foo[id] + $selector = preg_replace('/(\w+)\[([_\w-]+[_\w\d-]*)\]/', '\1[@\2]', $selector); + // [id] + $selector = preg_replace('/\[([_\w-]+[_\w\d-]*)\]/', '*[@\1]', $selector); + // foo[id=foo] + $selector = preg_replace('/\[([_\w-]+[_\w\d-]*)=[\'"]?(.*?)[\'"]?\]/', '[@\1="\2"]', $selector); + // [id=foo] + $selector = preg_replace('/^\[/', '*[', $selector); + // div#foo + $selector = preg_replace('/([_\w-]+[_\w\d-]*)\#([_\w-]+[_\w\d-]*)/', '\1[@id="\2"]', $selector); + // #foo + $selector = preg_replace('/\#([_\w-]+[_\w\d-]*)/', '*[@id="\1"]', $selector); + // div.foo + $selector = preg_replace('/([_\w-]+[_\w\d-]*)\.([_\w-]+[_\w\d-]*)/', '\1[contains(concat(" ",@class," ")," \2 ")]', $selector); + // .foo + $selector = preg_replace('/\.([_\w-]+[_\w\d-]*)/', '*[contains(concat(" ",@class," ")," \1 ")]', $selector); + // div:first-child + $selector = preg_replace('/([_\w-]+[_\w\d-]*):first-child/', '*/\1[position()=1]', $selector); + // div:last-child + $selector = preg_replace('/([_\w-]+[_\w\d-]*):last-child/', '*/\1[position()=last()]', $selector); + // :first-child + $selector = str_replace(':first-child', '*/*[position()=1]', $selector); + // :last-child + $selector = str_replace(':last-child', '*/*[position()=last()]', $selector); + // :nth-last-child + $selector = preg_replace('/:nth-last-child\((\d+)\)/', '[position()=(last() - (\1 - 1))]', $selector); + // div:nth-child + $selector = preg_replace('/([_\w-]+[_\w\d-]*):nth-child\((\d+)\)/', '*/*[position()=\2 and self::\1]', $selector); + // :nth-child + $selector = preg_replace('/:nth-child\((\d+)\)/', '*/*[position()=\1]', $selector); + // :contains(Foo) + $selector = preg_replace('/([_\w-]+[_\w\d-]*):contains\((.*?)\)/', '\1[contains(string(.),"\2")]', $selector); + // > + $selector = preg_replace('/>/', '/', $selector); + // ~ + $selector = preg_replace('/~/', '/following-sibling::', $selector); + // + + $selector = preg_replace('/\+([_\w-]+[_\w\d-]*)/', '/following-sibling::\1[position()=1]', $selector); + $selector = str_replace(']*', ']', $selector); + $selector = str_replace(']/*', ']', $selector); + } + // ' ' + $selector = implode('/descendant::', $selectors); + $selector = 'descendant-or-self::' . $selector; + // :scope + $selector = preg_replace('/(((\|)?descendant-or-self::):scope)/', '.\3', $selector); + // $element + $sub_selectors = explode(',', $selector); + foreach ($sub_selectors as $key => $sub_selector) { + $parts = explode('$', $sub_selector); + $sub_selector = array_shift($parts); + if (count($parts) && preg_match_all('/((?:[^\/]*\/?\/?)|$)/', $parts[0], $matches)) { + $results = $matches[0]; + $results[] = str_repeat('/..', count($results) - 2); + $sub_selector .= implode('', $results); + } + $sub_selectors[$key] = $sub_selector; + } + $selector = implode(',', $sub_selectors); + + return $selector; + } +} diff --git a/src/Xml.php b/src/Xml.php new file mode 100644 index 0000000..49a05dc --- /dev/null +++ b/src/Xml.php @@ -0,0 +1,100 @@ +loadHTML('' . $str); + $res = simplexml_import_dom($doc); + return $res; + } + + public static function toObject(\SimpleXMLElement $xml) { + self::$_empty = new \stdClass(); + + $e = json_encode($xml); + $o = json_decode($e); + self::_fixAttributes($o); + self::_fixComments($o); + self::_fixEmpty($o); + return $o; + } + + public static function tidyXML(\SimpleXMLElement $xml, $filename = null) { + $dom = dom_import_simplexml($xml)->ownerDocument; + $dom->formatOutput = true; + $tidy = $dom->saveXML(); + if (is_null($filename)) { + return $tidy; + } + file_put_contents($filename, $tidy); + } + + protected static function _fixAttributes(&$o) { + foreach ($o as $k => $v) { + if (is_object($o) && $k == "@attributes") { + foreach ($v as $ak => $av) { + $ak = '_' . $ak; + $o->$ak = $av; + } + unset($o->{"@attributes"}); + } elseif (is_array($v) || is_object($v)) { + if (is_array($o)) { + self::_fixAttributes($o[$k]); + } else { + self::_fixAttributes($o->$k); + } + } + } + } + + protected static function _fixComments(&$o) { + foreach ($o as $k => $v) { + if ($k == 'comment') { + unset($o->$k); + } elseif (is_array($v) || is_object($v)) { + if (is_array($o)) { + self::_fixComments($o[$k]); + } else { + self::_fixComments($o->$k); + } + } + } + } + + protected static function _fixEmpty(&$o) { + foreach ($o as $k => $v) { + if (is_object($v)) { + if ($v == self::$_empty) { + $o->$k = ''; + continue; + } + } + + if (is_array($v) || is_object($v)) { + if (is_array($o)) { + self::_fixEmpty($o[$k]); + } else { + self::_fixEmpty($o->$k); + } + } + } + } + + public static function innerXML(\DOMElement $e){ + $innerHTML= ''; + $children = $e->childNodes; + foreach ($children as $child) { + $innerHTML .= $child->ownerDocument->saveXML( $child ); + } + + return $innerHTML; + } + +} \ No newline at end of file diff --git a/src/Zip.php b/src/Zip.php new file mode 100644 index 0000000..498b902 --- /dev/null +++ b/src/Zip.php @@ -0,0 +1,47 @@ +cd($dir); + $cl->setArg('o'); + $cl->setArg(null, $zip); + $cl->execute(); + } else if (class_exists('ZipArchive')) { + $za = new \ZipArchive(); + $za->open($zip); + $za->extractTo($dir); + $za->close(); + } + } + + public static function archive($source, $zip) + { + $zipexe = 'zip'; + + $cl = new CommandLine($zipexe); + if (is_array($source)) { + $cl->setArg('j'); + $cl->setArg(null, $zip); + foreach ($source as $item) { + $cl->setArg(null, $item); + } + } else if (@is_dir($source)) { + $cl->cd($source); + $cl->setArg('r'); + $cl->setArg(null, $zip); + $cl->setArg(null, '*'); + } + $cl->execute(); + } + +} \ No newline at end of file