]> _ Git - cubist_util.git/commitdiff
wip #3753
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Thu, 3 Dec 2020 12:42:21 +0000 (13:42 +0100)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Thu, 3 Dec 2020 12:42:21 +0000 (13:42 +0100)
49 files changed:
composer.json
src/ArrayUtil.php [new file with mode: 0644]
src/Base64.php [new file with mode: 0644]
src/Boolean.php [new file with mode: 0644]
src/CommandLine.php [new file with mode: 0644]
src/Cubist/Util/ArrayUtil.php [deleted file]
src/Cubist/Util/Base64.php [deleted file]
src/Cubist/Util/Boolean.php [deleted file]
src/Cubist/Util/CommandLine.php [deleted file]
src/Cubist/Util/Files/Files.php [deleted file]
src/Cubist/Util/Files/RecursiveDirectoryIterator.php [deleted file]
src/Cubist/Util/Files/VirtualDirectory.php [deleted file]
src/Cubist/Util/Files/mime.types [deleted file]
src/Cubist/Util/Gzip.php [deleted file]
src/Cubist/Util/Html.php [deleted file]
src/Cubist/Util/Json.php [deleted file]
src/Cubist/Util/ListUtil.php [deleted file]
src/Cubist/Util/Math.php [deleted file]
src/Cubist/Util/ObjectUtil.php [deleted file]
src/Cubist/Util/PHP.php [deleted file]
src/Cubist/Util/Serializer.php [deleted file]
src/Cubist/Util/Sort.php [deleted file]
src/Cubist/Util/Str.php [deleted file]
src/Cubist/Util/Text.php [deleted file]
src/Cubist/Util/Url.php [deleted file]
src/Cubist/Util/WebVideo.php [deleted file]
src/Cubist/Util/XML/DOMSelector.php [deleted file]
src/Cubist/Util/Xml.php [deleted file]
src/Cubist/Util/Zip.php [deleted file]
src/Files/Files.php [new file with mode: 0644]
src/Files/RecursiveDirectoryIterator.php [new file with mode: 0644]
src/Files/VirtualDirectory.php [new file with mode: 0644]
src/Files/mime.types [new file with mode: 0644]
src/Gzip.php [new file with mode: 0644]
src/Html.php [new file with mode: 0644]
src/Json.php [new file with mode: 0644]
src/ListUtil.php [new file with mode: 0644]
src/Math.php [new file with mode: 0644]
src/ObjectUtil.php [new file with mode: 0644]
src/PHP.php [new file with mode: 0644]
src/Serializer.php [new file with mode: 0644]
src/Sort.php [new file with mode: 0644]
src/Str.php [new file with mode: 0644]
src/Text.php [new file with mode: 0644]
src/Url.php [new file with mode: 0644]
src/WebVideo.php [new file with mode: 0644]
src/XML/DOMSelector.php [new file with mode: 0644]
src/Xml.php [new file with mode: 0644]
src/Zip.php [new file with mode: 0644]

index a6a4862b960b47bcde0dca96c76c866d3916084d..88bcf589059e9df5b056dc7454d420f4e9021577 100644 (file)
@@ -11,8 +11,8 @@
     }
   ],
   "autoload": {
-    "psr-0": {
-      "Cubist\\Util": "src\/"
+    "psr-4": {
+      "Cubist\\Util": "src"
     }
   },
   "authors": [
diff --git a/src/ArrayUtil.php b/src/ArrayUtil.php
new file mode 100644 (file)
index 0000000..aef58b4
--- /dev/null
@@ -0,0 +1,161 @@
+<?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;
+       }
+
+}
diff --git a/src/Base64.php b/src/Base64.php
new file mode 100644 (file)
index 0000000..5cf8dd2
--- /dev/null
@@ -0,0 +1,13 @@
+<?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
diff --git a/src/Boolean.php b/src/Boolean.php
new file mode 100644 (file)
index 0000000..bfe1374
--- /dev/null
@@ -0,0 +1,19 @@
+<?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
diff --git a/src/CommandLine.php b/src/CommandLine.php
new file mode 100644 (file)
index 0000000..56fc23c
--- /dev/null
@@ -0,0 +1,257 @@
+<?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));
+       }
+
+}
diff --git a/src/Cubist/Util/ArrayUtil.php b/src/Cubist/Util/ArrayUtil.php
deleted file mode 100644 (file)
index aef58b4..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-<?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;
-       }
-
-}
diff --git a/src/Cubist/Util/Base64.php b/src/Cubist/Util/Base64.php
deleted file mode 100644 (file)
index 5cf8dd2..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<?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
diff --git a/src/Cubist/Util/Boolean.php b/src/Cubist/Util/Boolean.php
deleted file mode 100644 (file)
index bfe1374..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-<?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
diff --git a/src/Cubist/Util/CommandLine.php b/src/Cubist/Util/CommandLine.php
deleted file mode 100644 (file)
index 56fc23c..0000000
+++ /dev/null
@@ -1,257 +0,0 @@
-<?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));
-       }
-
-}
diff --git a/src/Cubist/Util/Files/Files.php b/src/Cubist/Util/Files/Files.php
deleted file mode 100644 (file)
index 420aeec..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-<?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
diff --git a/src/Cubist/Util/Files/RecursiveDirectoryIterator.php b/src/Cubist/Util/Files/RecursiveDirectoryIterator.php
deleted file mode 100644 (file)
index b9ab558..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-<?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
diff --git a/src/Cubist/Util/Files/VirtualDirectory.php b/src/Cubist/Util/Files/VirtualDirectory.php
deleted file mode 100644 (file)
index 35d8de2..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-<?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
diff --git a/src/Cubist/Util/Files/mime.types b/src/Cubist/Util/Files/mime.types
deleted file mode 100644 (file)
index da8cd69..0000000
+++ /dev/null
@@ -1,1588 +0,0 @@
-# This file maps Internet media types to unique file extension(s).
-# Although created for httpd, this file is used by many software systems
-# and has been placed in the public domain for unlimited redisribution.
-#
-# The table below contains both registered and (common) unregistered types.
-# A type that has no unique extension can be ignored -- they are listed
-# here to guide configurations toward known types and to make it easier to
-# identify "new" types.  File extensions are also commonly used to indicate
-# content languages and encodings, so choose them carefully.
-#
-# Internet media types should be registered as described in RFC 4288.
-# The registry is at <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
diff --git a/src/Cubist/Util/Gzip.php b/src/Cubist/Util/Gzip.php
deleted file mode 100644 (file)
index 290ebc3..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-<?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';
-               }
-       }
-
-}
diff --git a/src/Cubist/Util/Html.php b/src/Cubist/Util/Html.php
deleted file mode 100644 (file)
index 06e9ec8..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Cubist\Util;
-class Html
-{
-
-       public static function isHtml($s)
-       {
-               if (!is_string($s)) {
-                       return false;
-               }
-               return (substr($s, 0, 1) == '<');
-       }
-
-}
diff --git a/src/Cubist/Util/Json.php b/src/Cubist/Util/Json.php
deleted file mode 100644 (file)
index ea50766..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-<?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
diff --git a/src/Cubist/Util/ListUtil.php b/src/Cubist/Util/ListUtil.php
deleted file mode 100644 (file)
index ba0d67f..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<?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;
-       }
-
-}
diff --git a/src/Cubist/Util/Math.php b/src/Cubist/Util/Math.php
deleted file mode 100644 (file)
index 357326e..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-<?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;
-       }
-
-}
diff --git a/src/Cubist/Util/ObjectUtil.php b/src/Cubist/Util/ObjectUtil.php
deleted file mode 100644 (file)
index cbc196b..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<?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;
-       }
-
-
-}
diff --git a/src/Cubist/Util/PHP.php b/src/Cubist/Util/PHP.php
deleted file mode 100644 (file)
index fffb548..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<?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;
-    }
-}
diff --git a/src/Cubist/Util/Serializer.php b/src/Cubist/Util/Serializer.php
deleted file mode 100644 (file)
index 0c7ebe1..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<?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
diff --git a/src/Cubist/Util/Sort.php b/src/Cubist/Util/Sort.php
deleted file mode 100644 (file)
index 0402056..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-<?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};
-               }
-       }
-
-}
diff --git a/src/Cubist/Util/Str.php b/src/Cubist/Util/Str.php
deleted file mode 100644 (file)
index 53ef969..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-<?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
diff --git a/src/Cubist/Util/Text.php b/src/Cubist/Util/Text.php
deleted file mode 100644 (file)
index 55a9355..0000000
+++ /dev/null
@@ -1,951 +0,0 @@
-<?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('&nbsp;', ' ', $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('&amp;', '&', $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 &nbsp;
-    public static function preventOrphans($str)
-    {
-
-        $find = ' '; // What to search for
-        $replace = '&nbsp;'; // What to replace it with
-
-        $last_space = strrpos($str, $find); // Find last occurrence in string
-
-        if ($last_space !== false) {
-            $str = substr_replace($str, $replace, $last_space, strlen($find));
-        }
-
-        // Also replace punctuation that has spaces before it (eg. in French)
-        $punctuations = array(' :', ' !', ' ?', '« ', ' »');
-        $replacements = array("{$replace}:", "{$replace}!", "{$replace}?", "«{$replace}", "{$replace}»");
-        $str = str_replace($punctuations, $replacements, $str);
-
-        return $str;
-    }
-
-    /**
-     * Check email address
-     *
-     * Returns true if $email is a valid email address.
-     *
-     * @param string $email Email string
-     * @return boolean
-     * @link http://www.iamcal.com/publish/articles/php/parsing_email/
-     *
-     * @copyright Cal Henderson
-     * @license http://creativecommons.org/licenses/by-sa/2.5/ CC-BY-SA
-     */
-    public static function isEmail($email)
-    {
-        $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
-        $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
-        $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
-        $quoted_pair = '\\x5c[\\x00-\\x7f]';
-        $domain_literal = "\\x5b($dtext|$quoted_pair)*\\x5d";
-        $quoted_string = "\\x22($qtext|$quoted_pair)*\\x22";
-        $domain_ref = $atom;
-        $sub_domain = "($domain_ref|$domain_literal)";
-        $word = "($atom|$quoted_string)";
-        $domain = "$sub_domain(\\x2e$sub_domain)*";
-        $local_part = "$word(\\x2e$word)*";
-        $addr_spec = "$local_part\\x40$domain";
-
-        return (boolean)preg_match("!^$addr_spec$!", $email);
-    }
-
-    /**
-     * Accents replacement
-     *
-     * Replaces some occidental accentuated characters by their ASCII
-     * representation.
-     *
-     * @param string $str String to deaccent
-     * @return    string
-     */
-    public static function deaccent($str)
-    {
-        $pattern['A'] = '\x{00C0}-\x{00C5}';
-        $pattern['AE'] = '\x{00C6}';
-        $pattern['C'] = '\x{00C7}';
-        $pattern['D'] = '\x{00D0}';
-        $pattern['E'] = '\x{00C8}-\x{00CB}';
-        $pattern['I'] = '\x{00CC}-\x{00CF}';
-        $pattern['N'] = '\x{00D1}';
-        $pattern['O'] = '\x{00D2}-\x{00D6}\x{00D8}';
-        $pattern['OE'] = '\x{0152}';
-        $pattern['S'] = '\x{0160}';
-        $pattern['U'] = '\x{00D9}-\x{00DC}';
-        $pattern['Y'] = '\x{00DD}';
-        $pattern['Z'] = '\x{017D}';
-
-        $pattern['a'] = '\x{00E0}-\x{00E5}';
-        $pattern['ae'] = '\x{00E6}';
-        $pattern['c'] = '\x{00E7}';
-        $pattern['d'] = '\x{00F0}';
-        $pattern['e'] = '\x{00E8}-\x{00EB}';
-        $pattern['i'] = '\x{00EC}-\x{00EF}';
-        $pattern['n'] = '\x{00F1}';
-        $pattern['o'] = '\x{00F2}-\x{00F6}\x{00F8}';
-        $pattern['oe'] = '\x{0153}';
-        $pattern['s'] = '\x{0161}';
-        $pattern['u'] = '\x{00F9}-\x{00FC}';
-        $pattern['y'] = '\x{00FD}\x{00FF}';
-        $pattern['z'] = '\x{017E}';
-
-        $pattern['ss'] = '\x{00DF}';
-
-        foreach ($pattern as $r => $p) {
-            $str = preg_replace('/[' . $p . ']/u', $r, $str);
-        }
-
-        return $str;
-    }
-
-    /**
-     * URL cleanup
-     *
-     * @param string $str URL to tidy
-     * @param boolean $keep_slashes Keep slashes in URL
-     * @param boolean $keep_spaces Keep spaces in URL
-     * @return string
-     */
-    public static function tidyURL($str, $keep_slashes = true, $keep_spaces = false)
-    {
-        $str = strip_tags($str);
-        $str = str_replace(array('?', '&', '#', '=', '+', '<', '>', '"', '%'), '', $str);
-        $str = str_replace("'", ' ', $str);
-        $str = preg_replace('/[\s]+/u', ' ', trim($str));
-
-        if (!$keep_slashes) {
-            $str = str_replace('/', '-', $str);
-        }
-
-        if (!$keep_spaces) {
-            $str = str_replace(' ', '-', $str);
-        }
-
-        $str = preg_replace('/[-]+/', '-', $str);
-
-        # Remove path changes in URL
-        $str = preg_replace('%^/%', '', $str);
-        $str = preg_replace('%\.+/%', '', $str);
-
-        return $str;
-    }
-
-    /**
-     * Cut string
-     *
-     * Returns a cuted string on spaced at given length $l.
-     *
-     * @param string $str String to cut
-     * @param integer $l Length to keep
-     * @return    string
-     */
-    public static function cutString($str, $l)
-    {
-        $s = preg_split('/([\s]+)/u', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
-
-        $res = '';
-        $L = 0;
-
-        if (mb_strlen($s[0]) >= $l) {
-            return mb_substr($s[0], 0, $l);
-        }
-
-        foreach ($s as $v) {
-            $L = $L + mb_strlen($v);
-
-            if ($L > $l) {
-                break;
-            } else {
-                $res .= $v;
-            }
-        }
-
-        return trim($res);
-    }
-
-    /**
-     * Split words
-     *
-     * Returns an array of words from a given string.
-     *
-     * @param string $str Words to split
-     * @return array
-     */
-    public static function splitWords($str, $minChar = 3)
-    {
-        $non_word = '\x{0000}-\x{002F}\x{003A}-\x{0040}\x{005b}-\x{0060}\x{007B}-\x{007E}\x{00A0}-\x{00BF}\s';
-        if (preg_match_all('/([^' . $non_word . ']{' . $minChar . ',})/msu', html::clean($str), $match)) {
-            foreach ($match[1] as $i => $v) {
-                $match[1][$i] = mb_strtolower($v);
-            }
-            return $match[1];
-        }
-        return array();
-    }
-
-    /**
-     * Encoding detection
-     *
-     * Returns the encoding (in lowercase) of given $str.
-     *
-     * @param string $str String
-     * @return string
-     */
-    public static function detectEncoding($str)
-    {
-        return strtolower(mb_detect_encoding($str . ' ',
-            'UTF-8,ISO-8859-1,ISO-8859-2,ISO-8859-3,' .
-            'ISO-8859-4,ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8,' .
-            'ISO-8859-9,ISO-8859-10,ISO-8859-13,ISO-8859-14,ISO-8859-15'));
-    }
-
-    /**
-     * Find bad UTF8 tokens
-     *
-     * Locates the first bad byte in a UTF-8 string returning it's
-     * byte index in the string
-     * PCRE Pattern to locate bad bytes in a UTF-8 string
-     * Comes from W3 FAQ: Multilingual Forms
-     * Note: modified to include full ASCII range including control chars
-     *
-     * @param string $str String to search
-     * @return integer|false
-     * @link http://phputf8.sourceforge.net
-     *
-     * @copyright Harry Fuecks
-     * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU LGPL 2.1
-     */
-    public static function utf8badFind($str)
-    {
-        $UTF8_BAD =
-            '([\x00-\x7F]' .                          # ASCII (including control chars)
-            '|[\xC2-\xDF][\x80-\xBF]' .               # non-overlong 2-byte
-            '|\xE0[\xA0-\xBF][\x80-\xBF]' .           # excluding overlongs
-            '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}' .    # straight 3-byte
-            '|\xED[\x80-\x9F][\x80-\xBF]' .           # excluding surrogates
-            '|\xF0[\x90-\xBF][\x80-\xBF]{2}' .        # planes 1-3
-            '|[\xF1-\xF3][\x80-\xBF]{3}' .            # planes 4-15
-            '|\xF4[\x80-\x8F][\x80-\xBF]{2}' .        # plane 16
-            '|(.{1}))';                              # invalid byte
-        $pos = 0;
-        $badList = array();
-
-        while (preg_match('/' . $UTF8_BAD . '/S', $str, $matches)) {
-            $bytes = strlen($matches[0]);
-            if (isset($matches[2])) {
-                return $pos;
-            }
-            $pos += $bytes;
-            $str = substr($str, $bytes);
-        }
-        return false;
-    }
-
-
-    /**
-     * BOM removal
-     *
-     * Removes BOM from the begining of a string if present.
-     *
-     * @param string $str String to clean
-     * @return string
-     */
-    public static function removeBOM($str)
-    {
-        if (substr_count($str, '')) {
-            return str_replace('', '', $str);
-        }
-
-        return $str;
-    }
-
-    /**
-     * Quoted printable conversion
-     *
-     * Encodes given str to quoted printable
-     *
-     * @param string $str String to encode
-     * @return string
-     */
-    public static function QPEncode($str)
-    {
-        $res = '';
-
-        foreach (preg_split("/\r?\n/msu", $str) as $line) {
-            $l = '';
-            preg_match_all('/./', $line, $m);
-
-            foreach ($m[0] as $c) {
-                $a = ord($c);
-
-                if ($a < 32 || $a == 61 || $a > 126) {
-                    $c = sprintf('=%02X', $a);
-                }
-
-                $l .= $c;
-            }
-
-            $res .= $l . "\r\n";
-        }
-        return $res;
-    }
-
-}
\ No newline at end of file
diff --git a/src/Cubist/Util/Url.php b/src/Cubist/Util/Url.php
deleted file mode 100644 (file)
index 53eee9b..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-<?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;
-               }
-       }
-
-}
diff --git a/src/Cubist/Util/WebVideo.php b/src/Cubist/Util/WebVideo.php
deleted file mode 100644 (file)
index 850086d..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-<?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;
-       }
-
-}
diff --git a/src/Cubist/Util/XML/DOMSelector.php b/src/Cubist/Util/XML/DOMSelector.php
deleted file mode 100644 (file)
index a375218..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-<?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;
-    }
-}
diff --git a/src/Cubist/Util/Xml.php b/src/Cubist/Util/Xml.php
deleted file mode 100644 (file)
index 49a05dc..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-<?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
diff --git a/src/Cubist/Util/Zip.php b/src/Cubist/Util/Zip.php
deleted file mode 100644 (file)
index 498b902..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<?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
diff --git a/src/Files/Files.php b/src/Files/Files.php
new file mode 100644 (file)
index 0000000..420aeec
--- /dev/null
@@ -0,0 +1,218 @@
+<?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
diff --git a/src/Files/RecursiveDirectoryIterator.php b/src/Files/RecursiveDirectoryIterator.php
new file mode 100644 (file)
index 0000000..b9ab558
--- /dev/null
@@ -0,0 +1,23 @@
+<?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
diff --git a/src/Files/VirtualDirectory.php b/src/Files/VirtualDirectory.php
new file mode 100644 (file)
index 0000000..35d8de2
--- /dev/null
@@ -0,0 +1,154 @@
+<?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
diff --git a/src/Files/mime.types b/src/Files/mime.types
new file mode 100644 (file)
index 0000000..da8cd69
--- /dev/null
@@ -0,0 +1,1588 @@
+# This file maps Internet media types to unique file extension(s).
+# Although created for httpd, this file is used by many software systems
+# and has been placed in the public domain for unlimited redisribution.
+#
+# The table below contains both registered and (common) unregistered types.
+# A type that has no unique extension can be ignored -- they are listed
+# here to guide configurations toward known types and to make it easier to
+# identify "new" types.  File extensions are also commonly used to indicate
+# content languages and encodings, so choose them carefully.
+#
+# Internet media types should be registered as described in RFC 4288.
+# The registry is at <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
diff --git a/src/Gzip.php b/src/Gzip.php
new file mode 100644 (file)
index 0000000..290ebc3
--- /dev/null
@@ -0,0 +1,93 @@
+<?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';
+               }
+       }
+
+}
diff --git a/src/Html.php b/src/Html.php
new file mode 100644 (file)
index 0000000..06e9ec8
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+
+namespace Cubist\Util;
+class Html
+{
+
+       public static function isHtml($s)
+       {
+               if (!is_string($s)) {
+                       return false;
+               }
+               return (substr($s, 0, 1) == '<');
+       }
+
+}
diff --git a/src/Json.php b/src/Json.php
new file mode 100644 (file)
index 0000000..ea50766
--- /dev/null
@@ -0,0 +1,79 @@
+<?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
diff --git a/src/ListUtil.php b/src/ListUtil.php
new file mode 100644 (file)
index 0000000..ba0d67f
--- /dev/null
@@ -0,0 +1,51 @@
+<?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;
+       }
+
+}
diff --git a/src/Math.php b/src/Math.php
new file mode 100644 (file)
index 0000000..357326e
--- /dev/null
@@ -0,0 +1,154 @@
+<?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;
+       }
+
+}
diff --git a/src/ObjectUtil.php b/src/ObjectUtil.php
new file mode 100644 (file)
index 0000000..cbc196b
--- /dev/null
@@ -0,0 +1,33 @@
+<?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;
+       }
+
+
+}
diff --git a/src/PHP.php b/src/PHP.php
new file mode 100644 (file)
index 0000000..fffb548
--- /dev/null
@@ -0,0 +1,58 @@
+<?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;
+    }
+}
diff --git a/src/Serializer.php b/src/Serializer.php
new file mode 100644 (file)
index 0000000..0c7ebe1
--- /dev/null
@@ -0,0 +1,47 @@
+<?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
diff --git a/src/Sort.php b/src/Sort.php
new file mode 100644 (file)
index 0000000..0402056
--- /dev/null
@@ -0,0 +1,64 @@
+<?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};
+               }
+       }
+
+}
diff --git a/src/Str.php b/src/Str.php
new file mode 100644 (file)
index 0000000..53ef969
--- /dev/null
@@ -0,0 +1,37 @@
+<?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
diff --git a/src/Text.php b/src/Text.php
new file mode 100644 (file)
index 0000000..55a9355
--- /dev/null
@@ -0,0 +1,951 @@
+<?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('&nbsp;', ' ', $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('&amp;', '&', $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 &nbsp;
+    public static function preventOrphans($str)
+    {
+
+        $find = ' '; // What to search for
+        $replace = '&nbsp;'; // What to replace it with
+
+        $last_space = strrpos($str, $find); // Find last occurrence in string
+
+        if ($last_space !== false) {
+            $str = substr_replace($str, $replace, $last_space, strlen($find));
+        }
+
+        // Also replace punctuation that has spaces before it (eg. in French)
+        $punctuations = array(' :', ' !', ' ?', '« ', ' »');
+        $replacements = array("{$replace}:", "{$replace}!", "{$replace}?", "«{$replace}", "{$replace}»");
+        $str = str_replace($punctuations, $replacements, $str);
+
+        return $str;
+    }
+
+    /**
+     * Check email address
+     *
+     * Returns true if $email is a valid email address.
+     *
+     * @param string $email Email string
+     * @return boolean
+     * @link http://www.iamcal.com/publish/articles/php/parsing_email/
+     *
+     * @copyright Cal Henderson
+     * @license http://creativecommons.org/licenses/by-sa/2.5/ CC-BY-SA
+     */
+    public static function isEmail($email)
+    {
+        $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
+        $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
+        $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
+        $quoted_pair = '\\x5c[\\x00-\\x7f]';
+        $domain_literal = "\\x5b($dtext|$quoted_pair)*\\x5d";
+        $quoted_string = "\\x22($qtext|$quoted_pair)*\\x22";
+        $domain_ref = $atom;
+        $sub_domain = "($domain_ref|$domain_literal)";
+        $word = "($atom|$quoted_string)";
+        $domain = "$sub_domain(\\x2e$sub_domain)*";
+        $local_part = "$word(\\x2e$word)*";
+        $addr_spec = "$local_part\\x40$domain";
+
+        return (boolean)preg_match("!^$addr_spec$!", $email);
+    }
+
+    /**
+     * Accents replacement
+     *
+     * Replaces some occidental accentuated characters by their ASCII
+     * representation.
+     *
+     * @param string $str String to deaccent
+     * @return    string
+     */
+    public static function deaccent($str)
+    {
+        $pattern['A'] = '\x{00C0}-\x{00C5}';
+        $pattern['AE'] = '\x{00C6}';
+        $pattern['C'] = '\x{00C7}';
+        $pattern['D'] = '\x{00D0}';
+        $pattern['E'] = '\x{00C8}-\x{00CB}';
+        $pattern['I'] = '\x{00CC}-\x{00CF}';
+        $pattern['N'] = '\x{00D1}';
+        $pattern['O'] = '\x{00D2}-\x{00D6}\x{00D8}';
+        $pattern['OE'] = '\x{0152}';
+        $pattern['S'] = '\x{0160}';
+        $pattern['U'] = '\x{00D9}-\x{00DC}';
+        $pattern['Y'] = '\x{00DD}';
+        $pattern['Z'] = '\x{017D}';
+
+        $pattern['a'] = '\x{00E0}-\x{00E5}';
+        $pattern['ae'] = '\x{00E6}';
+        $pattern['c'] = '\x{00E7}';
+        $pattern['d'] = '\x{00F0}';
+        $pattern['e'] = '\x{00E8}-\x{00EB}';
+        $pattern['i'] = '\x{00EC}-\x{00EF}';
+        $pattern['n'] = '\x{00F1}';
+        $pattern['o'] = '\x{00F2}-\x{00F6}\x{00F8}';
+        $pattern['oe'] = '\x{0153}';
+        $pattern['s'] = '\x{0161}';
+        $pattern['u'] = '\x{00F9}-\x{00FC}';
+        $pattern['y'] = '\x{00FD}\x{00FF}';
+        $pattern['z'] = '\x{017E}';
+
+        $pattern['ss'] = '\x{00DF}';
+
+        foreach ($pattern as $r => $p) {
+            $str = preg_replace('/[' . $p . ']/u', $r, $str);
+        }
+
+        return $str;
+    }
+
+    /**
+     * URL cleanup
+     *
+     * @param string $str URL to tidy
+     * @param boolean $keep_slashes Keep slashes in URL
+     * @param boolean $keep_spaces Keep spaces in URL
+     * @return string
+     */
+    public static function tidyURL($str, $keep_slashes = true, $keep_spaces = false)
+    {
+        $str = strip_tags($str);
+        $str = str_replace(array('?', '&', '#', '=', '+', '<', '>', '"', '%'), '', $str);
+        $str = str_replace("'", ' ', $str);
+        $str = preg_replace('/[\s]+/u', ' ', trim($str));
+
+        if (!$keep_slashes) {
+            $str = str_replace('/', '-', $str);
+        }
+
+        if (!$keep_spaces) {
+            $str = str_replace(' ', '-', $str);
+        }
+
+        $str = preg_replace('/[-]+/', '-', $str);
+
+        # Remove path changes in URL
+        $str = preg_replace('%^/%', '', $str);
+        $str = preg_replace('%\.+/%', '', $str);
+
+        return $str;
+    }
+
+    /**
+     * Cut string
+     *
+     * Returns a cuted string on spaced at given length $l.
+     *
+     * @param string $str String to cut
+     * @param integer $l Length to keep
+     * @return    string
+     */
+    public static function cutString($str, $l)
+    {
+        $s = preg_split('/([\s]+)/u', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
+
+        $res = '';
+        $L = 0;
+
+        if (mb_strlen($s[0]) >= $l) {
+            return mb_substr($s[0], 0, $l);
+        }
+
+        foreach ($s as $v) {
+            $L = $L + mb_strlen($v);
+
+            if ($L > $l) {
+                break;
+            } else {
+                $res .= $v;
+            }
+        }
+
+        return trim($res);
+    }
+
+    /**
+     * Split words
+     *
+     * Returns an array of words from a given string.
+     *
+     * @param string $str Words to split
+     * @return array
+     */
+    public static function splitWords($str, $minChar = 3)
+    {
+        $non_word = '\x{0000}-\x{002F}\x{003A}-\x{0040}\x{005b}-\x{0060}\x{007B}-\x{007E}\x{00A0}-\x{00BF}\s';
+        if (preg_match_all('/([^' . $non_word . ']{' . $minChar . ',})/msu', html::clean($str), $match)) {
+            foreach ($match[1] as $i => $v) {
+                $match[1][$i] = mb_strtolower($v);
+            }
+            return $match[1];
+        }
+        return array();
+    }
+
+    /**
+     * Encoding detection
+     *
+     * Returns the encoding (in lowercase) of given $str.
+     *
+     * @param string $str String
+     * @return string
+     */
+    public static function detectEncoding($str)
+    {
+        return strtolower(mb_detect_encoding($str . ' ',
+            'UTF-8,ISO-8859-1,ISO-8859-2,ISO-8859-3,' .
+            'ISO-8859-4,ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8,' .
+            'ISO-8859-9,ISO-8859-10,ISO-8859-13,ISO-8859-14,ISO-8859-15'));
+    }
+
+    /**
+     * Find bad UTF8 tokens
+     *
+     * Locates the first bad byte in a UTF-8 string returning it's
+     * byte index in the string
+     * PCRE Pattern to locate bad bytes in a UTF-8 string
+     * Comes from W3 FAQ: Multilingual Forms
+     * Note: modified to include full ASCII range including control chars
+     *
+     * @param string $str String to search
+     * @return integer|false
+     * @link http://phputf8.sourceforge.net
+     *
+     * @copyright Harry Fuecks
+     * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU LGPL 2.1
+     */
+    public static function utf8badFind($str)
+    {
+        $UTF8_BAD =
+            '([\x00-\x7F]' .                          # ASCII (including control chars)
+            '|[\xC2-\xDF][\x80-\xBF]' .               # non-overlong 2-byte
+            '|\xE0[\xA0-\xBF][\x80-\xBF]' .           # excluding overlongs
+            '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}' .    # straight 3-byte
+            '|\xED[\x80-\x9F][\x80-\xBF]' .           # excluding surrogates
+            '|\xF0[\x90-\xBF][\x80-\xBF]{2}' .        # planes 1-3
+            '|[\xF1-\xF3][\x80-\xBF]{3}' .            # planes 4-15
+            '|\xF4[\x80-\x8F][\x80-\xBF]{2}' .        # plane 16
+            '|(.{1}))';                              # invalid byte
+        $pos = 0;
+        $badList = array();
+
+        while (preg_match('/' . $UTF8_BAD . '/S', $str, $matches)) {
+            $bytes = strlen($matches[0]);
+            if (isset($matches[2])) {
+                return $pos;
+            }
+            $pos += $bytes;
+            $str = substr($str, $bytes);
+        }
+        return false;
+    }
+
+
+    /**
+     * BOM removal
+     *
+     * Removes BOM from the begining of a string if present.
+     *
+     * @param string $str String to clean
+     * @return string
+     */
+    public static function removeBOM($str)
+    {
+        if (substr_count($str, '')) {
+            return str_replace('', '', $str);
+        }
+
+        return $str;
+    }
+
+    /**
+     * Quoted printable conversion
+     *
+     * Encodes given str to quoted printable
+     *
+     * @param string $str String to encode
+     * @return string
+     */
+    public static function QPEncode($str)
+    {
+        $res = '';
+
+        foreach (preg_split("/\r?\n/msu", $str) as $line) {
+            $l = '';
+            preg_match_all('/./', $line, $m);
+
+            foreach ($m[0] as $c) {
+                $a = ord($c);
+
+                if ($a < 32 || $a == 61 || $a > 126) {
+                    $c = sprintf('=%02X', $a);
+                }
+
+                $l .= $c;
+            }
+
+            $res .= $l . "\r\n";
+        }
+        return $res;
+    }
+
+}
\ No newline at end of file
diff --git a/src/Url.php b/src/Url.php
new file mode 100644 (file)
index 0000000..53eee9b
--- /dev/null
@@ -0,0 +1,80 @@
+<?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;
+               }
+       }
+
+}
diff --git a/src/WebVideo.php b/src/WebVideo.php
new file mode 100644 (file)
index 0000000..850086d
--- /dev/null
@@ -0,0 +1,127 @@
+<?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;
+       }
+
+}
diff --git a/src/XML/DOMSelector.php b/src/XML/DOMSelector.php
new file mode 100644 (file)
index 0000000..a375218
--- /dev/null
@@ -0,0 +1,179 @@
+<?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;
+    }
+}
diff --git a/src/Xml.php b/src/Xml.php
new file mode 100644 (file)
index 0000000..49a05dc
--- /dev/null
@@ -0,0 +1,100 @@
+<?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
diff --git a/src/Zip.php b/src/Zip.php
new file mode 100644 (file)
index 0000000..498b902
--- /dev/null
@@ -0,0 +1,47 @@
+<?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