Index: token.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/token/token.module,v
retrieving revision 1.62
diff -u -p -r1.62 token.module
--- token.module	31 Jan 2011 21:10:02 -0000	1.62
+++ token.module	14 Feb 2011 06:15:53 -0000
@@ -35,7 +35,7 @@ function token_system_info_alter(&$info,
  * Return an array of the core modules supported by token.module.
  */
 function _token_core_supported_modules() {
-  return array('book', 'menu', 'profile');
+  return array('book', 'menu', 'profile', 'aggregator');
 }
 
 /**
@@ -101,6 +101,15 @@ function token_menu() {
       'file' => 'token.pages.inc',
       'weight' => 5,
     );
+    $items['aggregator/sources/%aggregator_feed/devel/token'] = array(
+      'title' => 'Tokens',
+      'page callback' => 'token_devel_token_object',
+      'page arguments' => array('aggregator-feed', 2),
+      'access arguments' => array('access devel information'),
+      'type' => MENU_LOCAL_TASK,
+      'file' => 'token.pages.inc',
+      'weight' => 5,
+    );
   }
 
   return $items;
Index: token.tokens.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/token/token.tokens.inc,v
retrieving revision 1.39
diff -u -p -r1.39 token.tokens.inc
--- token.tokens.inc	31 Jan 2011 21:10:02 -0000	1.39
+++ token.tokens.inc	14 Feb 2011 06:15:53 -0000
@@ -861,3 +861,121 @@ function _token_profile_fields() {
 
   return $fields;
 }
+
+/**
+ * Implements hook_token_info() on behalf of aggregator.module.
+ */
+function aggregator_token_info() {
+  $info['types']['aggregator-feed'] = array(
+    'name' => t('Aggregator feed'),
+    'description' => t('Tokens related to aggregator feeds.'),
+    'needs-data' => 'aggregator-feed',
+  );
+  $info['tokens']['aggregator-feed']['fid'] = array(
+    'name' => t('Feed ID'),
+    'description' => t('The unique ID of the aggregator feed.'),
+  );
+  $info['tokens']['aggregator-feed']['title'] = array(
+    'name' => t('Title'),
+    'description' => t('The title of the aggregator feed.'),
+  );
+  $info['tokens']['aggregator-feed']['source-url'] = array(
+    'name' => t('Source URL'),
+    'description' => t('The source URL of the aggregator feed.'),
+  );
+  $info['tokens']['aggregator-feed']['modified'] = array(
+    'name' => t('Date source modified'),
+    'description' => t('The date the feed was last modified.'),
+    'type' => 'date',
+  );
+  $info['tokens']['aggregator-feed']['last-checked'] = array(
+    'name' => t("Date last checked"),
+    'description' => t("The date the feed was last checked."),
+    'type' => 'date',
+  );
+  $info['tokens']['aggregator-feed']['description'] = array(
+    'name' => t('Description'),
+    'description' => t('The description of the parent website of the feed.'),
+  );
+  $info['tokens']['aggregator-feed']['url'] = array(
+    'name' => t('URL'),
+    'description' => t('The URL of the aggregator feed.'),
+    'type' => 'url',
+  );
+  $info['tokens']['aggregator-feed']['edit-url'] = array(
+    'name' => t('Edit URL'),
+    'description' => t("The URL of the aggregator feed's edit page."),
+  );
+  $info['tokens']['aggregator-feed']['item-count'] = array(
+    'name' => t('Item count'),
+    'description' => t('The number of items belonging to the aggregator feed.'),
+  );
+
+  return $info;
+}
+
+/**
+ * Implements hook_tokens() on behalf of aggregator.module.
+ */
+function aggregator_tokens($type, $tokens, array $data = array(), array $options = array()) {
+  $replacements = array();
+  $sanitize = !empty($options['sanitize']);
+
+  $url_options = array('absolute' => TRUE);
+  if (isset($options['language'])) {
+    $url_options['language'] = $options['language'];
+    $language_code = $options['language']->language;
+  }
+  else {
+    $language_code = NULL;
+  }
+
+  if ($type == 'aggregator-feed' && !empty($data['aggregator-feed'])) {
+    $feed = $data['aggregator-feed'];
+
+    foreach ($tokens as $name => $original) {
+      switch ($name) {
+        case 'fid':
+          $replacements[$original] = $feed->fid;
+          break;
+        case 'title':
+          $replacements[$original] = $sanitize ? check_plain($feed->title) : $feed->title;
+          break;
+        case 'source-url':
+          $replacements[$original] = $sanitize ? check_url($feed->url) : $feed->url;
+          break;
+        case 'description':
+          $replacements[$original] = $sanitize ? aggregator_filter_xss($feed->description) : $feed->description;
+          break;
+        case 'modified':
+          $replacements[$original] = format_date($feed->modified, 'medium', '', NULL, $language_code);
+          break;
+        case 'last-checked':
+          $replacements[$original] = format_date($feed->checked, 'medium', '', NULL, $language_code);
+          break;
+        case 'url':
+          $replacements[$original] = url("aggregator/sources/{$feed->fid}", $url_options);
+          break;
+        case 'edit-url':
+          $replacements[$original] = url("aggregator/sources/{$feed->fid}/configure", $url_options);
+          break;
+        case 'item-count':
+          $replacements[$original] = db_query("SELECT COUNT(1) FROM {aggregator_item} WHERE fid = :fid", array(':fid' => $feed->fid))->fetchField();
+          break;
+      }
+    }
+
+    // Chained token relationships.
+    if ($modified_tokens = token_find_with_prefix($tokens, 'modified')) {
+      $replacements += token_generate('date', $modified_tokens, array('date' => $feed->modified), $options);
+    }
+    if ($last_checked_tokens = token_find_with_prefix($tokens, 'last-checked')) {
+      $replacements += token_generate('date', $last_checked_tokens, array('date' => $feed->checked), $options);
+    }
+    if ($url_tokens = token_find_with_prefix($tokens, 'url')) {
+      $replacements += token_generate('url', $url_tokens, array('path' => "aggregator/sources/{$feed->fid}"), $options);
+    }
+  }
+
+  return $replacements;
+}
