diff --git a/core/modules/file/css/file.formatter.generic.css b/core/modules/file/css/file.formatter.generic.css new file mode 100644 index 0000000..c024523 --- /dev/null +++ b/core/modules/file/css/file.formatter.generic.css @@ -0,0 +1,68 @@ +/** + * @file + * Default style for file module + */ + +/** + * File icons + */ +.file { + padding-left: 20px; /* LTR */ + display: inline-block; + min-height: 16px; + background-repeat: no-repeat; + background-position: left center; /* LTR */ +} + +[dir="rtl"] .file { + padding-left: inherit; + padding-right: 20px; + background-position: right center; +} + +.file--general { + background-image: url(../icons/application-octet-stream.png); +} +.file--package-x-generic { + background-image: url(../icons/package-x-generic.png); +} +.file--x-office-spreadsheet { + background-image: url(../icons/x-office-spreadsheet.png); +} +.file--x-office-document { + background-image: url(../icons/x-office-document.png); +} +.file--x-office-presentation { + background-image: url(../icons/x-office-presentation.png); +} +.file--text-x-script { + background-image: url(../icons/text-x-script.png); +} +.file--text-html { + background-image: url(../icons/text-html.png); +} +.file--text-plain { + background-image: url(../icons/text-plain.png); +} +.file--application-pdf { + background-image: url(../icons/application-pdf.png); +} +.file--application-octet-stream { + background-image: url(../icons/application-octet-stream.png); +} +.file--application-x-executable { + background-image: url(../icons/application-x-executable.png); +} +.file--audio { + background-image: url(../icons/audio-x-generic.png); +} +.file--video { + background-image: url(../icons/video-x-generic.png); +} +.file--text { + background-image: url(../icons/text-x-generic.png); +} +.file--image { + background-image: url(../icons/image-x-generic.png); +} + 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 55f99ac..6a87dc8 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( @@ -1542,43 +1542,15 @@ function file_managed_file_pre_render($element) { */ 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); + $url = file_create_url($file_entity->getFileUri()); - // Human-readable names, for use as text-alternatives to icons. - $mime_name = array( - 'application/msword' => t('Microsoft Office document icon'), - 'application/vnd.ms-excel' => t('Office spreadsheet icon'), - 'application/vnd.ms-powerpoint' => t('Office presentation icon'), - 'application/pdf' => t('PDF icon'), - 'video/quicktime' => t('Movie icon'), - 'audio/mpeg' => t('Audio icon'), - 'audio/wav' => t('Audio icon'), - 'image/jpeg' => t('Image icon'), - 'image/png' => t('Image icon'), - 'image/gif' => t('Image icon'), - 'application/zip' => t('Package icon'), - 'text/html' => t('HTML icon'), - 'text/plain' => t('Plain text icon'), - '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')), - ); - + $mime_type = $file->getMimeType(); // Set options as per anchor format described at // http://microformats.org/wiki/file-format-examples - $options['attributes']['type'] = $file->getMimeType() . '; length=' . $file->getSize(); + $options['attributes']['type'] = $mime_type . '; length=' . $file->getSize(); // Use the description as the link text if available. if (empty($variables['description'])) { @@ -1589,93 +1561,60 @@ 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')); -} + // Classes to add to the file field for icons. + $classes = array( + 'file', + // Add a specific class for each and every mime type. + 'file--mime-' . strtr($mime_type, array('/' => '-', '.' => '-')), + // Add a more general class for groups of well known mime types. + 'file--' . file_icon_class($mime_type), + ); -/** - * 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; - } - return FALSE; + // Set file classes to the options array. + $variables['attributes'] = new Attribute($variables['attributes']); + $variables['attributes']->addClass($classes); + + $variables['link'] = _l($link_text, $url, $options); } /** - * Creates a path to the icon for a file entity. + * Gets a class for the icon for a MIME type. * - * @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. + * @param string $mime_type + * A MIME type. * - * @return - * A string to the icon as a local path, or FALSE if an appropriate icon could - * not be found. + * @return string + * A class 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; - } - - // For a few mimetypes, we can "manually" map to a generic icon. - $generic_mime = (string) file_icon_map($file); - $icon_path = $icon_directory . '/' . $generic_mime . '.png'; - if ($generic_mime && file_exists($icon_path)) { - return $icon_path; +function file_icon_class($mime_type) { + // Search for a group with the files MIME type. + $generic_mime = (string) file_icon_map($mime_type); + if (!empty($generic_mime)) { + return $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($mime_type, $category) === 0) { + return $category; } } - // Try application-octet-stream as last fallback. - $icon_path = $icon_directory . '/application-octet-stream.png'; - if (file_exists($icon_path)) { - return $icon_path; - } - - // No icon can be found. - return FALSE; + // If there's no generic icon for the type the general class. + return 'general'; } /** * Determines the generic icon MIME package based on a file's MIME type. * - * @param \Drupal\file\FileInterface $file - * A file entity. + * @param string $mime_type + * A MIME type. * * @return * The generic icon MIME package expected for this file. */ -function file_icon_map(FileInterface $file) { - switch ($file->getMimeType()) { +function file_icon_map($mime_type) { + switch ($mime_type) { // Word document types. case 'application/msword': case 'application/vnd.ms-word.document.macroEnabled.12': @@ -1786,6 +1725,14 @@ function file_icon_map(FileInterface $file) { case 'application/x-pef-executable': return 'application-x-executable'; + // Acrobat types + case 'application/pdf': + case 'application/x-pdf': + case 'applications/vnd.pdf': + case 'text/pdf': + case 'text/x-pdf': + return 'application-pdf'; + default: return FALSE; } 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 }}