You are here

public function FileLink::preprocessVariables in Express 8

Preprocess the variables array.

Parameters

\Drupal\bootstrap\Utility\Variables $variables: The Variables object.

Overrides PreprocessBase::preprocessVariables

File

themes/contrib/bootstrap/src/Plugin/Preprocess/FileLink.php, line 31
Contains \Drupal\bootstrap\Plugin\Preprocess\FileLink.

Class

FileLink
Pre-processes variables for the "file_link" theme hook.

Namespace

Drupal\bootstrap\Plugin\Preprocess

Code

public function preprocessVariables(Variables $variables) {
  $options = [];
  $file = $variables['file'] instanceof File ? $variables['file'] : File::load($variables['file']->fid);
  $url = file_create_url($file
    ->getFileUri());
  $file_size = $file
    ->getSize();
  $mime_type = $file
    ->getMimeType();

  // Set options as per anchor format described at
  // http://microformats.org/wiki/file-format-examples
  $options['attributes']['type'] = "{$mime_type}; length={$file_size}";

  // Use the description as the link text if available.
  if (empty($variables['description'])) {
    $link_text = $file
      ->getFilename();
  }
  else {
    $link_text = $variables['description'];
    $options['attributes']['title'] = $file
      ->getFilename();
  }

  // Retrieve the generic mime type from core (mislabeled as "icon_class").
  $generic_mime_type = file_icon_class($mime_type);

  // Map the generic mime types to an icon and state.
  $mime_map = [
    'application-x-executable' => [
      'label' => t('binary file'),
      'icon' => 'console',
    ],
    'audio' => [
      'label' => t('audio file'),
      'icon' => 'headphones',
    ],
    'image' => [
      'label' => t('image'),
      'icon' => 'picture',
    ],
    'package-x-generic' => [
      'label' => t('archive'),
      'icon' => 'compressed',
    ],
    'text' => [
      'label' => t('document'),
      'icon' => 'file',
    ],
    'video' => [
      'label' => t('video'),
      'icon' => 'film',
    ],
  ];

  // Retrieve the mime map array.
  $mime = isset($mime_map[$generic_mime_type]) ? $mime_map[$generic_mime_type] : [
    'label' => t('file'),
    'icon' => 'file',
    'state' => 'primary',
  ];

  // Classes to add to the file field for icons.
  $variables
    ->addClass([
    'file',
    // Add a specific class for each and every mime type.
    'file--mime-' . strtr($mime_type, [
      '/' => '-',
      '.' => '-',
    ]),
    // Add a more general class for groups of well known mime types.
    'file--' . $generic_mime_type,
  ]);

  // Set the icon for the mime type.
  $icon = Bootstrap::glyphicon($mime['icon']);
  $variables->icon = Element::create($icon)
    ->addClass('text-primary')
    ->getArray();
  $options['attributes']['title'] = t('Open @mime in new window', [
    '@mime' => $mime['label'],
  ]);
  $options['attributes']['target'] = '_blank';
  if ($this->theme
    ->getSetting('tooltip_enabled')) {
    $options['attributes']['data-toggle'] = 'tooltip';
    $options['attributes']['data-placement'] = 'bottom';
  }
  $variables['link'] = Link::fromTextAndUrl($link_text, Url::fromUri($url, $options));

  // Add the file size as a variable.
  $variables->file_size = format_size($file_size);

  // Preprocess attributes.
  $this
    ->preprocessAttributes();
}