Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
100.00% |
29 / 29 |
|
100.00% |
9 / 9 |
CRAP | |
100.00% |
1 / 1 |
BlogPostDataFactory | |
100.00% |
29 / 29 |
|
100.00% |
9 / 9 |
12 | |
100.00% |
1 / 1 |
__construct | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
1 | |||
toArray | |
100.00% |
7 / 7 |
|
100.00% |
1 / 1 |
1 | |||
makeDescription | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
makeCategory | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
makeDate | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
2 | |||
makeAuthor | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
2 | |||
makeImage | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
2 | |||
makeDescriptionFromMarkdownBody | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getMatter | |
100.00% |
2 / 2 |
|
100.00% |
1 / 1 |
1 |
1 | <?php |
2 | |
3 | declare(strict_types=1); |
4 | |
5 | namespace Hyde\Framework\Factories; |
6 | |
7 | use Illuminate\Support\Str; |
8 | use Hyde\Framework\Factories\Concerns\CoreDataObject; |
9 | use Hyde\Framework\Actions\ConvertsMarkdownToPlainText; |
10 | use Hyde\Framework\Features\Blogging\Models\FeaturedImage; |
11 | use Hyde\Framework\Features\Blogging\Models\PostAuthor; |
12 | use Hyde\Markdown\Contracts\FrontMatter\BlogPostSchema; |
13 | use Hyde\Markdown\Models\FrontMatter; |
14 | use Hyde\Markdown\Models\Markdown; |
15 | use Hyde\Support\Models\DateString; |
16 | |
17 | /** |
18 | * Streamlines the data construction specific to a blog post. |
19 | * |
20 | * Simply pass along the data the class needs to run, then access the data using the toArray() method. |
21 | * |
22 | * All data can be set using front matter in the page source file. If no front matter is set for the given key, |
23 | * this class will attempt to generate and discover the values based on the page and the project's configuration. |
24 | */ |
25 | class BlogPostDataFactory extends Concerns\PageDataFactory implements BlogPostSchema |
26 | { |
27 | /** |
28 | * The front matter properties supported by this factory. |
29 | * |
30 | * Note that this class does not add the title, as that is already added to all pages. |
31 | */ |
32 | final public const SCHEMA = BlogPostSchema::BLOG_POST_SCHEMA; |
33 | |
34 | private readonly FrontMatter $matter; |
35 | private readonly Markdown $markdown; |
36 | |
37 | protected readonly ?string $description; |
38 | protected readonly ?string $category; |
39 | protected readonly ?DateString $date; |
40 | protected readonly ?PostAuthor $author; |
41 | protected readonly ?FeaturedImage $image; |
42 | |
43 | private readonly string $filePath; |
44 | |
45 | public function __construct(CoreDataObject $pageData) |
46 | { |
47 | $this->matter = $pageData->matter; |
48 | $this->markdown = $pageData->markdown; |
49 | $this->filePath = $pageData->sourcePath; |
50 | |
51 | $this->description = $this->makeDescription(); |
52 | $this->category = $this->makeCategory(); |
53 | $this->date = $this->makeDate(); |
54 | $this->author = $this->makeAuthor(); |
55 | $this->image = $this->makeImage(); |
56 | } |
57 | |
58 | /** |
59 | * @return array{description: string|null, category: string|null, date: \Hyde\Support\Models\DateString|null, author: \Hyde\Framework\Features\Blogging\Models\PostAuthor|null, image: \Hyde\Framework\Features\Blogging\Models\FeaturedImage|null} |
60 | */ |
61 | public function toArray(): array |
62 | { |
63 | return [ |
64 | 'description' => $this->description, |
65 | 'category' => $this->category, |
66 | 'date' => $this->date, |
67 | 'author' => $this->author, |
68 | 'image' => $this->image, |
69 | ]; |
70 | } |
71 | |
72 | protected function makeDescription(): string |
73 | { |
74 | return $this->getMatter('description') ?? $this->makeDescriptionFromMarkdownBody(); |
75 | } |
76 | |
77 | protected function makeCategory(): ?string |
78 | { |
79 | return $this->getMatter('category'); |
80 | } |
81 | |
82 | protected function makeDate(): ?DateString |
83 | { |
84 | if ($this->getMatter('date')) { |
85 | return new DateString($this->getMatter('date')); |
86 | } |
87 | |
88 | return null; |
89 | } |
90 | |
91 | protected function makeAuthor(): ?PostAuthor |
92 | { |
93 | if ($this->getMatter('author')) { |
94 | return PostAuthor::getOrCreate($this->getMatter('author')); |
95 | } |
96 | |
97 | return null; |
98 | } |
99 | |
100 | protected function makeImage(): ?FeaturedImage |
101 | { |
102 | if ($this->getMatter('image')) { |
103 | return FeaturedImageFactory::make($this->matter, $this->filePath); |
104 | } |
105 | |
106 | return null; |
107 | } |
108 | |
109 | private function makeDescriptionFromMarkdownBody(): string |
110 | { |
111 | return Str::limit((new ConvertsMarkdownToPlainText($this->markdown->body()))->execute(), 125); |
112 | } |
113 | |
114 | protected function getMatter(string $key): string|null|array |
115 | { |
116 | /** @var string|null|array $value */ |
117 | $value = $this->matter->get($key); |
118 | |
119 | return $value; |
120 | } |
121 | } |