=> * * Tous les fichiers images sont dans le dossier "graphics/smilies" */ $liste_smilies = array ( '[:cool:]' => 'cool.gif', '[;-)]' => 'wink.gif', '[:-p]' => 'tongue.gif', '[:-)]' => 'smile.gif', '[:-))]' => 'biggrin.gif', '[:-D]' => 'laugh.gif', '[:thup:]' => 'thumbup.gif', '[:roll:]' => 'rolleyes.gif', '[<_<]' => 'dry.gif', '[:-\]' => 'unsure.gif', '[:huh:]' => 'huh.gif', '[o_O]' => 'blink.gif', '[8-O]' => 'shock.gif', '[:-(]' => 'sad.gif', '[:\'-(]' => 'crying.gif', '[>_<]' => 'ranting.gif', '[%-S]' => 'wacko.gif', '[:help:]' => 'help.gif', '[:no:]' => 'no.gif', '[-_-]' => 'closedeyes.gif', '[:-}]' => 'blush.gif', '[<3]' => 'wub.gif', '[->]' => 'icon_arrow.gif', '[%-)]' => 'crazy.gif', '[8-)]' => 'surprised.gif', ); /** * Convertit les codes de smilies en HTML (sous forme d'images) */ function conv_smilies ($chaine) { global $liste_smilies; $modele = array (); $remplacement = array (); foreach ($liste_smilies as $cle => $nomFicImg) { $modele[] = conv_html ($cle); $remplacement[] = ''; } return str_replace ($modele, $remplacement, $chaine); } /** * Convertit les bbcodes en HTML * * Cette fonction doit être appliquée sur une chaine HTML, après * conv_url_bbcodes () et conv_html() */ function conv_bbcodes ($chaine) { // Pour les bbcodes acceptant l'imbrication, la partie centrale du masque // (récursif) doit être la suivante : (.*?((?R).*?)*) // Note: Les masques récursifs ne fonctionnent que depuis PHP 4.3.0. // Pour PHP < 4.3.0, les bbcodes de même nom ne doivent donc pas être imbriqués. // Par exemple, [color=red] rouge [color=blue] bleu [/color] rouge [/color] // ne fonctionne pas. global $cfgVersionPhortail; $modele = array ( '/(?s)\[b\](.*?((?R).*?)*)\[\/b\]/', '/(?s)\[i\](.*?((?R).*?)*)\[\/i\]/', '/(?s)\[u\](.*?((?R).*?)*)\[\/u\]/', '/(?s)\[s\](.*?((?R).*?)*)\[\/s\]/', '/(?s)\[color=((?i)#[\da-f]{3}|#[\da-f]{6}|[a-z]+)\](.*?((?R).*?)*)\[\/color\]/', '/(?s)\[font=([\w\',-]+(?:\s*[\w\',-]+)*)\](.*?((?R).*?)*)\[\/font\]/', '/(?s)\[size=(\d+)\](.*?((?R).*?)*)\[\/size\]/', '/(?s)\[align=(center|right|justify)\](.*?((?R).*?)*)\[\/align\]/', '/(?s)\[centrer\](.*?((?R).*?)*)\[\/centrer\]/', '/(?s)\[droite\](.*?((?R).*?)*)\[\/droite\]/', '/(?s)\[justifier\](.*?((?R).*?)*)\[\/justifier\]/', '/\[url=([^]]+)\](.*?)\[\/url\]/', '/\[siteurl=([^]]+)\](.*?)\[\/siteurl\]/', '/\[email=([^]]+)\](.*?)\[\/email\]/', '/\[img\]([^[]+)\[\/img\]/', '/\[img=(left|right)\]([^[]+)\[\/img\]/', '/\[phpversion\]/', '/\[phortailversion\]/', ); $remplacement = array ( '\\1', '\\1', '\\1', '\\1', '\\2', '\\2', '\\2', '\\2', '\\1', '\\1', '\\1', '\\2', '\\2', '\\2', '', '', conv_html (PHP_VERSION), conv_html ($cfgVersionPhortail), ); /* Conversion des bbcodes */ if (version_compare (PHP_VERSION, '5.1.0', '>=')) { do { $chaine = preg_replace ($modele, $remplacement, $chaine, -1, $nRemplacements); } while ($nRemplacements != 0); } else { /* Version moins "élégante", pour PHP < 5.1.0 */ do { $chaine1 = $chaine; $chaine = preg_replace ($modele, $remplacement, $chaine); } while ($chaine != $chaine1); } /* Conversion des bbcodes de listes ([list]) */ if (version_compare (PHP_VERSION, '4.3.3', '>=')) { $chaine = conv_bbcode_liste ($chaine); } else { /* * Version pour PHP < 4.3.3 * Cette version ne convertit pas les listes imbriquées ! */ $chaine = conv_bbcode_liste_v1 ($chaine); } return $chaine; } /** * Convertit les bbcodes de listes ([list]) * * Les listes imbriquées sont prises en charge. * Attention : cette fonction requiert PHP >= 4.3.3 ! */ function conv_bbcode_liste ($chaine, $niveau = 0) { $attributs_ol = array ( '1' => 'decimal', 'a' => 'lower-alpha', 'A' => 'upper-alpha', 'i' => 'lower-roman', 'I' => 'upper-roman' ); $attributs_ul = array ('disc', 'square', 'circle'); $chn = ''; $len = strlen ($chaine); $i = 0; while ($i < $len) { /* Recherche du prochain bloc [list]...[/list] */ $trv = preg_match ( '/\[list(=(.*?))?\](\s+|
)*(.*?((?R).*?)*)\[\/list\](\s*
)?/', $chaine, $matches, PREG_OFFSET_CAPTURE, $i); if ($trv) { $pos = $matches[0][1]; } else { $pos = $len; } /* Recopie de la partie avant [list] */ $chn .= substr($chaine, $i, $pos - $i); if ($trv) { /* Bloc [list]...[/list] trouvé */ $type = trim($matches[2][0]); // Type de liste $texteListe = $matches[4][0]; // Contenu du bloc /* Conversion du contenu du bloc (appel récursif) */ $listeConvertie = conv_bbcode_liste($texteListe, 1); if ($listeConvertie != '') { $nom = 'ul'; if ($type != '') { if (isset ($attributs_ol[$type])) { $nom = 'ol'; $type = $attributs_ol[$type]; } elseif (!in_array ($type, $attributs_ul)) { $type = ''; } } if ($type == '') { $codeDebut = '<'.$nom.' style="margin-top: 0; margin-bottom: 0">'; } else { $codeDebut = '<'.$nom.' style="list-style-type: '.$type.'; margin-top: 0; margin-bottom: 0">'; } $codeFin = ''; /* Ajout de la liste convertie avec les tags HTML de début et de fin */ $chn .= "\n".$codeDebut."\n".$listeConvertie.$codeFin."\n"; } /* Déplacement du pointeur de chaine à la fin du bloc traité */ $i = $matches[0][1] + strlen ($matches[0][0]); } else { $i = $pos; } } if ($niveau > 0) { /* Conversion des bbcodes [*] */ $elements = preg_split ('/\s*\[\*\]\s*/', $chn, -1, PREG_SPLIT_NO_EMPTY); if (empty ($elements)) { $chn = ''; } else { $chn = '
  • '.implode ("
  • \n
  • ", $elements).'
  • '."\n"; } } return $chn; } /** * Convertit les bbcodes de menus ([menu]) */ function conv_bbcode_menu ($chaine) { $modele = '/\[menu\](\s+|
    )*(.*?)\[\/menu\](\s*
    )?/'; return preg_replace_callback ($modele, 'callback_bbcode_menu', $chaine); } function callback_bbcode_menu ($matches) { $texteMenu = $matches[2]; $elements = preg_split('#\s*
    \s*#', $texteMenu, -1, PREG_SPLIT_NO_EMPTY); if (empty ($elements)) { $chn = ''; } else { $chn = "\n".''."\n"; foreach ($elements as $element) { $chn .= ' '; } $chn .= '

    '.conv_ponctuation ($element).'

    '."\n"; } return $chn; } /** * Encode les URL à l'intérieur des bbcodes qui en contiennent * * Les caractères non alphanumériques (sauf -_.) sont encodés sous la forme %hh * où h est un chiffre hexadécimal (ex: espace -> %20, é -> %E9) * * Cette fonction doit être appliquée sur une chaine brute, avant conv_html() * et conv_bbcodes(). * * Les bbcodes [url], [siteurl] et [email] sont transformés respectivement en * [url=], [siteurl=] et [email=] pour que le texte visible reste non encodé. */ function conv_url_bbcodes ($chaine) { $modele = array ( '/(\[url=)(.*?)(\].*?\[\/url\])/', // [url=][/url] '/\[(url)\](.*?)(\[\/url\])/', // [url][/url] '/(\[siteurl=)(.*?)(\].*?\[\/siteurl\])/', // [siteurl=][/siteurl] '/\[(siteurl)\](.*?)(\[\/siteurl\])/', // [siteurl][/siteurl] '/(\[email=)(.*?)(\].*?\[\/email\])/', // [email=][/email] '/\[(email)\](.*?)(\[\/email\])/', // [email][/email] '/(\[img\])(.*?)(\[\/img\])/', // [img][/img] '/(\[img=.*?\])(.*?)(\[\/img\])/', // [img=][/img] ); return preg_replace_callback ($modele, create_function ('$matches', 'if ($matches[1] == "url" or $matches[1] == "siteurl") '. ' return "[".$matches[1]."=".encode_url_components($matches[2], "http", false)."]".$matches[2].$matches[3]; '. 'elseif ($matches[1] == "email") '. ' return "[".$matches[1]."=".encode_url_components($matches[2], "mailto", false)."]".$matches[2].$matches[3]; '. 'else return $matches[1].encode_url_components($matches[2], "http", false).$matches[3];'), $chaine); } /** * Convertit la chaine en HTML (sauts de lignes et caractères HTML spéciaux), * sauf les parties entre les balises [html][/html] qui sont laissées intactes. */ function conv_bbcode_html ($chaine) { $chn = ''; $len = strlen ($chaine); $i = 0; while ($i < $len) { $pos = strpos ($chaine, '[html]', $i); $trv = (!is_bool($pos) || $pos); /* sous-chaine trouvée */ if (!$trv) { $pos = $len; } /* Convertit en HTML la partie avant [html], en utilisant la fonction $fonction_conv */ $chn .= conv_sauts_ligne (conv_ponctuation (conv_html (substr ($chaine, $i, $pos - $i)))); if ($trv) { $i = $pos + 6; $pos = strpos ($chaine, '[/html]', $i); if (is_bool($pos) && !$pos) { $pos = strlen ($chaine); /* sous-chaine non trouvée */ } /* Copie la partie entre [html] et [/html] sans modification */ $chn .= substr ($chaine, $i, $pos - $i); $i = $pos + 7; } else { $i = $pos; } } return $chn; } /** * Convertit en HTML une chaine saisie par l'utilisateur. * Les bbcodes, smilies, sauts de lignes et caractères HTML spéciaux sont convertis. */ function conv_texte_bbcodes ($chaine) { /* L'ordre d'appel des fonctions doit être respecté ! */ return conv_smilies (conv_bbcodes (conv_sauts_ligne (conv_ponctuation (conv_html (conv_url_bbcodes ($chaine)))))); } /** * Convertit en HTML une chaine saisie par l'utilisateur. * Les bbcodes, smilies, sauts de lignes et caractères HTML spéciaux sont convertis. * * ATTENTION ! Le code HTML entre les balises [html][/html] est conservé et sera * donc interprété à l'affichage ! * * NE PAS utiliser cette fonction pour des informations saisies par les visiteurs ! */ function conv_texte_bbcodes_html ($chaine) { return conv_smilies (conv_bbcodes (conv_bbcode_html (conv_url_bbcodes ($chaine)))); } /******************************************************************************* * * Outils d'édition des BBcodes et des smilies * ******************************************************************************/ /** * Affiche la liste des smilies sous forme d'images cliquables * * Le nombre total de smilies affichés et le nombre de smilies par ligne est * paramétrable. * * Le clic sur une image insère le code texte du smiley dans le champ de * formulaire (de type TEXTAREA) dont l'identifiant (id) est spécifié * (par défaut: "bbcodes_txt"). */ function afficher_smilies ($nb_smilies, $nb_par_ligne, $champ = 'bbcodes_txt') { global $liste_smilies; echo '

    '."\n"; $i = 1; foreach ($liste_smilies as $cle => $nomFicImg) { if ($i > $nb_smilies) { break; } echo ''. ''.conv_html($cle).''; if (is_int($i / $nb_par_ligne)) { echo '
    '."\n"; } else { echo "\n"; } $i++; } echo '

    '."\n"; } /** * Affiche une boite d'outils contenant : * * - les boutons permettant d'insérer, modifier ou supprimer les bbcodes * - les boutons permettant d'insérer les smilies * * Les bbcodes ou smilies sont insérés dans le champ de formulaire (de type * TEXTAREA) dont l'identifiant (id) est "bbcodes_txt" (non paramétrable). */ function afficher_bbcodes_et_smilies () { echo '
    Gras Italique Souligné   Centrer Aligner à droite Justifier   Liste Liste numérotée   Insérer une image Insérer un lien Insérer une adresse email
    '; afficher_smilies (23, 12); echo '

    '; } /******************************************************************************* * * Fonctions de compatibilité pour les anciennes versions de PHP * ******************************************************************************/ /* * Compatibilité avec PHP < 4.3.3 */ function conv_bbcode_liste_v1 ($chaine) { $modele = '/\[list(=(.*?))?\](\s+|
    )*(.*?((?R).*?)*)\[\/list\](\s*
    )?/e'; $remplacement = "conv_texte_bbcode_liste_v1('\\2', '\\4')"; return preg_replace ($modele, $remplacement, $chaine); } function conv_texte_bbcode_liste_v1 ($type, $texteListe) { $attributs_ol = array ( '1' => 'decimal', 'a' => 'lower-alpha', 'A' => 'upper-alpha', 'i' => 'lower-roman', 'I' => 'upper-roman' ); $attributs_ul = array ('disc', 'square', 'circle'); /* Suppression des backslashes ajoutés par preg_replace() */ $texteListe = str_replace ('\"', '"', $texteListe); $type = trim ($type); $nom = 'ul'; if ($type != '') { if (isset ($attributs_ol[$type])) { $nom = 'ol'; $type = $attributs_ol[$type]; } elseif (! in_array($type, $attributs_ul)) { $type = ''; } } if ($type == '') { $codeDebut = '<'.$nom.'>'; } else { $codeDebut = '<'.$nom.' style="list-style-type: '.$type.'">'; } $codeFin = ''; /* Conversion des bbcodes [*] */ $elements = preg_split ('/\s*\[\*\]\s*/', $texteListe, -1, PREG_SPLIT_NO_EMPTY); if (empty ($elements)) { $chn = ''; } else { $chn = "\n".$codeDebut."\n
  • ".implode ("
  • \n
  • ", $elements)."
  • \n".$codeFin."\n"; } return $chn; } ?>