<?php

// ------------------------------------------------------------------------- //
// Conversion RTF 2 HTML                                                     //
// ------------------------------------------------------------------------- //
// Auteur: Jean-Christophe Lafenêtre                                         //
// Email:  webmaster@fsjinfo.com                                             //
// Web:    http://www.fsjinfo.com                                            //
// ------------------------------------------------------------------------- //

?>

<html>
<body>

<?

if(!($userfile)) {
   
?>
   <form enctype="multipart/form-data" action="<?print($PHP_SELF);?>" method=post>
   <input type=hidden name="max_file_size" value=2000>
   Fichier: <input name=userfile type=file>
   <input type=submit value=Go>
   </form>
   </body>
   </html>
   <?
   
exit;
}

function
ProcessTags($tags, $line) {
   
$html = "";
   global
$color;
   global
$size;
   global
$bullets;

   
$tags = trim($tags);

   
// une liste à puces commence avec \pnindent
   
if(ereg("\\\pnindent", $tags)) {
      
$html .= "<ul><li>";
      
// on ajoute à la variable globale $bullets
      // le numéro de la ligne, pour plus tard.
      
$bullets += $line;
      
// on enlève les retours à la ligne et tabulations
      
$tags = ereg_replace("\\\par", "", $tags);
      
$tags = ereg_replace("\\\(tab)", "", $tags);
   }
   
// si $line == $bullets, c'est la première ligne des puces
   
if($line - $bullets == 0) {
      
$tags = ereg_replace("\\\par", "", $tags);
   }
   
// sinon on est à une ligne suivante des puces
   
elseif($line - $bullets == 1) {
      
// s'il y a '\pntext' on ajoute une puce
      
if(ereg("\\\pntext", $tags)) {
         
$html .= "<li>";
         
$tags = ereg_replace("\\\par", "", $tags);
         
$tags = ereg_replace("\\\(tab)", "", $tags);
         
// on augmente $bullets avec $line
         
$bullets++;
      }
      
// sinon, on clôt et réinitialise $bullets
      
else {
         
$html .= "</ul>";
         
$bullets = 0;
      }
   }

   
// Caractères gras
   
if(ereg("\\\b0", $tags))            { $html .= "</b>"; }
   elseif(
ereg("\\\b", $tags))         { $html .= "<b>"; }

   
// Italiques
   
if(ereg("\\\i0", $tags))            { $html .= "</i>"; }
   elseif(
ereg("\\\i", $tags))         { $html .= "<i>"; }

   
// Souligné
   
if(ereg("\\\ulnone", $tags))        { $html .= "</u>"; }
   elseif(
ereg("\\\ul", $tags))        { $html .= "<u>"; }

   
// Alignements
   
if(ereg("\\\pard\\\qc", $tags))      { $html .= "<div align=center>"; }
   elseif(
ereg("\\\pard\\\qr", $tags))  { $html .= "<div align=right>"; }
   elseif(
ereg("\\\pard", $tags))       { $html .= "<div align=left>"; }

   
// Enlève \pard pour éviter les confusions avec \par.
   
$tags = ereg_replace("\\\pard", "", $tags);

   
// Retours à la ligne
   
if(ereg("\\\par", $tags))        { $html .= "<br>"; }

   
// s'il y a une balise de couleur
   // il faut traiter le changement de couleur
   
$changColor = FALSE;
   if(
ereg("\\\cf[0-9]", $tags)) {
      global
$fcolor;
      
$changColor = TRUE;
      
$numcolors = count($fcolor);
      for(
$i = 0; $i < $numcolors; $i++) {
         
$test = "\\\cf$i";
         if(
ereg($test, $tags)) {
            
$color = "color=#".$fcolor[$i];
         }
      }
   }

   
$changSize = FALSE;
   
// Changement de taille de police
   
if(ereg("\\\fs[0-9][0-9]", $tags, $temp)) {
      
$changSize = TRUE;
      
$tmpsize = ereg_replace("\\\fs", "", $temp[0]);
      
$tmpsize /= 2;
      if    (
$tmpsize < 10)  { $size = "size=1"; }
      elseif(
$tmpsize <= 12) { $size = "size=2"; }
      elseif(
$tmpsize <= 14) { $size = "size=3"; }
      elseif(
$tmpsize <= 16) { $size = "size=4"; }
      elseif(
$tmpsize <= 18) { $size = "size=5"; }
      elseif(
$tmpsize <= 20) { $size = "size=6"; }
      elseif(
$tmpsize <= 22) { $size = "size=7"; }
      else                   {
$size = "size=8"; }
   }

   
// en cas de changement de couleur ou de taille
   
if ($changSize || $changColor) {
      
$html .= "</font><font $size $color>";
   }

   
// remplace les tabulation par des espaces insécables.
   
if(ereg("\\\(tab)", $tags)) { $html .= "&nbsp;&nbsp;"; }

   return
$html;
}


function
ProcessWord($word) {
   
// Remplace \\ par \
   
$word = ereg_replace("[\\]{2,}", "\\", $word);
   
// Remplace \{ par {
   
$word = ereg_replace("[\\][\{]", "\{", $word);
   
// Remplace \} par }
   
$word = ereg_replace("[\\][\}]", "\}", $word);
   
// Remplace 2 espaces par des inécables
   
$word = ereg_replace("  ", "&nbsp;&nbsp;", $word);

   return
$word;
}

// taille et couleur de police par défaut
$color = "color=#000000";
$size = "size=2";
// variable de repérage dans l'avancée des puces
$bullets = 0;
// tableau des caractères accentués
$specials = array (
               
"e0" => "&agrave;",   // à
               
"e2" => "&acirc;",    // â
               
"e9" => "&eacute;",   // é
               
"e8" => "&egrave;",   // è
               
"eb" => "&euml;",     // ë
               
"ea" => "&ecirc;",    // ê
               
"ee" => "&icirc;",    // î
               
"ef" => "&iuml;",     // ï
               
"f4" => "&ocirc;",    // ô
               
"f6" => "&ouml;",     // ö
               
"fb" => "&ucirc;",    // û
               
"fc" => "&uuml;",     // ü
               
"e7" => "&ccedil;",   // ç
               
"c4" => "&Auml;",     // Ä
               
"cb" => "&Euml;",     // Ë
               
"cf" => "&Iuml;",     // Ï
               
"d6" => "&Ouml;",     // Ö
               
"dc" => "&Uuml;",     // Ü
               
"c7" => "&Ccedil;",   // Ç
               
"80" => "&euro;",     // &#8364;
               
"a9" => "&copy;",     // ©
               
"ae" => "&reg;"       // ®
               
);

// Le fichier rtf est mis dans un tableau (par lignes)
$rtfile = file($userfile);

// nb de lignes
$fileLength = count($rtfile);

// parcours du fichier ligne par ligne
for($i = 1; $i < $fileLength; $i++) {
   
/*
   ** Si la ligne contient "\colortbl" c'est le tableau des couleurs.
   ** Il faut alors séparer les valeurs en R, V, B.
   ** Puis il faut les convertir en hexa, et enfin remettre ensemble RVB.
   ** Puis on stocke dans le tableau nommé fcolor.
   */

   
if(ereg("^\{\\\colortbl", $rtfile[$i])) {
      
$colors = explode("\\", $rtfile[$i]);
      
$numOfColors = count($colors);
      for(
$k = 2; $k < $numOfColors; $k++) {
         
// Déterminer le nombre de couleurs différentes.
         // $match contient toutes les R,V,B successives
         
if(ereg("[0-9]+", $colors[$k], $matches)) {
            
$match[] = $matches[0];
         }
      }

      
// Convertir chaque couleur en hex.
      // fcolor contient les RVB
      // fcolor intialisé avec \cf0, la couleur automatique de Wordpad
      
$fcolor[0] = "000000";
      
$numOfColors = count($match);
      for(
$k = 0; $k < $numOfColors; $k += 3) {
         
$red = dechex($match[$k]);
         
$red = $match[$k] < 16 ? "0$red" : $red;
         
$green = dechex($match[$k + 1]);
         
$green = $match[$k +1] < 16 ? "0$green" : $green;
         
$blue = dechex($match[$k + 2]);
         
$blue = $match[$k + 2] < 16 ? "0$blue" : $blue;
         
$fcolor[] = "$red$green$blue";
      }
      
$numOfColors = count($fcolor);
   }

   
// Si ce n'est pas le tableau des couleurs,
   // il faut identifier les mots et les balises RTF
   
else {
      
$token = "";
      
$start = 0;
      
$lineLength = strlen($rtfile[$i]);
      
// on parcourt la ligne caractère par caractère
      
for($k = 0; $k < $lineLength; $k++) {
         
// si on a la séquence '\[qqch]' c'est un groupe de balises rtf
         
if($rtfile[$i][$start] == "\\" && $rtfile[$i][$start + 1] != "\\" &&
            
$rtfile[$i][$start + 1] != "'") {
            
$token .= $rtfile[$i][$k];

            
// on arrête de construire token
            // au changement de mot ou au début d'un autre groupe de balises
            
if($rtfile[$i][$k] == " " || $rtfile[$i][$k + 1] == "{") {
               
$newFile[$i] .= ProcessTags($token, $i);
               
$token = "";
               
$start = $k + 1;
            }
            
// on arrête le token devant un caractère spécial pour le traiter
            // à part
            
elseif ($rtfile[$i][$k] == "\\" && $rtfile[$i][$k + 1] == "'") {
               
$newFile[$i] .= ProcessTags($token, $i);
               
$token = "";
               
$k -= 1;
               
$start = $k;
            }
            
// on arrête en fin de ligne
            
elseif($rtfile[$i][$k] == "\n") {
               
$newFile[$i] .= ProcessTags($token, $i);
               
$token = "";
            }
         }

         
// si c'est '{', c'est aussi des balises
         
elseif($rtfile[$i][$start] == "{") {
            
$token .= $rtfile[$i][$k];
            if(
$rtfile[$i][$k] == "{") {
               
// on compte les { ouvertes
               
$open += 1;
            }
            if(
$rtfile[$i][$k] == "}") {
               
$open -= 1;
               
// on arrête qd elles sont toutes refermées
               
if ($open == 0) {
                  
$newFile[$i] .= ProcessTags($token, $i);
                  
$token = "";
                  
$start = $k + 1;
               }
            }
         }

         
// "\'", c'est un caractère spécial
         // on traite les 4 caractères de la chaîne
         
elseif($rtfile[$i][$start] == "\\" && $rtfile[$i][$start + 1] == "'") {
            
$token = substr($rtfile[$i], $start + 2, 2);
            
$newFile[$i] .= $specials[$token];
            
$token = "";
            
$start += 4;
            
$k = $start - 1; // car la boucle k fera encore + 1
         
}

         
// dans les autres cas, on empile
         
else {
            
// on remplit $token jusqu'à \
            // et on traite le mot.
            
if($rtfile[$i][$k] == "\\" && $rtfile[$i][$k + 1] != "\\" &&
               
$rtfile[$i][$k - 1] != "\\") {
               
$newFile[$i] .= ProcessWord($token);
               
$token = $rtfile[$i][$k];
               
$start = $k;
            }
            else {
               
$token .= $rtfile[$i][$k];
            }
         }
      }
   }
}


// on écrit dans le navigateur le fichier converti.
$limit = sizeof($newFile);
for(
$i = 0; $i < $limit; $i++) {
   print(
"$newFile[$i]\n");
}

?>

</body>
</html>