Index: advanced_forum.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/advanced_forum/advanced_forum.module,v
retrieving revision 1.56
diff -u -p -w -r1.56 advanced_forum.module
--- advanced_forum.module	14 May 2008 20:54:57 -0000	1.56
+++ advanced_forum.module	28 May 2008 04:47:12 -0000
@@ -80,18 +80,65 @@ function advanced_forum_settings_page() 
  * D5 compatability wrapper for node/comment preprocess functions.
  */
 function advanced_forum_addvars($hook, $vars) {
+  _advanced_forum_load_preprocessors();
   switch ($hook) {
     case 'node':
-      advanced_forum_preprocess_node($vars);
-      break;
     case 'comment':
-      advanced_forum_preprocess_comment($vars);
+      advanced_forum_call_preprocess($hook, $vars);
       break;
   }
 
   return $vars;
 }
 
+
+/**
+ * Load advanced forum preprocessors includes on behalf of modules.
+ */
+function _advanced_forum_load_preprocessors() {
+  static $finished = FALSE;
+  if ($finished) {
+    return;
+  }
+  advanced_forum_include('forum.inc');
+}
+
+/**
+ * Load advanced forum files on behalf of modules.
+ *
+ * Blatent rip of views include system.
+ */
+function advanced_forum_include($file) {
+  $cache = cache_get('advforum_includes', 'cache');
+  if (isset($cache->data) && $cache->data) {
+    $includes = unserialize($cache->data);
+  }
+  else {
+    $advanced_forum_path = drupal_get_path('module', 'advanced_forum') . '/modules';
+    foreach (module_list() as $module) {
+      $module_path = drupal_get_path('module', $module);
+      if (file_exists("$module_path/$module.$file")) {
+        $includes[] = "./$module_path/$module.$file";
+      }
+      else if (file_exists("$module_path/includes/$module.$file")) {
+        $includes[] = "./$module_path/includes/$module.$file";
+      }
+      else if (file_exists("$advanced_forum_path/$module.$file")) {
+        $includes[] = "./$advanced_forum_path/$module.$file";
+      }
+    }
+    cache_set('advforum_includes', 'cache', serialize($includes));
+  }
+  foreach ($includes as $include) {
+    require_once $include;
+  }
+}
+
+/**
+ * Implementation of hook_preprocess_node().
+ *
+ * Provide additional templates and variables to forum nodes.
+ */
 function advanced_forum_preprocess_node(&$vars) {
   if (advanced_forum_treat_as_forum_post('node', $vars)) {
     // Use our combined node/comment template file
@@ -236,7 +283,7 @@ function theme_forum_user($account) {
   $variables['account'] = $account;
 
   // Call our preprocess function to create all the variables
-  template_preprocess_forum_user($variables);
+  advanced_forum_call_preprocess('forum_user', $variables);
     
   // Send the variables to the advf-forum-user.tpl.php
   $forum_theme =  advanced_forum_get_forum_theme_directory();
@@ -284,99 +331,6 @@ function template_preprocess_forum_user(
     $variables['online_text'] = t('Offline');
     $variables['online_status'] = '<div class="user-offline">' . $variables['online_icon'] . ' ' . $variables['online_text'] . '</div>';
   }
-
-  // Profile
-  if (module_exists('profile')) {
-    $variables['profile'] = profile_view_profile($account);
-  }
-  
-  // Points
-  if (module_exists('userpoints')) {
-    $variables['points_raw'] = userpoints_get_current_points($accountid);
-    $variables['points'] = '<div class="user-points"><strong>' . t('Points: ') . '</strong>' . $variables['points_raw'] . '</div>';
-  }
-
-  // Posts / IP
-  if (module_exists('user_stats')) {
-    $variables['posts_raw'] = user_stats_get_stats('post_count', $accountid);
-    $variables['posts'] = '<div class="user-posts"><strong>' . t('Posts: ') . '</strong>' . $variables['posts_raw'] . '</div>';
-    
-    // IP is only visible if the viewer has access, so do an extra check
-    $ip = user_stats_get_stats('ip_address', $accountid);
-    if (!empty($ip)) {
-      $variables['ip_raw'] = $ip;
-      $variables['ip'] = '<div class="user-ip"><strong>' . t('IP: ') . '</strong>' . $variables['ip_raw'] . '</div>';
-    }
-  }
- 
-  // Title
-  if (module_exists('user_titles')) {
-    $variables['user_title_raw'] = user_titles_get_user_title($accountid);
-    $variables['user_title'] = '<div class="user-title">' . $variables['user_title_raw'] . '</div>';
-  }
-
-  // Badges
-  if (module_exists('user_badges')) {
-    $variables['user_badges_raw'] = user_badges_for_uid($accountid);
-    $variables['user_badges'] = '<div class="user-badges">' . $variables['user_badges_raw'] . '</div>';
-  }
-
-  // Contact user
-  if (module_exists('contact') && ($account->contact) && ($account->uid != $user->uid) && ($user->uid != 0)) {
-    $variables['contact_class'] = "contact";
-    $variables['contact_icon'] = theme('image', advanced_forum_theme_path() . '/' . $themedir . "/images/email.png", 'Email', 'Email', NULL, TRUE);
-    $variables['contact_text'] = t('Email');
-    $variables['contact_link'] = 'user/'. $accountid . '/contact';
-    $variables['contact'] = '<div class="contact">' . 
-                          l($variables['contact_icon'] . ' '  . $variables['contact_text'], $variables['contact_link'], NULL, NULL, NULL, NULL, TRUE) . 
-                          '</div>';
-  }
-           
-  // Send private message
-  if (module_exists('privatemsg') && 
-     ($account->uid != $user->uid) && 
-     user_access('access private messages') && 
-     (isset($account->privatemsg_allow) ? $account->privatemsg_allow : 1)) { 
-    $variables['privatemsg_icon'] = theme('image', advanced_forum_theme_path() . '/' . $themedir . "/images/user_comment.png", 'Private Message', 'Private Message', NULL, TRUE);
-    $variables['privatemsg_text'] = t('Send PM');
-    $variables['privatemsg_link'] = 'privatemsg/new/'. $accountid;
-    $variables['privatemsg'] = '<div class="privatemsg">' . 
-      l($variables['privatemsg_icon'] . ' '  . 
-      $variables['privatemsg_text'], $variables['privatemsg_link'],NULL,NULL,NULL,NULL,TRUE) . '</div>';
-  }
-
-  // Add / remove from buddylist
-  if (module_exists('buddylist')) {
-  
-    if (user_access('maintain buddy list') && @in_array($accountid, array_keys(buddylist_get_buddies($user->uid)))) {
-      // Remove buddy
-      $variables['buddylist_class'] = "buddy-remove";
-      $variables['buddylist_icon'] = theme('image', advanced_forum_theme_path() . '/' . $themedir . "/images/group_delete.png", 'Remove Buddy', 'Remove Buddy', NULL, TRUE);
-      $variables['buddylist_text'] = t('Remove buddy');
-      $variables['buddylist_link'] = 'buddy/delete/'. $accountid;
-    } else {
-      // Add buddy
-      if ($accountid != $user->uid && user_access('maintain buddy list')) {
-        $variables['buddylist_class'] = "buddy-add";
-        $variables['buddylist_icon'] = theme('image', advanced_forum_theme_path() . '/' . $themedir . "/images/group_add.png", 'Add to buddy list', 'Add to buddy list', NULL, TRUE);
-        $variables['buddylist_text'] = t('Add buddy');
-        $variables['buddylist_link'] = 'buddy/add/'. $accountid;
-      }
-    }
-    
-    $variables['buddylist'] = '<div class="' . $variables['buddylist_class'] . '">' . 
-                         l($variables['buddylist_icon'] . ' '  . $variables['buddylist_text'], $variables['buddylist_link'],NULL,NULL,NULL,NULL,TRUE) . 
-                         '</div>';
-  } 
-  // Subscribe to user's posts 
-  // D6 alert: this assumes forum type.
-  if (module_exists('subscriptions')) { 
-    if (user_access('subscribe to content types')) {
-      $variables['subscribe_link'] = "subscriptions/add/type/forum/" . $account->uid;
-      $variables['subscribe'] = l(t("Subscribe"), $variables['subscribe_link'], array('title' => 'Subscribe to forum posts by this user'));
-    }
-  }
-
 }
 
 /********************** FORUM MODULE THEME OVERRIDES *************************/
@@ -396,11 +350,8 @@ function phptemplate_forum_display($foru
   $variables['sortby'] = $sortby;
   $variables['forum_per_page'] = $forum_per_page;
    
-  // Pass the parameters into the D6 preprocess function
-  template_preprocess_forums($variables);
-
   // Pass the parameters into our preprocess function
-  advanced_forum_preprocess_forums($variables);
+  advanced_forum_call_preprocess('forums', $variables);
 
   // Look for the .tpl file in the theme. If found, use it. If not found, default
   // to the stock forum code and put up a warning.
@@ -449,11 +400,8 @@ function phptemplate_forum_list($forums,
   $variables['parents'] = $parents;
   $variables['tid'] = $tid;
 
-  // Pass the parameters into the D6 preprocess function
-  template_preprocess_forum_list($variables);
-   
   // Pass the parameters into our preprocess function
-  advanced_forum_preprocess_forum_list($variables);
+  advanced_forum_call_preprocess('forum_list', $variables);
    
   // Look for the .tpl file in the theme. If found, use it. If not found, default
   // to the stock forum code and put up a warning.
@@ -483,11 +431,8 @@ function phptemplate_forum_submitted($to
   // Create a $variables array from the parameters
   $variables['topic'] = $topic;
    
-  // Pass the parameters into the D6 preprocess function
-  template_preprocess_forum_submitted($variables);
- 
   // Pass the parameters into our preprocess function
-  advanced_forum_preprocess_forum_submitted($variables);
+  advanced_forum_call_preprocess('forum_submitted', $variables);
 
   // Look for the .tpl file in the theme. If found, use it. If not found, 
   // just warn because there is no stock code to default to.
@@ -518,11 +463,8 @@ function phptemplate_forum_topic_list($t
   $variables['sortby'] = $sortby;
   $variables['forum_per_page'] = $forum_per_page;
    
-  // Pass the parameters into the D6 preprocess function
-  template_preprocess_forum_topic_list($variables);
-  
   // Pass the parameters into our preprocess function
-  advanced_forum_preprocess_forum_topic_list($variables);
+  advanced_forum_call_preprocess('forum_topic_list', $variables);
       
   // Look for the .tpl file in the theme. If found, use it. If not found, default
   // to the stock forum code and put up a warning.
@@ -631,11 +573,9 @@ function phptemplate_forum_icon($new_pos
   $variables['sticky'] = $sticky;
   $variables['topic_id'] = $topic_id;
    
-  // Pass the parameters into the D6 preprocess function
-  template_preprocess_forum_icon($variables);
 
   // Pass the parameters into our preprocess function
-  advanced_forum_preprocess_forum_icon($variables);
+  advanced_forum_call_preprocess('forum_icon', $variables);
 
   // Look for the .tpl file in the theme. If found, use it. If not found, default
   // to the stock forum code and put up a warning.
Index: d6_compat.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/advanced_forum/d6_compat.inc,v
retrieving revision 1.4
diff -u -p -w -r1.4 d6_compat.inc
--- d6_compat.inc	23 Mar 2008 02:22:38 -0000	1.4
+++ d6_compat.inc	28 May 2008 04:47:12 -0000
@@ -337,3 +337,99 @@ function comment_new_page_count($num_com
   }
   return $pagenum;
 }
+
+/*****************************************************************************/
+/**************************** Preprocessor ***********************************/
+/*****************************************************************************/
+
+/**
+ * Call preprocess functions for a theme hook.
+ *
+ * By calling this in a theme function prior to calling the template callback,
+ * we emulate the theme registry and preprocessor hooks of D6.
+ * @param $hook
+ * A theme hook that need preprocessing.
+ * @param $variables
+ * The theme variables array. This is used to return by reference.
+ * @return
+ * Return by reference the $variables array
+ */
+function advanced_forum_call_preprocess($hook, &$variables) {
+  $functions = advanced_forum_get_preprocess($hook);
+  $args = array(&$variables, $hook);
+  foreach ($functions as $function) {
+    call_user_func_array($function, $args);
+  }
+}
+
+/**
+ * Get a list of preprocess functions for a given hook.
+ *
+ * @param $hook
+ * A theme hook that need preprocessing.
+ * @return
+ * An array or preprocessor function.
+ */
+function advanced_forum_get_preprocess($hook) {
+  static $registry;
+
+  if (!isset($registry)) {
+    global $theme;
+    // Check the theme registry cache; if it exists, use it.
+    $cache = cache_get("advforum_registry:$theme", 'cache');
+    if (isset($cache->data) && $cache->data) {
+      $registry = unserialize($cache->data);
+    }
+    else {
+      // We'll build it below.
+      $registry = array();
+    }
+  }
+
+  // If we don't have registry or don't have an entry, build one and cache it.
+  // This will build the registry as needed so unused functions won't be poluting it.
+  if (empty($registry) || !isset($registry[$hook])) {
+    global $theme;
+    $registry[$hook] = _advanced_forum_build_preprocess($hook);
+    cache_set("advforum_registry:$theme", 'cache', serialize($registry));
+  }
+
+  return $registry[$hook];
+}
+
+/**
+ * Helper function that does the leg work of finding preprocessor functions for a given hook.
+ *
+ * @param $hook
+ * A theme hook that need preprocessing.
+ * @return
+ * An array of preprocessor functions.
+ */
+function _advanced_forum_build_preprocess($hook) {
+  static $d5;
+  if (!isset($d5)) {
+    $d5 = !function_exists('_theme_build_registry');
+  }
+  if (!$d5) {
+    // We shouldn't have to do anything in drupal 6.  I we want we could remove
+    // the functions completely but this works too.
+    return;
+  }
+
+  $return = array();
+  // Default preprocessor prefix.
+  $prefixes[] = 'template';
+  // Add all modules so they can intervene with their own preprocessors. This allows them
+  // to provide preprocess functions even if they are not the owner of the current hook.
+  $prefixes += module_list();
+
+  foreach ($prefixes as $prefix) {
+    if (function_exists($prefix .'_preprocess')) {
+      $return[] = $prefix .'_preprocess';
+    }
+    if (function_exists($prefix .'_preprocess_'. $hook)) {
+      $return[] = $prefix .'_preprocess_'. $hook;
+    }
+  }
+  return $return;
+}
