Index: devel_generate/book.devel_generate.inc
===================================================================
RCS file: devel_generate/book.devel_generate.inc
diff -N devel_generate/book.devel_generate.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ devel_generate/book.devel_generate.inc	31 Jan 2011 23:35:36 -0000
@@ -0,0 +1,82 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Functions needed for devel_generate book integration.
+ */
+
+define('DEVEL_GENERATE_NO_BOOKS', 0);
+define('DEVEL_GENERATE_CREATE_BOOKS', 1);
+define('DEVEL_GENERATE_ADD_TO_BOOKS', 2);
+define('DEVEL_GENERATE_CREATE_AND_ADD_TO_BOOKS', 3);
+
+/**
+ * Enrich the $node that is about to be saved with book information.
+ */
+function devel_generate_book(&$node, $option, $depth) {
+  if (!book_type_is_allowed($node->type)) {
+    return;
+  }
+
+  switch ($option) {
+    case DEVEL_GENERATE_NO_BOOKS:
+      return;
+    case DEVEL_GENERATE_CREATE_BOOKS:
+      $new_book = TRUE;
+      break;
+    case DEVEL_GENERATE_ADD_TO_BOOKS:
+      $new_book = FALSE;
+      break;
+    case DEVEL_GENERATE_CREATE_AND_ADD_TO_BOOKS:
+      $new_book = mt_rand(0, 1) ? TRUE : FALSE;
+      break;
+    default:
+      return;
+  }
+
+  if ($new_book) {
+    $node->book['bid'] = 'new';
+  }
+  else {
+    // Find the lowest and highest mlid in menu_links where the menu link belongs to the book module.
+    $limits = db_query("SELECT MIN(mlid) AS min_mlid, MAX(mlid) AS max_mlid FROM {menu_links} WHERE module='book'")->fetchAssoc();
+
+    // If there aren't any menu_links from the book module there's no point trying to add child book pages.
+    if ($limits['min_mlid']) {
+      // It could take a bunch of tries to find an mlid in the range because menu_links may have non-book entries and
+      // also because we are allowing the user to limit the depth of book pages.
+      while (TRUE) {
+        $candidate = mt_rand($limits['min_mlid'], $limits['max_mlid']);
+  
+        $query = db_select('book', 'b');
+        $query->innerJoin('menu_links', 'm', 'b.mlid = m.mlid');
+        $result = $query
+                  ->fields('b', array('mlid', 'bid'))
+                  ->fields('m', array('depth'))
+                  ->condition('m.depth', $depth, '<')
+                  ->condition('b.mlid', $candidate, '=')
+                  ->range(0, 1)
+                  ->execute()
+                  ->fetchAssoc();
+        if ($result['bid']) {
+          break;
+        }
+      }
+      if ($result['bid']) {
+        $node->book['bid'] = $result['bid'];
+        $node->book['plid'] = $result['mlid'];
+      }
+    }
+  }
+}
+
+function devel_generate_book_options() {
+  $options = array(
+    DEVEL_GENERATE_NO_BOOKS => t('Do not create or add content to books'),
+    DEVEL_GENERATE_CREATE_BOOKS => t('Create new books'),
+    DEVEL_GENERATE_ADD_TO_BOOKS => t('Add content to existing books'),
+    DEVEL_GENERATE_CREATE_AND_ADD_TO_BOOKS => t('Create new books and add content to existing books'),
+  );
+  return $options;
+}
Index: devel_generate/devel_generate.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/devel/devel_generate/devel_generate.inc,v
retrieving revision 1.27
diff -u -p -r1.27 devel_generate.inc
--- devel_generate/devel_generate.inc	14 Nov 2010 00:29:50 -0000	1.27
+++ devel_generate/devel_generate.inc	31 Jan 2011 23:35:36 -0000
@@ -691,6 +691,11 @@ function devel_generate_content_add_node
   module_load_include('inc', 'devel_generate', 'devel_generate.fields');
   devel_generate_fields($node, 'node', $node->type);
 
+  if (module_exists('book')) {
+    module_load_include('inc', 'devel_generate', 'book.devel_generate');
+    devel_generate_book($node, $results['book_options'], $results['book_depth']);
+  }
+
   // See devel_generate_nodeapi() for actions that happen before and after this save.
   node_save($node);
 }
Index: devel_generate/devel_generate.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/devel/devel_generate/devel_generate.module,v
retrieving revision 1.13
diff -u -p -r1.13 devel_generate.module
--- devel_generate/devel_generate.module	6 Dec 2010 15:28:53 -0000	1.13
+++ devel_generate/devel_generate.module	31 Jan 2011 23:35:36 -0000
@@ -201,6 +201,32 @@ function devel_generate_content_form() {
     '#default_value' => LANGUAGE_NONE,
   );
 
+  if (module_exists('book')) {
+    module_load_include('inc', 'devel_generate', 'book.devel_generate');
+    $options = devel_generate_book_options();
+
+    $form['book'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Book'),
+      '#collapsible' => TRUE,
+    );
+    $form['book']['book_options'] = array(
+      '#type' => 'radios',
+      '#description' => t('Nodes that are in the allowed list of book types can be their own books or added to existing books.'),
+      '#title' => t('Add to books'),
+      '#options' => $options,
+      '#default_value' => DEVEL_GENERATE_NO_BOOKS,
+    );
+
+    $form['book']['book_depth'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Maximum book depth'),
+      '#description' => t('Enter the maximum book page depth to generate.  Minimum allowed value is 2.  Maximum allowed value is !max_depth (MENU_MAX_DEPTH).', array('!max_depth' => MENU_MAX_DEPTH)),
+      '#default_value' => 2,
+      '#size' => 3,
+    );
+  }
+
   $form['submit'] = array(
     '#type' => 'submit',
     '#value' => t('Generate'),
@@ -223,6 +249,15 @@ function devel_generate_content_form_sub
   }
 }
 
+function devel_generate_content_form_validate($form, &$form_state) {
+  if (module_exists('book')) {
+    $depth = $form_state['values']['book_depth'];
+    if (!is_numeric($depth) || ($depth < 2) || ($depth > MENU_MAX_DEPTH)) {
+      form_set_error('book_depth', t('Depth of book pages to generate must be between 2 and !max_depth (MENU_MAX_DEPTH).', array('!max_depth' => MENU_MAX_DEPTH)));
+    }
+  }
+}
+
 function devel_generate_term_form() {
   $options = array();
   foreach (taxonomy_get_vocabularies() as $vid => $vocab) {
