-section is empty, return nothing
#Parse fields in rss-section
$fields = explode( "|", $input );
$url = @$fields[0];
$args = array();
for ( $i = 1; $i < sizeof( $fields ); $i++ ) {
$f = $fields[$i];
if ( strpos( $f, "=" ) === false ) $args[strtolower(trim($f))] = false;
else {
list( $k, $v ) = explode( "=", $f, 2 );
if ( trim( $v ) == false ) $args[strtolower(trim($k))] = false;
else $args[strtolower(trim($k))] = trim($v);
}
}
#Get charset from argument-array
$charset = @$args['charset'];
if( !$charset ) $charset = $wgOutputEncoding;
#Get max number of headlines from argument-array
$maxheads = @$args['max'];
$headcnt = 0;
#Get short-flag from argument-array
#If short is set, no description text is printed
if( isset( $args['short'] ) ) $short = true; else $short = false;
#Get reverse-flag from argument-array
if( isset( $args['reverse'] ) ) $reverse = true; else $reverse = false;
# Get date format from argument-array
if (isset($args["date"])) {
$date = @$args["date"];
if ($date == '')
$date = 'd M Y H:i';
}
else
$date = false;
#Get highlight terms from argument array
$rssHighlight = @$args['highlight'];
$rssHighlight = str_replace( ' ', ' ', $rssHighlight );
$rssHighlight = explode( ' ', trim( $rssHighlight ) );
#Get filter terms from argument-array
$rssFilter = @$args['filter'];
$rssFilter = str_replace( ' ', ' ', $rssFilter );
$rssFilter = explode( ' ', trim( $rssFilter ) );
#Filterout terms
$rssFilterout = @$args['filterout'];
$rssFilterout = str_replace( ' ', ' ', $rssFilterout );
$rssFilterout = explode( ' ', trim( $rssFilterout ) );
#Fetch RSS. May be cached locally.
#Refer to the documentation of magpie for details.
$rss = @fetch_rss( $url );
#Check for errors.
if ( $rss->ERROR ) {
return "Failed to load RSS feed from $url: ".$rss->ERROR."
"; #localize…
}
if ( !is_array( $rss->items ) ) {
return "Failed to load RSS feed from $url!
"; #localize…
}
#Build title line
#$title = iconv($charset, $wgOutputEncoding, $rss->channel['title']);
#if( $rss->channel['link'] ) $title = "$title";
$output = '';
if( $reverse ) $rss->items = array_reverse( $rss->items );
$description = false;
foreach ( $rss->items as $item ) {
if ( $item['description'] ) {
$description = true;
break;
}
}
#Build items
if ( !$short and $description ) { #full item list
$output.= '';
foreach ( $rss->items as $item ) {
$d_text = true;
$d_title = true;
$href = htmlspecialchars( trim( iconv( $charset, $wgOutputEncoding, $item['link'] ) ) );
$title = htmlspecialchars( trim( iconv( $charset, $wgOutputEncoding, $item['title'] ) ) );
if ($date) {
$pubdate = trim( iconv( $charset, $wgOutputEncoding, $item['pubdate'] ) );
$pubdate = date( $date, strtotime( $pubdate ) );
}
$d_title = wfRssFilter( $title, $rssFilter );
$d_title = wfRssFilterout( $title, $rssFilterout );
$title = wfRssHighlight( $title, $rssHighlight );
#Build description text if desired
if ( $item['description'] ) {
$text = trim( iconv( $charset, $wgOutputEncoding, $item['description'] ) );
#Avoid pre-tags
$text = str_replace( "\r", ' ', $text );
$text = str_replace( "\n", ' ', $text );
$text = str_replace( "\t", ' ', $text );
$text = str_replace( '
', '', $text );
$d_text = wfRssFilter( $text, $rssFilter );
$d_text = wfRssFilterout( $text, $rssFilterout );
$text = wfRssHighlight( $text, $rssHighlight );
$display = $d_text or $d_title;
} else {
$text = '';
$display = $d_title;
}
if ( $display ) {
$output.= "- $title
";
if ( $date ) $output.= " ($pubdate)";
if ( $text ) $output.= "- $text [?]
";
}
#Cut off output when maxheads is reached:
if ( ++$headcnt == $maxheads ) break;
}
$output.= '
';
} else { #short item list
## HACKY HACKY HACKY
$output.= '';
$displayed = array();
foreach ( $rss->items as $item ) {
$href = htmlspecialchars( trim( iconv( $charset, $wgOutputEncoding, $item['link'] ) ) );
$title = htmlspecialchars( trim( iconv( $charset, $wgOutputEncoding, $item['title'] ) ) );
$d_title = wfRssFilter( $title, $rssFilter ) && wfRssFilterout( $title, $rssFilterout );
$title = wfRssHighlight( $title, $rssHighlight );
if ($date) {
$pubdate = trim( iconv( $charset, $wgOutputEncoding, $item['pubdate'] ) );
if ( $pubdate == '' ) {
$pubdate = trim( iconv( $charset, $wgOutputEncoding, $item['dc']['date'] ) );
}
$pubdate = date( $date, strtotime( $pubdate ) );
}
if ( $d_title && !in_array( $title, $displayed ) ) {
// Add date to ouput if specified
$output.= '- '.$title.'';
if( $date ) {
$output.= " ($pubdate)";
}
$output.= '
';
$displayed[] = $title;
#Cut off output when maxheads is reached:
if ( ++$headcnt == $maxheads ) break;
}
}
$output.= '
';
}
return $output;
}
function wfRssFilter( $text, $rssFilter ) {
$display = true;
if ( is_array( $rssFilter ) ) {
foreach( $rssFilter as $term ) {
if ( $term ) {
$display = false;
if ( preg_match( "|$term|i", $text, $a ) ) {
$display = true;
return $display;
}
}
if ( $display ) break;
}
}
return $display;
}
function wfRssFilterout( $text, $rssFilterout ) {
$display = true;
if ( is_array( $rssFilterout ) ) {
foreach ( $rssFilterout as $term ) {
if ( $term ) {
if ( preg_match( "|$term|i", $text, $a ) ) {
$display = false;
return $display;
}
}
}
}
return $display;
}
function wfRssHighlight( $text, $rssHighlight ) {
$i = 0;
$starttag = 'v8x5u3t3u8h';
$endtag = 'q8n4f6n4n4x';
$color[] = 'coral';
$color[] = 'greenyellow';
$color[] = 'lightskyblue';
$color[] = 'gold';
$color[] = 'violet';
$count_color = count( $color );
if ( is_array( $rssHighlight ) ) {
foreach( $rssHighlight as $term ) {
if ( $term ) {
$text = preg_replace("|\b(\w*?".$term."\w*?)\b|i", "$starttag"."_".$i."\\1$endtag", $text);
$i++;
if ( $i == $count_color ) $i = 0;
}
}
}
#To avoid trouble should someone wants to highlight the terms "span", "style", …
for ( $i = 0; $i < 5; $i++ ) {
$text = preg_replace( "|$starttag"."_".$i."|", "", $text );
$text = preg_replace( "|$endtag|", '', $text );
}
return $text;
}
#PHP closing tag intentionally left blank