[spip-dev] Affichage de code source dans un article

Bonsoir,

je suis en train de mettre en place la 1.2 beta 13 sur
http://articles.phpheaven.net/

C'est destiné à reprendre les articles publiés sur phpHeaven, que ce
soit en français ou en anglais, donc j'ai pris l'option de créer un
secteur par langue.

Les articles publiés sont plutôt techniques et comportent presque
toujours des exemples de code.

Pour "bien" afficher le code, je fais par exemple, dans le corps d'un
article :

<html>
<pre>
<?php
// exemple
phpinfo();
?>
</pre>
</html>

Le problème est que je me retrouve avec des sauts de ligne doublés, ce
qui n'est pas top, donc j'ai fini par faire une petite fonction de
nettoyage que j'appelle par [(#TEXTE|propre|clean_pre)].

En voici le code :

function clean_pre($in)
{
  $prePos = strpos(strtolower($in), '<pre>');
  $prePos2 = strpos(strtolower($in), '</pre>');
  if ($prePos && $prePos2 && $prePos < $prePos2) {
    $toBeCleaned = $in;
    $out = '';
    while ($prePos && $prePos2 && $prePos < $prePos2) {
      $out .= substr($toBeCleaned, 0, $prePos - 1);
      $preContent = substr($toBeCleaned, $prePos + 5, $prePos2 - $prePos - 5);
      $out .= '<pre>' . ereg_replace("\n\n", "\n", $preContent) . '</pre>';
      $toBeCleaned = substr($toBeCleaned, $prePos2 + 6);
      $prePos = strpos(strtolower($toBeCleaned), '<pre>');
      $prePos2 = strpos(strtolower($toBeCleaned), '</pre>');
    }
    $out .= $toBeCleaned;
  } else {
    $out = $in;
  }
  return $out;
}

Comme ça, cela semble aller mieux ... :slight_smile:

-Nicolas

Merci pour tout ! Mais mieux vaudrait retravailler un peu propre() et
l'empêcher de mettre ces doubles sauts de ligne : personnellement je n'ai
pas retrouvé à quel moment on ls a introduits. Peut-être quand on convertit
les \r en \n... à voir.

@ Nicolas Hoizey (nhoizey@phpheaven.net) :

Le problème est que je me retrouve avec des sauts de ligne doublés, ce
qui n'est pas top, donc j'ai fini par faire une petite fonction de
nettoyage que j'appelle par [(#TEXTE|propre|clean_pre)].

En voici le code :

-- Fil

Mais mieux vaudrait retravailler un peu propre() et l'empêcher de
mettre ces doubles sauts de ligne

C'est sûr, mais j'étais pressé ... :wink:

personnellement je n'ai pas retrouvé à quel moment on ls a
introduits. Peut-être quand on convertit les \r en \n... à voir.

Oui, je pense. Il se trouve en effet que je bosse sous Windows, et
donc mes retours chariots sont "\r\n". Ce qui est remplacé par SPIP
par "\n\n" ...

Il faudrait tout simplement mieux remplacer "\r\n" par "\n", non ?

Je rappelle que Windows utilise "\r\n" et Unix "\n". Pour Mac et les
autres, je ne sais pas ...

-Nicolas

Oui, je pense. Il se trouve en effet que je bosse sous Windows, et
donc mes retours chariots sont "\r\n". Ce qui est remplac=E9 par SPIP
par "\n\n" ...
=20
Il faudrait tout simplement mieux remplacer "\r\n" par "\n", non ?
=20
Je rappelle que Windows utilise "\r\n" et Unix "\n". Pour Mac et les
autres, je ne sais pas ...

Sur Mac, c'est "\r". Simple, non!
Manolo

Bonjour,

suite à notre petite discussion d'hier, nous avons :

Windows \r\n
Unix \n
Mac \r

Donc, dans la fonction 'traiter_raccourcis()' de 'inc_texte.php3', en ligne
494, il faut à priori remplacer

$letexte = strtr($letexte, "\r", "\n");

par

$letexte = ereg_replace("((.)\r\n(.)|([^\r])\n(.)|(.)\r([^\n]))", "\\2\n\\3",
$letexte);

Ca marche très bien en client Windows, et je n'ai plus besoin de ma
fonction 'clean_pre()'.

Qui peut tester sur *nix et Mac ?

-Nicolas

$letexte = ereg_replace("((.)\r\n(.)|([^\r])\n(.)|(.)\r([^\n]))",
"\\2\n\\3", $letexte);

Oups, attention, ça foire la gestion des paragraphes, donc il faut deux "\n"
dans la seconde expression, qui devient "\\2\n\n\\3", et de nouveau utiliser la
fonction 'clean_pre()' en attendant que ce soit géré nativement.

Désolé pour cette approximation hative ...

-Nicolas