RecursiveDirectoryFilterIterator.php 2.0 KB

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