gl-website-deployer/vendor/doctrine/rst-parser/lib/Toc/GlobSearcher.php
2024-11-19 08:02:04 +01:00

72 lines
2.2 KiB
PHP

<?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;
}
}