diff --git a/core/modules/file/file.libraries.yml b/core/modules/file/file.libraries.yml index ccc0c3b..4652958 100644 --- a/core/modules/file/file.libraries.yml +++ b/core/modules/file/file.libraries.yml @@ -5,8 +5,16 @@ drupal.file: css: theme: css/file.admin.css: {} + component: + css/file.formatter.generic.css: {} dependencies: - core/jquery - core/jquery.once - core/drupal - core/drupalSettings + +drupal.file.formatter.generic: + version: VERSION + css: + theme: + css/file.formatter.generic.css: {} diff --git a/core/modules/file/file.module b/core/modules/file/file.module index e17ab46..4266fc2 100644 --- a/core/modules/file/file.module +++ b/core/modules/file/file.module @@ -576,7 +576,7 @@ function file_theme() { return array( // From file.module. 'file_link' => array( - 'variables' => array('file' => NULL, 'icon_directory' => NULL, 'description' => NULL, 'attributes' => array()), + 'variables' => array('file' => NULL, 'description' => NULL, 'attributes' => array()), 'template' => 'file-link', ), 'file_managed_file' => array( @@ -1535,19 +1535,13 @@ function file_managed_file_pre_render($element) { * @param array $variables * An associative array containing: * - file: A file object to which the link will be created. - * - icon_directory: (optional) A path to a directory of icons to be used for - * files. Defaults to the value of the "icon.directory" variable. * - description: A description to be displayed instead of the filename. * - attributes: An associative array of attributes to be placed in the a tag. */ function template_preprocess_file_link(&$variables) { $file = $variables['file']; - $options = array( - 'attributes' => $variables['attributes'], - ); - $icon_directory = $variables['icon_directory']; + $options = array(); - $url = file_create_url($file->getFileUri()); $file_entity = ($file instanceof File) ? $file : file_load($file->fid); // Human-readable names, for use as text-alternatives to icons. @@ -1568,13 +1562,7 @@ function template_preprocess_file_link(&$variables) { 'application/octet-stream' => t('Binary Data'), ); - $variables['icon'] = array( - '#theme' => 'image__file_icon', - '#uri' => file_icon_url($file_entity, $icon_directory), - '#alt' => (!empty($mime_name[$file->getMimeType()])) ? $mime_name[$file->getMimeType()] : t('File'), - '#title' => String::checkPlain($file_entity->getFilename()), - '#attributes' => array('class' => array('file-icon')), - ); + $url = file_create_url($file_entity->getFileUri()); // Set options as per anchor format described at // http://microformats.org/wiki/file-format-examples @@ -1589,80 +1577,50 @@ function template_preprocess_file_link(&$variables) { $options['attributes']['title'] = String::checkPlain($file_entity->getFilename()); } - $variables['link'] = l($link_text, $url, $options); - $variables['attributes'] = array('class' => array('file')); -} - -/** - * Creates a URL to the icon for a file entity. - * - * @param \Drupal\file\FileInterface $file - * A file entity. - * @param $icon_directory - * (optional) A path to a directory of icons to be used for files. Defaults to - * the value of the "icon.directory" variable. - * - * @return - * A URL string to the icon, or FALSE if an appropriate icon cannot be found. - */ -function file_icon_url(FileInterface $file, $icon_directory = NULL) { - if ($icon_path = file_icon_path($file, $icon_directory)) { - return base_path() . $icon_path; + // Set file classes to the options array. + if (isset($variables['attributes']['class']) && is_array($variables['attributes']['class'])) { + $variables['attributes']['class'] = array_merge($variables['attributes']['class'], file_icon_classes($file)); } - return FALSE; + else { + $variables['attributes']['class'] = file_icon_classes($file); + } + + $variables['link'] = l($link_text, $url, $options); } /** - * Creates a path to the icon for a file entity. + * Creates a list of classes to the icon for a file entity. * * @param \Drupal\file\FileInterface $file * A file entity. - * @param $icon_directory - * (optional) A path to a directory of icons to be used for files. Defaults to - * the value of the "icon.directory" variable. * * @return - * A string to the icon as a local path, or FALSE if an appropriate icon could - * not be found. + * A array of the classes associated to the file. */ -function file_icon_path(FileInterface $file, $icon_directory = NULL) { - // Use the default set of icons if none specified. - if (!isset($icon_directory)) { - $icon_directory = \Drupal::config('file.settings')->get('icon.directory'); - } - - // If there's an icon matching the exact mimetype, go for it. - $dashed_mime = strtr($file->getMimeType(), array('/' => '-')); - $icon_path = $icon_directory . '/' . $dashed_mime . '.png'; - if (file_exists($icon_path)) { - return $icon_path; - } + function file_icon_classes(File $file) { + $classes = array('file'); - // For a few mimetypes, we can "manually" map to a generic icon. + // Search for a group with the files MIME type. $generic_mime = (string) file_icon_map($file); - $icon_path = $icon_directory . '/' . $generic_mime . '.png'; - if ($generic_mime && file_exists($icon_path)) { - return $icon_path; + if (!empty($generic_mime)) { + $classes[] = $generic_mime; } // Use generic icons for each category that provides such icons. foreach (array('audio', 'image', 'text', 'video') as $category) { - if (strpos($file->getMimeType(), $category . '/') === 0) { - $icon_path = $icon_directory . '/' . $category . '-x-generic.png'; - if (file_exists($icon_path)) { - return $icon_path; - } + if (strpos($file->getMimeType(), $category) === 0) { + $classes[] = $category; } } - // Try application-octet-stream as last fallback. - $icon_path = $icon_directory . '/application-octet-stream.png'; - if (file_exists($icon_path)) { - return $icon_path; + // If there's no generic icon for the type use a specific one. + if (count($classes) == 1) { + $dashed_mime = strtr($file->getMimeType(), array('/' => '-')); + $classes[] = $dashed_mime; + $classes[] = 'file-general'; } - // No icon can be found. - return FALSE; + return $classes; } /** diff --git a/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php b/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php index 5d137e0..e37633b 100644 --- a/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php +++ b/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php @@ -46,6 +46,12 @@ public function viewElements(FieldItemListInterface $items) { } } + if (!empty($elements)) { + $elements['#attached'] = array( + 'library' => array('file/drupal.file.formatter.generic'), + ); + } + return $elements; } diff --git a/core/modules/file/templates/file-link.html.twig b/core/modules/file/templates/file-link.html.twig index fbbf08b..44cbd7f 100644 --- a/core/modules/file/templates/file-link.html.twig +++ b/core/modules/file/templates/file-link.html.twig @@ -6,11 +6,10 @@ * Available variables: * - attributes: The HTML attributes for the containing element. * - link: A link to the file. - * - icon: The icon image representing the file type. * * @see template_preprocess_file_link() * * @ingroup themeable */ #} -{{ icon }} {{ link }} +{{ link }}