[SPIP] ~v3.0.21-->v3.0.22
[lhc/web/www.git] / www / ecrire / inc / utils.php
index 03340b2..01ed0c1 100644 (file)
@@ -3,7 +3,7 @@
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2012                                                *
+ *  Copyright (c) 2001-2016                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
@@ -45,7 +45,7 @@ function charger_fonction($nom, $dossier='exec', $continue=false) {
 
        if (!preg_match(',^\w+$,', $f)){
                if ($continue) return false; //appel interne, on passe
-               die(htmlspecialchars($nom)." pas autorise");
+               die(spip_htmlspecialchars($nom)." pas autorise");
        }
 
        // passer en minuscules (cf les balises de formulaires)
@@ -66,7 +66,7 @@ function charger_fonction($nom, $dossier='exec', $continue=false) {
 
        include_spip('inc/minipres');
        echo minipres(_T('forum_titre_erreur'),
-                _T('fichier_introuvable', array('fichier'=> '<b>'.htmlentities($d).'</b>')));
+                _T('fichier_introuvable', array('fichier'=> '<b>'.spip_htmlentities($d).'</b>')));
        exit;
 }
 
@@ -114,7 +114,6 @@ function minipipe($fonc,&$val){
        // fonction
        if (function_exists($fonc))
                $val = call_user_func($fonc, $val);
-
        // Class::Methode
        else if (preg_match("/^(\w*)::(\w*)$/S", $fonc, $regs)
        AND $methode = array($regs[1], $regs[2])
@@ -407,11 +406,16 @@ function nettoyer_uri($reset = null)
        return $propre = (preg_replace(',[?&]$,', '', $uri1));
 }
 
-//
-// donner l'URL de base d'un lien vers "soi-meme", modulo
-// les trucs inutiles
-//
-// http://doc.spip.org/@self
+
+/**
+ * Donner l'URL de base d'un lien vers "soi-meme", modulo les trucs inutiles
+ *
+ * @param string $amp
+ *    Style des esperluettes
+ * @param bool $root
+ * @return string
+ *    URL vers soi-même
+**/
 function self($amp = '&amp;', $root = false) {
        $url = nettoyer_uri();
        if (!$root
@@ -437,7 +441,8 @@ function self($amp = '&amp;', $root = false) {
        }
 
        // eviter les hacks
-       $url = htmlspecialchars($url);
+       include_spip('inc/filtres_mini');
+       $url = spip_htmlspecialchars($url);
 
        // &amp; ?
        if ($amp != '&amp;')
@@ -512,7 +517,7 @@ function _T($texte, $args=array(), $options=array()) {
                $text = $texte;
 
                // pour les chaines non traduites, assurer un service minimum
-               if (!$GLOBALS['test_i18n'])
+               if (!$GLOBALS['test_i18n'] AND (_request('var_mode') != 'traduction'))
                        $text = str_replace('_', ' ',
                                 (($n = strpos($text,':')) === false ? $texte :
                                        substr($texte, $n+1)));
@@ -541,8 +546,8 @@ function _L($text, $args=array(), $class=null) {
                if ($args) spip_log("$f:  variables inutilisees " . join(', ', array_keys($args)),_LOG_DEBUG);
        }
 
-       if ($GLOBALS['test_i18n'] AND $class===null)
-               return "<blink style='color:red;'>$text</blink>";
+       if (($GLOBALS['test_i18n'] OR (_request('var_mode') == 'traduction')) AND $class===null)
+               return "<span class=debug-traduction-erreur>$text</span>";
        else
                return $text;
 }
@@ -637,14 +642,17 @@ function action_cron() {
  * @return bool
  */
 function cron ($taches=array(), $taches_old= array()) {
-       // si pas en mode cron force
-       // ou si base inaccessible, laisser tomber.
-       if (!defined('_DIRECT_CRON_FORCE') OR !spip_connect()) return false;
-       spip_log("cron !",'jq'._LOG_DEBUG);
+       // si pas en mode cron force, laisser tomber.
+       if (!defined('_DIRECT_CRON_FORCE')) return false;
        if (!is_array($taches)) $taches = $taches_old; // compat anciens appels
+       // si taches a inserer en base et base inaccessible, laisser tomber
+       // sinon on ne verifie pas la connexion tout de suite, car si ca se trouve
+       // queue_sleep_time_to_next_job() dira qu'il n'y a rien a faire
+       // et on evite d'ouvrir une connexion pour rien (utilisation de _DIRECT_CRON_FORCE dans mes_options.php)
+       if ($taches AND count($taches) AND !spip_connect())  return false;
+       spip_log("cron !",'jq'._LOG_DEBUG);
        if ($genie = charger_fonction('genie', 'inc', true)) {
-               $genie($taches);
-               return true;
+               return $genie($taches);
        }
        return false;
 }
@@ -737,7 +745,7 @@ function queue_sleep_time_to_next_job($force=null) {
                return null;
        if (!$_SERVER['REQUEST_TIME'])
                $_SERVER['REQUEST_TIME'] = time();
-       return max(0,$queue_next_job_time-$_SERVER['REQUEST_TIME']);
+       return $queue_next_job_time-$_SERVER['REQUEST_TIME'];
 }
 
 
@@ -961,8 +969,11 @@ function find_in_path ($file, $dirname='', $include=false) {
                                        include_once _ROOT_CWD . $a;
                                        $inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
                                }
-                               if (!defined('_SAUVER_CHEMIN'))
-                                       define('_SAUVER_CHEMIN',true);
+                               if (!defined('_SAUVER_CHEMIN')){
+                                       // si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
+                                       if (is_null($GLOBALS['path_files'])) return $a;
+                                       define('_SAUVER_CHEMIN', true);
+                               }
                                return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = $a;
                        }
                }
@@ -980,8 +991,11 @@ function find_in_path ($file, $dirname='', $include=false) {
                }
        }
 
-       if (!defined('_SAUVER_CHEMIN'))
-               define('_SAUVER_CHEMIN',true);
+       if (!defined('_SAUVER_CHEMIN')){
+               // si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
+               if (is_null($GLOBALS['path_files'])) return false;
+               define('_SAUVER_CHEMIN', true);
+       }
        return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = false;
 }
 
@@ -1206,8 +1220,9 @@ function test_valeur_serveur($truc) {
 // Fonctions de fabrication des URL des scripts de Spip
 //
 /**
- * l'URL de base du site, sans se fier a meta(adresse_site) qui
- * peut etre fausse (sites a plusieurs noms d'hotes, deplacements, erreurs)
+ * L'URL de base du site, en priorité sans se fier a meta(adresse_site) qui
+ * peut etre fausse (sites a plusieurs noms d'hotes, deplacements, erreurs).
+ * En dernier recours, lorsqu'on ne trouve rien, on utilise adresse_site comme fallback.
  * Note : la globale $profondeur_url doit etre initialisee de maniere a
  * indiquer le nombre de sous-repertoires de l'url courante par rapport a la
  * racine de SPIP : par exemple, sur ecrire/ elle vaut 1, sur sedna/ 1, et a
@@ -1238,8 +1253,16 @@ function url_de_base($profondeur=null) {
                OR (isset($_SERVER['HTTPS']) AND
                    test_valeur_serveur($_SERVER['HTTPS']))
        ) ? 'https' : 'http';
-       # note : HTTP_HOST contient le :port si necessaire
+       // note : HTTP_HOST contient le :port si necessaire
        $host = $_SERVER['HTTP_HOST'];
+       // si on n'a pas trouvé d'hôte du tout, en dernier recours on utilise adresse_site comme fallback
+       if (is_null($host) and isset($GLOBALS['meta']['adresse_site'])) {
+               $host = $GLOBALS['meta']['adresse_site'];
+               if ($scheme = parse_url($host, PHP_URL_SCHEME)) {
+                       $http = $scheme;
+                       $host = str_replace("{$scheme}://", '', $host);
+               }
+       }
        if (isset($_SERVER['SERVER_PORT'])
                AND $port=$_SERVER['SERVER_PORT']
                AND strpos($host,":")==false){
@@ -1560,6 +1583,12 @@ function spip_initialisation_core($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
                #if (!defined('_SPIP_LOCK_MODE')) define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip mais link() est tres souvent interdite
        }
 
+       // PHP_VERSION_ID dispo depuis PHP 5.2.7
+       if (!defined('PHP_VERSION_ID')) {
+          $version = explode('.',PHP_VERSION);
+          define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
+       }
+
        //
        // Module de lecture/ecriture/suppression de fichiers utilisant flock()
        // (non surchargeable en l'etat ; attention si on utilise include_spip()
@@ -1585,7 +1614,9 @@ function spip_initialisation_core($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
        spip_desinfecte($_REQUEST);
 
        // Par ailleurs on ne veut pas de magic_quotes au cours de l'execution
-       @set_magic_quotes_runtime(0);
+       if (PHP_VERSION_ID<50300) {
+               @set_magic_quotes_runtime(0);
+       }
 
        // Si les variables sont passees en global par le serveur,
        // il faut faire quelques verifications de base
@@ -1777,7 +1808,7 @@ function spip_initialisation_suite() {
        // on verifie que la memoire est suffisante pour le compactage css+js pour eviter la page blanche
        // il y aura d'autres problemes et l'utilisateur n'ira pas tres loin, mais ce sera plus comprehensible qu'une page blanche
        if (test_espace_prive() AND _MEMORY_LIMIT_MIN>8){
-               if ($memory = trim(ini_get('memory_limit'))){
+               if ($memory = trim(ini_get('memory_limit')) and $memory != -1) {
                        $unit = strtolower(substr($memory,strlen($memory/1),1));
                        switch($unit) {
                                // Le modifieur 'G' est disponible depuis PHP 5.1.0
@@ -1795,6 +1826,9 @@ function spip_initialisation_suite() {
                else
                        if (!defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE')) define('_INTERDIRE_COMPACTE_HEAD_ECRIRE',true); // evite une page blanche car on ne saura pas calculer la css dans ce hit
        }
+       // Protocoles a normaliser dans les chaines de langues
+       if (!defined('_PROTOCOLES_STD'))
+               define('_PROTOCOLES_STD', 'http|https|ftp|mailto|webcal');
 
        init_var_mode();
 }
@@ -1813,7 +1847,7 @@ function init_var_mode(){
                                if (!defined('_VAR_MODE')) define('_VAR_MODE',$_GET['var_mode']);
                        }
                        // preview, debug, blocs, urls et images necessitent une autorisation
-                       else if (in_array($_GET['var_mode'],array('preview','debug','inclure','urls','images'))) {
+                       else if (in_array($_GET['var_mode'],array('preview','debug','inclure','urls','images','traduction'))) {
                                include_spip('inc/autoriser');
                                if (autoriser(
                                        ($_GET['var_mode'] == 'preview')
@@ -1821,6 +1855,12 @@ function init_var_mode(){
                                                : 'debug'
                                )) {
                                        switch($_GET['var_mode']){
+                                               case 'traduction':
+                                                       // forcer le calcul pour passer dans traduire
+                                                       if (!defined('_VAR_MODE')) define('_VAR_MODE','calcul');
+                                                       // et ne pas enregistrer de cache pour ne pas trainer les surlignages sur d'autres pages
+                                                       if (!defined('_VAR_NOCACHE')) define('_VAR_NOCACHE',true);
+                                                       break;
                                                case 'preview':
                                                        // basculer sur les criteres de preview dans les boucles
                                                        if (!defined('_VAR_PREVIEW')) define('_VAR_PREVIEW',true);
@@ -1856,6 +1896,7 @@ function init_var_mode(){
                                                        if (!defined('_VAR_MODE')) define('_VAR_MODE',$_GET['var_mode']);
                                                        break;
                                        }
+          if (isset($GLOBALS['visiteur_session']['nom']))
                                        spip_log($GLOBALS['visiteur_session']['nom']
                                                . " "._VAR_MODE);
                                }
@@ -2134,7 +2175,7 @@ function recuperer_fond($fond, $contexte=array(), $options = array(), $connect='
                }
 
                $page = pipeline('recuperer_fond',array(
-                       'args'=>array('fond'=>$fond,'contexte'=>$contexte,'options'=>$options,'connect'=>$connect),
+                       'args'=>array('fond'=>$f,'contexte'=>$contexte,'options'=>$options,'connect'=>$connect),
                        'data'=>$page
                ));
                if (isset($options['ajax']) AND $options['ajax']){