test Drupal site working on Koality Theme Builder
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

417 lines
12 KiB

<?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);
}
}