Index: nodewords.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodewords/nodewords.module,v
retrieving revision 1.57.2.361
diff -u -p -r1.57.2.361 nodewords.module
--- nodewords.module	30 Oct 2010 18:57:10 -0000	1.57.2.361
+++ nodewords.module	30 Oct 2010 19:38:12 -0000
@@ -242,10 +242,18 @@ function nodewords_user($op, &$edit, &$a
  */
 function nodewords_add_tokens_help(&$form, $type) {
   switch ($type['type']) {
-    case NODEWORDS_TYPE_ERRORPAGE:
     case NODEWORDS_TYPE_PAGE:
       $tokens_type[] = 'global';
       $tokens_type[] = 'global meta tags';
+      $tokens_type[] = 'node';
+      $tokens_type[] = 'node meta tags';
+      $tokens_type[] = 'taxonomy';
+      $tokens_type[] = 'user';
+    break;
+    
+    case NODEWORDS_TYPE_ERRORPAGE:
+      $tokens_type[] = 'global';
+      $tokens_type[] = 'global meta tags';
       break;
 
     case NODEWORDS_TYPE_DEFAULT:
@@ -551,9 +559,64 @@ function nodewords_replace_tokens($conte
   }
 
   switch ($options['type']) {
-    case NODEWORDS_TYPE_ERRORPAGE:
     case NODEWORDS_TYPE_PAGE:
+      // Since a custom page can be virtually anything, we need to load global
+      // tokens and check arg(0) to see if there are additional tokens that we
+      // need to bring into scope.
+      $token_objects['global'] = NULL;
+      $token_objects['global meta tags'] = NULL;
+      $arg = arg();
+      if (!empty($arg[0])) {
+        switch ($arg[0]) {
+          // Core node.module.
+          case 'node':
+            $node_options = array();
+            node_nodewords_type_id($node_options, $arg);
+            $token_objects['node'] = _nodewords_node_load($node_options);
+            $token_objects['node meta tags'] = $token_objects['node'];
+            break;
+          // Core user.module.
+          case 'user':
+            $user_options = array();
+            user_metatags_type($user_options, $arg);
+            $token_objects['user'] = user_load($user_options['id']);
+            break;
+          // Core taxonomy.module.
+          case 'taxonomy':
+            $taxonomy_options = array();
+            taxonomy_nodewords_type_id($taxonomy_options, $arg);
+            $token_objects['taxonomy'] = _nodewords_taxonomy_object_load($taxonomy_options);
+            break;
+          // Core forum.module.
+          case 'forum':
+            $forum_options = array();
+            forum_nodewords_type_id($forum_options, $arg);
+            $token_objects['taxonomy'] = _nodewords_taxonomy_object_load($forum_options);
+            break;
+          // Contrib image.module.
+          case 'image':
+            $image_options = array();
+            image_nodewords_type_id($image_options, $arg);
+            $token_objects['taxonomy'] = _nodewords_taxonomy_object_load($image_options);
+            break;
+          // Contrib ubercart.module.
+          case 'catalog':
+            $uc_catalog_options = array();
+            forum_nodewords_type_id($uc_catalog_options, $arg);
+            $token_objects['taxonomy'] = _nodewords_taxonomy_object_load($uc_catalog_options);
+            break;
+          // Contrib taxonomy_menu.module.
+          case 'taxonomy_menu':
+            $taxonomy_menu_options = array();
+            taxonomy_menu_nodewords_type_id($taxonomy_menu_options, $arg);
+            $token_objects['taxonomy'] = _nodewords_taxonomy_object_load($taxonomy_menu_options);
+            break;
+        }
+      }
+      break;
+    case NODEWORDS_TYPE_ERRORPAGE:
       $token_objects['global'] = NULL;
+      $token_objects['global meta tags'] = NULL;
       break;
 
     case NODEWORDS_TYPE_NODE:
