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.

269 lines
6.9 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;
*/
function rtf_parsefile( $filename ,$classname )
{
$rtf = file_get_contents( $filename );
$html_code .= "<pre>";
$pos = strpos($rtf, '\fs20');
if( $pos) {
$rtf = substr( $rtf, $pos );
}
$rtf = str_replace( "<", "&lt;", $rtf );
$rtf = str_replace( ">", "&gt;", $rtf );
$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
$html_code .= '<span class="' . $classname . '1">'; // mit farbe 1 eröffnen
$span_open = true;
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
$html_tag .= '<span class="' . $classname . $item[2] . '">';
// 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;
}
function parse_styles( $rtf , $classname )
{
$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;
$html_code = "";
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);
// Bei blue gibt es bereits rot und grün
// Styleheader einmalig schreiben
if( $style_header_done == false ){
$html_code .= '<style type="text/css">';
$html_code .= "<!--\n";
$style_header_done = true;
}
// style erzeugen
$html_code .= ".$classname" . ++$css_num . " { color: rgb($red,$green,$blue) }\n";
}
}
// Stylefooter schicken
if( $style_header_done == true ){
$html_code .= "-->";
$html_code .= '</style>';
$html_code .= "\n";
}
return $html_code;
}
?>