? .DS_Store
? document-menu_get_object-arg-better.patch
? drupal_render.patch
? install_text_fixes.patch
? kick-comment-rendering-node-module.patch
? mw_235.patch
? mw_239.patch
? style-fixes-node-content-type.patch
? variable_rendering.patch
? 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	31 Dec 2008 23:58:50 -0000
@@ -35,6 +35,10 @@ if (is_int($return)) {
       break;
   }
 }
+elseif (is_array($return)) {
+  // The preferred return value of a menu callback is an array.
+  print theme('page', drupal_render($return));
+}
 elseif (isset($return)) {
   // Print any value (including an empty string) except NULL or undefined:
   print theme('page', $return);
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	31 Dec 2008 23:58:50 -0000
@@ -1977,26 +1977,30 @@ function template_preprocess_page(&$vari
  * @see node.tpl.php
  */
 function template_preprocess_node(&$variables) {
-  $node = $variables['node'];
+  $node = $variables['elements']['node'];
+
+  $variables += array(
+    'node'     => $node,
+    'teaser'   => &$variables['elements']['teaser'],
+    'date'     => format_date($node->created),
+    'name'     => theme('username', $node),
+    'node_url' => url('node/' . $node->nid),
+    'title'    => check_plain($node->title),
+    'page'     => (bool)menu_get_object(),
+  );
 
-  $variables['date']      = format_date($node->created);
-  $variables['name']      = theme('username', $node);
-  $variables['node_url']  = url('node/' . $node->nid);
-  $variables['title']     = check_plain($node->title);
-  $variables['page']     = (bool)menu_get_object();
-  
   if ($node->build_mode == NODE_BUILD_PREVIEW) {
     unset($node->content['links']);
   }
   
   // Render taxonomy links separately.
-  $variables['terms']     = !empty($node->content['links']['terms']) ? drupal_render($node->content['links']['terms']) : '';
+  $variables['terms']    = !empty($node->content['links']['terms']) ? drupal_render($node->content['links']['terms']) : '';
   
   // Render all remaining node links.
-  $variables['links']     = !empty($node->content['links']) ? drupal_render($node->content['links']) : '';
+  $variables['links']    = !empty($node->content['links']) ? drupal_render($node->content['links']) : '';
   
   // Render any comments.
-  $variables['comments']     = !empty($node->content['comments']) ? drupal_render($node->content['comments']) : '';
+  $variables['comments'] = !empty($node->content['comments']) ? drupal_render($node->content['comments']) : '';
 
   // Render the rest of the node into $content.
   if (!empty($node->content['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	31 Dec 2008 23:58:50 -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,31 @@ 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.
+ * @param $page
+ *   Whether to display the teaser only or the full form.
  *
  * @return
- *   An HTML representation of the themed node.
+ *   AnAn 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;
 }
 
 /**
@@ -1878,14 +1885,20 @@ 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 = '';
+    $render = array();
+    $weight = 0;
     foreach ($nodes as $node) {
-      $output .= node_view($node, TRUE);
+      $render["node_$node->nid"] = node_view($node, TRUE);
+      $render["node_$node->nid"]['#weight'] = $weight;
+      $weight++;
     }
 
     $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));
+    $render['pager'] = array(
+      '#markup' => theme('pager', NULL, variable_get('default_nodes_main', 10)),
+      '#weight' => $weight,
+    );
   }
   else {
     $default_message = '<h1 class="title">' . t('Welcome to your new Drupal website!') . '</h1>';
@@ -1898,11 +1911,15 @@ 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>';
+    $render = array(
+      '#markup' => $default_message,
+      '#prefix' => '<div id="first-time">',
+      '#suffix' => '</div>'
+    );
   }
   drupal_set_title('');
 
-  return $output;
+  return $render;
 }
 
 /**
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	31 Dec 2008 23:58:50 -0000
@@ -102,7 +102,12 @@ function node_form(&$form_state, $node) 
     $node = $form_state['node'] + (array)$node;
   }
   if (isset($form_state['node_preview'])) {
-    $form['#prefix'] = $form_state['node_preview'];
+    // form_builder would try to iterate over the stdClass $node, which fails
+    // miserably, so we have to render it first.
+    $form['preview'] = array(
+      '#markup' => drupal_render($form_state['node_preview']),
+      '#weight' => -1000,
+    );
   }
   $node = (object)$node;
   foreach (array('body', 'title', 'format') as $key) {
@@ -396,7 +401,10 @@ function node_preview($node) {
  * @ingroup themeable
  */
 function theme_node_preview($node) {
-  $output = '<div class="preview">';
+  $render = array(
+    '#prefix' => '<div class="preview">',
+    '#suffix' => '</div>',
+  );
 
   $preview_trimmed_version = FALSE;
   // Do we need to preview trimmed version of post as well as full version?
@@ -414,17 +422,28 @@ 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 .= '<h3>' . t('Preview full version') . '</h3>';
-    $output .= node_view($node, 0, FALSE);
+    $render['trimmed_title'] = array(
+      '#prefix' => '<h3>',
+      '#markup' => t('Preview trimmed version'),
+      '#suffix' => '</h3>',
+      '#weight' => 1,
+    );
+    $render['trimmed'] = node_view(clone $node, 1, FALSE);
+    $render['trimmed']['#weight'] = 2;
+    $render['full_title'] = array(
+      '#prefix' => '<h3>',
+      '#markup' => t('Preview trimmed version'),
+      '#suffix' => '</h3>',
+      '#weight' => 3,
+    );
+    $render['full'] = node_view(clone $node, 0, FALSE);
+    $render['full']['#weight'] = 4;
   }
   else {
-    $output .= node_view($node, 0, FALSE);
+    $render['full'] = node_view(clone $node, 0, FALSE);
   }
-  $output .= "</div>\n";
 
-  return $output;
+  return $render;
 }
 
 function node_form_submit($form, &$form_state) {
