From 6733014fc40a38dc031c9f4f1292f0c647671ca0 Mon Sep 17 00:00:00 2001
From: Dries Buytaert <dries@buytaert.net>
Date: Thu, 11 Aug 2005 13:12:44 +0000
Subject: [PATCH] - Patch #13941 by Prometheus6: made the aggregator module
 parse Atom feeds.

---
 CHANGELOG.txt                        |  2 ++
 modules/aggregator.module            | 47 ++++++++++++++++++++++++++--
 modules/aggregator/aggregator.module | 47 ++++++++++++++++++++++++++--
 3 files changed, 92 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 13a61143c967..3f735183de66 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -25,6 +25,8 @@ Drupal x.x.x, xxxx-xx-xx (development version)
 - book module:
     * added Docbook-like XML export functionality.
     * added OPML export functionality.
+- syndication:
+    * made the aggregator module parse Atom feeds.
 - XML-RPC:
     * replaced the XML-RPC library by a better one.
 - performance:
diff --git a/modules/aggregator.module b/modules/aggregator.module
index de07712469c2..f1f367136422 100644
--- a/modules/aggregator.module
+++ b/modules/aggregator.module
@@ -275,16 +275,38 @@ function aggregator_remove($feed) {
  * Call-back function used by the XML parser.
  */
 function aggregator_element_start($parser, $name, $attributes) {
-  global $item, $element, $tag;
+  global $item, $element, $tag, $items, $channel;
 
   switch ($name) {
     case 'IMAGE':
     case 'TEXTINPUT':
+    case 'CONTENT':
+    case 'SUMMARY':
+    case 'TAGLINE':
+    case 'SUBTITLE':
+    case 'LOGO':
+    case 'INFO':
+    case 'ID':
       $element = $name;
       break;
+    case 'LINK':
+      if ($attributes['REL'] == 'alternate') {
+        if ($element == 'ITEM') {
+          $items[$item]['LINK'] = $attributes['HREF'];
+        }
+        else {
+          $channel['LINK'] = $attributes['HREF'];
+        }
+      }
+      break;
     case 'ITEM':
       $element = $name;
       $item += 1;
+      break;
+    case 'ENTRY':
+      $element = 'ITEM';
+      $item += 1;
+      break;
   }
 
   $tag = $name;
@@ -300,6 +322,10 @@ function aggregator_element_end($parser, $name) {
     case 'IMAGE':
     case 'TEXTINPUT':
     case 'ITEM':
+    case 'ENTRY':
+    case 'CONTENT':
+    case 'INFO':
+    case 'ID':
       $element = '';
   }
 }
@@ -315,8 +341,26 @@ function aggregator_element_data($parser, $data) {
       $items[$item][$tag] .= $data;
       break;
     case 'IMAGE':
+    case 'LOGO':
       $image[$tag] .= $data;
       break;
+    case 'LINK':
+      if ($data) {
+        $items[$item][$tag] .= $data;
+      }
+      break;
+    case 'CONTENT':
+      $items[$item]['DESCRIPTION'] .= $data;
+      break;
+    case 'SUMMARY':
+      $items[$item]['DESCRIPTION'] .= $data;
+      break;
+    case 'TAGLINE':
+    case 'SUBTITLE':
+      $channel['DESCRIPTION'] .= $data;
+      break;
+    case 'INFO':
+    case 'ID':
     case 'TEXTINPUT':
       // The sub-element is not supported. However, we must recognize
       // it or its contents will end up in the item array.
@@ -488,7 +532,6 @@ function aggregator_parse_feed(&$data, $feed) {
       $value = preg_replace('/\Won[a-z]+\s*=[^>]+?>/i', '>', $value);
       $item[$key] = $value;
     }
-
     /*
     ** Resolve the item's title.  If no title is found, we use
     ** up to 40 characters of the description ending at a word
diff --git a/modules/aggregator/aggregator.module b/modules/aggregator/aggregator.module
index de07712469c2..f1f367136422 100644
--- a/modules/aggregator/aggregator.module
+++ b/modules/aggregator/aggregator.module
@@ -275,16 +275,38 @@ function aggregator_remove($feed) {
  * Call-back function used by the XML parser.
  */
 function aggregator_element_start($parser, $name, $attributes) {
-  global $item, $element, $tag;
+  global $item, $element, $tag, $items, $channel;
 
   switch ($name) {
     case 'IMAGE':
     case 'TEXTINPUT':
+    case 'CONTENT':
+    case 'SUMMARY':
+    case 'TAGLINE':
+    case 'SUBTITLE':
+    case 'LOGO':
+    case 'INFO':
+    case 'ID':
       $element = $name;
       break;
+    case 'LINK':
+      if ($attributes['REL'] == 'alternate') {
+        if ($element == 'ITEM') {
+          $items[$item]['LINK'] = $attributes['HREF'];
+        }
+        else {
+          $channel['LINK'] = $attributes['HREF'];
+        }
+      }
+      break;
     case 'ITEM':
       $element = $name;
       $item += 1;
+      break;
+    case 'ENTRY':
+      $element = 'ITEM';
+      $item += 1;
+      break;
   }
 
   $tag = $name;
@@ -300,6 +322,10 @@ function aggregator_element_end($parser, $name) {
     case 'IMAGE':
     case 'TEXTINPUT':
     case 'ITEM':
+    case 'ENTRY':
+    case 'CONTENT':
+    case 'INFO':
+    case 'ID':
       $element = '';
   }
 }
@@ -315,8 +341,26 @@ function aggregator_element_data($parser, $data) {
       $items[$item][$tag] .= $data;
       break;
     case 'IMAGE':
+    case 'LOGO':
       $image[$tag] .= $data;
       break;
+    case 'LINK':
+      if ($data) {
+        $items[$item][$tag] .= $data;
+      }
+      break;
+    case 'CONTENT':
+      $items[$item]['DESCRIPTION'] .= $data;
+      break;
+    case 'SUMMARY':
+      $items[$item]['DESCRIPTION'] .= $data;
+      break;
+    case 'TAGLINE':
+    case 'SUBTITLE':
+      $channel['DESCRIPTION'] .= $data;
+      break;
+    case 'INFO':
+    case 'ID':
     case 'TEXTINPUT':
       // The sub-element is not supported. However, we must recognize
       // it or its contents will end up in the item array.
@@ -488,7 +532,6 @@ function aggregator_parse_feed(&$data, $feed) {
       $value = preg_replace('/\Won[a-z]+\s*=[^>]+?>/i', '>', $value);
       $item[$key] = $value;
     }
-
     /*
     ** Resolve the item's title.  If no title is found, we use
     ** up to 40 characters of the description ending at a word
-- 
GitLab