generated from ergebnis/php-package-template
-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
FrontMatterLoader.php
80 lines (64 loc) · 1.92 KB
/
FrontMatterLoader.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
<?php
declare(strict_types=1);
/**
* Copyright (c) 2023-2024 Andreas Möller
*
* For the full copyright and license information, please view
* the LICENSE.md file that was distributed with this source code.
*
* @see https://github.com/ergebnis/twig-front-matter
*/
namespace Ergebnis\Twig\FrontMatter;
use Ergebnis\FrontMatter;
use Twig\Loader;
use Twig\Source;
final class FrontMatterLoader implements Loader\LoaderInterface
{
public function __construct(
private readonly Loader\LoaderInterface $loader,
private readonly FrontMatter\Parser $frontMatterParser,
private readonly Converter\FrontMatterConverter $frontMatterConverter,
) {
}
public function exists(string $name): bool
{
return $this->loader->exists($name);
}
public function isFresh(
string $name,
int $time,
): bool {
return $this->loader->isFresh(
$name,
$time,
);
}
public function getCacheKey(string $name): string
{
return $this->loader->getCacheKey($name);
}
public function getSourceContext(string $name): Source
{
$source = $this->loader->getSourceContext($name);
$parsed = $this->frontMatterParser->parse(FrontMatter\Content::fromString($source->getCode()));
$bodyMatter = $parsed->bodyMatter()->content()->toString();
if ($source->getCode() === $bodyMatter) {
return $source;
}
$frontMatterConvertedToTwigAssignments = $this->frontMatterConverter->convert($parsed->frontMatter()->data()->toArray());
$lines = \substr_count(
$parsed->frontMatter()->content()->toString(),
"\n",
);
$content = <<<TWIG
{$frontMatterConvertedToTwigAssignments}
{% line {$lines} %}
{$bodyMatter}
TWIG;
return new Source(
$content,
$source->getName(),
$source->getPath(),
);
}
}