Index: devel_generate.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/devel/devel_generate.inc,v
retrieving revision 1.1.2.13
diff -u -r1.1.2.13 devel_generate.inc
--- devel_generate.inc	15 Jun 2008 20:26:16 -0000	1.1.2.13
+++ devel_generate.inc	2 Sep 2008 17:50:11 -0000
@@ -58,6 +58,11 @@
 function devel_create_nodes($records, $users, $title_length = 8, $types = array()) {
 
   if (is_array($types)) {
+    if (in_array( 'book', $types)) {
+      // reset
+      _devel_generate_book_tree();
+    }
+    
     // Insert new data:
     for ($i = 1; $i <= $records; $i++) {
       $node->uid = $users[array_rand($users)];
@@ -73,6 +78,9 @@
           break;
       }
 
+      if ($node->type == 'book') {
+        $node->parent = _devel_generate_book_tree($next_nid);
+      }
 
       $title = devel_create_greeking(rand(1, $title_length), TRUE);
       $node->title = $title;
@@ -411,4 +419,74 @@
     $comments[$comment->nid][] = $comment->cid ;
   }
   return comments;
+}
+
+/**
+ * Manages a tree like parent-nid structure
+ *
+ * $odo has odometer like behaviour
+ * - counter: current digit
+ * - maximum: for chekcing a rollover
+ * - id: maintaining the current nid
+ *  
+ * @param integer $nid
+ * @return integer $pid
+ */
+function _devel_generate_book_tree($nid=-1) {
+  static $odo;
+  
+  // Initialise or reset
+  if (!isset($odo)||$nid==-1) {
+    $odo = array();
+    // books
+    $odo[] = array( 'maximum' => 3, 'current' => 0);
+    // children
+    $odo[] = array( 'maximum' => 4, 'current' => 0);
+    // grant-children
+    $odo[] = array( 'maximum' => 6, 'current' => 0);
+    
+    // done
+    if ($nid==-1) return;
+  }
+  
+  $parent_book= -1;
+  
+  // Add $nid to an (partly) empty odometer
+  for ($i=0;$i<count($odo);$i++) {
+    // Init code
+    if (!isset( $odo[$i]['id'])) {
+      $odo[$i]['id'] = $nid;
+      if ($i>0) {
+        $parent_book= $odo[$i-1]['id'];
+      }
+      else {
+        $parent_book= 0;
+      }
+      // done
+      return $parent_book;
+    }
+  }
+  
+  for ($i=count($odo)-1;$i>=0;$i--) {
+    $odo[$i]['current']=$odo[$i]['current']+1;
+    if ($odo[$i]['current']==$odo[$i]['maximum']) {
+      $odo[$i]['current']=0;
+      unset($odo[$i]['id']);
+    }
+    else {
+      $odo[$i]['id'] = $nid;
+      if ($i>0) {
+        $parent_book=$odo[$i-1]['id'];
+      }
+      else {
+        $parent_book=0;
+      }
+      // done
+      return $parent_book;
+    }
+  }
+  
+  // reset tree
+  _devel_generate_book_tree();
+  return _devel_generate_book_tree($nid);
 }
\ No newline at end of file
