From ca8358ad6088647733eb1d0a86e01bd2314039c5 Mon Sep 17 00:00:00 2001
From: "cedric@yterium.com" <>
Date: Thu, 18 Jul 2019 09:37:42 +0000
Subject: [PATCH] SVG est une image comme les autres : ajoute le support pour
 l'upload de SVG

---
 action/ajouter_documents.php |  2 +-
 action/tourner.php           |  2 +-
 base/typedoc.php             |  1 +
 inc/documents.php            |  7 +++----
 inc/vignette.php             |  2 +-
 medias_administrations.php   |  5 +++++
 metadata/image.php           | 22 ++++++++++++---------
 metadata/svg.php             | 37 ++++--------------------------------
 paquet.xml                   |  4 ++--
 9 files changed, 31 insertions(+), 51 deletions(-)

diff --git a/action/ajouter_documents.php b/action/ajouter_documents.php
index a9ed6e58..aa129a9d 100644
--- a/action/ajouter_documents.php
+++ b/action/ajouter_documents.php
@@ -517,7 +517,7 @@ function verifier_taille_document_acceptable(&$infos) {
 				if (@file_exists($img) and $img !== $infos['fichier']) {
 					spip_unlink($infos['fichier']);
 					@rename($img, $infos['fichier']);
-					$size = @getimagesize($infos['fichier']);
+					$size = @spip_getimagesize($infos['fichier']);
 					$infos['largeur'] = $size[0];
 					$infos['hauteur'] = $size[1];
 					$infos['taille'] = @filesize($infos['fichier']);
diff --git a/action/tourner.php b/action/tourner.php
index a7533ac8..042c22ba 100644
--- a/action/tourner.php
+++ b/action/tourner.php
@@ -92,7 +92,7 @@ function action_tourner_post($id_document, $angle) {
 		deplacer_fichier_upload($res, $dest);
 	} else {
 		$dest = $src;
-		$size_image = @getimagesize($dest);
+		$size_image = @spip_getimagesize($dest);
 		$largeur = $size_image[0];
 		$hauteur = $size_image[1];
 	}
diff --git a/base/typedoc.php b/base/typedoc.php
index 6ed6b6ef..5646fdb8 100644
--- a/base/typedoc.php
+++ b/base/typedoc.php
@@ -24,6 +24,7 @@ $tables_images = array(
 
 	// Autres images (peuvent utiliser le tag <img>)
 	'bmp' => 'BMP',
+	'svg' => 'SVG',
 );
 
 // Multimedia (peuvent utiliser le tag <embed>)
diff --git a/inc/documents.php b/inc/documents.php
index 9bfc5970..401ea445 100644
--- a/inc/documents.php
+++ b/inc/documents.php
@@ -129,11 +129,11 @@ function vignette_automatique($img, $doc, $lien, $x = 0, $y = 0, $align = '', $c
 		} else {
 			$f = charger_fonction('vignette', 'inc');
 			$img = $f($e, false);
-			$size = @getimagesize($img);
+			$size = @spip_getimagesize($img);
 			$img = "<img src='$img' " . $size[3] . ' />';
 		}
 	} else {
-		$size = @getimagesize($img);
+		$size = @spip_getimagesize($img);
 		$img = "<img src='$img' " . $size[3] . ' />';
 	}
 	// on appelle image_reduire independamment de la presence ou non
@@ -180,8 +180,7 @@ function vignette_automatique($img, $doc, $lien, $x = 0, $y = 0, $align = '', $c
  */
 function image_du_document($document, $connect = null) {
 	if ($e = $document['extension']
-		and isset($GLOBALS['meta']['formats_graphiques'])
-		and (strpos($GLOBALS['meta']['formats_graphiques'], $e) !== false)
+		and in_array($e, formats_image_acceptables())
 		and (!test_espace_prive() or $GLOBALS['meta']['creer_preview'] == 'oui')
 		and $document['fichier']
 	) {
diff --git a/inc/vignette.php b/inc/vignette.php
index 2dd05749..555c0dba 100644
--- a/inc/vignette.php
+++ b/inc/vignette.php
@@ -63,7 +63,7 @@ function inc_vignette_dist($ext, $size = true, $loop = true) {
 	}
 
 	$largeur = $hauteur = 0;
-	if ($v and $size = @getimagesize($v)) {
+	if ($v and $size = @spip_getimagesize($v)) {
 		$largeur = $size[0];
 		$hauteur = $size[1];
 	}
diff --git a/medias_administrations.php b/medias_administrations.php
index 8a267bca..a521b110 100644
--- a/medias_administrations.php
+++ b/medias_administrations.php
@@ -200,6 +200,11 @@ function medias_upgrade($nom_meta_base_version, $version_cible) {
 		// ajout de vtt
 		array('creer_base_types_doc')
 	);
+
+	$maj['1.4.0'] = array(
+		// update de SVG
+		array('creer_base_types_doc')
+	);
 	include_spip('base/upgrade');
 	include_spip('base/medias');
 	maj_plugin($nom_meta_base_version, $version_cible, $maj);
diff --git a/metadata/image.php b/metadata/image.php
index 35af1af1..23786037 100644
--- a/metadata/image.php
+++ b/metadata/image.php
@@ -17,7 +17,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
 function metadata_image_dist($fichier) {
 	$meta = array();
 
-	if ($size_image = @getimagesize($fichier)) {
+	if ($size_image = @spip_getimagesize($fichier)) {
 		$meta['largeur'] = intval($size_image[0]);
 		$meta['hauteur'] = intval($size_image[1]);
 		$meta['type_image'] = decoder_type_image($size_image[2]);
@@ -36,21 +36,25 @@ function metadata_image_dist($fichier) {
 // https://code.spip.net/@decoder_type_image
 function decoder_type_image($type, $strict = false) {
 	switch ($type) {
-		case 1:
+		case IMAGETYPE_GIF:
 			return 'gif';
-		case 2:
+		case IMAGETYPE_JPEG:
 			return 'jpg';
-		case 3:
+		case IMAGETYPE_PNG:
 			return 'png';
-		case 4:
+		case IMAGETYPE_SWF:
 			return $strict ? '' : 'swf';
-		case 5:
+		case IMAGETYPE_PSD:
 			return 'psd';
-		case 6:
+		case IMAGETYPE_BMP:
 			return 'bmp';
-		case 7:
-		case 8:
+		case IMAGETYPE_TIFF_II:
+		case IMAGETYPE_TIFF_MM:
 			return 'tif';
+		case IMAGETYPE_WEBP:
+			return 'webp';
+		case IMAGETYPE_SVG:
+			return $strict ? '' : 'svg';
 		default:
 			return '';
 	}
diff --git a/metadata/svg.php b/metadata/svg.php
index b2914415..e2393331 100644
--- a/metadata/svg.php
+++ b/metadata/svg.php
@@ -34,52 +34,23 @@ include_spip('inc/autoriser');
 function metadata_svg_dist($file) {
 	$meta = array();
 
-	$texte = spip_file_get_contents($file);
-
 	// Securite si pas autorise : virer les scripts et les references externes
 	// sauf si on est en mode javascript 'ok' (1), cf. inc_version
 	if ($GLOBALS['filtrer_javascript'] < 1
 		and !autoriser('televerser', 'script')
 	) {
 		include_spip('inc/texte');
+		$texte = spip_file_get_contents($file);
 		$new = trim(safehtml($texte));
 		// petit bug safehtml
 		if (substr($new, 0, 2) == ']>') {
 			$new = ltrim(substr($new, 2));
 		}
 		if ($new != $texte) {
-			ecrire_fichier($file, $texte = $new);
-		}
-	}
-
-	$width = $height = 150;
-	if (preg_match(',<svg[^>]+>,', $texte, $s)) {
-		$s = $s[0];
-		if (preg_match(',\WviewBox\s*=\s*.\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+),i', $s, $r)) {
-			$width = $r[3];
-			$height = $r[4];
-		} else {
-			// si la taille est en centimetre, estimer le pixel a 1/64 de cm
-			if (preg_match(',\Wwidth\s*=\s*.(\d+)([^"\']*),i', $s, $r)) {
-				if ($r[2] != '%') {
-					$width = $r[1];
-					if ($r[2] == 'cm') {
-						$width <<= 6;
-					}
-				}
-			}
-			if (preg_match(',\Wheight\s*=\s*.(\d+)([^"\']*),i', $s, $r)) {
-				if ($r[2] != '%') {
-					$height = $r[1];
-					if ($r[2] == 'cm') {
-						$height <<= 6;
-					}
-				}
-			}
+			ecrire_fichier($file, $new);
 		}
 	}
-	$meta['largeur'] = $width;
-	$meta['hauteur'] = $height;
 
-	return $meta;
+	$metadata = charger_fonction('image', 'metadata');
+	return $metadata($file);
 }
diff --git a/paquet.xml b/paquet.xml
index c157dd38..1b542d5b 100644
--- a/paquet.xml
+++ b/paquet.xml
@@ -1,11 +1,11 @@
 <paquet
 	prefix="medias"
 	categorie="multimedia"
-	version="2.22.1"
+	version="2.23.0"
 	etat="stable"
 	compatibilite="[3.3.0-dev;3.3.*]"
 	logo="prive/themes/spip/images/portfolio-32.png"
-	schema="1.3.6"
+	schema="1.4.0"
 >
 
 	<nom>Medias</nom>
-- 
GitLab