-
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathPublicationsExtension.php
83 lines (72 loc) · 2.91 KB
/
PublicationsExtension.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
<?php
declare(strict_types=1);
namespace Hyde\Publications;
use Hyde\Foundation\Concerns\HydeExtension;
use Hyde\Foundation\PageCollection;
use Hyde\Framework\Actions\AnonymousViewCompiler;
use Hyde\Pages\VirtualPage;
use Hyde\Publications\Models\PublicationListPage;
use Hyde\Publications\Models\PublicationPage;
use Hyde\Publications\Models\PublicationType;
use function range;
/**
* @see \Hyde\Publications\Testing\Feature\PublicationsExtensionTest
*/
class PublicationsExtension extends HydeExtension
{
/** @return array<class-string<\Hyde\Pages\Concerns\HydePage>> */
public static function getPageClasses(): array
{
return [
PublicationPage::class,
PublicationListPage::class,
];
}
public static function discoverPages(PageCollection $collection): void
{
static::discoverPublicationPages($collection);
}
protected static function discoverPublicationPages(PageCollection $instance): void
{
PublicationService::getPublicationTypes()->each(function (PublicationType $type) use ($instance): void {
static::discoverPublicationPagesForType($type, $instance);
static::generatePublicationListingPageForType($type, $instance);
});
}
protected static function discoverPublicationPagesForType(PublicationType $type, PageCollection $instance): void
{
PublicationService::getPublicationsForPubType($type)->each(function (PublicationPage $publication) use (
$instance
): void {
$instance->addPage($publication);
});
}
protected static function generatePublicationListingPageForType(PublicationType $type, PageCollection $instance): void
{
$page = new PublicationListPage($type);
$instance->put($page->getSourcePath(), $page);
if ($type->usesPagination()) {
static::generatePublicationPaginatedListingPagesForType($type, $instance);
}
}
/**
* @deprecated This method will be removed before merging into master.
*
* @internal This method will be removed before merging into master.
*/
protected static function generatePublicationPaginatedListingPagesForType(PublicationType $type,
PageCollection $instance
): void {
$paginator = $type->getPaginator();
foreach (range(1, $paginator->totalPages()) as $page) {
$paginator->setCurrentPage($page);
$listingPage = new VirtualPage("{$type->getDirectory()}/page-$page", [
'publicationType' => $type, 'paginatorPage' => $page,
'title' => $type->name.' - Page '.$page,
], compiler: function (VirtualPage $page) use ($type): string {
return AnonymousViewCompiler::call("{$type->getDirectory()}/$type->listTemplate", $page->matter->toArray());
});
$instance->put($listingPage->getSourcePath(), $listingPage);
}
}
}