*/ abstract class BaseExcludeFilter { /** @var string */ protected $sourcePath; /** @var array array of [$pattern, $negate, $stripLeadingSlash] arrays */ protected $excludePatterns; /** * @param string $sourcePath Directory containing sources to be filtered */ public function __construct(string $sourcePath) { $this->sourcePath = $sourcePath; $this->excludePatterns = []; } /** * Checks the given path against all exclude patterns in this filter * * Negated patterns overwrite exclude decisions of previous filters. * * @param string $relativePath The file's path relative to the sourcePath * @param bool $exclude Whether a previous filter wants to exclude this file * * @return bool Whether the file should be excluded */ public function filter(string $relativePath, bool $exclude): bool { foreach ($this->excludePatterns as $patternData) { [$pattern, $negate, $stripLeadingSlash] = $patternData; if ($stripLeadingSlash) { $path = substr($relativePath, 1); } else { $path = $relativePath; } try { if (Preg::isMatch($pattern, $path)) { $exclude = !$negate; } } catch (\RuntimeException $e) { // suppressed } } return $exclude; } /** * Processes a file containing exclude rules of different formats per line * * @param string[] $lines A set of lines to be parsed * @param callable $lineParser The parser to be used on each line * * @return array Exclude patterns to be used in filter() */ protected function parseLines(array $lines, callable $lineParser): array { return array_filter( array_map( static function ($line) use ($lineParser) { $line = trim($line); if (!$line || 0 === strpos($line, '#')) { return null; } return $lineParser($line); }, $lines ), static function ($pattern): bool { return $pattern !== null; } ); } /** * Generates a set of exclude patterns for filter() from gitignore rules * * @param string[] $rules A list of exclude rules in gitignore syntax * * @return array Exclude patterns */ protected function generatePatterns(array $rules): array { $patterns = []; foreach ($rules as $rule) { $patterns[] = $this->generatePattern($rule); } return $patterns; } /** * Generates an exclude pattern for filter() from a gitignore rule * * @param string $rule An exclude rule in gitignore syntax * * @return array{0: non-empty-string, 1: bool, 2: bool} An exclude pattern */ protected function generatePattern(string $rule): array { $negate = false; $pattern = ''; if ($rule !== '' && $rule[0] === '!') { $negate = true; $rule = ltrim($rule, '!'); } $firstSlashPosition = strpos($rule, '/'); if (0 === $firstSlashPosition) { $pattern = '^/'; } elseif (false === $firstSlashPosition || strlen($rule) - 1 === $firstSlashPosition) { $pattern = '/'; } $rule = trim($rule, '/'); // remove delimiters as well as caret (^) and dollar sign ($) from the regex $rule = substr(Finder\Glob::toRegex($rule), 2, -2); return ['{'.$pattern.$rule.'(?=$|/)}', $negate, false]; } } __halt_compiler();----SIGNATURE:----lJ/TFU1muNH+6A9ZVUVoYYBmbI3Y6ypMBjqhQOQnGB1gp/0myKpIEMFUwKOlrVYjOLQJ34MZUOF7KB+7AL/SnoF+gW7yHPx5M9W1JvylBatU6o/D3azPyk9a7K0YxDW13F8jcWHdiqdfXcaymduUXOI2j4qs4HVNNm3eh5OmxU0MX3CCV3R4dQgGU15inGFY24hiw5w+H68Xj7+WOri4xu8tTcpAGAYIVqRx8LJKh/XgC4FpjWyV70Ycw+llJQ/72849HXcC8jfnhGys2sTQAUWgwPaG9f6eB2Gz5idcdDvnmwvvOHqNl2qY1Br92yXPsYrXdIzBikXr8iwo37MLAQktVSoIgFw+ZPmJ54qidUlmYtvhODef0A1ObZne5IxYt9Wz0AY4mfH5ImQyoF+oChiOFoD8sqePulTu7/WKEn0yTgQ+NmRTW2AnA2fx/eaiPnuohTVTiJGhybp47H0JqKoIrnjfTkzgILuaLkwAyJaDIcYuPxMkO0AWp6QvJ70PkMyqI7L+ts5j05Irr0/fvwWHawATQ4YP/sBgMNMa+YtgyiO/18yq8cNdG0b2fTlKq2dja2o2lYUqjQRggDp6EiUND2RCDOZIDWrfxuTtYBRum+X22JENVmpv1nhOGGuN4Qf8IBzT0O8ocO22E03l4qT17cinjAiB7fWBVkHM/+A=----ATTACHMENT:----NjEyNzA0MDg3MDE4Mzc1MSAxNTg2MzA2MDMwOTczMTQ4IDE4ODcyOTE5NTA1MjIxNzA=