}
],
"autoload": {
- "psr-0": {
- "Cubist\\Util": "src\/"
+ "psr-4": {
+ "Cubist\\Util": "src"
}
},
"authors": [
--- /dev/null
+<?php
+namespace Cubist\Util;
+class ArrayUtil {
+
+ public static function removeValue(&$input, $value, $strict = false) {
+ $key = array_search($value, $input, $strict);
+ if ($key === false) {
+ return;
+ }
+ unset($input[$key]);
+ }
+
+ public static function flatten($a)
+ {
+ $res = array();
+ foreach($a as $k => $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;
+ }
+
+}
--- /dev/null
+<?php
+namespace Cubist\Util;
+class Base64 {
+
+ public static function decode($str) {
+ return base64_decode($str);
+ }
+
+ public static function encode($str) {
+ return base64_encode($str);
+ }
+
+}
\ No newline at end of file
--- /dev/null
+<?php
+
+namespace Cubist\Util;
+class Boolean
+{
+ // http://php.net/manual/fr/function.boolval.php#116547
+ public static function boolval($val, $return_null = false, $asString = false)
+ {
+ $boolval = (is_string($val) ? filter_var($val, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) : (bool)$val);
+ $res = ($boolval === null && !$return_null ? false : $boolval);
+ if (null === $res) {
+ return 'null';
+ } else if ($res === false) {
+ return 'false';
+ } else if ($res === true) {
+ return 'true';
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php
+
+namespace Cubist\Util;
+
+use Cubist\Net\SSH2;
+
+class CommandLine
+{
+
+ protected $program;
+ protected $args = array();
+ protected $env = array();
+ protected $cd = null;
+ protected $commande = null;
+ protected $output;
+ protected $temp_output = true;
+ protected $error;
+ protected $nohup = false;
+ protected $execTime;
+ protected $lang;
+ protected $ssh = null;
+ protected $longArgSeparator = '=';
+
+ function __construct($program, $output = null, $error = true)
+ {
+ if (stristr($program, ' ')) {
+ $program = '"' . $program . '"';
+ }
+ $this->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));
+ }
+
+}
+++ /dev/null
-<?php
-namespace Cubist\Util;
-class ArrayUtil {
-
- public static function removeValue(&$input, $value, $strict = false) {
- $key = array_search($value, $input, $strict);
- if ($key === false) {
- return;
- }
- unset($input[$key]);
- }
-
- public static function flatten($a)
- {
- $res = array();
- foreach($a as $k => $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;
- }
-
-}
+++ /dev/null
-<?php
-namespace Cubist\Util;
-class Base64 {
-
- public static function decode($str) {
- return base64_decode($str);
- }
-
- public static function encode($str) {
- return base64_encode($str);
- }
-
-}
\ No newline at end of file
+++ /dev/null
-<?php
-
-namespace Cubist\Util;
-class Boolean
-{
- // http://php.net/manual/fr/function.boolval.php#116547
- public static function boolval($val, $return_null = false, $asString = false)
- {
- $boolval = (is_string($val) ? filter_var($val, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) : (bool)$val);
- $res = ($boolval === null && !$return_null ? false : $boolval);
- if (null === $res) {
- return 'null';
- } else if ($res === false) {
- return 'false';
- } else if ($res === true) {
- return 'true';
- }
- }
-}
\ No newline at end of file
+++ /dev/null
-<?php
-
-namespace Cubist\Util;
-
-use Cubist\Net\SSH2;
-
-class CommandLine
-{
-
- protected $program;
- protected $args = array();
- protected $env = array();
- protected $cd = null;
- protected $commande = null;
- protected $output;
- protected $temp_output = true;
- protected $error;
- protected $nohup = false;
- protected $execTime;
- protected $lang;
- protected $ssh = null;
- protected $longArgSeparator = '=';
-
- function __construct($program, $output = null, $error = true)
- {
- if (stristr($program, ' ')) {
- $program = '"' . $program . '"';
- }
- $this->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));
- }
-
-}
+++ /dev/null
-<?php
-
-namespace Cubist\Util\Files;
-class Files
-{
-
- protected static $_mimeTypes = null;
-
- public static function rmdir($dir)
- {
- $files = self::getRecursiveDirectoryIterator($dir, \RecursiveIteratorIterator::CHILD_FIRST);
-
- foreach ($files as $file) {
- if ($file->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
+++ /dev/null
-<?php
-
-namespace Cubist\Util\Files;
-class RecursiveDirectoryIterator extends \RecursiveFilterIterator {
-
- protected $_exclude = array();
-
- public function __construct($path, $exclude = array()) {
- if ($path instanceof \RecursiveIterator) {
- $it = $path;
- } else {
- $it = new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS);
- }
- $this->_exclude = $exclude;
-
- parent::__construct($it);
- }
-
- public function accept() {
- return !in_array($this->current()->getFilename(), $this->_exclude);
- }
-
-}
\ No newline at end of file
+++ /dev/null
-<?php
-
-namespace Cubist\Util\Files;
-class VirtualDirectory
-{
-
- protected $_path;
- protected $_copy;
- protected $_directories;
- protected $_contents;
- protected $_tmp;
- protected $_dirs = array();
-
- public function __construct($path)
- {
- if (!file_exists($path)) {
- mkdir($path, 0777, true);
- $path = realpath($path);
- }
-
- $this->_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
+++ /dev/null
-# 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 <http://www.iana.org/assignments/media-types/>.
-#
-# 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
+++ /dev/null
-<?php
-
-namespace Cubist\Util;
-use Cubist\Util\Files\Files;
-
-class Gzip
-{
- public static function compressIfNotCompressed($filename)
- {
- if (file_exists($filename) && file_exists($filename . '.gz')) {
- if (filemtime($filename) >= 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';
- }
- }
-
-}
+++ /dev/null
-<?php
-
-namespace Cubist\Util;
-class Html
-{
-
- public static function isHtml($s)
- {
- if (!is_string($s)) {
- return false;
- }
- return (substr($s, 0, 1) == '<');
- }
-
-}
+++ /dev/null
-<?php
-
-namespace Cubist\Util;
-
-
-class Json
-{
- const TYPE_OBJECT = false;
- const TYPE_ARRAY = true;
-
- /**
- *
- * @param mixed $v
- * @return boolean
- */
- public static function isJson($v)
- {
- if (!is_string($v)) {
- return false;
- }
-
- $v = trim($v);
-
- $firstchar = mb_substr($v, 0, 1);
- $lastchar = mb_substr($v, -1);
- return (($firstchar == '[' && $lastchar == ']') || ($firstchar == '{' && $lastchar == '}'));
- }
-
- public static function decode($encodedValue, $objectDecodeType = self::TYPE_OBJECT)
- {
- if ((is_array($encodedValue) && $objectDecodeType === self::TYPE_ARRAY) ||
- (is_object($encodedValue) && $objectDecodeType === self::TYPE_OBJECT)
- ) {
- return $encodedValue;
- } else if (is_array($encodedValue) || is_object($encodedValue)) {
- $encodedValue = self::encode($encodedValue);
- }
- try {
- return json_decode($encodedValue, $objectDecodeType);
- } catch (\Exception $e) {
- return null;
- }
- }
-
- public static function encode($valueToEncode)
- {
- return json_encode($valueToEncode);
- }
-
- public static function decodeRecursive($encodedValue, $objectDecodeType = self::TYPE_OBJECT)
- {
- $v = $encodedValue;
- if (is_string($encodedValue)) {
- $v = json_decode($encodedValue);
-
- if (!$v) {
- return $encodedValue;
- }
- }
-
- if (null === $v || is_bool($v) || is_numeric($v) || is_scalar($v)) {
- return $v;
- }
-
- $v = ArrayUtil::asArray($v);
-
- array_walk_recursive($v, function (&$v, $k) {
- if (is_string($v)) {
- $v_decoded = json_decode($v, true);
- if ($v_decoded) {
- $v = $v_decoded;
- }
- }
- });
-
- return json_decode(json_encode($v), $objectDecodeType);
- }
-
-}
\ No newline at end of file
+++ /dev/null
-<?php
-namespace Cubist\Util;
-class ListUtil {
-
- public static function slice($list, $parts = 2) {
- return array_chunk($list, $parts, true);
- }
-
- public static function divide($list, $parts = 2, $flatten = false) {
- $res = array();
- $total = count($list);
-
- if ($total == 0) {
- return array(array());
- }
-
- $parts = min($parts, count($list));
-
- if ($parts == 1) {
- return array($list);
- }
-
- $perPart = ceil($total / $parts);
- for ($i = 0; $i < $parts; $i++) {
- $res[$i] = array();
- }
-
- $i = 0;
- foreach ($list as $key => $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;
- }
-
-}
+++ /dev/null
-<?php
-namespace Cubist\Util;
-class Math {
-
- public static function interval($val, $min, $max) {
- if ($min > $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;
- }
-
-}
+++ /dev/null
-<?php
-namespace Cubist\Util;
-class ObjectUtil {
-
- protected $_orderOnProperty = null;
- protected $_orderOnIsMethod = false;
-
- public static function toArray($o) {
- if (is_array($o)) {
- return $o;
- }
- if (is_object($o)) {
- return get_object_vars($o);
- }
- }
-
- public static function cloneObject($o) {
- return unserialize(serialize($o));
- }
-
- /**
- * @param $o mixed
- * @return object \stdClass
- */
- public static function asObject($o) {
- if ($o instanceof \stdClass) {
- return $o;
- }
- return (object)$o;
- }
-
-
-}
+++ /dev/null
-<?php
-
-namespace Cubist\Util;
-class PHP
-{
- public static function getFileDeclaring($object)
- {
- $reflected = new \ReflectionClass($object);
- return $reflected->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;
- }
-}
+++ /dev/null
-<?php
-namespace Cubist\Util;
-
-class Serializer {
- const PHP = 'php';
- const IGBINARY = 'igbinary';
- const JSON = 'json';
- const AUTO = 'auto';
-
- public static function serialize($data, $format = self::AUTO) {
- self::_format($format, $data);
-
- if ($format == self::IGBINARY) {
- return igbinary_serialize($data);
- } elseif ($format == self::PHP) {
- return serialize($data);
- } elseif ($format == self::JSON) {
- return json_encode($data);
- }
- }
-
- public static function unserialize($string, $format = self::AUTO) {
- self::_format($format, $string);
-
- if ($format == self::IGBINARY) {
- return igbinary_unserialize($string);
- } elseif ($format == self::PHP) {
- return unserialize($string);
- } elseif ($format == self::JSON) {
- return json_decode($string);
- }
- }
-
- protected static function _format(&$format, $data) {
- if ($format == self::AUTO || $format == self::IGBINARY) {
- if (!function_exists('igbinary_serialize')) {
- $format = self::PHP;
- } else {
- $format = self::IGBINARY;
- }
- }
- if ($format == self::AUTO) {
- $format = self::PHP;
- }
- }
-
-}
\ No newline at end of file
+++ /dev/null
-<?php
-namespace Cubist\Util;
-class Sort {
-
- const ASCENDING = 'ASC';
- const DESCENDING = 'DESC';
- protected static $_on;
-
-
- public static function sort(&$collection, $on, $algorithm = null, $way = self::ASCENDING) {
- if (is_null($algorithm)) {
- $callback = array('self', 'natural');
- } else if (is_callable($algorithm)) {
- $callback = $algorithm;
- }
-
- self::$_on = $on;
-
- uasort($collection, $callback);
- }
-
- public static function addSortDatas(&$datas, $on, $algorithm = null, $way = self::ASCENDING) {
- $copy = $datas;
- $count = count($datas);
-
- self::sort($copy, $on, $algorithm, $way);
-
- $i = 0;
- $p = '_order' . Text::ucfirst($on);
- foreach ($copy as $id => $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};
- }
- }
-
-}
+++ /dev/null
-<?php
-
-namespace Cubist\Util;
-
-class Str extends \Illuminate\Support\Str
-{
- /**
- * Generate a URL friendly "slug" from a given string.
- *
- * @param string $title
- * @param string $separator
- * @param string|null $language
- * @return string
- */
- public static function slugCase($title, $separator = '-', $language = 'en')
- {
- $title = $language ? static::ascii($title, $language) : $title;
-
- // Convert all dashes/underscores into separator
- $flip = $separator === '-' ? '_' : '-';
-
- $title = preg_replace('![' . preg_quote($flip) . ']+!u', $separator, $title);
-
- // Replace @ with the word 'at'
- $title = str_replace('@', $separator . 'at' . $separator, $title);
-
- // Remove all characters that are not the separator, letters, numbers, or whitespace.
- $title = preg_replace('![^' . preg_quote($separator) . '\pL\pN\s]+!u', '', $title);
-
- // Replace all separator characters and whitespace by a single separator
- $title = preg_replace('![' . preg_quote($separator) . '\s]+!u', $separator, $title);
-
- return trim($title, $separator);
- }
-
-
-}
\ No newline at end of file
+++ /dev/null
-<?php
-
-namespace Cubist\Util;
-
-use Illuminate\Support\Str;
-
-class Text
-{
-
- public static function utf8_encode($text, $from = 'ISO-8859-1')
- {
- return self::toUTF8($text, $from);
- }
-
- public static function toUTF8($str, $encoding = null)
- {
- if (!$encoding) {
- $encoding = self::detectEncoding($str);
- }
-
- $str = iconv($encoding, 'UTF-8//TRANSLIT', $str);
- return self::removeOddStuff($str);
- }
-
- public static function removeOddStuff($str)
- {
- $pattern = array();
- $pattern["'"] = '\x{0092}\x{00b4}\x{0060}\x{2018}\x{2019}';
- $pattern['oe'] = '\x{009c}';
- $pattern['...'] = '\x{0085}';
- $pattern['Oe'] = '\x{008c}';
- $pattern[' '] = '\x{0096}';
- $pattern['«'] = '\x{0093}';
- $pattern['»'] = '\x{0094}';
-
- foreach ($pattern as $r => $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('@</?\s*(' . $tags . ')(\s+[a-z_]+=(\'[^\']+\'|"[^"]+"))*\s*/?>@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('\16', $replace, $str);
- $str = str_replace('\18', $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
+++ /dev/null
-<?php
-
-namespace Cubist\Util;
-class Url
-{
-
- public static function isLocal($url, $site_url)
- {
- if (strpos($url, $site_url) === 0) {
- return true;
- }
-
- if (substr($url, 0, 2) == "//") {
- return false;
- }
- $u = parse_url($url);
- if (isset($u['scheme']) && $u['scheme'] != '') {
- return false;
- }
- return true;
- }
-
- public static function extractPathComponents($path)
- {
- $path = urldecode($path);
- $path = trim($path, '/');
- if ($path == '') {
- return array();
- } else {
- return explode('/', $path);
- }
- }
-
- public static function isDistant($url, $site_url)
- {
- return !self::isLocal($url, $site_url);
- }
-
- public static function toAbsolute($url, $site_url)
- {
- if (substr($url, 0, 1) == '/') {
- $url = $site_url . $url;
- }
- return $url;
- }
-
- public static function createGetUrl($url, $options)
- {
- $res = $url;
- $o = array();
- foreach ($options as $k => $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;
- }
- }
-
-}
+++ /dev/null
-<?php
-namespace Cubist\Util;
-class WebVideo {
-
- public static function isWebVideo($url) {
- if (!$url) {
- return false;
- }
- $filter = new CubeIT_Filter_WebVideo();
- $urlf = $filter->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;
- }
-
-}
+++ /dev/null
-<?php
-
-/**
- * @see https://github.com/tj/php-selector
- */
-
-namespace Cubist\Util\XML;
-
-use DOMDocument;
-use DOMXPath;
-
-class DOMSelector
-{
- /**
- * @var DOMDocument
- */
- protected $_dom;
-
- /**
- * DOMSelector constructor.
- * @param $data DOMDocument|string
- */
- public function __construct($data)
- {
- if ($data instanceof DOMDocument) {
- $this->_dom = $data;
- } else {
- libxml_use_internal_errors(true);
- $this->_dom = new DOMDocument();
- @$this->_dom->loadHTML('<?xml encoding="utf-8" ?>' . $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;
- }
-}
+++ /dev/null
-<?php
-namespace Cubist\Util;
-class Xml {
-
- protected static $_empty;
-
- public static function simplexml_load_htmlfile($file) {
- return self::simplexml_load_html(file_get_contents($file));
- }
-
- public static function simplexml_load_html($str) {
- $doc = new \DOMDocument();
- $doc->loadHTML('<?xml encoding="UTF-8">' . $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
+++ /dev/null
-<?php
-
-namespace Cubist\Util;
-class Zip
-{
-
- public static function extract($zip, $dir)
- {
-
- if (!file_exists($dir)) {
- mkdir($dir, 0777, true);
- }
- if (true) {
- $cl = new CommandLine('unzip');
- $cl->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
--- /dev/null
+<?php
+
+namespace Cubist\Util\Files;
+class Files
+{
+
+ protected static $_mimeTypes = null;
+
+ public static function rmdir($dir)
+ {
+ $files = self::getRecursiveDirectoryIterator($dir, \RecursiveIteratorIterator::CHILD_FIRST);
+
+ foreach ($files as $file) {
+ if ($file->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
--- /dev/null
+<?php
+
+namespace Cubist\Util\Files;
+class RecursiveDirectoryIterator extends \RecursiveFilterIterator {
+
+ protected $_exclude = array();
+
+ public function __construct($path, $exclude = array()) {
+ if ($path instanceof \RecursiveIterator) {
+ $it = $path;
+ } else {
+ $it = new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS);
+ }
+ $this->_exclude = $exclude;
+
+ parent::__construct($it);
+ }
+
+ public function accept() {
+ return !in_array($this->current()->getFilename(), $this->_exclude);
+ }
+
+}
\ No newline at end of file
--- /dev/null
+<?php
+
+namespace Cubist\Util\Files;
+class VirtualDirectory
+{
+
+ protected $_path;
+ protected $_copy;
+ protected $_directories;
+ protected $_contents;
+ protected $_tmp;
+ protected $_dirs = array();
+
+ public function __construct($path)
+ {
+ if (!file_exists($path)) {
+ mkdir($path, 0777, true);
+ $path = realpath($path);
+ }
+
+ $this->_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
--- /dev/null
+# 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 <http://www.iana.org/assignments/media-types/>.
+#
+# 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
--- /dev/null
+<?php
+
+namespace Cubist\Util;
+use Cubist\Util\Files\Files;
+
+class Gzip
+{
+ public static function compressIfNotCompressed($filename)
+ {
+ if (file_exists($filename) && file_exists($filename . '.gz')) {
+ if (filemtime($filename) >= 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';
+ }
+ }
+
+}
--- /dev/null
+<?php
+
+namespace Cubist\Util;
+class Html
+{
+
+ public static function isHtml($s)
+ {
+ if (!is_string($s)) {
+ return false;
+ }
+ return (substr($s, 0, 1) == '<');
+ }
+
+}
--- /dev/null
+<?php
+
+namespace Cubist\Util;
+
+
+class Json
+{
+ const TYPE_OBJECT = false;
+ const TYPE_ARRAY = true;
+
+ /**
+ *
+ * @param mixed $v
+ * @return boolean
+ */
+ public static function isJson($v)
+ {
+ if (!is_string($v)) {
+ return false;
+ }
+
+ $v = trim($v);
+
+ $firstchar = mb_substr($v, 0, 1);
+ $lastchar = mb_substr($v, -1);
+ return (($firstchar == '[' && $lastchar == ']') || ($firstchar == '{' && $lastchar == '}'));
+ }
+
+ public static function decode($encodedValue, $objectDecodeType = self::TYPE_OBJECT)
+ {
+ if ((is_array($encodedValue) && $objectDecodeType === self::TYPE_ARRAY) ||
+ (is_object($encodedValue) && $objectDecodeType === self::TYPE_OBJECT)
+ ) {
+ return $encodedValue;
+ } else if (is_array($encodedValue) || is_object($encodedValue)) {
+ $encodedValue = self::encode($encodedValue);
+ }
+ try {
+ return json_decode($encodedValue, $objectDecodeType);
+ } catch (\Exception $e) {
+ return null;
+ }
+ }
+
+ public static function encode($valueToEncode)
+ {
+ return json_encode($valueToEncode);
+ }
+
+ public static function decodeRecursive($encodedValue, $objectDecodeType = self::TYPE_OBJECT)
+ {
+ $v = $encodedValue;
+ if (is_string($encodedValue)) {
+ $v = json_decode($encodedValue);
+
+ if (!$v) {
+ return $encodedValue;
+ }
+ }
+
+ if (null === $v || is_bool($v) || is_numeric($v) || is_scalar($v)) {
+ return $v;
+ }
+
+ $v = ArrayUtil::asArray($v);
+
+ array_walk_recursive($v, function (&$v, $k) {
+ if (is_string($v)) {
+ $v_decoded = json_decode($v, true);
+ if ($v_decoded) {
+ $v = $v_decoded;
+ }
+ }
+ });
+
+ return json_decode(json_encode($v), $objectDecodeType);
+ }
+
+}
\ No newline at end of file
--- /dev/null
+<?php
+namespace Cubist\Util;
+class ListUtil {
+
+ public static function slice($list, $parts = 2) {
+ return array_chunk($list, $parts, true);
+ }
+
+ public static function divide($list, $parts = 2, $flatten = false) {
+ $res = array();
+ $total = count($list);
+
+ if ($total == 0) {
+ return array(array());
+ }
+
+ $parts = min($parts, count($list));
+
+ if ($parts == 1) {
+ return array($list);
+ }
+
+ $perPart = ceil($total / $parts);
+ for ($i = 0; $i < $parts; $i++) {
+ $res[$i] = array();
+ }
+
+ $i = 0;
+ foreach ($list as $key => $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;
+ }
+
+}
--- /dev/null
+<?php
+namespace Cubist\Util;
+class Math {
+
+ public static function interval($val, $min, $max) {
+ if ($min > $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;
+ }
+
+}
--- /dev/null
+<?php
+namespace Cubist\Util;
+class ObjectUtil {
+
+ protected $_orderOnProperty = null;
+ protected $_orderOnIsMethod = false;
+
+ public static function toArray($o) {
+ if (is_array($o)) {
+ return $o;
+ }
+ if (is_object($o)) {
+ return get_object_vars($o);
+ }
+ }
+
+ public static function cloneObject($o) {
+ return unserialize(serialize($o));
+ }
+
+ /**
+ * @param $o mixed
+ * @return object \stdClass
+ */
+ public static function asObject($o) {
+ if ($o instanceof \stdClass) {
+ return $o;
+ }
+ return (object)$o;
+ }
+
+
+}
--- /dev/null
+<?php
+
+namespace Cubist\Util;
+class PHP
+{
+ public static function getFileDeclaring($object)
+ {
+ $reflected = new \ReflectionClass($object);
+ return $reflected->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;
+ }
+}
--- /dev/null
+<?php
+namespace Cubist\Util;
+
+class Serializer {
+ const PHP = 'php';
+ const IGBINARY = 'igbinary';
+ const JSON = 'json';
+ const AUTO = 'auto';
+
+ public static function serialize($data, $format = self::AUTO) {
+ self::_format($format, $data);
+
+ if ($format == self::IGBINARY) {
+ return igbinary_serialize($data);
+ } elseif ($format == self::PHP) {
+ return serialize($data);
+ } elseif ($format == self::JSON) {
+ return json_encode($data);
+ }
+ }
+
+ public static function unserialize($string, $format = self::AUTO) {
+ self::_format($format, $string);
+
+ if ($format == self::IGBINARY) {
+ return igbinary_unserialize($string);
+ } elseif ($format == self::PHP) {
+ return unserialize($string);
+ } elseif ($format == self::JSON) {
+ return json_decode($string);
+ }
+ }
+
+ protected static function _format(&$format, $data) {
+ if ($format == self::AUTO || $format == self::IGBINARY) {
+ if (!function_exists('igbinary_serialize')) {
+ $format = self::PHP;
+ } else {
+ $format = self::IGBINARY;
+ }
+ }
+ if ($format == self::AUTO) {
+ $format = self::PHP;
+ }
+ }
+
+}
\ No newline at end of file
--- /dev/null
+<?php
+namespace Cubist\Util;
+class Sort {
+
+ const ASCENDING = 'ASC';
+ const DESCENDING = 'DESC';
+ protected static $_on;
+
+
+ public static function sort(&$collection, $on, $algorithm = null, $way = self::ASCENDING) {
+ if (is_null($algorithm)) {
+ $callback = array('self', 'natural');
+ } else if (is_callable($algorithm)) {
+ $callback = $algorithm;
+ }
+
+ self::$_on = $on;
+
+ uasort($collection, $callback);
+ }
+
+ public static function addSortDatas(&$datas, $on, $algorithm = null, $way = self::ASCENDING) {
+ $copy = $datas;
+ $count = count($datas);
+
+ self::sort($copy, $on, $algorithm, $way);
+
+ $i = 0;
+ $p = '_order' . Text::ucfirst($on);
+ foreach ($copy as $id => $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};
+ }
+ }
+
+}
--- /dev/null
+<?php
+
+namespace Cubist\Util;
+
+class Str extends \Illuminate\Support\Str
+{
+ /**
+ * Generate a URL friendly "slug" from a given string.
+ *
+ * @param string $title
+ * @param string $separator
+ * @param string|null $language
+ * @return string
+ */
+ public static function slugCase($title, $separator = '-', $language = 'en')
+ {
+ $title = $language ? static::ascii($title, $language) : $title;
+
+ // Convert all dashes/underscores into separator
+ $flip = $separator === '-' ? '_' : '-';
+
+ $title = preg_replace('![' . preg_quote($flip) . ']+!u', $separator, $title);
+
+ // Replace @ with the word 'at'
+ $title = str_replace('@', $separator . 'at' . $separator, $title);
+
+ // Remove all characters that are not the separator, letters, numbers, or whitespace.
+ $title = preg_replace('![^' . preg_quote($separator) . '\pL\pN\s]+!u', '', $title);
+
+ // Replace all separator characters and whitespace by a single separator
+ $title = preg_replace('![' . preg_quote($separator) . '\s]+!u', $separator, $title);
+
+ return trim($title, $separator);
+ }
+
+
+}
\ No newline at end of file
--- /dev/null
+<?php
+
+namespace Cubist\Util;
+
+use Illuminate\Support\Str;
+
+class Text
+{
+
+ public static function utf8_encode($text, $from = 'ISO-8859-1')
+ {
+ return self::toUTF8($text, $from);
+ }
+
+ public static function toUTF8($str, $encoding = null)
+ {
+ if (!$encoding) {
+ $encoding = self::detectEncoding($str);
+ }
+
+ $str = iconv($encoding, 'UTF-8//TRANSLIT', $str);
+ return self::removeOddStuff($str);
+ }
+
+ public static function removeOddStuff($str)
+ {
+ $pattern = array();
+ $pattern["'"] = '\x{0092}\x{00b4}\x{0060}\x{2018}\x{2019}';
+ $pattern['oe'] = '\x{009c}';
+ $pattern['...'] = '\x{0085}';
+ $pattern['Oe'] = '\x{008c}';
+ $pattern[' '] = '\x{0096}';
+ $pattern['«'] = '\x{0093}';
+ $pattern['»'] = '\x{0094}';
+
+ foreach ($pattern as $r => $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('@</?\s*(' . $tags . ')(\s+[a-z_]+=(\'[^\']+\'|"[^"]+"))*\s*/?>@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('\16', $replace, $str);
+ $str = str_replace('\18', $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
--- /dev/null
+<?php
+
+namespace Cubist\Util;
+class Url
+{
+
+ public static function isLocal($url, $site_url)
+ {
+ if (strpos($url, $site_url) === 0) {
+ return true;
+ }
+
+ if (substr($url, 0, 2) == "//") {
+ return false;
+ }
+ $u = parse_url($url);
+ if (isset($u['scheme']) && $u['scheme'] != '') {
+ return false;
+ }
+ return true;
+ }
+
+ public static function extractPathComponents($path)
+ {
+ $path = urldecode($path);
+ $path = trim($path, '/');
+ if ($path == '') {
+ return array();
+ } else {
+ return explode('/', $path);
+ }
+ }
+
+ public static function isDistant($url, $site_url)
+ {
+ return !self::isLocal($url, $site_url);
+ }
+
+ public static function toAbsolute($url, $site_url)
+ {
+ if (substr($url, 0, 1) == '/') {
+ $url = $site_url . $url;
+ }
+ return $url;
+ }
+
+ public static function createGetUrl($url, $options)
+ {
+ $res = $url;
+ $o = array();
+ foreach ($options as $k => $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;
+ }
+ }
+
+}
--- /dev/null
+<?php
+namespace Cubist\Util;
+class WebVideo {
+
+ public static function isWebVideo($url) {
+ if (!$url) {
+ return false;
+ }
+ $filter = new CubeIT_Filter_WebVideo();
+ $urlf = $filter->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;
+ }
+
+}
--- /dev/null
+<?php
+
+/**
+ * @see https://github.com/tj/php-selector
+ */
+
+namespace Cubist\Util\XML;
+
+use DOMDocument;
+use DOMXPath;
+
+class DOMSelector
+{
+ /**
+ * @var DOMDocument
+ */
+ protected $_dom;
+
+ /**
+ * DOMSelector constructor.
+ * @param $data DOMDocument|string
+ */
+ public function __construct($data)
+ {
+ if ($data instanceof DOMDocument) {
+ $this->_dom = $data;
+ } else {
+ libxml_use_internal_errors(true);
+ $this->_dom = new DOMDocument();
+ @$this->_dom->loadHTML('<?xml encoding="utf-8" ?>' . $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;
+ }
+}
--- /dev/null
+<?php
+namespace Cubist\Util;
+class Xml {
+
+ protected static $_empty;
+
+ public static function simplexml_load_htmlfile($file) {
+ return self::simplexml_load_html(file_get_contents($file));
+ }
+
+ public static function simplexml_load_html($str) {
+ $doc = new \DOMDocument();
+ $doc->loadHTML('<?xml encoding="UTF-8">' . $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
--- /dev/null
+<?php
+
+namespace Cubist\Util;
+class Zip
+{
+
+ public static function extract($zip, $dir)
+ {
+
+ if (!file_exists($dir)) {
+ mkdir($dir, 0777, true);
+ }
+ if (true) {
+ $cl = new CommandLine('unzip');
+ $cl->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