You are here

public function Theme::fileScan in Express 8

Wrapper for the core file_scan_directory() function.

Finds all files that match a given mask in the given directories and then caches the results. A general site cache clear will force new scans to be initiated for already cached directories.

Parameters

string $mask: The preg_match() regular expression of the files to find.

string $subdir: Sub-directory in the theme to start the scan, without trailing slash. If not set, the base path of the current theme will be used.

array $options: Options to pass, see file_scan_directory() for addition options:

  • ignore_flags: (int|FALSE) A bitmask to indicate which directories (if any) should be skipped during the scan. Must also not contain a "nomask" property in $options. Value can be any of the following:

    • \Drupal\bootstrap::IGNORE_CORE
    • \Drupal\bootstrap::IGNORE_ASSETS
    • \Drupal\bootstrap::IGNORE_DOCS
    • \Drupal\bootstrap::IGNORE_DEV
    • \Drupal\bootstrap::IGNORE_THEME

    Pass FALSE to iterate over all directories in $dir.

Return value

array An associative array (keyed on the chosen key) of objects with 'uri', 'filename', and 'name' members corresponding to the matching files.

See also

file_scan_directory()

File

themes/contrib/bootstrap/src/Theme.php, line 291
Contains \Drupal\bootstrap.

Class

Theme
Defines a theme object.

Namespace

Drupal\bootstrap

Code

public function fileScan($mask, $subdir = NULL, array $options = []) {
  $path = $this
    ->getPath();

  // Append addition sub-directories to the path if they were provided.
  if (isset($subdir)) {
    $path .= '/' . $subdir;
  }

  // Default ignore flags.
  $options += [
    'ignore_flags' => self::IGNORE_DEFAULT,
  ];
  $flags = $options['ignore_flags'];
  if ($flags === self::IGNORE_DEFAULT) {
    $flags = self::IGNORE_CORE | self::IGNORE_ASSETS | self::IGNORE_DOCS | self::IGNORE_DEV;
  }

  // Save effort by skipping directories that are flagged.
  if (!isset($options['nomask']) && $flags) {
    $ignore_directories = [];
    if ($flags & self::IGNORE_ASSETS) {
      $ignore_directories += [
        'assets',
        'css',
        'images',
        'js',
      ];
    }
    if ($flags & self::IGNORE_CORE) {
      $ignore_directories += [
        'config',
        'lib',
        'src',
      ];
    }
    if ($flags & self::IGNORE_DOCS) {
      $ignore_directories += [
        'docs',
        'documentation',
      ];
    }
    if ($flags & self::IGNORE_DEV) {
      $ignore_directories += [
        'bower_components',
        'grunt',
        'node_modules',
        'starterkits',
      ];
    }
    if ($flags & self::IGNORE_TEMPLATES) {
      $ignore_directories += [
        'templates',
        'theme',
      ];
    }
    if (!empty($ignore_directories)) {
      $options['nomask'] = '/^' . implode('|', $ignore_directories) . '$/';
    }
  }

  // Retrieve cache.
  $files = $this
    ->getCache('files');

  // Generate a unique hash for all parameters passed as a change in any of
  // them could potentially return different results.
  $hash = Crypt::generateHash($mask, $path, $options);
  if (!$files
    ->has($hash)) {
    $files
      ->set($hash, file_scan_directory($path, $mask, $options));
  }
  return $files
    ->get($hash, []);
}