? Doxyfile
? files
? filter_interface_improvements_2.patch
? upload_inline_2_0.patch
? upload_inline_2_1.patch
? upload_inline_2_2.patch
? database/database.prefixed.mysql
? sites/webschuur.dyndns.org.DPL
Index: modules/filter.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter.module,v
retrieving revision 1.71
diff -u -F^f -u -F^f -r1.71 filter.module
--- modules/filter.module	25 Aug 2005 21:14:16 -0000	1.71
+++ modules/filter.module	13 Sep 2005 19:05:30 -0000
@@ -205,6 +205,17 @@ function filter_menu($may_cache) {
       'callback' => 'filter_admin_overview',
       'access' => user_access('administer filters'));
 
+    $items[] = array('path' => 'admin/filters/list', 'title' => t('list'),
+      'callback' => 'filter_admin_overview',
+      'type' => MENU_DEFAULT_LOCAL_TASK,
+      'access' => user_access('administer filters'));
+
+    $items[] = array('path' => 'admin/filters/add', 'title' => t('add input format'),
+      'callback' => 'filter_admin_add',
+      'type' => MENU_LOCAL_TASK,
+      'weight' => 1,
+      'access' => user_access('administer filters'));
+ 
     $items[] = array('path' => 'admin/filters/delete', 'title' => t('delete input format'),
       'callback' => 'filter_admin_delete',
       'type' => MENU_CALLBACK,
@@ -220,12 +231,13 @@ function filter_menu($may_cache) {
 
       if (isset($formats[arg(2)])) {
         $items[] = array('path' => 'admin/filters/'. arg(2), 'title' => t("'%format' input format", array('%format' => $formats[arg(2)]->name)),
-        'callback' => 'filter_admin_filters',
+        'callback' => 'filter_admin_format',
+        'callback arguments' => array('format' => $formats[arg(2)]),
         'type' => MENU_CALLBACK,
         'access' => user_access('administer filters'));
 
         $items[] = array('path' => 'admin/filters/'. arg(2) .'/list', 'title' => t('list'),
-        'callback' => 'filter_admin_filters',
+        'callback' => 'filter_admin_format',
         'type' => MENU_DEFAULT_LOCAL_TASK,
         'weight' => 0,
         'access' => user_access('administer filters'));
@@ -259,40 +271,32 @@ function filter_perm() {
  * Menu callback; allows administrators to set up input formats.
  */
 function filter_admin_overview() {
-  // Process form submission
-  switch ($_POST['op']) {
-    case t('Save input formats'):
-      filter_admin_save();
-      break;
-    case t('Add input format'):
-      filter_admin_add();
-      break;
+  // Process form submission to set the default format
+  if ($_POST['op'] == t('Save default format')) {
+    filter_admin_save_default();
   }
 
   // Overview of all formats.
   $formats = filter_formats();
-  $roles = user_roles();
   $error = false;
 
-  $header = array(t('Name'), t('Default'));
-  foreach ($roles as $name) {
-    $header[] = $name;
-  }
-  $header[] = array('data' => t('Operations'), 'colspan' => 2);
+  $header = array(t('Default'), t('Name'), t('Roles'), array('data' => t('Operations'), 'colspan' => 2));
 
   $rows = array();
   foreach ($formats as $id => $format) {
+    $roles = array();
+    foreach (user_roles() as $rid => $name) {
+      //prepare a roles array with roles that may access the filter
+      if (strstr($format->roles, ",$rid,")){
+        $roles[] = $name;
+      }
+    }
     $row = array();
     $default = ($id == variable_get('filter_default_format', 1));
 
-    $row[] = form_textfield('', "name][$id", $format->name, 15, 255);
     $row[] = form_radio('', 'default', $id, $default);
-
-    foreach ($roles as $rid => $name) {
-      $checked = strstr($format->roles, ",$rid,");
-      $row[] = form_checkbox('', "roles][$id][$rid", 1, $default || $checked, NULL, $default ? array('disabled' => 'disabled') : NULL);
-    }
-
+    $row[] = $format->name;
+    $row[] = $roles ? implode(', ',$roles) : t('No roles may use this format');
     $row[] = l(t('configure'), 'admin/filters/'. $id);
     $row[] = $default ? '' : l('delete', 'admin/filters/delete/'. $id);
 
@@ -300,15 +304,8 @@ function filter_admin_overview() {
   }
 
   $group = theme('table', $header, $rows);
-  $group .= form_submit(t('Save input formats'));
-  $output = '<h2>'. t('Permissions and settings') . '</h2>' . form($group);
-
-  // Form to add a new format.
-  $group = t("<p>To add a new input format, type its name here. After it has been added, you can configure its options.</p>");
-  $form = form_textfield(t('Name'), 'name', '', 30, 255);
-  $form .= form_submit(t('Add input format'));
-  $group .= form($form);
-  $output .= '<h2>'. t('Add new input format') .'</h2>'. $group;
+  $group .= form_submit(t('Save default format'));
+  $output = form($group);
 
   return $output;
 }
@@ -316,57 +313,26 @@ function filter_admin_overview() {
 /**
  * Save input formats on the overview page.
  */
-function filter_admin_save() {
+function filter_admin_save_default() {
   $edit = $_POST['edit'];
-
+  drupal_set_message(t('Default format saved'));
   variable_set('filter_default_format', $edit['default']);
-
-  foreach ($edit['name'] as $id => $name) {
-    $name = trim($name);
-
-    if (strlen($name) == 0) {
-      drupal_set_message(t('The input format name must be specified.'));
-      drupal_goto('admin/filters');
-    }
-    else {
-      db_query("UPDATE {filter_formats} SET name='%s' WHERE format = %d", $name, $id);
-    }
-  }
-
-  // We store the roles as a string for ease of use.
-  // We use leading and trailing comma's to allow easy substring matching.
-  foreach ($edit['roles'] as $id => $format) {
-    $roles = ',';
-    foreach ($format as $rid => $value) {
-      if ($value) {
-        $roles .= $rid .',';
-      }
-    }
-    db_query("UPDATE {filter_formats} SET roles = '%s' WHERE format = %d", $roles, $id);
-  }
-
-  drupal_set_message(t('The input format settings have been updated.'));
-  drupal_goto('admin/filters');
 }
 
 /**
  * Add a new input format.
  */
 function filter_admin_add() {
-  $edit = $_POST['edit'];
-
-  $name = trim($edit['name']);
+  if ($_POST['op']) {
+    $edit = $_POST['edit'];
+    filter_admin_filters_save($format->format, $edit);
 
-  if (strlen($name) == 0) {
-    drupal_set_message(t('The input format must have a name.'));
+    drupal_set_message(t('Added input format %format.', array('%format' => theme('placeholder', $edit['name']))));
     drupal_goto('admin/filters');
   }
   else {
-    db_query("INSERT INTO {filter_formats} (name) VALUES ('%s')", $name);
+    return filter_admin_format_form($format);
   }
-
-  drupal_set_message(t('Input format %format has been created.', array('%format' => theme('placeholder', $edit['name']))));
-  drupal_goto('admin/filters');
 }
 
 /**
@@ -386,7 +352,7 @@ function filter_admin_delete() {
 
       cache_clear_all('filter:'. $edit['format'], true);
 
-      drupal_set_message(t('Input format %format has been removed.', array('%format' => theme('placeholder', $edit['name']))));
+      drupal_set_message(t('Deleted input format %format.', array('%format' => theme('placeholder', $edit['name']))));
     }
     drupal_goto('admin/filters');
   }
@@ -409,37 +375,17 @@ function filter_admin_delete() {
 /**
  * Menu callback; configure the filters for a format.
  */
-function filter_admin_filters() {
-  $format = arg(2);
-
+function filter_admin_format($format) {
   // Handle saving of weights.
   if ($_POST['op']) {
-    filter_admin_filters_save($format, $_POST['edit']);
-  }
-
-  $all = filter_list_all();
-  $enabled = filter_list_format($format);
-
-  // Table with filters
-  $header = array(t('Enabled'), t('Name'), t('Description'));
-  $rows = array();
-  foreach ($all as $id => $filter) {
-    $row = array();
-    $row[] = form_checkbox('', $id, 1, isset($enabled[$id]));
-    $row[] = $filter->name;
-    $row[] = module_invoke($filter->module, 'filter', 'description', $filter->delta);
-
-    $rows[] = $row;
-  }
-  $form = theme('table', $header, $rows);
-  if (!$empty) {
-    $form .= form_submit(t('Save configuration'));
+    $edit = $_POST['edit'];
+    filter_admin_filters_save($format->format, $edit);
   }
 
-  $output .= '<h2>'. t('Filters') .'</h2>'. form($form);
+  $output = filter_admin_format_form($format);
 
   // Composition tips (guidelines)
-  $tips = _filter_tips($format, false);
+  $tips = _filter_tips($format->format, false);
   $extra = l(t('More information about formatting options'), 'filter/tips');
   $tiplist = theme('filter_tips', $tips, false, $extra);
   if (!$tiplist) {
@@ -453,13 +399,54 @@ function filter_admin_filters() {
 }
 
 /**
+ * Renders a form for a format
+ */
+function filter_admin_format_form($format) {
+  $default = ($format->format == variable_get('filter_default_format', 1));
+
+  //Add the name of the object
+  $form = form_textfield(t('Name'), 'name', $format->name, 60, 127, t('Give the name of this filter format'), NULL, TRUE);
+
+  //Add a row of checkboxes for.form group
+  foreach (user_roles() as $rid => $name) {
+    $checked = strstr($format->roles, ",$rid,");
+    $group .= form_checkbox($name, 'roles]['.$rid, 1, ($default || $checked), NULL, $default ? array('disabled' => 'disabled') : NULL);
+  }
+  if ($default) {
+    $help = '<br/>' . t('You are editing the default format. For the default format, all roles must be enabled. Therefore you cannot change them.');
+    $group .= form_hidden('default_format', 1);
+  }
+  $form .= form_group(t('Roles'), $group, t('Choose which roles may use this filter format') . $help);
+ 
+  // Table with filters
+  $all = filter_list_all();
+  $enabled = filter_list_format($format->format);
+
+  $group = '';
+  foreach ($all as $id => $filter) {
+    $group .= form_checkbox($filter->name, $id, 1, isset($enabled[$id]), module_invoke($filter->module, 'filter', 'description', $filter->delta));
+  }
+
+  $form .= form_group(t('filters'), $group, t('Choose the filters that will be used in this filter format'));
+  $form .= form_submit(t('Save configuration'));
+
+  return form($form);
+}
+
+/**
  * Save enabled/disabled status for filters in a format.
  */
 function filter_admin_filters_save($format, $toggles) {
   $current = filter_list_format($format);
-
+  $edit = $_POST['edit'];
   $cache = true;
 
+  if (!$format) { //add a new filter format. 
+    db_query("INSERT INTO {filter_formats} (name) VALUES ('%s')", $name);
+    $result = db_fetch_object(db_query("SELECT MAX(format) AS format FROM {filter_formats}"));
+    $format = $result->format;
+  }
+  
   db_query("DELETE FROM {filters} WHERE format = %d", $format);
   foreach ($toggles as $id => $checked) {
     if ($checked) {
@@ -473,13 +460,26 @@ function filter_admin_filters_save($form
     }
   }
 
-  // Update the format's 'no cache' flag.
-  db_query('UPDATE {filter_formats} SET cache = %d WHERE format = %d', (int)$cache, $format);
-
-  cache_clear_all('filter:'. $format, true);
-
-  drupal_set_message(t('The input format has been updated.'));
-  drupal_goto('admin/filters/'. arg(2) .'/list');
+  $name = trim($edit['name']);
+  if (strlen($name) == 0) {
+    form_set_error('name', t('You must enter a name for this input format.'));
+    drupal_goto('admin/filters/add');
+  }
+  else {
+    // We store the roles as a string for ease of use.
+    // we should always set all roles to true when saving a default role. disabled checkboxes may not always return TRUE.
+    // We use leading and trailing comma's to allow easy substring matching.
+    $roles = ',';
+    foreach ($edit['roles'] as $rid => $value) {
+      if ($value || $edit['default_format']) {
+        $roles .= $rid .',';
+      }
+    }
+    db_query("UPDATE {filter_formats} SET cache = %d, name='%s', roles = '%s' WHERE format = %d", (int)$cache, $name, $roles, $format);
+    drupal_set_message(t('The input format settings have been updated.'));
+    drupal_goto('admin/filters');
+    cache_clear_all('filter:'. $format, true);
+  }
 }
 
 /**
@@ -746,8 +746,7 @@ function filter_form($name = 'format', $
       $output .= theme('filter_tips', $tips);
       $output .= '</div>';
     }
-    $group = theme('form_element', NULL, $output, $extra, NULL, _form_get_error($name));
-    return form_group_collapsible(t('Input format'), $group, TRUE);
+    return theme('form_element', t('Input format'), $output, $extra, NULL, _form_get_error($name));
   }
   else {
     // Only one format available: use a hidden form item and only show tips.
@@ -925,7 +924,7 @@ function filter_filter($op, $delta = 0, 
  */
 function _filter_html_settings($format) {
   $group = form_radios(t('Filter HTML tags'), "filter_html_$format", variable_get("filter_html_$format", FILTER_HTML_STRIP), array(FILTER_HTML_STRIP => t('Strip tags'), FILTER_HTML_ESCAPE => t('Escape tags')), t('How to deal with HTML tags in user-contributed content. If set to "Strip tags", dangerous tags are removed (see below).  If set to "Escape tags", all HTML is escaped and presented as it was typed.'));
-  $group .= form_textfield(t('Allowed HTML tags'), "allowed_html_$format", variable_get("allowed_html_$format", '<a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>'), 60, 255, t('If "Strip tags" is selected, optionally specify tags which should not be stripped. Javascript event attributes are always stripped.'));
+  $group .= form_textfield(t('Allowed HTML tags'), "allowed_html_$format", variable_get("allowed_html_$format", '<a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>'), 64, 255, t('If "Strip tags" is selected, optionally specify tags which should not be stripped. Javascript event attributes are always stripped.'));
   $group .= form_checkbox(t('Display HTML help'), "filter_html_help_$format", 1, variable_get("filter_html_help_$format", 1), t('If enabled, Drupal will display some basic HTML help in the long filter tips.'));
   $group .= form_radios(t('HTML style attributes'), "filter_style_$format", variable_get("filter_style_$format", FILTER_STYLE_STRIP), array(FILTER_STYLE_ALLOW => t('Allowed'), FILTER_STYLE_STRIP => t('Removed')), t('If "Strip tags" is selected, you can choose whether "STYLE" attributes are allowed or removed from input.'));
   $group .= form_checkbox(t('Spam link deterrent'), "filter_html_nofollow_$format", 1, variable_get("filter_html_nofollow_$format", FALSE), t('If enabled, Drupal will add rel="nofollow" to all links, as a measure to reduce the effectiveness of spam links. Note: this will also prevent valid links from being followed by search engines, therefore it is likely most effective when enabled for anonymous users.'));
