From 46765a0041e0bf100fd49b2630027752fc12e7d1 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Tue, 27 Sep 2022 16:55:13 +0200
Subject: [PATCH] fix: normaliser le balisage des blocs de code dans le rendu
 du texte avec une fonction `spip_balisage_code()` qui genere un
 `<div><pre><code>` si c'est un bloc de code ou un simple `<code>` si c'est du
 code en ligne + ajouter les classes `.spip_code_block` et `.spip_code_inline`
 pour distinguer les 2 usages, et par extension ajouter la classe
 `.spip_cadre_block`

Refs: spip/textwheel#4843 #2504
---
 ecrire/inc/texte_mini.php | 52 ++++++++++++++++++++++++++++++---------
 1 file changed, 40 insertions(+), 12 deletions(-)

diff --git a/ecrire/inc/texte_mini.php b/ecrire/inc/texte_mini.php
index 7b4a8e0a27..ba2a84dbf1 100644
--- a/ecrire/inc/texte_mini.php
+++ b/ecrire/inc/texte_mini.php
@@ -56,6 +56,40 @@ function definir_puce() {
 	return $GLOBALS[$p];
 }
 
+/**
+ * Preparer le markup html pour les extraits de code en ligne ou en bloc
+ *
+ * @param string $corps
+ * @param bool $bloc
+ * @param string $attributs
+ * @param string $langage
+ * @return string
+ */
+function spip_balisage_code(string $corps, bool $bloc = false, string $attributs = '', string $langage = '') {
+
+	$echap = spip_htmlspecialchars($corps); // il ne faut pas passer dans entites_html, ne pas transformer les &#xxx; du code !
+	$class = "spip_code " . ($bloc ? 'spip_code_block' : 'spip_code_inline');
+	if ($langage) {
+		$class .= " $langage";
+	}
+	if ($bloc) {
+		$html = "<div class=\"precode\">"
+		  . "<pre class=\"$class\" dir=\"ltr\" style=\"text-align: left;\"$attributs>"
+		  . "<code>"
+		  . $echap
+		  . '</code>'
+		  . '</pre>'
+		  . '</div>';
+	}
+	else {
+		$echap = str_replace("\t", "&nbsp; &nbsp; &nbsp; &nbsp; ", $echap);
+		$echap = str_replace("  ", " &nbsp;", $echap);
+		$html = "<code class=\"$class\" dir=\"ltr\" $attributs>" . $echap . '</code>';
+	}
+
+	return $html;
+}
+
 
 // XHTML - Preserver les balises-bloc : on liste ici tous les elements
 // dont on souhaite qu'ils provoquent un saut de paragraphe
@@ -131,24 +165,18 @@ function traiter_echap_pre_dist($regs, $options = []) {
 // Echapper les <code>...</ code>
 function traiter_echap_code_dist($regs, $options = []) {
 	[, , $att, $corps] = $regs;
-	$echap = spip_htmlspecialchars($corps); // il ne faut pas passer dans entites_html, ne pas transformer les &#xxx; du code !
 
 	// ne pas mettre le <div...> s'il n'y a qu'une ligne
-	if (is_int(strpos($echap, "\n"))) {
+	if (strpos($corps, "\n") !== false) {
 		// supprimer les sauts de ligne debut/fin
 		// (mais pas les espaces => ascii art).
-		$echap = preg_replace("/^[\n\r]+|[\n\r]+$/s", '', $echap);
-		$echap = nl2br($echap);
-		$echap = "<div style='text-align: left;' "
-			. "class='spip_code' dir='ltr'><code$att>"
-			. $echap . '</code></div>';
+		$corps = preg_replace("/^[\n\r]+|[\n\r]+$/s", '', $corps);
+
+		$echap = spip_balisage_code($corps, true, $att);
 	} else {
-		$echap = "<code$att class='spip_code' dir='ltr'>" . $echap . '</code>';
+		$echap = spip_balisage_code($corps, false, $att);
 	}
 
-	$echap = str_replace("\t", '&nbsp; &nbsp; &nbsp; &nbsp; ', $echap);
-	$echap = str_replace('  ', ' &nbsp;', $echap);
-
 	return $echap;
 }
 
@@ -162,7 +190,7 @@ function traiter_echap_cadre_dist($regs, $options = []) {
 		$n += floor(strlen($l) / 60) + 1;
 	}
 	$n = max($n, 2);
-	$echap = "\n<textarea readonly='readonly' cols='40' rows='$n' class='spip_cadre' dir='ltr'>$echap</textarea>";
+	$echap = "\n<textarea readonly='readonly' cols='40' rows='$n' class='spip_cadre spip_cadre_block' dir='ltr'>$echap</textarea>";
 
 	return $echap;
 }
-- 
GitLab