Browse Source

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
remotes/checkIfPRContentChanged-1664367935568689996/balisage_pre_code
Cerdic 4 months ago
parent
commit
0ed18d2ced
  1. 52
      ecrire/inc/texte_mini.php

52
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;
}

Loading…
Cancel
Save