Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace DrupalCodeGenerator\Command;
|
Chris@0
|
4
|
Chris@0
|
5 use DrupalCodeGenerator\ApplicationFactory;
|
Chris@0
|
6 use DrupalCodeGenerator\Asset;
|
Chris@0
|
7 use DrupalCodeGenerator\Utils;
|
Chris@0
|
8 use Symfony\Component\Console\Command\Command;
|
Chris@0
|
9 use Symfony\Component\Console\Input\InputInterface;
|
Chris@0
|
10 use Symfony\Component\Console\Input\InputOption;
|
Chris@0
|
11 use Symfony\Component\Console\Output\OutputInterface;
|
Chris@0
|
12
|
Chris@0
|
13 /**
|
Chris@0
|
14 * Base class for all generators.
|
Chris@0
|
15 */
|
Chris@0
|
16 abstract class BaseGenerator extends Command implements GeneratorInterface {
|
Chris@0
|
17
|
Chris@0
|
18 /**
|
Chris@0
|
19 * The command name.
|
Chris@0
|
20 *
|
Chris@0
|
21 * @var string
|
Chris@0
|
22 */
|
Chris@0
|
23 protected $name;
|
Chris@0
|
24
|
Chris@0
|
25 /**
|
Chris@0
|
26 * The command description.
|
Chris@0
|
27 *
|
Chris@0
|
28 * @var string
|
Chris@0
|
29 */
|
Chris@0
|
30 protected $description;
|
Chris@0
|
31
|
Chris@0
|
32 /**
|
Chris@0
|
33 * The command alias.
|
Chris@0
|
34 *
|
Chris@0
|
35 * @var string
|
Chris@0
|
36 */
|
Chris@0
|
37 protected $alias;
|
Chris@0
|
38
|
Chris@0
|
39 /**
|
Chris@0
|
40 * Command label.
|
Chris@0
|
41 *
|
Chris@0
|
42 * @var string
|
Chris@0
|
43 */
|
Chris@0
|
44 protected $label;
|
Chris@0
|
45
|
Chris@0
|
46 /**
|
Chris@0
|
47 * A path where templates are stored.
|
Chris@0
|
48 *
|
Chris@0
|
49 * @var string
|
Chris@0
|
50 */
|
Chris@0
|
51 protected $templatePath;
|
Chris@0
|
52
|
Chris@0
|
53 /**
|
Chris@0
|
54 * The working directory.
|
Chris@0
|
55 *
|
Chris@0
|
56 * @var string
|
Chris@0
|
57 */
|
Chris@0
|
58 protected $directory;
|
Chris@0
|
59
|
Chris@0
|
60 /**
|
Chris@0
|
61 * The destination.
|
Chris@0
|
62 *
|
Chris@0
|
63 * @var mixed
|
Chris@0
|
64 */
|
Chris@0
|
65 protected $destination = 'modules/%';
|
Chris@0
|
66
|
Chris@0
|
67 /**
|
Chris@0
|
68 * Files to create.
|
Chris@0
|
69 *
|
Chris@0
|
70 * The key of the each item in the array is the path to the file and
|
Chris@0
|
71 * the value is the generated content of it.
|
Chris@0
|
72 *
|
Chris@0
|
73 * @var array
|
Chris@0
|
74 *
|
Chris@0
|
75 * @deprecated Use self::$assets.
|
Chris@0
|
76 */
|
Chris@0
|
77 protected $files = [];
|
Chris@0
|
78
|
Chris@0
|
79 /**
|
Chris@0
|
80 * Assets to create.
|
Chris@0
|
81 *
|
Chris@0
|
82 * @var \DrupalCodeGenerator\Asset[]
|
Chris@0
|
83 */
|
Chris@0
|
84 protected $assets = [];
|
Chris@0
|
85
|
Chris@0
|
86 /**
|
Chris@0
|
87 * Twig template variables.
|
Chris@0
|
88 *
|
Chris@0
|
89 * @var array
|
Chris@0
|
90 */
|
Chris@0
|
91 protected $vars = [];
|
Chris@0
|
92
|
Chris@0
|
93 /**
|
Chris@0
|
94 * {@inheritdoc}
|
Chris@0
|
95 */
|
Chris@0
|
96 protected function configure() {
|
Chris@0
|
97 $this
|
Chris@0
|
98 ->setName($this->name)
|
Chris@0
|
99 ->setDescription($this->description)
|
Chris@0
|
100 ->addOption(
|
Chris@0
|
101 'directory',
|
Chris@0
|
102 '-d',
|
Chris@0
|
103 InputOption::VALUE_OPTIONAL,
|
Chris@0
|
104 'Working directory'
|
Chris@0
|
105 )
|
Chris@0
|
106 ->addOption(
|
Chris@0
|
107 'answers',
|
Chris@0
|
108 '-a',
|
Chris@0
|
109 InputOption::VALUE_OPTIONAL,
|
Chris@0
|
110 'Default JSON formatted answers'
|
Chris@0
|
111 );
|
Chris@0
|
112
|
Chris@0
|
113 if ($this->alias) {
|
Chris@0
|
114 $this->setAliases([$this->alias]);
|
Chris@0
|
115 }
|
Chris@0
|
116
|
Chris@0
|
117 if (!$this->templatePath) {
|
Chris@0
|
118 $this->templatePath = ApplicationFactory::getRoot() . '/templates';
|
Chris@0
|
119 }
|
Chris@0
|
120 }
|
Chris@0
|
121
|
Chris@0
|
122 /**
|
Chris@0
|
123 * {@inheritdoc}
|
Chris@0
|
124 */
|
Chris@0
|
125 protected function initialize(InputInterface $input, OutputInterface $output) {
|
Chris@0
|
126 $this->getHelperSet()->setCommand($this);
|
Chris@0
|
127 $this->getHelper('dcg_renderer')->addPath($this->templatePath);
|
Chris@0
|
128
|
Chris@0
|
129 $directory = $input->getOption('directory') ?: getcwd();
|
Chris@0
|
130 // No need to look up for extension root when generating an extension.
|
Chris@0
|
131 $extension_destinations = ['modules', 'profiles', 'themes'];
|
Chris@0
|
132 $is_extension = in_array($this->destination, $extension_destinations);
|
Chris@0
|
133 $this->directory = $is_extension
|
Chris@0
|
134 ? $directory : (Utils::getExtensionRoot($directory) ?: $directory);
|
Chris@0
|
135
|
Chris@0
|
136 // Display welcome message.
|
Chris@0
|
137 $header = sprintf(
|
Chris@0
|
138 "\n Welcome to %s generator!",
|
Chris@0
|
139 $this->getName()
|
Chris@0
|
140 );
|
Chris@0
|
141 $output->writeln($header);
|
Chris@0
|
142 $header_length = strlen(trim(strip_tags($header)));
|
Chris@0
|
143 $output->writeln('<fg=cyan;options=bold>–' . str_repeat('–', $header_length) . '–</>');
|
Chris@0
|
144 }
|
Chris@0
|
145
|
Chris@0
|
146 /**
|
Chris@0
|
147 * {@inheritdoc}
|
Chris@0
|
148 */
|
Chris@0
|
149 protected function execute(InputInterface $input, OutputInterface $output) {
|
Chris@0
|
150
|
Chris@0
|
151 // Render all assets.
|
Chris@0
|
152 $renderer = $this->getHelper('dcg_renderer');
|
Chris@0
|
153 foreach ($this->getAssets() as $asset) {
|
Chris@0
|
154 // Supply the asset with all collected variables if it has no local ones.
|
Chris@0
|
155 if (!$asset->getVars()) {
|
Chris@0
|
156 $asset->vars($this->vars);
|
Chris@0
|
157 }
|
Chris@0
|
158 $asset->render($renderer);
|
Chris@0
|
159 }
|
Chris@0
|
160
|
Chris@0
|
161 $dumped_files = $this->getHelper('dcg_dumper')->dump($input, $output);
|
Chris@0
|
162 $this->getHelper('dcg_output_handler')->printSummary($output, $dumped_files);
|
Chris@0
|
163 return 0;
|
Chris@0
|
164 }
|
Chris@0
|
165
|
Chris@0
|
166 /**
|
Chris@0
|
167 * {@inheritdoc}
|
Chris@0
|
168 */
|
Chris@0
|
169 public function getLabel() {
|
Chris@0
|
170 return $this->label;
|
Chris@0
|
171 }
|
Chris@0
|
172
|
Chris@0
|
173 /**
|
Chris@0
|
174 * Returns list of rendered files.
|
Chris@0
|
175 *
|
Chris@0
|
176 * @return array
|
Chris@0
|
177 * An associative array where each key is path to a file and value is
|
Chris@0
|
178 * rendered content.
|
Chris@0
|
179 *
|
Chris@0
|
180 * @deprecated.
|
Chris@0
|
181 */
|
Chris@0
|
182 public function getFiles() {
|
Chris@0
|
183 return $this->files;
|
Chris@0
|
184 }
|
Chris@0
|
185
|
Chris@0
|
186 /**
|
Chris@0
|
187 * {@inheritdoc}
|
Chris@0
|
188 */
|
Chris@0
|
189 public function getAssets() {
|
Chris@0
|
190 if ($this->files) {
|
Chris@0
|
191 // Convert files into assets for legacy commands.
|
Chris@0
|
192 $assets = [];
|
Chris@0
|
193 foreach ($this->getFiles() as $path => $file) {
|
Chris@0
|
194 $asset = new Asset();
|
Chris@0
|
195 $asset->path($path);
|
Chris@0
|
196 if (!is_array($file)) {
|
Chris@0
|
197 $file = ['content' => $file];
|
Chris@0
|
198 }
|
Chris@0
|
199 if (isset($file['content'])) {
|
Chris@0
|
200 $asset->content($file['content']);
|
Chris@0
|
201 }
|
Chris@0
|
202 else {
|
Chris@0
|
203 $asset->type('directory');
|
Chris@0
|
204 }
|
Chris@0
|
205 if (isset($file['action'])) {
|
Chris@0
|
206 $asset->action($file['action']);
|
Chris@0
|
207 }
|
Chris@0
|
208 if (isset($file['header_size'])) {
|
Chris@0
|
209 $asset->headerSize($file['header_size']);
|
Chris@0
|
210 }
|
Chris@0
|
211 if (isset($file['mode'])) {
|
Chris@0
|
212 $asset->mode($file['mode']);
|
Chris@0
|
213 }
|
Chris@0
|
214 $assets[] = $asset;
|
Chris@0
|
215 }
|
Chris@0
|
216 return array_merge($assets, $this->assets);
|
Chris@0
|
217 }
|
Chris@0
|
218
|
Chris@0
|
219 return $this->assets;
|
Chris@0
|
220 }
|
Chris@0
|
221
|
Chris@0
|
222 /**
|
Chris@0
|
223 * {@inheritdoc}
|
Chris@0
|
224 */
|
Chris@0
|
225 public function setDirectory($directory) {
|
Chris@0
|
226 $this->directory = $directory;
|
Chris@0
|
227 }
|
Chris@0
|
228
|
Chris@0
|
229 /**
|
Chris@0
|
230 * {@inheritdoc}
|
Chris@0
|
231 */
|
Chris@0
|
232 public function getDirectory() {
|
Chris@0
|
233 return $this->directory;
|
Chris@0
|
234 }
|
Chris@0
|
235
|
Chris@0
|
236 /**
|
Chris@0
|
237 * {@inheritdoc}
|
Chris@0
|
238 */
|
Chris@0
|
239 public function setDestination($destination) {
|
Chris@0
|
240 $this->destination = $destination;
|
Chris@0
|
241 }
|
Chris@0
|
242
|
Chris@0
|
243 /**
|
Chris@0
|
244 * {@inheritdoc}
|
Chris@0
|
245 */
|
Chris@0
|
246 public function getDestination() {
|
Chris@0
|
247 return $this->destination;
|
Chris@0
|
248 }
|
Chris@0
|
249
|
Chris@0
|
250 /**
|
Chris@0
|
251 * Renders a template.
|
Chris@0
|
252 *
|
Chris@0
|
253 * @param string $template
|
Chris@0
|
254 * Twig template.
|
Chris@0
|
255 * @param array $vars
|
Chris@0
|
256 * Template variables.
|
Chris@0
|
257 *
|
Chris@0
|
258 * @return string
|
Chris@0
|
259 * A string representing the rendered output.
|
Chris@0
|
260 */
|
Chris@0
|
261 protected function render($template, array $vars) {
|
Chris@0
|
262 return $this->getHelper('dcg_renderer')->render($template, $vars);
|
Chris@0
|
263 }
|
Chris@0
|
264
|
Chris@0
|
265 /**
|
Chris@0
|
266 * Asks the user for template variables.
|
Chris@0
|
267 *
|
Chris@0
|
268 * @param \Symfony\Component\Console\Input\InputInterface $input
|
Chris@0
|
269 * Input instance.
|
Chris@0
|
270 * @param \Symfony\Component\Console\Output\OutputInterface $output
|
Chris@0
|
271 * Output instance.
|
Chris@0
|
272 * @param array $questions
|
Chris@0
|
273 * List of questions that the user should answer.
|
Chris@0
|
274 * @param array $vars
|
Chris@0
|
275 * Array of predefined template variables.
|
Chris@0
|
276 *
|
Chris@0
|
277 * @return array
|
Chris@0
|
278 * Template variables.
|
Chris@0
|
279 *
|
Chris@0
|
280 * @see \DrupalCodeGenerator\InputHandler
|
Chris@0
|
281 */
|
Chris@0
|
282 protected function &collectVars(InputInterface $input, OutputInterface $output, array $questions, array $vars = []) {
|
Chris@0
|
283 $this->vars += $this->getHelper('dcg_input_handler')->collectVars($input, $output, $questions, $vars);
|
Chris@0
|
284 return $this->vars;
|
Chris@0
|
285 }
|
Chris@0
|
286
|
Chris@0
|
287 /**
|
Chris@0
|
288 * Creates an asset.
|
Chris@0
|
289 *
|
Chris@0
|
290 * @param string $type
|
Chris@0
|
291 * Asset type.
|
Chris@0
|
292 *
|
Chris@0
|
293 * @return \DrupalCodeGenerator\Asset
|
Chris@0
|
294 * The asset.
|
Chris@0
|
295 */
|
Chris@0
|
296 protected function addAsset($type) {
|
Chris@0
|
297 $asset = (new Asset())->type($type);
|
Chris@0
|
298 $this->assets[] = $asset;
|
Chris@0
|
299 return $asset;
|
Chris@0
|
300 }
|
Chris@0
|
301
|
Chris@0
|
302 /**
|
Chris@0
|
303 * Creates file asset.
|
Chris@0
|
304 *
|
Chris@0
|
305 * @return \DrupalCodeGenerator\Asset
|
Chris@0
|
306 * The asset.
|
Chris@0
|
307 */
|
Chris@0
|
308 protected function addFile() {
|
Chris@0
|
309 return $this->addAsset('file');
|
Chris@0
|
310 }
|
Chris@0
|
311
|
Chris@0
|
312 /**
|
Chris@0
|
313 * Creates directory asset.
|
Chris@0
|
314 *
|
Chris@0
|
315 * @return \DrupalCodeGenerator\Asset
|
Chris@0
|
316 * The asset.
|
Chris@0
|
317 */
|
Chris@0
|
318 protected function addDirectory() {
|
Chris@0
|
319 return $this->addAsset('directory');
|
Chris@0
|
320 }
|
Chris@0
|
321
|
Chris@0
|
322 /**
|
Chris@0
|
323 * Creates service file asset.
|
Chris@0
|
324 *
|
Chris@0
|
325 * @return \DrupalCodeGenerator\Asset
|
Chris@0
|
326 * The asset.
|
Chris@0
|
327 */
|
Chris@0
|
328 protected function addServicesFile() {
|
Chris@0
|
329 return $this->addFile()
|
Chris@0
|
330 ->path('{machine_name}.services.yml')
|
Chris@0
|
331 ->action('append')
|
Chris@0
|
332 ->headerSize(1);
|
Chris@0
|
333 }
|
Chris@0
|
334
|
Chris@0
|
335 /**
|
Chris@0
|
336 * Creates file asset.
|
Chris@0
|
337 *
|
Chris@0
|
338 * @param string $path
|
Chris@0
|
339 * Path to the file.
|
Chris@0
|
340 * @param string $template
|
Chris@0
|
341 * Twig template to render.
|
Chris@0
|
342 * @param array $vars
|
Chris@0
|
343 * Twig variables.
|
Chris@0
|
344 *
|
Chris@0
|
345 * @deprecated Use self::addFile() or self::addDirectory().
|
Chris@0
|
346 */
|
Chris@0
|
347 protected function setFile($path = NULL, $template = NULL, array $vars = []) {
|
Chris@0
|
348 $this->addFile()
|
Chris@0
|
349 ->path($path)
|
Chris@0
|
350 ->template($template)
|
Chris@0
|
351 ->vars($vars);
|
Chris@0
|
352 }
|
Chris@0
|
353
|
Chris@0
|
354 /**
|
Chris@0
|
355 * Creates service file asset.
|
Chris@0
|
356 *
|
Chris@0
|
357 * @param string $path
|
Chris@0
|
358 * Path to the file.
|
Chris@0
|
359 * @param string $template
|
Chris@0
|
360 * Twig template to render.
|
Chris@0
|
361 * @param array $vars
|
Chris@0
|
362 * Twig variables.
|
Chris@0
|
363 *
|
Chris@0
|
364 * @deprecated Use self::addServiceFile().
|
Chris@0
|
365 */
|
Chris@0
|
366 protected function setServicesFile($path, $template, array $vars) {
|
Chris@0
|
367 $this->addServicesFile()
|
Chris@0
|
368 ->path($path)
|
Chris@0
|
369 ->template($template)
|
Chris@0
|
370 ->vars($vars);
|
Chris@0
|
371 }
|
Chris@0
|
372
|
Chris@0
|
373 }
|