Code
Dernière modification : 2007/08/03 13:13
Pour une balise de code efficace
Changement de la balise de { vers { { pour ne pas avoir de collision avec les fonctions
j'ai une 1ere version qui marche \o/ → 2.19+4b2
Voir TestCode pour une petite démo.
Fonctionnement et code source
L'idée est d'extraire le code de la page avant le traitement des regex. Comme cela on évite que les autres balises soient interprétées.
Ensuite, on les re-insère à la fin. Cela se fait donc en deux parties.
Attention dans le code suivant, il faut retirer les espaces entre les {
- On remplace le texte contenu entre les balises { { et } } par le token CODE (ligne 203 en TW2.21). Ajoutez :
$nbcode = preg_match_all("/{ {(.+)} }/Ums",$CONTENT,$matches_code);
$CONTENT = preg_replace("/{ {(.+)} }/Ums","<code><pre>{ {CODE} }</pre></code>",$CONTENT);
avant la ligne :
$CONTENT = preg_replace("/\^(.)/Umsie", "'&#'.ord('\\1').';'", $CONTENT);
- Puis à la fin, on remplace ce token par le texte préalablement extrait (ligne 259 en TW2.21). Ajoutez :
function matchcode($m) {global $matches_code;static $idxcode=0; return $matches_code[1][$idxcode++];}
if ($nbcode > 0)
$CONTENT = preg_replace_callback(array_fill(0,$nbcode,"/{ {CODE} }/"),"matchcode",$CONTENT);
après la ligne
$CONTENT = html_entity_decode($CONTENT);
- Il faut aussi supprimer (ou commenter) l'ancienne regex (ligne 252) :
//$CONTENT = preg_replace("/{(.+)}/Ue", "'<pre><code>' . preg_replace('#<br />#', '', '\\1') . '</code></pre>'", $CONTENT);
Problèmes
-
Problème avec les caractères accentués dans le code→ solution temporaire, voir UTF-8
é è ô à
- Il faut éviter { { CODE } } sans espace dans le texte
- L'imbrication ne marche pas (comme vu ci-dessus) :
pour du code :
{{ print "hello";
}}
- Quand on insère du code avec des CR/LF, deux sauts de lignes sont affichés