123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- <?php
- declare(strict_types = 1);
- namespace Fgm\Drupal\Composer;
- use Symfony\Component\Console\Input\InputArgument;
- use Symfony\Component\Console\Input\InputDefinition;
- use Symfony\Component\Console\Input\InputInterface;
- use Symfony\Component\Console\Output\OutputInterface;
- use Symfony\Component\Yaml\Exception\ParseException;
- use Symfony\Component\Yaml\Yaml;
- use Twig\Environment;
- use Twig\Extension\DebugExtension;
- use Twig\Loader\FilesystemLoader;
- use Twig\TemplateWrapper;
- class HugoConfigCommand extends BaseBuilderCommand
- {
- /**
- * @var string
- */
- protected $eventName;
- /**
- * {@inheritDoc}
- */
- public function configure()
- {
- parent::configure();
- $this->eventName = $this->getName();
- $this
- ->setName('build:config_doc')
- ->setDescription('Configure the documentation site for the current environment.')
- ->setDefinition(
- new InputDefinition([
- new InputArgument(static::ARG_FILE, InputArgument::OPTIONAL),
- ])
- )
- ->setHelp(
- <<<EOT
- The build:config_doc modifies the doc/config.toml file and rebuilds the documentation
- site to account for the changes.
- EOT
- );
- }
- /**
- * {@inheritDoc}
- */
- public function execute(InputInterface $input, OutputInterface $output)
- {
- [$templateName, $err] = $this->validateTemplateName($input, $output);
- if ($err) {
- return 1;
- };
- $settingsPath = $this->getSettingsPath();
- $templatePath = "${settingsPath}/${templateName}";
- $realTemplatePath = realpath($templatePath);
- if (empty($realTemplatePath)) {
- $output->writeln(sprintf("Could not load template %s: no such file", $templateName));
- return 2;
- }
- $paramsPath = "${settingsPath}/merged.params.local.yml";
- $realParamsPath = realpath($paramsPath);
- if (empty($realParamsPath)) {
- $output->writeln(sprintf("Could not load parameters %s: no such file", $paramsPath));
- return 3;
- }
- $yaml = new Yaml();
- try {
- $params = $yaml->parseFile($realParamsPath);
- } catch (ParseException $e) {
- $output->writeln(sprintf("Could not parse %s: %s", $realParamsPath, $e->getMessage()));
- return 4;
- }
- $loader = new FilesystemLoader($settingsPath, $settingsPath);
- $twig = new Environment($loader, [
- 'auto_reload' => true,
- 'cache' => false,
- 'debug' => true,
- 'strict_variables' => true,
- ]);
- $twig->addExtension(new DebugExtension());
- $wrapper = $twig->load($templateName);
- $context = [
- 'base_url' => $params['instance']['doc']['base_url'],
- ];
- $error = $this->render($wrapper, $context, $output);
- if ($error) {
- $output->writeln(sprintf("Failed rendering doc configuration"));
- return 5;
- }
- $cwd = getcwd();
- chdir('doc');
- $err = system("hugo -D", $exit);
- if ($exit != 0) {
- $output->writeln(sprintf("Failed running hugo to rebuild documentation site: %s\n", $err));
- return 6;
- }
- chdir($cwd);
- }
- protected function render(TemplateWrapper $wrapper, array $context, OutputInterface $output): int
- {
- $configPath = "doc/config.toml";
- if (file_exists($configPath)) {
- $ok = unlink($configPath);
- if (!$ok) {
- $output->writeln(sprintf(
- "Could not remove old %s file",
- $configPath
- ));
- return 1;
- }
- }
- $rendered = $wrapper->render($context);
- $ok = file_put_contents($configPath, $rendered, LOCK_EX);
- if (!$ok) {
- $output->writeln(sprintf('Could not write new %s file', $configPath));
- return 2;
- }
- return 0;
- }
- }
|