'Janvier', 'February'=>'Février', 'March'=>'Mars', 'April'=>'Avril', 'May'=>'Mai', 'June'=>'Juin', 'July'=>'Juillet', 'August'=>'Août', 'September'=>'Septembre', 'October'=>'Octobre', 'November'=>'Novembre', 'December'=>'Décembre', 'Monday'=>'Lundi', 'Tuesday'=>'Mardi', 'Wednesday'=>'Mercredi', 'Thursday'=>'Jeudi','Friday'=>'Vendredi','Saturday'=>'Samedi','Sunday'=>'Dimanche', 'Feb'=>'Fév','Apr'=>'Avr','May'=>'Mai','Jun'=>'Juin', 'Jul'=>'Juil','Aug'=>'Aout','Dec'=>'Déc', 'Mon'=>'Lun','Tue'=>'Mar','Wed'=>'Mer','Thu'=>'Jeu','Fri'=>'Ven','Sat'=>'Sam','Sun'=>'Dim']; static public function strftime_fr($format=null, $ts=null) { if (is_null($format)) { $format = '%d/%m/%Y à %H:%M'; } $date = strftime($format, $ts); $date = strtr($date, self::$french_date_names); $date = strtolower($date); return $date; } static public function date_fr($format=null, $ts=null) { if (is_null($format)) { $format = 'd/m/Y à H:i'; } $date = date($format, $ts); $date = strtr($date, self::$french_date_names); $date = strtolower($date); return $date; } static public function sqliteDateToFrench($d, $short = false) { if (strlen($d) == 10 || $short) { $d = substr($d, 0, 10); $f = 'Y-m-d'; $f2 = 'd/m/Y'; } elseif (strlen($d) == 16) { $f = 'Y-m-d H:i'; $f2 = 'd/m/Y H:i'; } else { $f = 'Y-m-d H:i:s'; $f2 = 'd/m/Y H:i'; } if ($dt = \DateTime::createFromFormat($f, $d)) return $dt->format($f2); else return $d; } static public function makeTimestampFromForm($d) { return mktime($d['h'], $d['min'], 0, $d['m'], $d['d'], $d['y']); } static public function modifyDate($str, $change) { $date = \DateTime::createFromFormat('Y-m-d', $str); $date->modify($change); return $date->format('Y-m-d'); } static public function checkDate($str) { if (!preg_match('!^(\d{4})-(\d{2})-(\d{2})$!', $str, $match)) return false; if (!checkdate($match[2], $match[3], $match[1])) return false; return true; } static public function checkDateTime($str) { if (!preg_match('!^(\d{4}-\d{2}-\d{2})[T ](\d{2}):(\d{2})!', $str, $match)) return false; if (!self::checkDate($match[1])) return false; if ((int) $match[2] < 0 || (int) $match[2] > 23) return false; if ((int) $match[3] < 0 || (int) $match[3] > 59) return false; if (isset($match[4]) && ((int) $match[4] < 0 || (int) $match[4] > 59)) return false; return true; } static public function getRequestURI() { if (!empty($_SERVER['REQUEST_URI'])) return $_SERVER['REQUEST_URI']; else return false; } static public function getSelfURL($no_qs = false) { $uri = self::getRequestUri(); if (strpos($uri, WWW_URI) === 0) { $uri = substr($uri, strlen(WWW_URI)); } if ($no_qs && (strpos($uri, '?') !== false)) { $uri = substr($uri, 0, strpos($uri, '?')); } return WWW_URL . $uri; } static public function disableHttpCaching() { header("Cache-Control: no-cache, must-revalidate"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header('Pragma: no-cache'); } public static function redirect($destination=false, $exit=true) { if (empty($destination) || !preg_match('/^https?:\/\//', $destination)) { if (empty($destination)) $destination = WWW_URL; else $destination = WWW_URL . preg_replace('/^\//', '', $destination); } if (headers_sent()) { echo ''. ' ' . ' ' . ' '. ' '. '
'. ' Cliquez ici pour continuer...'. '
'. ' '. ''; if ($exit) exit(); return true; } header("Location: " . $destination); if ($exit) exit(); } static protected function _sessionStart($force = false) { if (!isset($_SESSION) && ($force || isset($_COOKIE[session_name()]))) { session_start(); } return true; } static public function CSRF_create($key) { self::_sessionStart(true); if (!isset($_SESSION['csrf'])) { $_SESSION['csrf'] = []; } $_SESSION['csrf'][$key] = sha1($key . uniqid($key, true) . time()); return $_SESSION['csrf'][$key]; } static public function CSRF_check($key, $hash=null) { self::_sessionStart(); if (is_null($hash)) { $name = self::CSRF_field_name($key); if (!isset($_POST[$name])) return false; $hash = $_POST[$name]; } if (empty($_SESSION['csrf'][$key])) return false; if ($_SESSION['csrf'][$key] != $hash) return false; unset($_SESSION['csrf'][$key]); return true; } static public function CSRF_field_name($key) { return 'gecko/'.base64_encode(sha1($key, true)); } static public function generatePassword($length, $chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890') { $string = ''; for ($i = 0; $i < $length; $i++) { $pos = rand(0, strlen($chars)-1); $string .= $chars[$pos]; } return $string; } static public function post($key) { return isset($_POST[$key]) ? $_POST[$key] : ''; } static public function get($key) { return isset($_GET[$key]) ? $_GET[$key] : ''; } static public function getIP() { if (!empty($_SERVER['REMOTE_ADDR'])) return $_SERVER['REMOTE_ADDR']; return ''; } static public function &getCountryList() { if (is_null(self::$country_list)) { require_once ROOT . '/include/libs/countries/countries_fr.php'; self::$country_list = $countries; } return self::$country_list; } static public function getCountryName($code) { $list = self::getCountryList(); if (!isset($list[$code])) return false; return $list[$code]; } /** * Génération pagination à partir de la page courante ($current), * du nombre d'items total ($total), et du nombre d'items par page ($bypage). * $listLength représente la longueur d'items de la pagination à génerer * * @param int $current * @param int $total * @param int $bypage * @param int $listLength * @param bool $showLast Toggle l'affichage du dernier élément de la pagination * @return array */ public static function getGenericPagination($current, $total, $bypage, $listLength=11, $showLast = true) { if ($total <= $bypage) return false; $total = ceil($total / $bypage); if ($total < $current) return false; $length = ($listLength / 2); $begin = $current - ceil($length); if ($begin < 1) { $begin = 1; } $end = $begin + $listLength; if($end > $total) { $begin -= ($end - $total); $end = $total; } if ($begin < 1) { $begin = 1; } if($end==($total-1)) { $end = $total; } if($begin == 2) { $begin = 1; } $out = []; if ($current > 1) { $out[] = ['id' => $current - 1, 'label' => '« ' . 'Page précédente', 'class' => 'prev', 'accesskey' => 'a']; } if ($begin > 1) { $out[] = ['id' => 1, 'label' => '1 ...', 'class' => 'first']; } for ($i = $begin; $i <= $end; $i++) { $out[] = ['id' => $i, 'label' => $i, 'class' => ($i == $current) ? 'current' : '']; } if ($showLast && $end < $total) { $out[] = ['id' => $total, 'label' => '... ' . $total, 'class' => 'last']; } if ($current < $total) { $out[] = ['id' => $current + 1, 'label' => 'Page suivante' . ' »', 'class' => 'next', 'accesskey' => 'z']; } return $out; } static public function transliterateToAscii($str, $charset='UTF-8') { // Don't process empty strings if (!trim($str)) return $str; // We only process non-ascii strings if (preg_match('!^[[:ascii:]]+$!', $str)) return $str; $str = htmlentities($str, ENT_NOQUOTES, $charset); $str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str); $str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. 'œ' $str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères $str = preg_replace('![^[:ascii:]]+!', '', $str); return $str; } static public function htmlLinksOnUrls($str) { return preg_replace_callback('!(?<=\s|^)((?:(ftp|https?|file|ed2k|ircs?)://|(magnet|mailto|data|tel|fax|geo|sips?|xmpp):)([^\s<]+))!', function ($match) { $proto = $match[2] ?: $match[3]; $text = ($proto == 'http' || $proto == 'mailto') ? $match[4] : $match[1]; return ''.htmlspecialchars($text, ENT_QUOTES, 'UTF-8').''; }, $str); } static public function htmlGarbage2xhtml($str) { if (!self::$g2x) { require_once ROOT . '/include/libs/garbage2xhtml/lib.garbage2xhtml.php'; self::$g2x = new \garbage2xhtml; self::$g2x->core_attributes = ['class', 'id', 'title']; } return self::$g2x->process($str); } static public function htmlSpip($str, $prefix = '') { // Intertitres $str = preg_replace('/(?$1', $str); // Gras $str = preg_replace('/(?$1', $str); // Italique $str = preg_replace('/(?$1', $str); // Espaces typograhiques $str = preg_replace('/\h*([?!;:»])(\s+|$)/u', ' $1$2', $str); $str = preg_replace('/(^|\s+)([«])\h*/u', '$1$2 ', $str); // Liens $str = preg_replace('/(?(.+?)\]/', '$1', $str); $str = preg_replace('/(?$1', $str); // Adresses email $str = preg_replace('//iU', '', $str); return $str; } static public function mail($to, $subject, $content, $additional_headers = []) { // Création du contenu du message $content = wordwrap($content); $content = trim($content); $content = preg_replace("#(?get('email_envoi_automatique').'>'; } $additional_headers['MIME-Version'] = '1.0'; $additional_headers['Content-type'] = 'text/plain; charset=UTF-8'; $additional_headers['Return-Path'] = $config->get('email_envoi_automatique'); foreach ($additional_headers as $name=>$value) { $headers .= $name . ': '.$value."\r\n"; } $headers = preg_replace("#(?read()) { if ($file[0] != '.') { unlink($path . '/' . $file); } } $dir->close(); return true; } static public function suggestPassword() { require_once ROOT . '/include/libs/passphrase/lib.passphrase.french.php'; return \Passphrase::generate(); } static public function checkIBAN($iban) { $iban = substr($iban, 4) . substr($iban, 0, 4); $iban = str_replace(range('A', 'Z'), range(10, 35), $iban); return (bcmod($iban, 97) == 1); } static public function IBAN_RIB($iban) { if (substr($iban, 0, 2) != 'FR') { return ''; } return substr($iban, 4, 5) // Code banque . ' ' . substr($iban, 4+5, 5) // Code guichet . ' ' . substr($iban, 4+5+5, -2) // Numéro de compte . ' ' . substr($iban, -2); // Clé RIB } static public function checkBIC($bic) { return preg_match('!^[A-Z]{4}[A-Z]{2}[1-9A-Z]{2}(?:[A-Z\d]{3})?$!', $bic); } static public function normalizePhoneNumber($n) { $n = preg_replace('!(\+\d+)\(0\)!', '\\1', $n); $n = preg_replace('![^\d\+]!', '', $n); return $n; } static public function write_ini_string($in) { $out = ''; $get_ini_line = function ($key, $value) use (&$get_ini_line) { if (is_bool($value)) { return $key . ' = ' . ($value ? 'true' : 'false'); } elseif (is_numeric($value)) { return $key . ' = ' . $value; } elseif (is_array($value)) { $out = ''; foreach ($value as $row) { $out .= $get_ini_line($key . '[]', $row) . "\n"; } return substr($out, 0, -1); } else { return $key . ' = "' . str_replace('"', '\\"', $value) . '"'; } }; foreach ($in as $key=>$value) { if (is_array($value) && is_string($key)) { $out .= '[' . $key . "]\n"; foreach ($value as $row_key=>$row_value) { $out .= $get_ini_line($row_key, $row_value) . "\n"; } $out .= "\n"; } else { $out .= $get_ini_line($key, $value) . "\n"; } } return $out; } static public function getMaxUploadSize() { return min([ self::return_bytes(ini_get('upload_max_filesize')), self::return_bytes(ini_get('post_max_size')), self::return_bytes(ini_get('memory_limit')) ]); } static public function return_bytes ($size_str) { switch (substr($size_str, -1)) { case 'G': case 'g': return (int)$size_str * pow(1024, 3); case 'M': case 'm': return (int)$size_str * pow(1024, 2); case 'K': case 'k': return (int)$size_str * 1024; default: return $size_str; } } static public function deleteRecursive($path, $delete_target = false) { if (!file_exists($path)) return false; $dir = dir($path); if (!$dir) return false; while ($file = $dir->read()) { if ($file == '.' || $file == '..') continue; if (is_dir($path . '/' . $file)) { if (!self::deleteRecursive($path . '/' . $file, true)) return false; } else { unlink($path . '/' . $file); } } $dir->close(); rmdir($path); return true; } static public function plugin_url($params = []) { if (isset($params['id'])) { $url = WWW_URL . 'admin/plugin/' . $params['id'] . '/'; } else { $url = PLUGIN_URL; } if (!empty($params['file'])) $url .= $params['file']; if (!empty($params['query'])) { $url .= '?'; if (!(is_numeric($params['query']) && (int)$params['query'] === 1) && $params['query'] !== true) $url .= $params['query']; } return $url; } static public function find_csv_delim($fp) { $line = ''; while ($line === '' && !feof($fp)) { $line = trim(fgets($fp, 4096)); } // Delete the columns content $line = preg_replace('/".*?"/', '', $line); $delims = [ ';' => substr_count($line, ';'), ',' => substr_count($line, ','), "\t"=> substr_count($line, "\t") ]; arsort($delims); reset($delims); rewind($fp); return key($delims); } }