diff --git a/core/modules/file/file.libraries.yml b/core/modules/file/file.libraries.yml index ccc0c3b..c3ba921 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.generic_file.css: {} dependencies: - core/jquery - core/jquery.once - core/drupal - core/drupalSettings + +drupal.file.formatter.generic_file: + version: VERSION + css: + theme: + css/file.generic_file.css: {} diff --git a/core/modules/file/file.module b/core/modules/file/file.module index e1f4b28..a471324 100644 --- a/core/modules/file/file.module +++ b/core/modules/file/file.module @@ -1614,13 +1614,6 @@ function template_preprocess_file_link(&$variables) { $url = file_create_url($file->getFileUri()); $file_entity = ($file instanceof File) ? $file : file_load($file->fid); - $variables['icon'] = array( - '#theme' => 'image__file_icon', - '#uri' => file_icon_url($file_entity, $icon_directory), - '#alt' => '', - '#title' => check_plain($file_entity->getFilename()), - '#attributes' => array('class' => 'file-icon'), - ); // Set options as per anchor format described at // http://microformats.org/wiki/file-format-examples @@ -1635,80 +1628,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\File $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(File $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\File $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(File $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; } /** @@ -1739,7 +1702,7 @@ function file_icon_map(File $file) { case 'application/x-applix-word': case 'application/x-kword': case 'application/x-kword-crypt': - return 'x-office-document'; + return 'office-document'; // Spreadsheet document types. case 'application/vnd.ms-excel': @@ -1755,7 +1718,7 @@ function file_icon_map(File $file) { case 'application/x-gnumeric': case 'application/x-kspread': case 'application/x-kspread-crypt': - return 'x-office-spreadsheet'; + return 'office-spreadsheet'; // Presentation document types. case 'application/vnd.ms-powerpoint': @@ -1767,7 +1730,7 @@ function file_icon_map(File $file) { case 'application/vnd.sun.xml.impress': case 'application/vnd.sun.xml.impress.template': case 'application/x-kpresenter': - return 'x-office-presentation'; + return 'office-presentation'; // Compressed archive types. case 'application/zip': diff --git a/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php b/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php index 5d137e0..debb764 100644 --- a/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php +++ b/core/modules/file/src/Plugin/Field/FieldFormatter/GenericFileFormatter.php @@ -28,6 +28,10 @@ class GenericFileFormatter extends FileFormatterBase { public function viewElements(FieldItemListInterface $items) { $elements = array(); + $elements['#attached'] = array( + 'library' => array('file/drupal.file.formatter.generic_file'), + ); + foreach ($items as $delta => $item) { if ($item->isDisplayed() && $item->entity) { $elements[$delta] = array( diff --git a/core/modules/file/templates/file-link.html.twig b/core/modules/file/templates/file-link.html.twig index fbbf08b..f9e7969 100644 --- a/core/modules/file/templates/file-link.html.twig +++ b/core/modules/file/templates/file-link.html.twig @@ -13,4 +13,4 @@ * @ingroup themeable */ #} -{{ icon }} {{ link }} +{{ link }}