From 9ef4c078fae4ccef00782a3901b340fe9888d2d3 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Tue, 19 Nov 2019 12:05:18 +0100
Subject: [PATCH] Faciliter l'utilisation d'icones SVG ET la compatibilite avec
 versions precedentes de SPIP : - on peut fournir une icone generique -xx.svg
 qui sera utilisee en remplacement de toutes les icones -32.png, -24.png,
 16.png Ca permet de fournir les icones au format png pour les anciennes
 versions de SPIP, en continuant a les referencer dans le paquet.xml ET de
 fournir a cote une seule version svg qui sera utilisee preferentiellement
 dans SPIP 3.3+

---
 ecrire/inc/filtres.php        | 19 +++++++++++++++----
 ecrire/inc/icone_renommer.php |  2 +-
 ecrire/inc/utils.php          |  7 +++++++
 3 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 9b3e063411..7ae74fa5e6 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -3296,20 +3296,31 @@ function charge_scripts($files, $script = true) {
  *   chemin_image : utiliser chemin_image sur $img fourni, ou non (oui par dafaut)
  *   utiliser_suffixe_size : utiliser ou non le suffixe de taille dans le nom de fichier de l'image
  *   sous forme -xx.png (pour les icones essentiellement) (oui par defaut)
+ *   variante_svg_si_possible: utiliser l'image -xx.svg au lieu de -32.png par exemple (si la variante svg est disponible)
  * @return string
  */
 function http_img_pack($img, $alt, $atts = '', $title = '', $options = array()) {
+	$img_file = $img;
 	if (!isset($options['chemin_image']) or $options['chemin_image'] == true) {
-		$img = chemin_image($img);
+		$img_file = chemin_image($img);
+	}
+	else {
+		if (!isset($options['variante_svg_si_possible']) or $options['variante_svg_si_possible'] == true){
+			if (preg_match(',-\d+[.](png|gif|svg)$,', $img_file, $m)
+				and $variante_svg_generique = substr($img_file, 0, -strlen($m[0])) . "-xx.svg"
+				and file_exists($variante_svg_generique)){
+				$img_file = $variante_svg_generique;
+			}
+		}
 	}
 	if (stripos($atts, 'width') === false) {
 		// utiliser directement l'info de taille presente dans le nom
 		if ((!isset($options['utiliser_suffixe_size']) or $options['utiliser_suffixe_size'] == true)
-			and preg_match(',-([0-9]+)[.](png|gif)$,', $img, $regs)
+			and preg_match(',-([0-9]+)[.](png|gif|svg)$,', $img, $regs)
 		) {
 			$largeur = $hauteur = intval($regs[1]);
 		} else {
-			$taille = taille_image($img);
+			$taille = taille_image($img_file);
 			list($hauteur, $largeur) = $taille;
 			if (!$hauteur or !$largeur) {
 				return "";
@@ -3318,7 +3329,7 @@ function http_img_pack($img, $alt, $atts = '', $title = '', $options = array())
 		$atts .= " width='" . $largeur . "' height='" . $hauteur . "'";
 	}
 
-	return "<img src='$img' alt='" . attribut_html($alt ? $alt : $title) . "'"
+	return "<img src='$img_file' alt='" . attribut_html($alt ? $alt : $title) . "'"
 	. ($title ? ' title="' . attribut_html($title) . '"' : '')
 	. " " . ltrim($atts)
 	. " />";
diff --git a/ecrire/inc/icone_renommer.php b/ecrire/inc/icone_renommer.php
index f5ef5bbde6..134ad2b148 100644
--- a/ecrire/inc/icone_renommer.php
+++ b/ecrire/inc/icone_renommer.php
@@ -19,7 +19,7 @@ include_spip('base/objets');
 
 function inc_icone_renommer_dist($fond, $fonction) {
 	$size = 24;
-	if (preg_match("/(?:-([0-9]{1,3}))?([.](gif|png))?$/i", $fond, $match)
+	if (preg_match("/(?:-([0-9]{1,3}))?([.](gif|png|svg))?$/i", $fond, $match)
 		and ((isset($match[0]) and $match[0]) or (isset($match[1]) and $match[1]))
 	) {
 		if (isset($match[1]) and $match[1]) {
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index b223241549..89fb15c7e2 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -1385,6 +1385,13 @@ function find_in_theme($file, $subdir = '', $include = false) {
 	if (isset($themefiles["$subdir$file"])) {
 		return $themefiles["$subdir$file"];
 	}
+	// on peut fournir une icone generique -xx.svg qui fera le job dans toutes les tailles, et qui est prioritaire
+	if (preg_match(',-\d+[.](png|gif|svg)$,', $file, $m)
+	  and $file_svg_generique = substr($file,0, -strlen($m[0])) . "-xx.svg"
+		and $f = find_in_theme("$file_svg_generique")) {
+		return $themefiles["$subdir$file"] = $f;
+	}
+
 	$themes = lister_themes_prives();
 	foreach ($themes as $theme) {
 		if ($f = find_in_path($file, "prive/themes/$theme/$subdir", $include)) {
-- 
GitLab