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", " ", $echap); + $echap = str_replace(" ", " ", $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", ' ', $echap); - $echap = str_replace(' ', ' ', $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