// Copyleft (C) 2003 BohwaZ, license Art Libre
) ?
var $antispam = "oui"; // Protection anti-spam sur les adresses emails?
var $xhtml = "oui"; // Sortie xHTML Stricte ?
var $nettoyages = "oui"; // Effectuer les nettoyages pour chaque fonction? (désactivé automatiquement
// lors de l'exécution de totale)
var $smiley_path = "smileys/";
var $smiley_base = "/smileys/";
// FIN DE LA CONFIG ////////////////////////////////////////////////////////////////////////////
var $totale = "non"; // Ne pas toucher
// Pour coder les adresse eMail des expéditeurs avec des codes étranges ;o)
// Merci à Grand'Pa ;-) http://pretextes.apinc.org/
function _antispam($email)
{
//$email = str_replace("@","[at]",$email);
$len = strlen($email);
for($x = 0; $x < $len; $x++)
{
$ord = ord(substr($email,$x,1));
$temp.= "".$ord.";";
}
return $temp;
}
// Pour la correction typographique française
function typofr($texte)
{
$texte = ereg_replace("[ ]([\?!]|»|»)"," \\1",$texte);
$texte = ereg_replace("(«|«) ","« ",$texte);
return $texte;
}
// Nettoyage précédent l'appel d'une fonction
function nettoyer_avant($texte)
{
$unicode = array("–" => "-", "—" => "-", "‘" => "'",
"’" => "'", "…" => "...", "“" => "\"", "”" => "\"", " "=>" ",
#"<"=>"<", ">"=>">",
"œ"=>"oe","…"=>"...","’"=>"'");
$texte = strtr($texte,$unicode);
$texte = str_replace("\r\n","\n",$texte);
$texte = str_replace("\r","",$texte);
$texte = str_replace("\t"," ",$texte);
$texte = stripslashes($texte);
return $texte;
}
// nettoyage suivant l'appel d'une fonction
function nettoyer_apres($texte)
{
$texte = trim($texte);
// retours à la ligne
if($this->retours == "oui") {
$texte = nl2br($texte);
if($this->xhtml == "oui") {
$texte = str_replace("
\n
\n","
",$texte); $texte = "
".$texte."
"; } } $texte = str_replace("\\a","\n",$texte); // Pour les retours à la ligne de formatage du code if($this->parse_urls == "oui") { // URLs (+ gestion des liens Peercast et ed2k) $texte = eregi_replace( "(^|[ \t\r\n>])((ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero|peercast|ed2k):". "[A-Za-z0-9/](([A-Za-z0-9$|.+!*(),;/?:@&~=_#-])|%[A-Fa-f0-9]{2})+)","\\1\\2",$texte); $texte = eregi_replace("(^|[ \t\r\n>])([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+)", "\\0", $texte); } if($this->antispam == "oui") { // Protection anti-spam while(eregi("([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+)",$texte,$out)) { $texte = str_replace($out[0],$this->_antispam($out[0]),$texte); } } if($this->smileys == "oui") // Smileys $texte = $this->smileys($texte); if($this->typo_fr == "oui") $texte = $this->typofr($texte); return $texte; } function totale($texte) { $this->nettoyages = "non"; $texte = $this->nettoyer_avant($texte); #$texte = $this->perso($texte); if($this->bbcode == "oui") $texte = $this->bbcode($texte); if($this->spip == "oui") $texte = $this->spip($texte); if($this->julika == "oui") $texte = $this->julika($texte); if($this->wiki == "oui") $texte = $this->wiki2xhtml($texte); if($this->berenice == "oui") $texte = $this->berenice($texte); $texte = $this->nettoyer_apres($texte); return $texte; } function perso($texte) { while(eregi("\[([^\n]*)-(>|>)(ecrit[ ]?|écrit[ ]?)?([0-9]+)\]",$texte,$out)) { $id = $out[4]; $lien = $out[1]; $res = mysql_query("SELECT id,name,mois,date,titre FROM ecrits WHERE id='{$id}'"); $rec = mysql_fetch_assoc($res); mysql_free_result($res); $url = '/'.substr($rec['mois'],0,4).'/'.substr($rec['mois'],4,2).'/'.date("d/",$rec['date']); if(!empty($rec['name'])) $url.= $rec['name']; else $url.= $rec['id']; if(empty($lien)) $lien = htmlentities(stripslashes($rec['titre'])); $texte = str_replace($out[0],''.$lien.'',$texte); } return $texte; } // BBCODE //////////////////////////////////////////////////////////////////////////////////// // La plupart du BBCode est compris par cette classe. Si vous trouvez des balises BBCode // // qui ne sont pas gérées par cette classe, contactez-moi. // // Les particularités de chaque forum (phpBB, Invision et Phorum) sont gérées. Si vous // // trouvez d'autres particularités avec d'autres forums, n'hésitez pas à me contacter. // ////////////////////////////////////////////////////////////////////////////////////////////// // Pour la balise [code] du bbcode function _code($texte) { return "".str_replace(" "," ",$texte[1])."
",$texte); $texte = preg_replace("|\[quote=[\"']?([^\"']+)[\"']?\]|Ui","",$texte); // Code source $texte = preg_replace_callback("|\[code\]([^\[]+)\[/code\]|Ui",array(&$this,_code),$texte); // Barre horizontale if($this->xhtml == "oui") $texte = preg_replace("|\[hr\]|Ui","\\1 a dit:
\\a",$texte); $texte = preg_replace("|\[/quote\]|Ui","
\\a",$texte); else $texte = preg_replace("|\[hr\]|Ui","
\\a",$texte); // Images $texte = preg_replace("|\[img\]([^\[]+)\[/img\]|Ui","",$texte); // Adresses URLs $texte = preg_replace("|\[url=([^\]]+)\]([^\[]+)\[/url\]|Ui","\\2",$texte); $texte = preg_replace("|\[url\]([^\[]+)\[/url\]|Ui","\\1",$texte); $texte = preg_replace("§\[email]([^\[]+)\[/email\]§Ui","\\1",$texte); // Listes à puces $texte = eregi_replace("\[/list\]","[/list]",$texte); // Pour passer en minuscules while(eregi("\[list(=([1a])?)?\]",$texte,$out)) { $deb = strpos($texte,$out[0]); $txt = substr($texte,$deb); $fin = strpos($txt,"[/list]"); $txt = substr($txt,0,$fin+7); // On détermine le type de liste if($out[2] == "1") $in = ''; elseif($out[2] == "a") $in = '
'; elseif(!empty($out[1])) $in = '
'; else $in = "
"; else $lst.= ""; $texte = str_replace($txt,$lst."\\a",$texte); } if($this->nettoyages == "oui") $texte = $this->nettoyer_apres($texte); return $texte; } //"; // Hop on construit la liste $lst = $in."\\a".substr($txt,strlen($out[0]),-7); $lst = preg_replace("/\[\*\](.+?)/U","
- \\1
\\a",$lst); $lst = str_replace("\n\n","\\b",$lst); $lst = str_replace("\n","",$lst); $lst = str_replace("\\b","\n\n",$lst); if(!empty($out[1])) $lst.= "Textes Bérénice ////////////////////////////////////////////////////////////////////////// // Il n'existe pas d'autres codes propres à Textes Bérénice, à ma connaissance. // // Le code suivant est directement repris du code du forum (http://pretextes.apinc.org/) // // Une liste des codes et de leur utilisation est disponible ici: http://mi-c.org/notisse.html // ////////////////////////////////////////////////////////////////////////////////////////////////// function berenice($texte) { if($this->nettoyages == "oui") $texte = $this->nettoyer_avant($texte); // La ligne suivante est à décommenter si vous avez l'utilité des liens vers des messages // internes au forum Bérénice //$texte = eregi_replace("\[\[\(([0-9]+)\)\]\]","> Message \\1",$texte); $texte = eregi_replace("\[\(\[([[:alnum:]|[:punct:]]+)\]\)\]([^[:space:]]*)([[:alnum:]|[:punct:]])", "\\1", $texte); $texte = eregi_replace("\[\(f\[([[:alnum:]|[:punct:]]+)\]f\)\]([^[:space:]]*)([[:alnum:]|[:punct:]])", "\\1", $texte); $texte = eregi_replace("\[\(i\[([[:alnum:]|[:punct:]]+)\]i\)\]([^[:space:]]*)([[:alnum:]|[:punct:]])", "\\1", $texte); $texte = eregi_replace("\[\(u\[([[:alnum:]|[:punct:]]+)\]u\)\]([^[:space:]]*)([[:alnum:]|[:punct:]])", "\\1", $texte); if($this->nettoyages == "oui") $texte = $this->nettoyer_apres($texte); return $texte; } // Raccourcis SPIP /////////////////////////////////////////////////////////////////////////// // Les raccourcis gérés ici sont conformes à ceux utilisés par la version 1.6 de Spip. // // Cependant les listes à puces sur plusieurs niveaux ne sont pas gérées (pas encore). // // Documentation de SPIP ici: http://www.spip.org/ // ////////////////////////////////////////////////////////////////////////////////////////////// // Pour les raccourcis SPIP (révision 0.1.3) function spip($texte) { if($this->nettoyages == "oui") $texte = $this->nettoyer_avant($texte); // Raccourcis simples: intertitres, gras, italique if($this->xhtml == "oui") $tablo = array("{{{" => " ", "}}}" => "
", "{{" => "", "}}" => "", "{" => "", "}" => ""); else $tablo = array("{{{" => "", "}}}" => "
", "{{" => "", "}}" => "", "{" => "", "}" => ""); $texte = strtr($texte,$tablo); $texte = ereg_replace("----+","
",$texte); // Barres horizontales // Puces (ne prend pas en compte les niveaux de profondeurs, du moins pas encore) #$texte = ereg_replace("(^|\n)-([*#]+)?","\\1- ",$texte); // Pour les liens spécifiques vers des articles, des brèves ou des rubriques: [Article->112] // A décommenter si vous voyez l'utilité de ces liens. // Attention: les liens de type [->article 3212] ne sont pas gérés, cette classe ne pouvant // récupérer le titre de l'article. #$texte = preg_replace("/\[([^\n]+)-(>|>)(ecrit|ecrit )?([0-9]+)\]/Ui","\\1",$texte); # $texte = preg_replace("/\[([^\n]+)-(>|>)(br|breve |brève )([0-9]+)\]/Ui","\\1",$texte); # $texte = preg_replace("/\[([^\n]+)-(>|>)(rub|rubrique )([0-9]+)\]/Ui","\\1",$texte); // Liens $texte = preg_replace("/\[([^\n]+)-(>|>)([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+)\]/Ui", "\\1",$texte); $texte = preg_replace("/\[([^\n]+)-(>|>)([^\]]+)\]/Ui","\\1",$texte); // Notes de bas de page preg_match_all("/\[\[([^\]]+)\]\]/Ui",$texte,$out,PREG_SET_ORDER); $a = 1; for($i=0; $i < count($out); $i++) { if(preg_match("/(<|<)([^> &]+)(>|>)/Ui",$out[$i][1],$out2)) { $note = $out2[2]; $out[$i][1] = str_replace($out2[0],"",$out[$i][1]); } else { $note = $a; $a++; } $texte = str_replace($out[$i][0], '['.$note.']',$texte); if($i == 0) $texte.= '
'; $texte.= '
- ['.$note.'] '.$out[$i][1].'
\\a'; if($i == count($out)-1) $texte.= ''; } // Tableaux (piqué directement dans spip même si j'aimerais refaire ça avec des regex) $texte = ereg_replace("^\n?\|","\n\n|",$texte); $texte = ereg_replace("\|\n?$","|\n\n",$texte); $tableBeginPos = strpos($texte, "\n\n|"); $tableEndPos = strpos($texte, "|\n\n"); while(is_integer($tableBeginPos) && is_integer($tableEndPos) && $tableBeginPos < $tableEndPos + 3) { $textBegin = substr($texte, 0, $tableBeginPos); $textTable = substr($texte, $tableBeginPos + 2, $tableEndPos - $tableBeginPos); $textEnd = substr($texte, $tableEndPos + 3); $newTextTable = "\n\n
"; if($this->xhtml == "oui") $newTextTable = "\n\n
"; $rowId = 0; $lineEnd = strpos($textTable, "|\n"); while(is_integer($lineEnd)) { $rowId++; $row = substr($textTable, 0, $lineEnd); $textTable = substr($textTable,$lineEnd+2); if ($rowId == 1)// && ereg("^(\\|[[:space:]]*\\{\\{[^}]+\\}\\}[[:space:]]*)+$", $row)) { $newTextTable .= '
\n"; $texte = $textBegin . $newTextTable . $textEnd; $tableBeginPos = strpos($texte, "\n\n|"); $tableEndPos = strpos($texte, "|\n\n"); } $texte = trim($texte); if($this->nettoyages == "oui") $texte = $this->nettoyer_apres($texte); return $texte; } // SMILEYS /////////////////////////////////////////////////////////////////////////////////////////// // La gestion des smileys se fait sur la base de phpBB. Donc des codes genre ':)' ou ':evil:'. Par // // défaut, aucun smiley n'est géré. Vous pouvez ajouter des smileys grâce au fichier // // conf.txt qui doit être situé dans le même répertoire que les smileys. Ce fichier doit // // comporter un smiley par ligne et écrit de cette manière: code du smiley (';)' par exemple) // // [espace] adresse de l'image // // (relative ou absolue). Ainsi voici une ligne par exemple: ':evil: /smileys/evil.gif' // ////////////////////////////////////////////////////////////////////////////////////////////////////// function smileys($texte) // révision 0.1.4 { if(!file_exists($this->smiley_path."conf.txt")) return $texte; $out = file($this->smiley_path."conf.txt"); $texte = "\n".$texte."\n"; foreach($out as $ligne) { if(trim($ligne) == "") continue; $ligne = explode(" ",$ligne); $image = $this->smiley_base.$ligne[0]; unset($smileys); for($i=1;$i < count($ligne);$i++) { $smileys.= preg_quote(trim($ligne[$i])); if($i < count($ligne)-1) $smileys.= "|"; } $texte = eregi_replace("(^|[ \n\r\t>])({$smileys})([ \n\r\t<]|$)", "\\1\\3",$texte); } return trim($texte); } //'; } else { $newTextTable .= ' '; } $newTextTable .= ereg_replace("\|([^\|]+)", " '; $lineEnd = strpos($textTable, "|\n"); } $newTextTable .= "\\1 ", $row); $newTextTable .= 'TEXTES JULIKA ////////////////////////////////////////////////////////////////////////////// // Gère le code du forum Textes Julika .Certain codes sont les mêmes que les raccourcis SPIP // // Il y a donc quelques fonctions redondants. // //////////////////////////////////////////////////////////////////////////////////////////////////// function julika($texte) // Révision 0.1.3 { if($this->nettoyages == "oui") $texte = $this->nettoyer_avant($texte); // Les blocs et listes à puces $texte = ereg_replace("\n{2,}","\n\n",$texte); $txt = explode("\n\n",$texte); for($i=0; $i < count($txt); $i++) { if(eregi("^([ ]+)(#|-)",$txt[$i],$out)) { if($out[2] == "#") $ls = "ol"; else $ls = "ul"; $liste = explode("\n",trim($txt[$i])); $sortie = ""; for($a=0; $a < count($liste); $a++) { $x1 = ereg_replace("^[ ]*".$out[2],"",$liste[$a]); $x1 = trim($x1); $sortie.= " - ".$x1."
\\a"; } $txt[$i] = "<".$ls.">\\a".$sortie."".$ls.">"; } } $texte = implode("\n\n",$txt); $texte = ereg_replace("([uo]l)>\n+","\\1>\\a",$texte); $texte = ereg_replace("\n+<([uo]l)>","\\a<\\1>",$texte); // Traitement des images: centrées, gauche ou droite et normales while(eregi("<img\|(center|right|left)\|([^\n &\|]+)>",$texte,$sortie1)) { $name = explode("/",$sortie1[2]); $name = ucfirst($name[-1]); if($this->xhtml == "oui") $texte = str_replace($sortie1[0],"",$texte); else $texte = str_replace($sortie1[0],"",$texte); } if($this->xhtml == "oui") $texte = eregi_replace("<img\|([^\n &\|]+)>","",$texte); else $texte = eregi_replace("<img\|([^\n &\|]+)>","",$texte); // Traitement des images (nouvelle version, apparu dansTextes Julika 3.4) preg_match_all("/<image\|([^\|]+)(\|align=(left|right|top|texttop|middle|absmiddle|baseline|bottom|absbottom))?". "(\|alt=([^\|]+))?(\|title=([^\|]+))?(\|([0-9]+)x([0-9]+))?>/Ui",$texte,$out,PREG_SET_ORDER); for($i=0; $i < count($out); $i++) { $tag = ""; $texte = str_replace($out[$i][0],$tag,$texte); } // Traitement des liens mail et Web/FTP $texte = eregi_replace("\[([^\n\[]+)(->|\|)([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+)\]", "\\1", $texte); $texte = eregi_replace("\[([^\n\[]+)(->|\|)([^\n\[\"]+)\]", "\\1", $texte); //" // Raccourcis simples: intertitres, gras, italique if($this->xhtml == "oui") $tablo = array("<<" => " ", ">>" => "", "{{" => "", "}}" => "", "{" => "", "}" => ""); else $tablo = array("<<" => "«", ">>" => "»", "{{" => "", "}}" => "", "{" => "", "}" => ""); $texte = strtr($texte,$tablo); if($this->xhtml == "oui") $texte = ereg_replace("\n----+\n?", "
", $texte); // ligne de séparation else $texte = ereg_replace("\n----+\n?", "
", $texte); // ligne de séparation if($this->nettoyages == "oui") $texte = $this->nettoyer_apres($texte); return $texte; } // WIKI CODE ///////////////////////////////////////////////////////////////////////////////////////// // Le Wiki Code est celui qui est géré par le script wiki2xhtml d'Olivier Meunier. Il doit exister // // beaucoup d'autres wiki codes en fonction des versions des wikis. La version de wiki2xhtml de // // cette classe est donc amenée à s'agrandir avec d'autres codes venus d'autres wikis. Merci de me // // signaler les wikis codes que vous connaissez qui ne sont pas gérés ici. // ////////////////////////////////////////////////////////////////////////////////////////////////////// // Wiki2xhtml de Olivier Meunier. License MPL (Mozilla) Portions created by the // // Initial Developer are Copyright (C) 2003 the Initial Developer. All Rights Reserved. // ////////////////////////////////////////////////////////////////////////////////////////////////////// // Wiki2xHTML version +0.1.5 d'après le wiki2xhtml d'olivier meunier // Corrections faites pour l'appel aux fonctions à l'intérieur de la classe function wiki2xhtml($string) { if($this->nettoyages == "oui") $texte = $this->nettoyer_avant($texte); $T = explode("\n",$string); $T[] = "\n"; ## Application du parseur récursif $res = $this->wikiParseRecursif($T,0); ## Application des autres contraintes (gras, italique, liens) # Emphase //$res = preg_replace("§''(.*)''§msU",'$1',$res); $res = preg_replace("/''(.*)''/msU",'$1',$res); # Forte emphase $res = preg_replace('/__(.*)__/msU','$1',$res); # Line break $res = str_replace('%%%','
',$res); #Liens # Protégés par des assertions arrières $res = preg_replace_callback('/(?$1',$res); # Citation avec langue $res = preg_replace('/\{\{([^|]+)\|([^|]*)\}\}/msU','$1',$res); # Citation avec langue et url $res = preg_replace('/\{\{([^|]+)\|([^|]*)\|([^|]*)\}\}/msU','$1',$res); # Ajout d'une ~ancre~ (Stephanie) $res = preg_replace('/~([^~]+)~/msU',' ',$res); # Ajout d'un @@code@@ (Olivier) $res = preg_replace('/@@([^~]+)@@/msU','$1
',$res); # Nettoyage des \s en trop $res = preg_replace('/([\s]+)(<\/p>|<\/li>|<\/pre>)/','$2',$res); $res = preg_replace('/(- )([\s]+)/','$1',$res); if($this->nettoyages == "oui") $texte = $this->nettoyer_apres($texte); return $res; } function wikiParseRecursif($T,$i,$mode='') { $str = $T[$i]."\n"; # Titres if(ereg('^([!]{1,3})(.*)$',$str,$cap)) { if(strlen($cap[1]) == 3) { $t = 'h1'; } elseif (strlen($cap[1]) == 2) { $t = 'h2'; } else { $t = 'h3'; } $res .= '<'.$t.'>'.trim($cap[2]).''.$t.'>'."\\a"; } #hr elseif(ereg('^[-]{4}([- ]*)$',trim($str))) { $res .= "\\a
\\a"; for($j=0;$j
"; } # Liste elseif(ereg('^([*#]+)(.*)',$str,$cap)) { $dl = ($mode == '') ? 0 : strlen($mode); $d = strlen($cap[1]); $delta = $d-$dl; if($delta > 0) { if(substr($cap[1],-1,1) == '*') { $res .= "\\a"; } else { $res .= "
\\a"; } } elseif ($delta < 0) { $res .= "
wikiParseRecursif($T,$i+1,$mode); } return $res; } function wikiParseUrl($matches) { # Tableau des correspondances d'url spéciales $array_url = array( '#^google://(.*)$#' => 'http://www.google.com/search?q=$1&start=0&start=0' ); $data = explode('|',$matches[1]); // Modifié pour ne pas interférer avec SPIP if(count($data) == 1) { $url = $data[0]; $content = $url; if(!eregi("^(ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero|peercast|ed2k)",$data[0])) $nolinks = "oui"; } elseif(count($data) > 1) { $url = $data[1]; $content = $data[0]; $lang = $data[2]; $title = $data[3]; } $url = preg_replace(array_flip($array_url),$array_url,$url); if(ereg('^(.+)[.](gif|jpg|jpeg|png)$',$url)) { # On ajoute les dimensions de l'image si locale # Idée de Stephanie $img_size = NULL; if(!ereg('[a-zA-Z]+://',$url)) { if(ereg('^/',$url)) { $path_img = $_SERVER['DOCUMENT_ROOT'].$url; } else { $path_img = $url; } $img_size = @getimagesize($path_img); } $res = '