Commit 56e1b484 authored by catch's avatar catch
Browse files

Issue #2492171 by dww, alexpott, sokru, jungle, hgoto, Pancho, collinhaines,...

Issue #2492171 by dww, alexpott, sokru, jungle, hgoto, Pancho, collinhaines, kirkkala, chr.fritsch, borisson_, seanB, pingwin4eg, SKAUGHT, andypost, Berdir: Provide options to sanitize filenames (transliterate, lowercase, replace whitespace, etc)
parent 37117ca4
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -4,3 +4,10 @@ description:
icon:
  directory: 'core/modules/file/icons'
make_unused_managed_files_temporary: false
filename_sanitization:
  transliterate: false
  replace_whitespace: false
  replace_non_alphanumeric: false
  deduplicate_separators: false
  lowercase: false
  replacement_character: '-'
+22 −0
Original line number Diff line number Diff line
@@ -24,6 +24,28 @@ file.settings:
    make_unused_managed_files_temporary:
      type: boolean
      label: 'Controls if unused files should be marked temporary'
    filename_sanitization:
      type: mapping
      label: 'Uploaded filename sanitization options'
      mapping:
        transliterate:
          type: boolean
          label: 'Transliterate'
        replace_whitespace:
          type: boolean
          label: 'Replace whitespace'
        replace_non_alphanumeric:
          type: boolean
          label: 'Replace non-alphanumeric characters except dot, underscore and dash'
        deduplicate_separators:
          type: boolean
          label: 'Replace sequences of dots, underscores and/or dashes with the replacement character'
        lowercase:
          type: boolean
          label: 'Convert to lowercase'
        replacement_character:
          type: string
          label: 'Character to use in replacements'

field.storage_settings.file:
  type: base_entity_reference_field_settings
+77 −0
Original line number Diff line number Diff line
@@ -1552,3 +1552,80 @@ function file_field_find_file_reference_column(FieldDefinitionInterface $field)
  }
  return FALSE;
}

/**
 * Implements hook_form_FORM_ID_alter().
 *
 * Injects the file sanitization options into /admin/config/media/file-system.
 *
 * These settings are enforced during upload by the FileEventSubscriber that
 * listens to the FileUploadSanitizeNameEvent event.
 *
 * @see \Drupal\system\Form\FileSystemForm
 * @see \Drupal\Core\File\Event\FileUploadSanitizeNameEvent
 * @see \Drupal\file\EventSubscriber\FileEventSubscriber
 */
function file_form_system_file_system_settings_alter(array &$form, FormStateInterface $form_state) {
  $config = \Drupal::config('file.settings');
  $form['filename_sanitization'] = [
    '#type' => 'details',
    '#title' => t('Sanitize filenames'),
    '#description' => t('These settings only apply to new files as they are uploaded. Changes here do not affect existing file names.'),
    '#open' => TRUE,
    '#tree' => TRUE,
  ];

  $form['filename_sanitization']['replacement_character'] = [
    '#type' => 'select',
    '#title' => t('Replacement character'),
    '#default_value' => $config->get('filename_sanitization.replacement_character'),
    '#options' => [
      '-' => t('Dash (-)'),
      '_' => t('Underscore (_)'),
    ],
    '#description' => t('Used when replacing whitespace, replacing non-alphanumeric characters or transliterating unknown characters.'),
  ];

  $form['filename_sanitization']['transliterate'] = [
    '#type' => 'checkbox',
    '#title' => t('Transliterate'),
    '#default_value' => $config->get('filename_sanitization.transliterate'),
    '#description' => t('Transliteration replaces any characters that are not alphanumeric, underscores, periods or hyphens with the replacement character. It ensures filenames only contain ASCII characters. It is recommended to keep transliteration enabled.'),
  ];

  $form['filename_sanitization']['replace_whitespace'] = [
    '#type' => 'checkbox',
    '#title' => t('Replace whitespace with the replacement character'),
    '#default_value' => $config->get('filename_sanitization.replace_whitespace'),
  ];

  $form['filename_sanitization']['replace_non_alphanumeric'] = [
    '#type' => 'checkbox',
    '#title' => t('Replace non-alphanumeric characters with the replacement character'),
    '#default_value' => $config->get('filename_sanitization.replace_non_alphanumeric'),
    '#description' => t('Alphanumeric characters, dots <span aria-hidden="true">(.)</span>, underscores <span aria-hidden="true">(_)</span> and dashes <span aria-hidden="true">(-)</span> are preserved.'),
  ];

  $form['filename_sanitization']['deduplicate_separators'] = [
    '#type' => 'checkbox',
    '#title' => t('Replace sequences of dots, underscores and/or dashes with the replacement character'),
    '#default_value' => $config->get('filename_sanitization.deduplicate_separators'),
  ];

  $form['filename_sanitization']['lowercase'] = [
    '#type' => 'checkbox',
    '#title' => t('Convert to lowercase'),
    '#default_value' => $config->get('filename_sanitization.lowercase'),
  ];

  $form['#submit'][] = 'file_system_settings_submit';
}

/**
 * Form submission handler for file system settings form.
 */
function file_system_settings_submit(array &$form, FormStateInterface $form_state) {
  $config = \Drupal::configFactory()->getEditable('file.settings')
    ->set('filename_sanitization', $form_state->getValue('filename_sanitization'));
  $config->save();
}
+14 −0
Original line number Diff line number Diff line
@@ -29,3 +29,17 @@ function file_post_update_add_permissions_to_roles(?array &$sandbox = NULL): voi
    return TRUE;
  });
}

/**
 * Add default filename sanitization configuration.
 */
function file_post_update_add_default_filename_sanitization_configuration() {
  $config = \Drupal::configFactory()->getEditable('file.settings');
  $config->set('filename_sanitization.transliterate', FALSE);
  $config->set('filename_sanitization.replace_whitespace', FALSE);
  $config->set('filename_sanitization.replace_non_alphanumeric', FALSE);
  $config->set('filename_sanitization.deduplicate_separators', FALSE);
  $config->set('filename_sanitization.lowercase', FALSE);
  $config->set('filename_sanitization.replacement_character', '-');
  $config->save();
}
+5 −0
Original line number Diff line number Diff line
services:
  file.event.subscriber:
    class: Drupal\file\EventSubscriber\FileEventSubscriber
    arguments: ['@config.factory', '@transliteration', '@language_manager']
    tags:
      - { name: event_subscriber }
  file.usage:
    class: Drupal\file\FileUsage\DatabaseFileUsageBackend
    arguments: ['@config.factory', '@database', 'file_usage']
Loading