[SPIP] ~v3.0.21-->v3.0.22
[lhc/web/www.git] / www / ecrire / inc / filtres.php
index 220645f..5223d09 100644 (file)
@@ -3,7 +3,7 @@
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2014                                                *
+ *  Copyright (c) 2001-2016                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
@@ -189,6 +189,39 @@ function filtrer($filtre) {
        }
 }
 
+/*
+ *
+ * [(#CALCUL|set{toto})] enregistre le résultat de #CALCUL
+ *           dans la variable toto et renvoie vide
+ *
+ * [(#CALCUL|set{toto,1})] enregistre le résultat de #CALCUL
+ *           dans la variable toto et renvoie la valeur
+ *
+ */
+function filtre_set(&$Pile, $val, $key, $continue = null) {
+       $Pile['vars'][$key] = $val;
+       return $continue ? $val : '';
+}
+
+/*
+ * [(#TRUC|debug{avant}|calcul|debug{apres}|etc)] affiche
+ *   la valeur de #TRUC avant et après le calcul
+ */
+function filtre_debug($val, $key=null) {
+       $debug = (
+               is_null($key) ? '' :  (var_export($key,true)." = ")
+       ) . var_export($val, true);
+
+       include_spip('inc/autoriser');
+       if (autoriser('webmestre'))
+               echo "<div class='spip_debug'>\n",$debug,"</div>\n";
+
+       spip_log($debug, 'debug');
+
+       return $val;
+}
+
+
 // fonction generique d'entree des filtres images
 // accepte en entree un texte complet, un img-log (produit par #LOGO_XX),
 // un tag <img ...> complet, ou encore un nom de fichier *local* (passer
@@ -378,9 +411,27 @@ function filtrer_entites($texte) {
        // filtrer
        $texte = html2unicode($texte);
        // remettre le tout dans le charset cible
-       return unicode2charset($texte);
+       $texte = unicode2charset($texte);
+       // cas particulier des " et ' qu'il faut filtrer aussi
+       // (on le faisait deja avec un &quot;)
+       if (strpos($texte,"&#")!==false)
+               $texte = str_replace(array("&#039;","&#39;","&#034;","&#34;"), array("'","'",'"','"'), $texte);
+       return $texte;
+}
+
+/**
+ * Version securisee de filtrer_entites
+ * @param string $t
+ * @return string
+ */
+if (!function_exists('filtre_filtrer_entites_dist')) {
+       function filtre_filtrer_entites_dist($t) {
+               include_spip('inc/texte');
+               return interdire_scripts(filtrer_entites($t));
+       }
 }
 
+
 // caracteres de controle - http://www.w3.org/TR/REC-xml/#charsets
 // http://doc.spip.org/@supprimer_caracteres_illegaux
 function supprimer_caracteres_illegaux($texte) {
@@ -388,7 +439,7 @@ function supprimer_caracteres_illegaux($texte) {
        static $to = null;
        
        if (is_array($texte)) {
-               return array_map('corriger_caracteres_windows', $texte);
+               return array_map('supprimer_caracteres_illegaux', $texte);
        }
        
        if (!$to) $to = str_repeat('-', strlen($from));
@@ -470,7 +521,7 @@ function recuperer_numero($texte) {
        if (preg_match(
        ",^[[:space:]]*([0-9]+)([.)]|".chr(194).'?'.chr(176).")[[:space:]]+,S",
        $texte, $regs))
-               return intval($regs[1]);
+               return strval($regs[1]);
        else
                return '';
 }
@@ -1123,7 +1174,7 @@ function affdate_heure($numdate) {
  * - Du 20 fevrier 2007 au 30 mars 2008
  * $horaire='oui' ou true permet d'afficher l'horaire, toute autre valeur n'indique que le jour
  * $forme peut contenir une ou plusieurs valeurs parmi
- *  - abbr (afficher le nom des jours en abbrege)
+ *  - abbr (afficher le nom des jours en abrege)
  *  - hcal (generer une date au format hcal)
  *  - jour (forcer l'affichage des jours)
  *  - annee (forcer l'affichage de l'annee)
@@ -1132,6 +1183,10 @@ function affdate_heure($numdate) {
  * @param string $date_fin
  * @param string $horaire
  * @param string $forme
+ *   abbr pour afficher le nom du jour en abrege (Dim. au lieu de Dimanche)
+ *   annee pour forcer l'affichage de l'annee courante
+ *   jour pour forcer l'affichage du nom du jour
+ *   hcal pour avoir un markup microformat abbr
  * @return string
  */
 function affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme=''){
@@ -1169,7 +1224,7 @@ function affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme=''){
                        }else{
                                // Le <abbr...>lundi 20 fevrier de 18h00</abbr> a <abbr...>20h00</abbr>
                                if($dtabbr && $dtstart && $dtend)
-                                       $s = spip_ucfirst(_T('date_fmt_jour_heure_debut_fin_abbr',array('jour'=>$s,'heure_debut'=>$hd,'heure_fin'=>$hf,'dtstart'=>$dtstart,'dtend'=>$dtend,'dtabbr'=>$dtabbr)));
+                                       $s = _T('date_fmt_jour_heure_debut_fin_abbr',array('jour'=>spip_ucfirst($s),'heure_debut'=>$hd,'heure_fin'=>$hf,'dtstart'=>$dtstart,'dtend'=>$dtend,'dtabbr'=>$dtabbr));
                                // Le lundi 20 fevrier de 18h00 a 20h00
                                else
                                        $s = spip_ucfirst(_T('date_fmt_jour_heure_debut_fin',array('jour'=>$s,'heure_debut'=>$hd,'heure_fin'=>$hf)));
@@ -1186,7 +1241,7 @@ function affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme=''){
                if(!$h)
                        $date_debut = jour($d);
                else
-                       $date_debut = $affdate($d);
+                       $date_debut = affdate_jourcourt($d,date("Y",$date_fin));
                $date_fin = $affdate($f);
                if($jour){
                        $nomjour_debut = nom_jour($d,$abbr);
@@ -1204,13 +1259,13 @@ function affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme=''){
                $s = _T('date_fmt_periode',array('date_debut' => $date_debut,'date_fin'=>$date_fin));
        }
        else {
-               $date_debut = affdate($d);
-               $date_fin = affdate($f);
+               $date_debut = affdate_jourcourt($d,date("Y",$date_fin));
+               $date_fin = $affdate($f);
                if($jour){
                        $nomjour_debut = nom_jour($d,$abbr);
-                       $date_debut = _T('date_fmt_jour_periode',array('nomjour'=>$nomjour_debut,'jour' => $date_debut));
+                       $date_debut = _T('date_fmt_jour',array('nomjour'=>$nomjour_debut,'jour' => $date_debut));
                        $nomjour_fin = nom_jour($f,$abbr);
-                       $date_fin = _T('date_fmt_jour_periode',array('nomjour'=>$nomjour_fin,'jour' => $date_fin));
+                       $date_fin = _T('date_fmt_jour',array('nomjour'=>$nomjour_fin,'jour' => $date_fin));
                }
                if ($h){
                        $date_debut = _T('date_fmt_jour_heure',array('jour'=>$date_debut,'heure'=>$hd)); 
@@ -2275,16 +2330,17 @@ function concat(){
 
 
 // http://doc.spip.org/@charge_scripts
-function charge_scripts($scripts) {
-  $flux = "";
-  $args = is_array($scripts)?$scripts:explode("|",$scripts);
-  foreach($args as $script) {
-    if(preg_match(",^\w+$,",$script)) {
-      $path = find_in_path("javascript/$script.js");
-      if($path) $flux .= spip_file_get_contents($path);
-    }
-  }
-  return $flux;
+// http://doc.spip.org/@charge_scripts
+function charge_scripts($files, $script = true) {
+       $flux = "";
+       foreach(is_array($files)?$files:explode("|",$files) as $file) {
+               if (!is_string($file)) continue;
+               if ($script)
+                       $file = preg_match(",^\w+$,",$file) ? "javascript/$file.js" : '';
+               if ($file) $path = find_in_path($file);
+               if ($path) $flux .= spip_file_get_contents($path);
+       }
+       return $flux;
 }
 
 
@@ -2464,8 +2520,10 @@ function encoder_contexte_ajax($c,$form='', $emboite=NULL, $ajaxid='') {
        
        if (!function_exists('calculer_cle_action'))
                include_spip("inc/securiser_action");
-       $cle = calculer_cle_action($form.(is_array($c)?serialize($c):$c));
-       $c = serialize(array($c,$cle));
+
+       $c = serialize($c);
+       $cle = calculer_cle_action($form . $c);
+       $c = "$cle:$c";
 
        // on ne stocke pas les contextes dans des fichiers caches
        // par defaut, sauf si cette configuration a ete forcee
@@ -2514,8 +2572,7 @@ function encoder_contexte_ajax($c,$form='', $emboite=NULL, $ajaxid='') {
        if ($ajaxid AND is_string($ajaxid)){
                $class .= ' ajax-id-'.$ajaxid;
        }
-       $compl = "aria-live='polite' aria-atomic='true' ";
-       return "<div class='$class' ".$compl."data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n";
+       return "<div class='$class' "."data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n";
 }
 
 // la procedure inverse de encoder_contexte_ajax()
@@ -2533,10 +2590,20 @@ function decoder_contexte_ajax($c,$form='') {
                if (function_exists('gzdeflate') && function_exists('gzinflate'))
                        $c = @gzinflate($c);
        }
-       list($env, $cle) = @unserialize($c);
 
-       if ($cle == calculer_cle_action($form.(is_array($env)?serialize($env):$env)))
-               return $env;
+       // extraire la signature en debut de contexte
+       // et la verifier avant de deserializer
+       // format : signature:donneesserializees
+       if ($p = strpos($c,":")){
+               $cle = substr($c,0,$p);
+               $c = substr($c,$p+1);
+
+               if ($cle == calculer_cle_action($form . $c)) {
+                       $env = @unserialize($c);
+                       return $env;
+               }
+       }
+
        return false;
 }
 
@@ -2938,6 +3005,7 @@ function generer_info_entite($id_objet, $type_objet, $info, $etoile=""){
        if (!$etoile
                AND is_array($traitement)
          AND (isset($traitement[$table_sql]) OR isset($traitement[0]))){
+               include_spip('inc/texte');
                $traitement = $traitement[isset($traitement[$table_sql]) ? $table_sql : 0];
                $traitement = str_replace('%s', "'".texte_script($info_generee)."'", $traitement);
                // FIXME: $connect et $Pile[0] font souvent partie des traitements.