--- /dev/null 2005-11-20 21:22:37.000000000 -0600
+++ category_devel/category_devel.info 2007-02-13 17:42:49.000000000 -0600
@@ -0,0 +1,5 @@
+; $Id$
+name = Category devel
+description = Debugging and development tools for Category.
+package = Category
+dependencies = category
--- /dev/null 2005-11-20 21:22:37.000000000 -0600
+++ category_devel/category_devel.module 2007-02-14 10:40:43.000000000 -0600
@@ -0,0 +1,129 @@
+ 'node/'.arg(1).'/cat_devel',
+ 'title' => t('Category dev'),
+ 'access' => user_access('administer categories'),
+ 'callback' => 'category_devel_page',
+ 'type' => MENU_LOCAL_TASK,
+ );
+ $items[] = array(
+ 'path' => 'node/'.arg(1).'/cat_devel_img',
+ 'access' => user_access('administer categories'),
+ 'callback' => 'category_devel_image',
+ 'callback arguments' => array(arg(1)),
+ 'type' => MENU_CALLBACK,
+ );
+ }
+ }
+ }
+ else {
+ $items[] = array(
+ 'path' => 'admin/settings/category_devel',
+ 'title' => t('Category Devel'),
+ 'description' => t('Configure Category Devel'),
+ 'callback' => 'drupal_get_form',
+ 'callback arguments' => 'category_devel_admin_settings',
+ 'access' => user_access('administer site configuration'),
+ 'type' => MENU_NORMAL_ITEM,
+ );
+ }
+ return $items;
+}
+
+function category_devel_admin_settings() {
+ $form = array();
+ $form['category_devel_dot'] = array(
+ '#type' => 'textfield',
+ '#title' => t('Path to dot'),
+ '#description' => t('Enter the path to your Graphviz dot binary.'),
+ '#default_value' => variable_get('category_devel_dot','/usr/pkg/bin/dot'),
+ );
+ return system_settings_form($form);
+}
+
+
+function category_devel_page() {
+ $o = '
'.t('Ovals are categories, boxes are containers.').'
';
+ $o .= '
';
+ return $o;
+}
+
+/**
+ * Menu callback to render and display the tree.
+ * Requires webserver-accessible graphviz binary.
+ */
+function category_devel_image($nid) {
+ $dot = category_devel_dot($nid);
+ $filename = tempnam(file_directory_temp(),'cat_dev_');
+ $imagename = tempnam(file_directory_temp(),'cat_dev_');
+ $handle = fopen($filename,'w');
+ fwrite($handle,$dot);
+ fclose($handle);
+ $errors = system(variable_get('category_devel_dot','/usr/pkg/bin/dot').' -Tpng '.$filename.' >'.$imagename);
+ unlink($filename);
+ $img = file_get_contents($imagename);
+ unlink($imagename);
+ header('Content-Type: image/png');
+ echo $img;
+ exit();
+}
+
+/**
+ * Function to generate a dot file representing the paths to the root.
+ */
+function category_devel_dot($nid) {
+ $o = 'digraph g {';
+ $pairs = array();
+ _category_devel_dot($pairs,$nid);
+ $data = $pairs['data'];
+ unset($pairs['data']);
+ foreach ($pairs as $k=>$v) {
+ foreach ($v as $k2=>$v2) {
+ $o .= '"'.$k.'"'.' -> '.'"'.$k2.'"'.';';
+ }
+ }
+ foreach ($data as $k => $v) {
+ $o .= '"'.$k.'" [shape='.$v['type'].' label="'.$k.', '.$v['weight'].'\n'.$v['name'].'"];';
+ }
+ $o .= '"0" [shape=box label=""];}';
+ return $o;
+}
+
+/**
+ * Helper function for category_devel_dot().
+ */
+function _category_devel_dot(&$pairs,$nid) {
+ $node = node_load($nid);
+ $parents = $node->parents;
+ if (empty($parents)) {
+ $parents = array($node->parent);
+ }
+ $type = category_node_get_type($node);
+ $pairs['data'][$node->nid] = array(
+ 'name' => $node->title,
+ 'type' => ($type=='category_cat') ? "ellipse" : "box",
+ 'weight' => $node->weight,
+ );
+ foreach($parents as $p) {
+ $pairs[$p][$node->nid] = TRUE;
+ if ($p != 0) {
+ _category_devel_dot($pairs,$p);
+ }
+ }
+}
+