RecursiveDirectoryFilterIterator.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <?php
  2. /**
  3. * @package Grav\Common\Filesystem
  4. *
  5. * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Common\Filesystem;
  9. use RecursiveFilterIterator;
  10. use RecursiveIterator;
  11. use SplFileInfo;
  12. use function in_array;
  13. /**
  14. * Class RecursiveDirectoryFilterIterator
  15. * @package Grav\Common\Filesystem
  16. */
  17. class RecursiveDirectoryFilterIterator extends RecursiveFilterIterator
  18. {
  19. /** @var string */
  20. protected static $root;
  21. /** @var array */
  22. protected static $ignore_folders;
  23. /** @var array */
  24. protected static $ignore_files;
  25. /**
  26. * Create a RecursiveFilterIterator from a RecursiveIterator
  27. *
  28. * @param RecursiveIterator $iterator
  29. * @param string $root
  30. * @param array $ignore_folders
  31. * @param array $ignore_files
  32. */
  33. public function __construct(RecursiveIterator $iterator, $root, $ignore_folders, $ignore_files)
  34. {
  35. parent::__construct($iterator);
  36. $this::$root = $root;
  37. $this::$ignore_folders = $ignore_folders;
  38. $this::$ignore_files = $ignore_files;
  39. }
  40. /**
  41. * Check whether the current element of the iterator is acceptable
  42. *
  43. * @return bool true if the current element is acceptable, otherwise false.
  44. */
  45. public function accept()
  46. {
  47. /** @var SplFileInfo $file */
  48. $file = $this->current();
  49. $filename = $file->getFilename();
  50. $relative_filename = str_replace($this::$root . '/', '', $file->getPathname());
  51. if ($file->isDir()) {
  52. if (in_array($relative_filename, $this::$ignore_folders, true)) {
  53. return false;
  54. }
  55. if (!in_array($filename, $this::$ignore_files, true)) {
  56. return true;
  57. }
  58. } elseif ($file->isFile() && !in_array($filename, $this::$ignore_files, true)) {
  59. return true;
  60. }
  61. return false;
  62. }
  63. /**
  64. * @return RecursiveDirectoryFilterIterator|RecursiveFilterIterator
  65. */
  66. public function getChildren()
  67. {
  68. /** @var RecursiveDirectoryFilterIterator $iterator */
  69. $iterator = $this->getInnerIterator();
  70. return new self($iterator->getChildren(), $this::$root, $this::$ignore_folders, $this::$ignore_files);
  71. }
  72. }