You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

367 lines
9.3 KiB
PHP

<?
/*
Wünsche und Beschwerden an Alex P.
liest ein rtf file. Erzeugt durch Wordpad oder Hypersnap und
generiert HTML Code und kapselt es in ein <pre>
WORD FUNKT NICHT!
Test:
include('rtfparser.php');
$html_code = rtf_parsefile('test.rtf'); //..... in string
echo $html_code;
*/
global $rtf_color_index;
global $rtf_color_class;
$rtf_color_index[ 0 ][ 0 ] = 0;
$rtf_color_index[ 0 ][ 1 ] = 0;
$rtf_color_index[ 0 ][ 2 ] = 0;
$rtf_color_index[ 1 ][ 0 ] = 0;
$rtf_color_index[ 1 ][ 1 ] = 0;
$rtf_color_index[ 1 ][ 2 ] = 119;
$rtf_color_index[ 2 ][ 0 ] = 0;
$rtf_color_index[ 2 ][ 1 ] = 0;
$rtf_color_index[ 2 ][ 2 ] = 255;
$rtf_color_index[ 3 ][ 0 ] = 0;
$rtf_color_index[ 3 ][ 1 ] = 128;
$rtf_color_index[ 3 ][ 2 ] = 0;
$rtf_color_index[ 4 ][ 0 ] = 0;
$rtf_color_index[ 4 ][ 1 ] = 153;
$rtf_color_index[ 4 ][ 2 ] = 0;
$rtf_color_index[ 5 ][ 0 ] = 128;
$rtf_color_index[ 5 ][ 1 ] = 0;
$rtf_color_index[ 5 ][ 2 ] = 0;
$rtf_color_index[ 6 ][ 0 ] = 128;
$rtf_color_index[ 6 ][ 1 ] = 128;
$rtf_color_index[ 6 ][ 2 ] = 128;
$rtf_color_index[ 7 ][ 0 ] = 136;
$rtf_color_index[ 7 ][ 1 ] = 0;
$rtf_color_index[ 7 ][ 2 ] = 0;
$rtf_color_index[ 8 ][ 0 ] = 160;
$rtf_color_index[ 8 ][ 1 ] = 0;
$rtf_color_index[ 8 ][ 2 ] = 160;
$rtf_color_class[0]=0;
$rtf_color_class[1]=1;
$rtf_color_class[2]=2;
$rtf_color_class[3]=3;
$rtf_color_class[4]=4;
$rtf_color_class[5]=5;
$rtf_color_class[6]=6;
$rtf_color_class[7]=7;
$rtf_color_class[8]=8;
$rtf_color_class[9]=9;
function rtf_parsefile( $filename ,$classname )
{
global $rtf_color_index;
global $rtf_color_class;
$rtf = file_get_contents( $filename );
//Achtung vorher wurde parse_styles getrennt aufgerufen
//weil es im header passieren musste.
//Diesmal ist es hier, weil die classnamen dem css angepasst
//werden.
parse_styles( $rtf , $classname );
$html_code .= "<pre>";
$pos = strpos($rtf, '\fs20');
if( $pos) {
$rtf = substr( $rtf, $pos );
}
$rtf = str_replace( "<", "&lt;", $rtf );
$rtf = str_replace( ">", "&gt;", $rtf );
/*
Per Default sind die ersten Zeilen ohne Farbwechsel code.
RTF nimmt den ersten Farbtopf.
Damit dieser Parser funktioniert,
muss am Anfang der Zeichen ein \cf1 Farbwechsel Befehl
eingefügt werden.
alt:
$html_code .= '<span class="' . $classname . '1">'; // mit farbe 1 eröffnen
$span_open = true;
neu:
$rtf = '\cf1 ' . $rtf <--- farbwechsel forciert, dann wird richtige farbe eingesetzt
*/
$rtf = '\cf1 ' . $rtf; // Farbwechsel auf Farbe1 erzwingen
$rtf_array = explode( "\\", $rtf );
$index = 0; // zähler zum index des rtf_arrays
$span_open = false; // flag zum schliessen eines vorherigen spans
$max_index = count($rtf_array) - 1 ; // letztes item weg, ist eine störende geschwungene Klammer
for( $index = 1; $index < $max_index; $index ++ )
{
$item = $rtf_array[ $index ];
// Escape Chars
if( strlen($item) == 0 ) {
// dieser leerer String wird \
$html_code .= "\\";
// nächster braucht ein blank, das geschluckt wird
$rtf_array[ $index + 1 ] = "x " . $rtf_array[ $index + 1 ];
// aus \n quelle wird
// item[0]="" item[1]="n"
// für den parser muss aus item 0 der \ werden
// und item[1] ein "xpseudo n", es wird bis zum Blank gelöscht
}
if( strncmp( $item, "cf", 2 ) == 0 )
{
// cf ist ein color feld
// zuerst vorherigen offenen span tag schliessen
// dann neuen span tag aufbauen
if( $span_open )
$html_tag = "</span>";
else
$html_tag = "";
$span_open = true; // span bleibt offen, wir machen neuen auf
$xx = $item[2];
$html_tag .= '<span class="' . $classname . $rtf_color_class[$xx-1] . '">';
// cf entfernen, wenn ein blank hinter cf? steht dann
// dieses auch mit entfernen
$cnt = 3;
if( $item[3] == ' ' )
$cnt = 4;
$item = substr( $item, $cnt );
// ins array zurück
$item = $html_tag . $item;
}
else if( strncmp( $item, "pard", 4 ) == 0 )
{
// pard entfernen und ein nachfolgendes blank auch
if( $item[4] == ' ' ) {
$item = substr( $item, 5 );
}else{
$item = substr( $item, 4 );
}
}
else if( strncmp( $item, "par", 3 ) == 0 )
{
// par entfernen und ein nachfolgendes blank auch
if( $item[3] == ' ' ) {
$item = substr( $item, 4 );
}else{
$item = substr( $item, 3 );
}
}
else if( strncmp( $item, "tab", 3 ) == 0 )
{
// par entfernen und ein nachfolgendes blank auch
if( $item[3] == ' ' ) {
$item = substr( $item, 4 );
}else{
$item = substr( $item, 3 );
}
$item = " " . $item; // 4 leerzeichen statt tab
}
else if ( strncmp( $item, "{", 1 ) == 0 )
{
}
else if ( strncmp ($item, "}", 1 ) == 0 )
{
}
else if ( strcmp ($item, "b" ) == 0 )
{
$item = "<wH>";
}
else if ( strncmp ($item, "b ",2 ) == 0 )
{
$item = substr($item, 2);
$item = "<wH>" . $item;
}
else if ( $item[0] == "'" )
{
$item = str_replace( "'c1","&Aacute;",$item );
$item = str_replace( "'e1","&aacute;",$item );
$item = str_replace( "'c0","&Agrave;",$item );
$item = str_replace( "'e0","&agrave;",$item );
$item = str_replace( "'c9","&Eacute;",$item );
$item = str_replace( "'e9","&eacute;",$item );
$item = str_replace( "'c8","&Egrave;",$item );
$item = str_replace( "'e8","&egrave;",$item );
$item = str_replace( "'cd","&Iacute;",$item );
$item = str_replace( "'ed","&iacute;",$item );
$item = str_replace( "'cc","&Igrave;",$item );
$item = str_replace( "'ec","&igrave;",$item );
$item = str_replace( "'d3","&Oacute;",$item );
$item = str_replace( "'f3","&oacute;",$item );
$item = str_replace( "'d2","&Ograve;",$item );
$item = str_replace( "'f2","&ograve;",$item );
$item = str_replace( "'da","&Uacute;",$item );
$item = str_replace( "'fa","&uacute;",$item );
$item = str_replace( "'d9","&Ugrave;",$item );
$item = str_replace( "'f9","&ugrave;",$item );
$item = str_replace( "'80","&#8364;",$item );
$item = str_replace( "'d1","&Ntilde;",$item );
$item = str_replace( "'f1","&ntilde;",$item );
$item = str_replace( "'c7","&Ccedil;",$item );
$item = str_replace( "'e7","&ccedil;",$item );
$item = str_replace( "'dc","&Uuml;",$item );
$item = str_replace( "'fc","&uuml;",$item );
$item = str_replace( "'bf","&#191;",$item );
$item = str_replace( "'a1","&#161;",$item );
$item = str_replace( "'b7","&middot;",$item );
$item = str_replace( "'a9","&copy;",$item );
$item = str_replace( "'ae","&reg;",$item );
$item = str_replace( "'ba","&ordm;",$item );
$item = str_replace( "'aa","&ordf;",$item );
$item = str_replace( "'b2","&sup2;",$item );
$item = str_replace( "'b3","&sup3;",$item );
$item = str_replace( "'e4","&auml;",$item );
$item = str_replace( "'c4","&Auml;",$item );
$item = str_replace( "'d6","&Ouml;",$item );
$item = str_replace( "'f6","&ouml;",$item );
$item = str_replace( "'df","&szlig;",$item );
}
else {
//code bis zum ersten blank löschen
$pos1 = strpos( $item, ' ' );
if( $pos1 )
$item = substr( $item, $pos1+1 );
$pos2 = strpos( $item, '{' );
if( $pos2 )
$item = substr( $item, $pos2+1 );
if( $pos2 == false && $pos1 == false )
$item = "";
}
$rtf_array[ $index ] = $item;
$html_code .= $rtf_array[ $index ];
}
if( $span_open )
$html_code .="</span>";
$html_code .= "</pre>";
return $html_code;
}
/*
so sieht das css aus im default.css:
--------------------------------------
.rtfcol0 { color: rgb(0,0,0);}
.rtfcol1 { color: rgb(0,0,119);}
.rtfcol2 { color: rgb(0,0,255);}
.rtfcol3 { color: rgb(0,128,0);}
.rtfcol4 { color: rgb(0,153,0);}
.rtfcol5 { color: rgb(128,0,0);}
.rtfcol6 { color: rgb(128,128,128);}
.rtfcol7 { color: rgb(136,0,0);}
.rtfcol8 { color: rgb(160,0,160);}
*/
function parse_styles( $rtf , $classname )
{
global $rtf_color_index;
global $rtf_color_class;
$pos = strpos($rtf, '\fs20');
if( $pos) $rtf = substr( $rtf, 0, $pos + 5 );
$rtf_array = explode( "\\", $rtf );
/* beispiel array inhalt
red0
green0
blue255;
red0
green0
blue0;
red136
green0
blue0;
red128
green128
blue128;
red160
green0
blue160;
red0
green128
blue0;}
*/
$style_header_done = false;
$index = 0;
foreach( $rtf_array as $item )
{
if( strncmp( "red", $item, 3 ) == 0 )
$red = substr( $item, 3 );
if( strncmp( "green", $item, 5 ) == 0 )
$green = substr( $item, 5 );
if( strncmp( "blue", $item, 4 ) == 0 ) {
$blue = substr( $item, 4 );
$blue = preg_replace( "[\D]","",$blue);
// farbcode suchen
$i=0;
for( $i=0; $i < 9; $i++ ){
if( $red == $rtf_color_index[$i][0] &&
$green == $rtf_color_index[$i][1] &&
$blue == $rtf_color_index[$i][2] )
{
$rtf_color_class[ $index ] = $i;
break; // fertig, gefunden
}
}
// Wenn keine Farbe gefunden wurde
// dann setzen wir die classe auf 0 (schwarz)
if( $i == 9 ){
//echo "<h1>WARNUNG color $red $green $blue nicht gefunden (rtf color $index) </h1>";
//exit;
$rtf_color_class[ $index ] = 0;
}
// Nächster Farbcode index vom rtffile
$index ++;
}
}
}
?>