72 lines
2.2 KiB
PHP
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;
|
||
|
}
|
||
|
}
|