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
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( "<", "<", $rtf );
|
|
$rtf = str_replace( ">", ">", $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","Á",$item );
|
|
$item = str_replace( "'e1","á",$item );
|
|
$item = str_replace( "'c0","À",$item );
|
|
$item = str_replace( "'e0","à",$item );
|
|
$item = str_replace( "'c9","É",$item );
|
|
$item = str_replace( "'e9","é",$item );
|
|
$item = str_replace( "'c8","È",$item );
|
|
$item = str_replace( "'e8","è",$item );
|
|
$item = str_replace( "'cd","Í",$item );
|
|
$item = str_replace( "'ed","í",$item );
|
|
$item = str_replace( "'cc","Ì",$item );
|
|
$item = str_replace( "'ec","ì",$item );
|
|
$item = str_replace( "'d3","Ó",$item );
|
|
$item = str_replace( "'f3","ó",$item );
|
|
$item = str_replace( "'d2","Ò",$item );
|
|
$item = str_replace( "'f2","ò",$item );
|
|
$item = str_replace( "'da","Ú",$item );
|
|
$item = str_replace( "'fa","ú",$item );
|
|
$item = str_replace( "'d9","Ù",$item );
|
|
$item = str_replace( "'f9","ù",$item );
|
|
$item = str_replace( "'80","€",$item );
|
|
$item = str_replace( "'d1","Ñ",$item );
|
|
$item = str_replace( "'f1","ñ",$item );
|
|
$item = str_replace( "'c7","Ç",$item );
|
|
$item = str_replace( "'e7","ç",$item );
|
|
$item = str_replace( "'dc","Ü",$item );
|
|
$item = str_replace( "'fc","ü",$item );
|
|
$item = str_replace( "'bf","¿",$item );
|
|
$item = str_replace( "'a1","¡",$item );
|
|
$item = str_replace( "'b7","·",$item );
|
|
$item = str_replace( "'a9","©",$item );
|
|
$item = str_replace( "'ae","®",$item );
|
|
$item = str_replace( "'ba","º",$item );
|
|
$item = str_replace( "'aa","ª",$item );
|
|
$item = str_replace( "'b2","²",$item );
|
|
$item = str_replace( "'b3","³",$item );
|
|
|
|
$item = str_replace( "'e4","ä",$item );
|
|
$item = str_replace( "'c4","Ä",$item );
|
|
$item = str_replace( "'d6","ö",$item );
|
|
$item = str_replace( "'f6","Ö",$item );
|
|
$item = str_replace( "'df","ß",$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;
|
|
}
|
|
|
|
?>
|