<?php declare(strict_types=1); namespace Doctrine\RST\Toc; use Doctrine\RST\Environment; use Symfony\Component\Finder\Finder; use function array_merge; use function realpath; use function rtrim; use function str_replace; use function strrpos; use function substr; class GlobSearcher { /** * Returns array of absolute URL strings. * * For example, if you were glob'ing from inside a file called * "subdir/file.rst", it would return paths like "/subdir/other-file" * and "/subdir/more-dir/file2". * * @return string[] */ public function globSearch(Environment $environment, string $globPattern): array { $currentFilePath = (string) realpath(rtrim($environment->absoluteRelativePath(''), '/')); $rootDocPath = rtrim(str_replace($environment->getDirName(), '', $currentFilePath), '/'); if ($globPattern[0] === '/') { $globPatternPath = $rootDocPath . $globPattern; } else { $globPatternPath = $currentFilePath . '/' . $globPattern; } $pos = strrpos($globPatternPath, '/'); $globPatternFile = $pos === false ? $globPatternPath : substr($globPatternPath, $pos + 1); $globPatternPath = $pos === false ? '' : substr($globPatternPath, 0, $pos); $allFiles = []; $finder = new Finder(); $finder->in($globPatternPath) ->name($globPatternFile . '.rst') ->files(); foreach ($finder as $file) { if ($file->isDir()) { // remove the root directory so it is a relative path from the root $relativePath = str_replace($rootDocPath, '', (string) $file->getRealPath()); // recursively search in this directory $dirFiles = $this->globSearch($environment, $relativePath . '/*'); $allFiles = array_merge($allFiles, $dirFiles); } else { // Trim the root path and the .rst extension. This is what the // RST parser requires to add a dependency. $file = str_replace([$rootDocPath, '.rst'], '', (string) $file->getRealPath()); $allFiles[] = $file; } } return $allFiles; } }