diff --git a/feeds.api.php b/feeds.api.php index 58e1670..771ac27 100644 --- a/feeds.api.php +++ b/feeds.api.php @@ -80,6 +80,32 @@ function hook_feeds_plugins() { */ /** + * @defgroup parse Parser-related hooks + * @{ + */ + +/** + * Invoked after a feed item is parsed by the Common Syndication parser. + * + * @param array $item + * Set of parsed values. + * @param SimpleXMLElement $rss_item + * Non-interpreted, parsed XML structure of the actually parsed item. + * @param SimpleXMLElement $feed + * Non-interpreted, parsed XML structure of the entire feed. + */ +function hook_common_syndication_parser_item_alter(array &$item, SimpleXMLElement $rss_item, SimpleXMLElement $feed) { + // For example, parse date in a smarter way for RSS2.0 feeds: + if (isset($rss_item['pubDate'])) { + $item['timestamp'] = _my_module_date_convert($rss_item['pubDate']); + } +} + +/** + * @} + */ + +/** * @defgroup import Import and clear hooks * @{ */ diff --git a/libraries/common_syndication_parser.inc b/libraries/common_syndication_parser.inc index d37599f..5d89f43 100644 --- a/libraries/common_syndication_parser.inc +++ b/libraries/common_syndication_parser.inc @@ -220,6 +220,7 @@ function _parser_common_syndication_atom10_parse($feed_XML) { } $item['tags'] = isset($additional_taxonomies['ATOM Categories']) ? $additional_taxonomies['ATOM Categories'] : array(); $item['domains'] = isset($additional_taxonomies['ATOM Domains']) ? $additional_taxonomies['ATOM Domains'] : array(); + drupal_alter('common_syndication_parser_item', $item, $news, $feed_XML); $parsed_source['items'][] = $item; } return $parsed_source; @@ -312,6 +313,7 @@ function _parser_common_syndication_RDF10_parse($feed_XML) { $item['rdf'][$rdf_property] = $rdf_value; } + drupal_alter('common_syndication_parser_item', $item, $rss_item, $feed_XML); $parsed_source['items'][] = $item; } @@ -356,15 +358,15 @@ function _parser_common_syndication_RSS20_parse($feed_XML) { $parsed_source['link'] = isset($feed_XML->channel->link) ? "{$feed_XML->channel->link}" : ""; $parsed_source['items'] = array(); - foreach ($feed_XML->xpath('//item') as $news) { + foreach ($feed_XML->xpath('//item') as $rss_item) { $title = $body = $original_author = $original_url = $guid = ''; - $category = $news->xpath('category'); + $category = $rss_item->xpath('category'); // Get children for current namespace. - $content = (array)$news->children($ns["content"]); - $dc = (array)$news->children($ns["dc"]); - $georss = (array)$news->children($ns["georss"]); - $news = (array) $news; + $content = (array)$rss_item->children($ns["content"]); + $dc = (array)$rss_item->children($ns["dc"]); + $georss = (array)$rss_item->children($ns["georss"]); + $news = (array) $rss_item; $news['category'] = $category; if (isset($news['title'])) { @@ -470,6 +472,7 @@ function _parser_common_syndication_RSS20_parse($feed_XML) { $item['domains'] = $additional_taxonomies['RSS Domains']; $item['tags'] = $additional_taxonomies['RSS Categories']; + drupal_alter('common_syndication_parser_item', $item, $rss_item, $feed_XML); $parsed_source['items'][] = $item; } return $parsed_source;