blob: 52e293c22622965e2e8ba6eb031b15ceb9ba9b61 [file] [log] [blame]
<?php
/**
* *****************************************************************************
* Copyright (c) 2014 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://eclipse.org/legal/epl-v10.html
*
* Contributors:
* Christopher Guindon (Eclipse Foundation) - Initial implementation
* *****************************************************************************
*/
class FeedParser {
/**
* List of rss paths
*
* @var string
*/
private $path = array();
/**
* Default display count
*
* @var integer
*/
private $count = 4;
/**
* Flag to only display press_releases
*
* @var string
*/
private $press_release = FALSE;
/**
* Array of news item
*
* @var array
*/
private $items = array();
/**
* View more link values
*
* @var string
*/
private $view_more = array();
/**
* Link to feedburner feed
*
* @var string
*/
private $rss_link = "";
/**
* Default date_format
*
* @var string
*/
private $date_format = "Y/m/d";
/**
* Default news item limit
*
* @var integer
*/
private $limit = 200;
/**
* Set date format
*
* @param string $format
*/
public function setDateFormat($format = "Y/m/d") {
$this->date_format = $format;
return TRUE;
}
/**
* Get date format
*
* @return string
*/
public function getDateFormat() {
return $this->date_format;
}
/**
* Set path for RSS feed
*
* @param string $url
*/
public function addPath($path = "") {
if (is_string($path)) {
$this->path[] = $path;
return TRUE;
}
return FALSE;
}
/**
* Get path for RSS feed
*
* @return string
*/
public function getPath() {
return $this->path;
}
/**
* Set RSS link
*
* @param string $url
*/
public function setRssLink($url = "") {
if (is_string($url)) {
$this->rss_link = $url;
return TRUE;
}
return FALSE;
}
/**
* Get RSS link
*
* @param string $html
*
* @return string
*/
public function getRssLink() {
return $this->rss_link;
}
/**
* Get RSS link
*
* @param string $html
*
* @return string
*/
public function getRssLinkHTML() {
$url = $this->getRssLink();
if (empty($url)) {
return "";
}
return '<a href="' . $url . '" class="link-rss-feed orange" title="Subscribe to our RSS-feed"><i class="fa fa-rss"></i> <span>Subscribe to our RSS-feed</span></a>';
}
/**
* Set Press Release Flag
*
* @param string $flag
*/
public function setPressRelease($flag = FALSE) {
if (is_bool($flag)) {
$this->press_release = $flag;
return TRUE;
}
return FALSE;
}
/**
* Get Press Release Flag
*
* @return string
*/
public function getPressRelease() {
return $this->press_release;
}
/**
* Set item count
*
* @param number $count
*/
public function setCount($count = 4) {
if (is_numeric($count)) {
$this->count = $count;
return TRUE;
}
return FALSE;
}
/**
* Get item count
*
* @return number $count
*/
public function getCount() {
return $this->count;
}
/**
* Set description limit
*
* @param number $limit
*/
public function setLimit($limit = 200) {
if (is_numeric($limit)) {
$this->limit = $limit;
return TRUE;
}
return FALSE;
}
/**
* Get description limit
*
* @return number $limit
*/
public function getLimit() {
return $this->limit;
}
/**
* Set view_more link
*
* @param string $url
* @param string $caption
* @param string $prefix
*/
public function setViewMoreLink($url = "", $caption = 'View all', $prefix = '> ') {
if (is_string($url) && is_string($caption) && is_string($prefix)) {
$this->view_more = array(
'url' => $url,
'caption' => $caption,
'prefix' => $prefix
);
return TRUE;
}
return FALSE;
}
/**
* Get ViewMore link
*
* @return string
*/
public function getViewMoreLink() {
$view_more = $this->view_more;
if (empty($view_more['url']) || empty($view_more['caption'])) {
return array();
}
if (!isset($view_more['prefix'])) {
$view_more['prefix'] = "";
}
return $view_more;
}
/**
* Get view_more link (HTML)
*
* @return string
*/
public function getViewMoreLinkHTML() {
$view_more = $this->getViewMoreLink();
if (empty($view_more)) {
return "";
}
return $view_more['prefix'] . '<a href="' . $view_more['url'] . '">' . $view_more['caption'] . '</a>';
}
/**
* Html Output
*
* @return string
*/
public function output() {
if (!$this->_parseFeeds()) {
return '<p>This news feed is currently empty. Please try again later.</p>';
}
$output = '';
if (!empty($this->items)) {
$output = '<ul class="news-list-media list-unstyled">';
foreach ($this->items as $item) {
$output .= '<li><a href="' . $item['link'] . '" class="media media-link">';
$output .= '<p class="media-date">' . $item['date'] . '</p><h4 class="media-heading">' . $item['title'] . '</h4>';
if ($this->getLimit() > 0) {
$output .= '<p class="media-text">' . $item['description'] . '</p>';
}
$output .= ' </a></li>';
}
$output .= '</ul>';
}
return $output;
}
/**
* Parse the Feed
*
* @return boolean
*/
private function _parseFeeds() {
$path = $this->getPath();
if (empty($path)) {
return FALSE;
}
$count = 0;
foreach ($path as $p) {
if (file_exists($p)) {
$feed = simplexml_load_file($p);
}
if (isset($feed) && $feed != FALSE) {
foreach ($feed->channel->item as $item) {
$feed_array = array();
if ($count >= $this->count) {
break;
}
if ($this->getPressRelease() && $item->pressrelease != 1) {
continue;
}
$date = strtotime((string) $item->pubDate);
$date = date($this->getDateFormat(), $date);
$description = (string) strip_tags($item->description);
if (strlen($description) > $this->getLimit()) {
$description = substr($description, 0, $this->limit);
$description .= "...";
}
$item_array = array(
'title' => (string) $item->title,
'description' => $description,
'link' => (string) $item->link,
'date' => $date
);
$this->items[] = $item_array;
$count++;
}
}
}
if (!empty($this->items)) {
return TRUE;
}
return FALSE;
}
}