-
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathFileCollection.php
95 lines (78 loc) · 2.75 KB
/
FileCollection.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php
declare(strict_types=1);
namespace Hyde\Foundation;
use Hyde\Facades\Features;
use Hyde\Foundation\Concerns\BaseFoundationCollection;
use Hyde\Framework\Services\DiscoveryService;
use Hyde\Pages\BladePage;
use Hyde\Pages\Concerns\HydePage;
use Hyde\Pages\DocumentationPage;
use Hyde\Pages\HtmlPage;
use Hyde\Pages\MarkdownPage;
use Hyde\Pages\MarkdownPost;
use Hyde\Support\Models\File;
/**
* @see \Hyde\Framework\Foundation\FileCollection
*/
final class FileCollection extends BaseFoundationCollection
{
public function getSourceFiles(?string $pageClass = null): self
{
return ! $pageClass ? $this->getAllSourceFiles() : $this->getSourceFilesFor($pageClass);
}
public function getAllSourceFiles(): self
{
return $this->filter(function (File $file) {
return $file->belongsTo !== null;
});
}
public function getSourceFilesFor(string $pageClass): self
{
return $this->filter(function (File $file) use ($pageClass): bool {
return $file->belongsTo() === $pageClass;
});
}
public function getMediaFiles(): self
{
return $this->filter(function (File $file): bool {
return str_starts_with((string) $file, '_media');
});
}
protected function runDiscovery(): self
{
if (Features::hasHtmlPages()) {
$this->discoverFilesFor(HtmlPage::class);
}
if (Features::hasBladePages()) {
$this->discoverFilesFor(BladePage::class);
}
if (Features::hasMarkdownPages()) {
$this->discoverFilesFor(MarkdownPage::class);
}
if (Features::hasMarkdownPosts()) {
$this->discoverFilesFor(MarkdownPost::class);
}
if (Features::hasDocumentationPages()) {
$this->discoverFilesFor(DocumentationPage::class);
}
// TODO: Add hook to support custom page types
$this->discoverMediaAssetFiles();
return $this;
}
/** @param class-string<HydePage> $pageClass */
protected function discoverFilesFor(string $pageClass): void
{
// Scan the source directory, and directories therein, for files that match the model's file extension.
foreach (glob($this->kernel->path($pageClass::sourcePath('{*,**/*}')), GLOB_BRACE) as $filepath) {
if (! str_starts_with(basename((string) $filepath), '_')) {
$this->put($this->kernel->pathToRelative($filepath), File::make($filepath)->belongsTo($pageClass));
}
}
}
protected function discoverMediaAssetFiles(): void
{
foreach (DiscoveryService::getMediaAssetFiles() as $filepath) {
$this->put($this->kernel->pathToRelative($filepath), File::make($filepath));
}
}
}