[SPIP] v3.2.1-->v3.2.2
[lhc/web/www.git] / www / ecrire / inc / csv.php
index 30f3149..0abfa8e 100644 (file)
@@ -3,7 +3,7 @@
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2017                                                *
+ *  Copyright (c) 2001-2019                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
@@ -32,6 +32,8 @@ if (!defined('_ECRIRE_INC_VERSION')) {
  *     - Titre du tableau (si une seule colonne)
  **/
 function analyse_csv($t) {
+       
+       // Quel est le séparateur ?
        $virg = substr_count($t, ',');
        $pvirg = substr_count($t, ';');
        $tab = substr_count($t, "\t");
@@ -43,15 +45,14 @@ function analyse_csv($t) {
                $hs = '&#59;';
                $virg = $pvirg;
        }
-       if ($tab > $virg) {
+       // un certain nombre de tab => le séparateur est tab
+       if ($tab > $virg / 10) {
                $sep = "\t";
                $hs = "\t";
        }
-
-       $t = preg_replace('/\r?\n/', "\n",
-               preg_replace('/[\r\n]+/', "\n", $t));
+       
        // un separateur suivi de 3 guillemets attention !
-       // attention au ; suceptible d'etre confondu avec un separateur
+       // attention au ; ou , suceptible d'etre confondu avec un separateur
        // on substitue un # et on remplacera a la fin
        $t = preg_replace("/([\n$sep])\"\"\"/", '\\1"&#34#', $t);
        $t = str_replace('""', '&#34#', $t);
@@ -59,10 +60,14 @@ function analyse_csv($t) {
        foreach ($r[0] as $cell) {
                $t = str_replace($cell,
                        str_replace($sep, $hs,
-                               str_replace("\n", "<br />",
+                               str_replace("\n", "``**``", // échapper les saut de lignes, on les remettra après.
                                        substr($cell, 1, -1))),
                        $t);
        }
+       
+       $t = preg_replace('/\r?\n/', "\n",
+       preg_replace('/[\r\n]+/', "\n", $t));
+       
        list($entete, $corps) = explode("\n", $t, 2);
        $caption = '';
        // sauter la ligne de tete formee seulement de separateurs
@@ -121,10 +126,12 @@ function analyse_csv($t) {
                        $lignes[$k] = substr($v, 0, -1);
                }
        }
-
+       
        foreach ($lignes as &$l) {
+               $l = str_replace('&#34#','"',$l);
+               $l = str_replace('``**``',"\n",$l);
                $l = explode($sep, $l);
        }
-
+       
        return array(explode($sep, $entete), $lignes, $caption);
 }