<?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 .= " "; }
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(" ", " ", $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" => "à", // à
"e2" => "â", // â
"e9" => "é", // é
"e8" => "è", // è
"eb" => "ë", // ë
"ea" => "ê", // ê
"ee" => "î", // î
"ef" => "ï", // ï
"f4" => "ô", // ô
"f6" => "ö", // ö
"fb" => "û", // û
"fc" => "ü", // ü
"e7" => "ç", // ç
"c4" => "Ä", // Ä
"cb" => "Ë", // Ë
"cf" => "Ï", // Ï
"d6" => "Ö", // Ö
"dc" => "Ü", // Ü
"c7" => "Ç", // Ç
"80" => "€", // €
"a9" => "©", // ©
"ae" => "®" // ®
);
// 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>