<?php
|
|
|
|
namespace Drupal\koality_theme\Command;
|
|
|
|
use Drupal\Console\Command\Shared\ArrayInputTrait;
|
|
use Symfony\Component\Console\Input\InputInterface;
|
|
use Symfony\Component\Console\Input\InputOption;
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
|
use Drupal\Console\Command\Shared\ThemeRegionTrait;
|
|
use Drupal\Console\Command\Shared\ThemeBreakpointTrait;
|
|
use Drupal\Console\Command\Shared\ConfirmationTrait;
|
|
use Drupal\Console\Core\Command\Command;
|
|
use Drupal\Console\Extension\Manager;
|
|
use Drupal\Console\Utils\Site;
|
|
use Drupal\Console\Core\Utils\StringConverter;
|
|
use Drupal\Console\Utils\Validator;
|
|
use Drupal\Core\Extension\ThemeHandler;
|
|
use Webmozart\PathUtil\Path;
|
|
use Drupal\koality_theme\Generator\KoalityThemeGenerator;
|
|
|
|
|
|
/**
|
|
* Class GenerateThemeCommand.
|
|
*
|
|
* Drupal\Console\Annotations\DrupalCommand (
|
|
* extension="koality_theme",
|
|
* extensionType="module"
|
|
* )
|
|
*/
|
|
class GenerateThemeCommand extends Command {
|
|
|
|
use ConfirmationTrait;
|
|
use ThemeRegionTrait;
|
|
use ThemeBreakpointTrait;
|
|
use ArrayInputTrait;
|
|
|
|
/**
|
|
* @var Manager
|
|
*/
|
|
protected $extensionManager;
|
|
|
|
/**
|
|
* @var KoalityThemeGenerator
|
|
*/
|
|
protected $generator;
|
|
|
|
/**
|
|
* @var Validator
|
|
*/
|
|
protected $validator;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
protected $appRoot;
|
|
|
|
/**
|
|
* @var ThemeHandler
|
|
*/
|
|
protected $themeHandler;
|
|
|
|
/**
|
|
* @var Site
|
|
*/
|
|
protected $site;
|
|
|
|
/**
|
|
* @var StringConverter
|
|
*/
|
|
protected $stringConverter;
|
|
|
|
/**
|
|
* ThemeCommand constructor.
|
|
*
|
|
* @param Manager $extensionManager
|
|
* @param KoalityThemeGenerator $generator
|
|
* @param Validator $validator
|
|
* @param $appRoot
|
|
* @param ThemeHandler $themeHandler
|
|
* @param Site $site
|
|
* @param StringConverter $stringConverter
|
|
*/
|
|
public function __construct(
|
|
Manager $extensionManager,
|
|
KoalityThemeGenerator $generator,
|
|
Validator $validator,
|
|
$appRoot,
|
|
ThemeHandler $themeHandler,
|
|
Site $site,
|
|
StringConverter $stringConverter
|
|
) {
|
|
$this->extensionManager = $extensionManager;
|
|
$this->generator = $generator;
|
|
$this->validator = $validator;
|
|
$this->appRoot = $appRoot;
|
|
$this->themeHandler = $themeHandler;
|
|
$this->site = $site;
|
|
$this->stringConverter = $stringConverter;
|
|
parent::__construct();
|
|
}
|
|
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
protected function configure() {
|
|
$this
|
|
->setName('koality_theme:generate')
|
|
->setDescription($this->trans('commands.generate.theme.description'))
|
|
->setHelp($this->trans('commands.generate.theme.help'))
|
|
->addOption(
|
|
'theme',
|
|
NULL,
|
|
InputOption::VALUE_REQUIRED,
|
|
$this->trans('commands.generate.theme.options.theme')
|
|
)
|
|
->addOption(
|
|
'machine-name',
|
|
NULL,
|
|
InputOption::VALUE_REQUIRED,
|
|
$this->trans('commands.generate.theme.options.machine-name')
|
|
)
|
|
->addOption(
|
|
'theme-path',
|
|
NULL,
|
|
InputOption::VALUE_REQUIRED,
|
|
$this->trans('commands.generate.theme.options.theme-path')
|
|
)
|
|
->addOption(
|
|
'description',
|
|
NULL,
|
|
InputOption::VALUE_OPTIONAL,
|
|
$this->trans('commands.generate.theme.options.description')
|
|
)
|
|
->addOption('core', NULL, InputOption::VALUE_OPTIONAL, $this->trans('commands.generate.theme.options.core'))
|
|
->addOption(
|
|
'package',
|
|
NULL,
|
|
InputOption::VALUE_OPTIONAL,
|
|
$this->trans('commands.generate.theme.options.package')
|
|
)
|
|
->addOption(
|
|
'global-library',
|
|
NULL,
|
|
InputOption::VALUE_OPTIONAL,
|
|
$this->trans('commands.generate.theme.options.global-library')
|
|
)
|
|
->addOption(
|
|
'libraries',
|
|
NULL,
|
|
InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY,
|
|
$this->trans('commands.generate.theme.options.libraries')
|
|
)
|
|
->addOption(
|
|
'base-theme',
|
|
NULL,
|
|
InputOption::VALUE_OPTIONAL,
|
|
$this->trans('commands.generate.theme.options.base-theme')
|
|
)
|
|
->addOption(
|
|
'base-theme-regions',
|
|
NULL,
|
|
InputOption::VALUE_NONE,
|
|
$this->trans('commands.generate.theme.options.base-theme-regions')
|
|
)
|
|
->addOption(
|
|
'regions',
|
|
NULL,
|
|
InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY,
|
|
$this->trans('commands.generate.theme.options.regions')
|
|
)
|
|
->addOption(
|
|
'breakpoints',
|
|
NULL,
|
|
InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY,
|
|
$this->trans('commands.generate.theme.options.breakpoints')
|
|
)
|
|
->setAliases(['gt']);
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
protected function execute(InputInterface $input, OutputInterface $output) {
|
|
// @see use Drupal\Console\Command\Shared\ConfirmationTrait::confirmOperation
|
|
if (!$this->confirmOperation()) {
|
|
return 1;
|
|
}
|
|
|
|
$theme = $this->validator->validateModuleName($input->getOption('theme'));
|
|
// Get the profile path and define a profile path if it is null
|
|
// Check that it is an absolute path or otherwise create an absolute path using appRoot
|
|
$theme_path = $input->getOption('theme-path');
|
|
if (is_null($theme_path)) {
|
|
$uri = $this->site->getMultisiteName($input);
|
|
$defaultThemePath = 'themes/custom';
|
|
$theme_path = $this->site->multisiteMode($uri) ? 'sites/' . $this->site->getMultisiteDir($uri) . '/' . $defaultThemePath : $defaultThemePath;
|
|
}
|
|
$theme_path = Path::isAbsolute($theme_path) ? $theme_path : Path::makeAbsolute($theme_path, $this->appRoot);
|
|
$theme_path = $this->validator->validateModulePath($theme_path, TRUE);
|
|
|
|
$machine_name = $input->getOption('machine-name') ?
|
|
$this->validator->validateMachineName($input->getOption('machine-name'))
|
|
: $this->stringConverter->createMachineName($theme);
|
|
|
|
$description = $input->getOption('description');
|
|
$core = $input->getOption('core');
|
|
$package = $input->getOption('package');
|
|
$base_theme = $input->getOption('base-theme');
|
|
$base_theme_regions = $input->getOption('base-theme-regions');
|
|
$global_library = $input->getOption('global-library');
|
|
$libraries = $input->getOption('libraries');
|
|
$regions = $input->getOption('regions');
|
|
$breakpoints = $input->getOption('breakpoints');
|
|
$noInteraction = $input->getOption('no-interaction');
|
|
|
|
// Parse nested data.
|
|
if ($noInteraction) {
|
|
$libraries = $this->explodeInlineArray($libraries);
|
|
$regions = $this->explodeInlineArray($regions);
|
|
$breakpoints = $this->explodeInlineArray($breakpoints);
|
|
}
|
|
|
|
$base_theme_path = $this->extensionManager->getTheme($base_theme);
|
|
|
|
$this->generator->generate([
|
|
'theme' => $theme,
|
|
'machine_name' => $machine_name,
|
|
'dir' => $theme_path,
|
|
'core' => $core,
|
|
'description' => $description,
|
|
'package' => $package,
|
|
'base_theme' => $base_theme,
|
|
'base_theme_path' => is_null($base_theme_path) ? FALSE : $base_theme_path->getRealPath(),
|
|
'base_theme_regions' => $base_theme_regions,
|
|
'global_library' => $global_library,
|
|
'libraries' => $libraries,
|
|
'regions' => $regions,
|
|
'breakpoints' => $breakpoints,
|
|
]);
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
protected function interact(InputInterface $input, OutputInterface $output) {
|
|
try {
|
|
$theme = $input->getOption('theme') ? $this->validator->validateModuleName($input->getOption('theme')) : NULL;
|
|
} catch (\Exception $error) {
|
|
$this->getIo()->error($error->getMessage());
|
|
|
|
return 1;
|
|
}
|
|
|
|
if (!$theme) {
|
|
$theme = $this->getIo()->ask(
|
|
$this->trans('commands.generate.theme.questions.theme'),
|
|
'',
|
|
function ($theme) {
|
|
return $this->validator->validateModuleName($theme);
|
|
}
|
|
);
|
|
$input->setOption('theme', $theme);
|
|
}
|
|
|
|
try {
|
|
$machine_name = $input->getOption('machine-name') ? $this->validator->validateModuleName($input->getOption('machine-name')) : NULL;
|
|
} catch (\Exception $error) {
|
|
$this->getIo()->error($error->getMessage());
|
|
|
|
return 1;
|
|
}
|
|
|
|
if (!$machine_name) {
|
|
$machine_name = $this->getIo()->ask(
|
|
$this->trans('commands.generate.theme.questions.machine-name'),
|
|
$this->stringConverter->createMachineName($theme),
|
|
function ($machine_name) {
|
|
return $this->validator->validateMachineName($machine_name);
|
|
}
|
|
);
|
|
$input->setOption('machine-name', $machine_name);
|
|
}
|
|
|
|
$theme_path = $input->getOption('theme-path');
|
|
if (!$theme_path) {
|
|
$uri = $this->site->getMultisiteName($input);
|
|
$defaultThemePath = 'themes/custom';
|
|
$theme_path = $this->getIo()->ask(
|
|
$this->trans('commands.generate.theme.questions.theme-path'),
|
|
$this->site->multisiteMode($uri) ? 'sites/' . $this->site->getMultisiteDir($uri) . '/' . $defaultThemePath : $defaultThemePath,
|
|
function ($theme_path) use ($machine_name) {
|
|
$fullPath = Path::isAbsolute($theme_path) ? $theme_path : Path::makeAbsolute($theme_path, $this->appRoot);
|
|
$fullPath = $fullPath . '/' . $machine_name;
|
|
if (file_exists($fullPath)) {
|
|
throw new \InvalidArgumentException(
|
|
sprintf(
|
|
$this->trans('commands.generate.theme.errors.directory-exists'),
|
|
$fullPath
|
|
)
|
|
);
|
|
}
|
|
else {
|
|
return $theme_path;
|
|
}
|
|
}
|
|
);
|
|
$input->setOption('theme-path', $theme_path);
|
|
}
|
|
|
|
$description = $input->getOption('description');
|
|
if (!$description) {
|
|
$description = $this->getIo()->ask(
|
|
$this->trans('commands.generate.theme.questions.description'),
|
|
$this->trans('commands.generate.theme.suggestions.my-awesome-theme')
|
|
);
|
|
$input->setOption('description', $description);
|
|
}
|
|
|
|
$package = $input->getOption('package');
|
|
if (!$package) {
|
|
$package = $this->getIo()->ask(
|
|
$this->trans('commands.generate.theme.questions.package'),
|
|
$this->trans('commands.generate.theme.suggestions.other')
|
|
);
|
|
$input->setOption('package', $package);
|
|
}
|
|
|
|
$core = $input->getOption('core');
|
|
if (!$core) {
|
|
$core = $this->getIo()->ask(
|
|
$this->trans('commands.generate.theme.questions.core'),
|
|
'8.x'
|
|
);
|
|
$input->setOption('core', $core);
|
|
}
|
|
|
|
$base_theme = $input->getOption('base-theme');
|
|
if (!$base_theme) {
|
|
$themes = $this->themeHandler->rebuildThemeData();
|
|
$themes['false'] = '';
|
|
|
|
uasort($themes, 'system_sort_modules_by_info_name');
|
|
|
|
$base_theme = $this->getIo()->choiceNoList(
|
|
$this->trans('commands.generate.theme.options.base-theme'),
|
|
array_keys($themes)
|
|
);
|
|
$input->setOption('base-theme', $base_theme);
|
|
}
|
|
|
|
$global_library = $input->getOption('global-library');
|
|
if (!$global_library) {
|
|
$global_library = $this->getIo()->ask(
|
|
$this->trans('commands.generate.theme.questions.global-library'),
|
|
'global-styling'
|
|
);
|
|
$input->setOption('global-library', $global_library);
|
|
}
|
|
|
|
|
|
// --libraries option.
|
|
$libraries = $input->getOption('libraries');
|
|
if (!$libraries) {
|
|
if ($this->getIo()->confirm(
|
|
$this->trans('commands.generate.theme.questions.library-add'),
|
|
TRUE
|
|
)
|
|
) {
|
|
// @see \Drupal\Console\Command\Shared\ThemeRegionTrait::libraryQuestion
|
|
$libraries = $this->libraryQuestion();
|
|
}
|
|
}
|
|
else {
|
|
$libraries = $this->explodeInlineArray($libraries);
|
|
}
|
|
$input->setOption('libraries', $libraries);
|
|
|
|
// --regions option.
|
|
$regions = $input->getOption('regions');
|
|
if (!$regions) {
|
|
if ($this->getIo()->confirm(
|
|
$this->trans('commands.generate.theme.questions.regions'),
|
|
TRUE
|
|
)
|
|
) {
|
|
// @see \Drupal\Console\Command\Shared\ThemeRegionTrait::regionQuestion
|
|
$regions = $this->regionQuestion();
|
|
}
|
|
}
|
|
else {
|
|
$regions = $this->explodeInlineArray($regions);
|
|
}
|
|
$input->setOption('regions', $regions);
|
|
|
|
// --breakpoints option.
|
|
$breakpoints = $input->getOption('breakpoints');
|
|
if (!$breakpoints) {
|
|
if ($this->getIo()->confirm(
|
|
$this->trans('commands.generate.theme.questions.breakpoints'),
|
|
TRUE
|
|
)
|
|
) {
|
|
// @see \Drupal\Console\Command\Shared\ThemeRegionTrait::regionQuestion
|
|
$breakpoints = $this->breakpointQuestion();
|
|
}
|
|
}
|
|
else {
|
|
$breakpoints = $this->explodeInlineArray($breakpoints);
|
|
}
|
|
$input->setOption('breakpoints', $breakpoints);
|
|
}
|
|
|
|
}
|