File.php
3.06 KB
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?php
declare(strict_types=1);
namespace DrupalCodeGenerator\Asset;
use DrupalCodeGenerator\Asset\Resolver\AppendResolver;
use DrupalCodeGenerator\Asset\Resolver\PrependResolver;
use DrupalCodeGenerator\Asset\Resolver\ResolverDefinition;
use DrupalCodeGenerator\Helper\Renderer\RendererInterface;
/**
* A data structure to represent a file being generated.
*/
final class File extends Asset implements RenderableInterface {
/**
* Asset content.
*/
private string $content = '';
/**
* Template to render main content.
*/
private ?string $template = NULL;
/**
* The template string to render.
*/
private ?string $inlineTemplate = NULL;
/**
* {@inheritdoc}
*/
public function __construct(string $path) {
parent::__construct($path);
$this->mode(0644);
}
/**
* Named constructor.
*/
public static function create(string $path): self {
return new self($path);
}
/**
* Returns the asset content.
*/
public function getContent(): string {
return $this->content;
}
/**
* Sets the asset content.
*/
public function content(string $content): self {
$this->content = $content;
return $this;
}
/**
* Sets the asset template.
*
* Templates with 'twig' extension are processed with Twig template engine.
*/
public function template(string $template): self {
if ($this->inlineTemplate) {
throw new \LogicException('A file cannot have both inline and regular templates.');
}
$this->template = $template;
return $this;
}
/**
* Returns the asset inline template.
*/
public function inlineTemplate(string $inline_template): self {
if ($this->template) {
throw new \LogicException('A file cannot have both inline and regular templates.');
}
$this->inlineTemplate = $inline_template;
return $this;
}
/**
* Sets the "prepend" resolver.
*/
public function prependIfExists(): self {
$this->resolverDefinition = new ResolverDefinition(PrependResolver::class);
return $this;
}
/**
* Sets the "append" resolver.
*
* @psalm-param int<0, max> $header_size
*/
public function appendIfExists(int $header_size = 0): self {
$this->resolverDefinition = new ResolverDefinition(AppendResolver::class, $header_size);
return $this;
}
/**
* {@inheritdoc}
*/
public function render(RendererInterface $renderer): void {
if ($this->inlineTemplate) {
$content = $renderer->renderInline($this->inlineTemplate, $this->getVars());
$this->content($content);
}
elseif ($this->template) {
$template = $this->replaceTokens($this->template);
$content = $renderer->render($template, $this->getVars());
$this->content($content);
}
// It's OK that the file has no templates as consumers may set rendered
// content directly through `content()` method.
}
/**
* Checks if the asset is a PHP script.
*/
public function isPhp(): bool {
return \in_array(
\pathinfo($this->getPath(), \PATHINFO_EXTENSION),
['php', 'module', 'install', 'inc', 'theme'],
);
}
}