? .DS_Store
? .patch
? asdf.patch
? asdf234.patch
? drupal_render.patch
? mw.patch
? qw45.patch
? test.patch
? tmp.patch
? modules/simpletest/.DS_Store
? sites/.DS_Store
? sites/default/.DS_Store
? sites/default/files
? sites/default/settings.php
? themes/.DS_Store
Index: index.php
===================================================================
RCS file: /cvs/drupal/drupal/index.php,v
retrieving revision 1.96
diff -u -p -r1.96 index.php
--- index.php	20 Sep 2008 20:22:23 -0000	1.96
+++ index.php	2 Jan 2009 07:00:18 -0000
@@ -21,7 +21,7 @@ require_once DRUPAL_ROOT . '/includes/bo
 drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
 $return = menu_execute_active_handler();
 
-// Menu status constants are integers; page content is a string.
+// Menu status constants are integers; page content is a string or array.
 if (is_int($return)) {
   switch ($return) {
     case MENU_NOT_FOUND:
@@ -36,8 +36,8 @@ if (is_int($return)) {
   }
 }
 elseif (isset($return)) {
-  // Print any value (including an empty string) except NULL or undefined:
-  print theme('page', $return);
+  // Print anything besides a menu constant, assuming it's not NULL or undefined.
+  drupal_render_page($return);
 }
 
 drupal_page_footer();
Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.841
diff -u -p -r1.841 common.inc
--- includes/common.inc	30 Dec 2008 16:43:14 -0000	1.841
+++ includes/common.inc	2 Jan 2009 07:00:20 -0000
@@ -301,8 +301,7 @@ function drupal_get_destination() {
  * Drupal will ensure that messages set by drupal_set_message() and other
  * session data are written to the database before the user is redirected.
  *
- * This function ends the request; use it rather than a print theme('page')
- * statement in your menu callback.
+ * This function ends the request; use it rather than returning an array in your menu callback.
  *
  * @param $path
  *   A Drupal path or a full URL.
@@ -389,7 +388,10 @@ function drupal_not_found() {
   }
 
   // To conserve CPU and bandwidth, omit the blocks.
-  print theme('page', $return, FALSE);
+  print drupal_render_page(array(
+    '#markup' => $return,
+    '#show_blocks' => FALSE
+  ));
 }
 
 /**
@@ -416,7 +418,12 @@ function drupal_access_denied() {
     drupal_set_title(t('Access denied'));
     $return = t('You are not authorized to access this page.');
   }
-  print theme('page', $return);
+  
+  // To conserve CPU and bandwidth, omit the blocks.
+  print drupal_render_page(array(
+    '#markup' => $return,
+    '#show_blocks' => FALSE
+  ));
 }
 
 /**
@@ -821,7 +828,11 @@ function _drupal_log_error($error, $fata
     drupal_set_header($_SERVER['SERVER_PROTOCOL'] . ' Service unavailable');
     drupal_set_title(t('Error'));
     if (!defined('MAINTENANCE_MODE') && drupal_get_bootstrap_phase() == DRUPAL_BOOTSTRAP_FULL) {
-      print theme('page', t('The website encountered an unexpected error. Please try again later.'), FALSE);
+      // To conserve CPU and bandwidth, omit the blocks.
+      print drupal_render_page(array(
+        '#markup' => t('The website encountered an unexpected error. Please try again later.'),
+        '#show_blocks' => FALSE
+      ));
     }
     else {
       print theme('maintenance_page', t('The website encountered an unexpected error. Please try again later.'), FALSE);
@@ -3176,6 +3187,22 @@ function drupal_alter($type, &$data) {
 }
 
 /**
+ * Renders the page and adds all theming.
+ * 
+ * @param $content
+ *   A string or array representing the content of the page.
+ */
+function drupal_render_page($content) {
+  // The preferred return value of a menu callback is an array.
+  if (!is_array($content)) {
+    $content = array('content' => array('#markup' => $content));
+  }
+  $content['#type'] = 'page';
+  drupal_alter('page', $content);
+  print drupal_render($content);
+}
+
+/**
  * Renders HTML given a structured array tree.
  *
  * Recursively iterates over each of the array elements, generating HTML code.
@@ -3339,7 +3366,7 @@ function drupal_common_theme() {
       'arguments' => array('text' => NULL)
     ),
     'page' => array(
-      'arguments' => array('content' => NULL, 'show_blocks' => TRUE, 'show_messages' => TRUE),
+      'arguments' => array('content' => NULL),
       'template' => 'page',
     ),
     'maintenance_page' => array(
@@ -3398,6 +3425,9 @@ function drupal_common_theme() {
     'item_list' => array(
       'arguments' => array('items' => array(), 'title' => NULL, 'type' => 'ul', 'attributes' => NULL),
     ),
+    'list' => array(
+      'arguments' => array('elements' => NULL),
+    ),
     'more_help_link' => array(
       'arguments' => array('url' => NULL),
     ),
Index: includes/theme.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/theme.inc,v
retrieving revision 1.458
diff -u -p -r1.458 theme.inc
--- includes/theme.inc	31 Dec 2008 12:02:21 -0000	1.458
+++ includes/theme.inc	2 Jan 2009 07:00:20 -0000
@@ -1571,6 +1571,28 @@ function theme_item_list($items = array(
 }
 
 /**
+ * Return a themed list of items from a drupal_render() style array.
+ *
+ * @param $elements
+ *   An array consisting of the following keys:
+ *     - items. An array of items as expected by theme('item_list'). Mandatory.
+ *     - #title. A title which prints above the list. Optional.
+ *     - list_type. The type of list to return. Defaults to "ul".
+ *     - #attributes. An array of attributes as expected by theme('item_list'). Optional.
+ * @return
+ *   A string containing the list output.
+ */
+function theme_list($elements) {
+  // Populate any missing array elements with their defaults.
+  $elements += array(
+    '#title' => '',
+    '#list_type' => 'ul',
+    '#attributes' => array(),
+    '#items' => array(),
+  );
+  return theme('item_list', $elements['#items'], $elements['#title'], $elements['#list_type'], $elements['#attributes']);
+}
+/**
  * Returns code that emits the 'more help'-link.
  */
 function theme_more_help_link($url) {
@@ -1825,6 +1847,13 @@ function template_preprocess(&$variables
  * @see page.tpl.php
  */
 function template_preprocess_page(&$variables) {
+  // Move some variables to the top level for themer convenience and template cleanliness.
+  $names = array('show_blocks' => TRUE, 'show_messages' => TRUE);
+  foreach ($names as $name => $default) {
+    $variables[$name] = isset($variables['content'][$name]) ? $variables['content'][$name] : $default;
+  }
+  $variables['content'] = &$variables['content']['#children'];
+  
   // Add favicon
   if (theme_get_setting('toggle_favicon')) {
     drupal_set_html_head('<link rel="shortcut icon" href="' . check_url(theme_get_setting('favicon')) . '" type="image/x-icon" />');
@@ -1977,6 +2006,8 @@ function template_preprocess_page(&$vari
  * @see node.tpl.php
  */
 function template_preprocess_node(&$variables) {
+  $variables['teaser'] = &$variables['elements']['teaser'];
+  $variables['node'] = &$variables['elements']['node'];
   $node = $variables['node'];
 
   $variables['date']      = format_date($node->created);
Index: modules/blog/blog.pages.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/blog/blog.pages.inc,v
retrieving revision 1.14
diff -u -p -r1.14 blog.pages.inc
--- modules/blog/blog.pages.inc	13 Oct 2008 00:33:01 -0000	1.14
+++ modules/blog/blog.pages.inc	2 Jan 2009 07:00:20 -0000
@@ -23,18 +23,20 @@ function blog_page_user($account) {
     $items[] = t('You are not allowed to post a new blog entry.');
   }
 
-  $output = theme('item_list', $items);
-
-  $result = pager_query(db_rewrite_sql("SELECT n.nid, n.sticky, n.created FROM {node} n WHERE n.type = 'blog' AND n.uid = %d AND n.status = 1 ORDER BY n.sticky DESC, n.created DESC"), variable_get('default_nodes_main', 10), 0, NULL, $account->uid);
-  $has_posts = FALSE;
-
-  while ($node = db_fetch_object($result)) {
-    $output .= node_view(node_load($node->nid), 1);
-    $has_posts = TRUE;
-  }
-
-  if ($has_posts) {
-    $output .= theme('pager', NULL, variable_get('default_nodes_main', 10));
+  $page['blog_actions'] = array(
+    '#items' => $items,
+    '#theme' => 'list',
+    '#weight' => -1,
+  );
+
+  $nids = pager_query(db_rewrite_sql("SELECT n.nid FROM {node} n WHERE n.type = 'blog' AND n.uid = %d AND n.status = 1 ORDER BY n.sticky DESC, n.created DESC"), variable_get('default_nodes_main', 10), 0, NULL, $account->uid)->fetchCol();
+  if (!empty($nids)) {
+    $nodes = node_load_multiple($nids);
+    $page += node_build_multiple($nodes);
+    $page['pager'] = array(
+      '#markup' => theme('pager', NULL, variable_get('default_nodes_main', 10)),
+      '#weight' => count($nodes),
+    );
   }
   else {
     if ($account->uid == $user->uid) {
@@ -46,7 +48,7 @@ function blog_page_user($account) {
   }
   drupal_add_feed(url('blog/' . $account->uid . '/feed'), t('RSS - !title', array('!title' => $title)));
 
-  return $output;
+  return $page;
 }
 
 /**
@@ -56,31 +58,33 @@ function blog_page_last() {
   global $user;
 
   $output = '';
-  $items = array();
+  $page = array();
 
   if (user_access('edit own blog')) {
     $items[] = l(t('Create new blog entry.'), "node/add/blog");
-  }
-
-  $output = theme('item_list', $items);
-
-  $result = pager_query(db_rewrite_sql("SELECT n.nid, n.created FROM {node} n WHERE n.type = 'blog' AND n.status = 1 ORDER BY n.sticky DESC, n.created DESC"), variable_get('default_nodes_main', 10));
-  $has_posts = FALSE;
-
-  while ($node = db_fetch_object($result)) {
-    $output .= node_view(node_load($node->nid), 1);
-    $has_posts = TRUE;
-  }
-
-  if ($has_posts) {
-    $output .= theme('pager', NULL, variable_get('default_nodes_main', 10));
+    $page['blog_actions'] = array(
+      '#items' => $items,
+      '#theme' => 'list',
+      '#weight' => -1,
+    );
+  }
+
+  $nids = pager_query(db_rewrite_sql("SELECT n.nid FROM {node} n WHERE n.type = 'blog' AND n.status = 1 ORDER BY n.sticky DESC, n.created DESC"), variable_get('default_nodes_main', 10))->fetchCol();
+
+  if (!empty($nids)) {
+    $nodes = node_load_multiple($nids);
+    $page += node_build_multiple($nodes);
+    $page['pager'] = array(
+      '#markup' => theme('pager', NULL, variable_get('default_nodes_main', 10)),
+      '#weight' => count($nodes),
+    );
   }
   else {
     drupal_set_message(t('No blog entries have been created.'));
   }
   drupal_add_feed(url('blog/feed'), t('RSS - blogs'));
 
-  return $output;
+  return $page;
 }
 
 /**
Index: modules/comment/comment.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/comment/comment.module,v
retrieving revision 1.677
diff -u -p -r1.677 comment.module
--- modules/comment/comment.module	31 Dec 2008 12:04:36 -0000	1.677
+++ modules/comment/comment.module	2 Jan 2009 07:00:20 -0000
@@ -1628,7 +1628,7 @@ function comment_form_add_preview($form,
   }
   else {
     $suffix = empty($form['#suffix']) ? '' : $form['#suffix'];
-    $form['#suffix'] = $suffix . node_view($node);
+    $form['#suffix'] = $suffix . drupal_render(node_view($node));
     $edit['pid'] = 0;
   }
 
Index: modules/comment/comment.pages.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/comment/comment.pages.inc,v
retrieving revision 1.11
diff -u -p -r1.11 comment.pages.inc
--- modules/comment/comment.pages.inc	31 Dec 2008 12:02:21 -0000	1.11
+++ modules/comment/comment.pages.inc	2 Jan 2009 07:00:20 -0000
@@ -92,7 +92,7 @@ function comment_reply($node, $pid = NUL
       }
       // This is the case where the comment is in response to a node. Display the node.
       elseif (user_access('access content')) {
-        $output .= node_view($node);
+        $output .= drupal_render(node_view($node));
       }
 
       // Should we show the reply box?
Index: modules/node/node.api.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.api.php,v
retrieving revision 1.6
diff -u -p -r1.6 node.api.php
--- modules/node/node.api.php	31 Dec 2008 12:02:22 -0000	1.6
+++ modules/node/node.api.php	2 Jan 2009 07:00:20 -0000
@@ -169,7 +169,7 @@ function hook_node_operations() {
  * @return
  *   None.
  */
-function hook_nodeapi_alter($node, $teaser, $page) {
+function hook_nodeapi_alter($node, $teaser) {
 }
 
 /**
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.1008
diff -u -p -r1.1008 node.module
--- modules/node/node.module	31 Dec 2008 12:02:22 -0000	1.1008
+++ modules/node/node.module	2 Jan 2009 07:00:20 -0000
@@ -96,7 +96,7 @@ function node_help($path, $arg) {
 function node_theme() {
   return array(
     'node' => array(
-      'arguments' => array('node' => NULL, 'teaser' => FALSE, 'page' => FALSE),
+      'arguments' => array('elements' => NULL),
       'template' => 'node',
     ),
     'node_list' => array(
@@ -1123,24 +1123,28 @@ function node_delete($nid) {
 }
 
 /**
- * Generate a display of the given node.
+ * Generate an array for rendering the given node.
  *
  * @param $node
  *   A node array or node object.
  * @param $teaser
  *   Whether to display the teaser only or the full form.
- * @param $links
- *   Whether or not to display node links. Links are omitted for node previews.
  *
  * @return
- *   An HTML representation of the themed node.
+ *   An array as expected by drupal_render().
  */
 function node_view($node, $teaser = FALSE) {
   $node = (object)$node;
 
   $node = node_build_content($node, $teaser);
-
-  return theme('node', $node, $teaser);
+  
+  $render = $node->content;
+  $render += array(
+    '#theme' => 'node',
+    'node' => $node,
+    'teaser' => $teaser,
+  );
+  return $render;
 }
 
 /**
@@ -1208,19 +1212,17 @@ function node_build_content($node, $teas
 }
 
 /**
- * Generate a page displaying a single node.
+ * Generate an array which displays a single node.
  */
 function node_show($node, $message = FALSE) {
   if ($message) {
     drupal_set_title(t('Revision of %title from %date', array('%title' => $node->title, '%date' => format_date($node->revision_timestamp))), PASS_THROUGH);
   }
 
-  $output = node_view($node, FALSE, TRUE);
-
   // Update the history table, stating that this user viewed this node.
   node_tag_new($node->nid);
 
-  return $output;
+  return node_view($node, FALSE);
 }
 
 /**
@@ -1872,20 +1874,42 @@ function node_feed($nids = FALSE, $chann
 }
 
 /**
+ * Construct a drupal_render() style array from an array of loaded nodes.
+ *
+ * @param array $nodes
+ *   An array of nodes as returned by node_load_multiple().
+ * @param boolean $teaser
+ *   Display nodes into teaser view or full view.
+ * @param integer $weight
+ *   An integer representing the weight of the first node in the list. 
+ * @return 
+ *   An array in the format expected by drupal_render().
+ */
+function node_build_multiple($nodes, $teaser = TRUE, $weight = 0) {
+  $render = array();
+  foreach ($nodes as $node) {
+    $render["nid_$node->nid"] = node_view($node, $teaser);
+    $render["nid_$node->nid"]['#weight'] = $weight;
+    $weight++;
+  }
+  return $render;
+}
+
+/**
  * Menu callback; Generate a listing of promoted nodes.
  */
 function node_page_default() {
   $nids = pager_query(db_rewrite_sql('SELECT n.nid FROM {node} n WHERE n.promote = 1 AND n.status = 1 ORDER BY n.sticky DESC, n.created DESC'), variable_get('default_nodes_main', 10))->fetchCol();
   if (!empty($nids)) {
     $nodes = node_load_multiple($nids);
-    $output = '';
-    foreach ($nodes as $node) {
-      $output .= node_view($node, TRUE);
-    }
+    $page = node_build_multiple($nodes);
 
     $feed_url = url('rss.xml', array('absolute' => TRUE));
     drupal_add_feed($feed_url, variable_get('site_name', 'Drupal') . ' ' . t('RSS'));
-    $output .= theme('pager', NULL, variable_get('default_nodes_main', 10));
+    $page['pager'] = array(
+      '#markup' => theme('pager', NULL, variable_get('default_nodes_main', 10)),
+      '#weight' => count($nodes),
+    );
   }
   else {
     $default_message = '<h1 class="title">' . t('Welcome to your new Drupal website!') . '</h1>';
@@ -1898,11 +1922,11 @@ function node_page_default() {
     $default_message .= '</ol>';
     $default_message .= '<p>' . t('For more information, please refer to the <a href="@help">help section</a>, or the <a href="@handbook">online Drupal handbooks</a>. You may also post at the <a href="@forum">Drupal forum</a>, or view the wide range of <a href="@support">other support options</a> available.', array('@help' => url('admin/help'), '@handbook' => 'http://drupal.org/handbooks', '@forum' => 'http://drupal.org/forum', '@support' => 'http://drupal.org/support')) . '</p>';
 
-    $output = '<div id="first-time">' . $default_message . '</div>';
+    $page = array('#markup' => '<div id="first-time">' . $default_message . '</div>');
   }
   drupal_set_title('');
 
-  return $output;
+  return $page;
 }
 
 /**
@@ -2930,7 +2954,7 @@ function node_unpublish_by_keyword_actio
  */
 function node_unpublish_by_keyword_action($node, $context) {
   foreach ($context['keywords'] as $keyword) {
-    if (strstr(node_view(clone $node), $keyword) || strstr($node->title, $keyword)) {
+    if (strstr(drupal_render(node_view(clone $node)), $keyword) || strstr($node->title, $keyword)) {
       $node->status = 0;
       watchdog('action', 'Set @type %title to unpublished.', array('@type' => node_get_types('name', $node), '%title' => $node->title));
       break;
Index: modules/node/node.pages.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.pages.inc,v
retrieving revision 1.48
diff -u -p -r1.48 node.pages.inc
--- modules/node/node.pages.inc	30 Dec 2008 16:43:18 -0000	1.48
+++ modules/node/node.pages.inc	2 Jan 2009 07:00:20 -0000
@@ -415,12 +415,12 @@ function theme_node_preview($node) {
   if ($preview_trimmed_version) {
     drupal_set_message(t('The trimmed version of your post shows what your post looks like when promoted to the main page or when exported for syndication.<span class="no-js"> You can insert the delimiter "&lt;!--break--&gt;" (without the quotes) to fine-tune where your post gets split.</span>'));
     $output .= '<h3>' . t('Preview trimmed version') . '</h3>';
-    $output .= node_view(clone $node, 1, FALSE);
+    $output .= drupal_render(node_view(clone $node, TRUE));
     $output .= '<h3>' . t('Preview full version') . '</h3>';
-    $output .= node_view($node, 0, FALSE);
+    $output .= drupal_render(node_view($node, FALSE));
   }
   else {
-    $output .= node_view($node, 0, FALSE);
+    $output .= drupal_render(node_view($node, FALSE));
   }
   $output .= "</div>\n";
 
Index: modules/system/system.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.admin.inc,v
retrieving revision 1.111
diff -u -p -r1.111 system.admin.inc
--- modules/system/system.admin.inc	30 Dec 2008 16:43:19 -0000	1.111
+++ modules/system/system.admin.inc	2 Jan 2009 07:00:21 -0000
@@ -1900,7 +1900,7 @@ function system_batch_page() {
   elseif (isset($output)) {
     // Force a page without blocks or messages to
     // display a list of collected messages later.
-    print theme('page', $output, FALSE, FALSE);
+    return $output;
   }
 }
 
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.654
diff -u -p -r1.654 system.module
--- modules/system/system.module	28 Dec 2008 19:11:31 -0000	1.654
+++ modules/system/system.module	2 Jan 2009 07:00:21 -0000
@@ -236,6 +236,11 @@ function system_elements() {
     '#method' => 'post',
     '#action' => request_uri(),
   );
+  
+  // @see drupal_render_page().
+  $type['page'] = array(
+    '#value' => NULL,
+  );
 
   /**
    * Input elements.
Index: modules/taxonomy/taxonomy.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.module,v
retrieving revision 1.451
diff -u -p -r1.451 taxonomy.module
--- modules/taxonomy/taxonomy.module	30 Dec 2008 16:43:19 -0000	1.451
+++ modules/taxonomy/taxonomy.module	2 Jan 2009 07:00:21 -0000
@@ -26,9 +26,6 @@ function taxonomy_theme() {
     'taxonomy_term_select' => array(
       'arguments' => array('element' => NULL),
     ),
-    'taxonomy_term_page' => array(
-      'arguments' => array('tids' => array(), 'result' => NULL),
-    ),
     'taxonomy_overview_vocabularies' => array(
       'arguments' => array('form' => array()),
     ),
@@ -1223,7 +1220,7 @@ function theme_taxonomy_term_select($ele
  * @param $order
  *   The order clause for the query that retrieve the nodes.
  * @return
- *   A resource identifier pointing to the query results.
+ *   An array node IDs.
  */
 function taxonomy_select_nodes($tids = array(), $operator = 'or', $depth = 0, $pager = TRUE, $order = 'n.sticky DESC, n.created DESC') {
   if (count($tids) > 0) {
@@ -1241,7 +1238,7 @@ function taxonomy_select_nodes($tids = a
     if ($operator == 'or') {
       $args = call_user_func_array('array_merge', $descendant_tids);
       $placeholders = db_placeholders($args, 'int');
-      $sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created FROM {node} n INNER JOIN {term_node} tn ON n.vid = tn.vid WHERE tn.tid IN (' . $placeholders . ') AND n.status = 1 ORDER BY ' . $order;
+      $sql = 'SELECT DISTINCT(n.nid) FROM {node} n INNER JOIN {term_node} tn ON n.vid = tn.vid WHERE tn.tid IN (' . $placeholders . ') AND n.status = 1 ORDER BY ' . $order;
       $sql_count = 'SELECT COUNT(DISTINCT(n.nid)) FROM {node} n INNER JOIN {term_node} tn ON n.vid = tn.vid WHERE tn.tid IN (' . $placeholders . ') AND n.status = 1';
     }
     else {
@@ -1253,44 +1250,20 @@ function taxonomy_select_nodes($tids = a
         $wheres .= ' AND tn' . $index . '.tid IN (' . db_placeholders($tids, 'int') . ')';
         $args = array_merge($args, $tids);
       }
-      $sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created FROM {node} n ' . $joins . ' WHERE n.status = 1 ' . $wheres . ' ORDER BY ' . $order;
+      $sql = 'SELECT DISTINCT(n.nid) FROM {node} n ' . $joins . ' WHERE n.status = 1 ' . $wheres . ' ORDER BY ' . $order;
       $sql_count = 'SELECT COUNT(DISTINCT(n.nid)) FROM {node} n ' . $joins . ' WHERE n.status = 1 ' . $wheres;
     }
     $sql = db_rewrite_sql($sql);
     $sql_count = db_rewrite_sql($sql_count);
     if ($pager) {
-      $result = pager_query($sql, variable_get('default_nodes_main', 10), 0, $sql_count, $args);
+      $nids = pager_query($sql, variable_get('default_nodes_main', 10), 0, $sql_count, $args)->fetchCol();
     }
     else {
-      $result = db_query_range($sql, $args, 0, variable_get('feed_default_items', 10));
+      $nids = db_query_range($sql, $args, 0, variable_get('feed_default_items', 10))->fetchCol();
     }
   }
 
-  return $result;
-}
-
-/**
- * Accepts the result of a pager_query() call, such as that performed by
- * taxonomy_select_nodes(), and formats each node along with a pager.
- */
-function taxonomy_render_nodes($result) {
-  $output = '';
-  $nids = array();
-  foreach ($result as $record) {
-    $nids[] = $record->nid;
-  }
-  if (!empty($nids)) {
-    $nodes = node_load_multiple($nids);
-
-    foreach ($nodes as $node) {
-      $output .= node_view($node, 1);
-    }
-    $output .= theme('pager', NULL, variable_get('default_nodes_main', 10), 0);
-  }
-  else {
-    $output .= '<p>' . t('There are currently no posts in this category.') . '</p>';
-  }
-  return $output;
+  return $nids;
 }
 
 /**
Index: modules/taxonomy/taxonomy.pages.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.pages.inc,v
retrieving revision 1.19
diff -u -p -r1.19 taxonomy.pages.inc
--- modules/taxonomy/taxonomy.pages.inc	19 Dec 2008 03:55:23 -0000	1.19
+++ modules/taxonomy/taxonomy.pages.inc	2 Jan 2009 07:00:21 -0000
@@ -42,12 +42,38 @@ function taxonomy_term_page($terms, $dep
           $breadcrumb[] = l(t('Home'), NULL);
           $breadcrumb = array_reverse($breadcrumb);
           drupal_set_breadcrumb($breadcrumb);
-
-          $output = theme('taxonomy_term_page', $tids, taxonomy_select_nodes($tids, $terms['operator'], $depth, TRUE));
           drupal_add_feed(url('taxonomy/term/' . $str_tids . '/' . $depth . '/feed'), 'RSS - ' . $title);
-          return $output;
+          
+          if ($nids = taxonomy_select_nodes($tids, $terms['operator'], $depth, TRUE)) {
+            drupal_add_css(drupal_get_path('module', 'taxonomy') . '/taxonomy.css');
+            $page = array();
+
+            // Only display the description if we have a single term, to avoid clutter and confusion.
+            if (count($tids) == 1) {
+              $term = taxonomy_term_load($tids[0]);
+              $description = $term->description;
+
+              // Check that a description is set.
+              if (!empty($description)) {
+                $page['term_description'] = array(
+                  '#markup' => filter_xss_admin($description),
+                  '#weight' => -1,
+                  '#prefix' => '<div class="taxonomy-term-description">',
+                  '#suffix' => '</div>',
+                );
+              }
+            }
+
+            $nodes = node_load_multiple($nids);
+            $page = node_build_multiple($nodes);
+            $page['pager'] = array(
+              '#markup' => theme('pager', NULL, variable_get('default_nodes_main', 10)),
+              '#weight' => count($nodes),
+            );
+            
+            return $page;
+          }
           break;
-
         case 'feed':
           $channel['link'] = url('taxonomy/term/' . $str_tids . '/' . $depth, array('absolute' => TRUE));
           $channel['title'] = variable_get('site_name', 'Drupal') . ' - ' . $title;
@@ -58,13 +84,9 @@ function taxonomy_term_page($terms, $dep
             $channel['description'] = $term->description;
           }
 
-          $result = taxonomy_select_nodes($tids, $terms['operator'], $depth, FALSE);
-          $items = array();
-          while ($row = db_fetch_object($result)) {
-            $items[] = $row->nid;
-          }
+          $nids = taxonomy_select_nodes($tids, $terms['operator'], $depth, FALSE);
 
-          node_feed($items, $channel);
+          node_feed($nids, $channel);
           break;
 
         default:
@@ -78,38 +100,6 @@ function taxonomy_term_page($terms, $dep
 }
 
 /**
- * Render a taxonomy term page HTML output.
- *
- * @param $tids
- *   An array of term ids.
- * @param $result
- *   A pager_query() result, such as that performed by taxonomy_select_nodes().
- *
- * @ingroup themeable
- */
-function theme_taxonomy_term_page($tids, $result) {
-  drupal_add_css(drupal_get_path('module', 'taxonomy') . '/taxonomy.css');
-  $output = '';
-
-  // Only display the description if we have a single term, to avoid clutter and confusion.
-  if (count($tids) == 1) {
-    $term = taxonomy_term_load($tids[0]);
-    $description = $term->description;
-
-    // Check that a description is set.
-    if (!empty($description)) {
-      $output .= '<div class="taxonomy-term-description">';
-      $output .= filter_xss_admin($description);
-      $output .= '</div>';
-    }
-  }
-
-  $output .= taxonomy_render_nodes($result);
-
-  return $output;
-}
-
-/**
  * Page to edit a vocabulary term.
  */
 function taxonomy_term_edit($term) {
Index: modules/upload/upload.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/upload/upload.test,v
retrieving revision 1.10
diff -u -p -r1.10 upload.test
--- modules/upload/upload.test	30 Dec 2008 16:43:19 -0000	1.10
+++ modules/upload/upload.test	2 Jan 2009 07:00:21 -0000
@@ -53,7 +53,7 @@ class UploadTestCase extends DrupalWebTe
     
     // Assure that the attachment link appears on teaser view and has correct count.
     $node = node_load($node->nid);
-    $teaser = node_view($node, TRUE);
+    $teaser = drupal_render(node_view($node, TRUE));
     $this->assertTrue(strpos($teaser, format_plural(2, '1 attachment', '@count attachments')), 'Attachments link found on node teaser.');
 
     // Fetch db record and use fid to rename and delete file.
