LibraryDeriver.php in Gin Layout Builder 8.2
File
modules/wingsuit_ui_patterns/src/Plugin/Deriver/LibraryDeriver.php
View source
<?php
namespace Drupal\wingsuit_ui_patterns\Plugin\Deriver;
use Drupal\Component\Serialization\Yaml;
use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Extension\ExtensionDiscovery;
use Drupal\Core\File\FileSystemInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\TypedData\TypedDataManager;
use Drupal\ui_patterns\Plugin\Deriver\AbstractYamlPatternsDeriver;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Extension\ThemeHandlerInterface;
class LibraryDeriver extends AbstractYamlPatternsDeriver {
protected $basePluginId;
protected $suffixes;
protected $root;
protected $themeHandler;
protected $moduleHandler;
protected $extensionDiscovery;
protected $extensionLocations = [];
protected $fileExtensions = [];
public function __construct($base_plugin_id, TypedDataManager $typed_data_manager, MessengerInterface $messenger, FileSystemInterface $file_system, $root, array $extensions, ModuleHandlerInterface $module_handler, ThemeHandlerInterface $theme_handler, ConfigFactory $config_factory) {
parent::__construct($base_plugin_id, $typed_data_manager, $messenger, $file_system);
$this->root = $root;
$this->fileExtensions = $extensions;
$this->moduleHandler = $module_handler;
$this->themeHandler = $theme_handler;
$this->extensionDiscovery = new ExtensionDiscovery($root);
$this->config = $config_factory
->getEditable('wingsuit_companion.config');
}
public static function create(ContainerInterface $container, $base_plugin_id) {
return new static($base_plugin_id, $container
->get('typed_data_manager'), $container
->get('messenger'), $container
->get('file_system'), $container
->get('app.root'), $container
->getParameter('wingsuit_companion.file_extensions'), $container
->get('module_handler'), $container
->get('theme_handler'), $container
->get('config.factory'));
}
public function getFileExtensions() {
return $this->fileExtensions;
}
private function removeWingsuitExtensions(&$definition) {
if (isset($definition['fields'])) {
$fields =& $definition['fields'];
foreach ($fields as &$field) {
if (isset($field['preview']['faker'])) {
unset($field['preview']['faker']);
$field['preview'] = 'Faked text';
continue;
}
if (isset($field['preview'][0]['id'])) {
$field['preview'] = $field['preview'][0];
}
if (isset($field['preview']['id'])) {
$field['preview']['theme'] = $field['preview']['id'];
}
foreach ([
'id',
'settings',
'fields',
'variant',
] as $key) {
if (isset($field['preview'][$key])) {
unset($field['preview'][$key]);
}
}
}
}
}
public function getPatterns() {
$patterns = [];
foreach ($this
->getDirectories() as $provider => $directory) {
try {
foreach ($this
->fileScanDirectory($directory) as $file_path => $file) {
$host_extension = $this
->getHostExtension($file_path);
if ($host_extension == FALSE || $host_extension == $provider) {
$content = file_get_contents($file_path);
foreach (Yaml::decode($content) as $id => $definition) {
$definition['id'] = $id;
$definition['base path'] = dirname($file_path);
$definition['file name'] = basename($file_path);
$definition['provider'] = $provider;
$this
->removeWingsuitExtensions($definition);
$patterns[] = $this
->getPatternDefinition($definition);
}
}
}
} catch (\Throwable $ex) {
\Drupal::messenger()
->addError("Error while parsing scaning directory " . $directory . ' ' . $ex
->getMessage());
}
}
return $patterns;
}
protected function getDirectories() {
$dist_path = $this->config
->get('dist_path');
$directories['wingsuit'] = realpath($dist_path);
return $directories;
}
protected function getHostExtension($pathname) {
$extensions = $this
->getExtensionLocations();
$parts = explode(DIRECTORY_SEPARATOR, $pathname);
while (!empty($parts)) {
$path = implode(DIRECTORY_SEPARATOR, $parts);
if (isset($extensions[$path])) {
return $extensions[$path];
}
array_pop($parts);
}
return FALSE;
}
protected function getExtensionLocations() {
if (empty($this->extensionLocations)) {
$extensions = $this->extensionDiscovery
->scan('theme') + $this->extensionDiscovery
->scan('module');
foreach ($extensions as $name => $extension) {
$this->extensionLocations[$this->root . DIRECTORY_SEPARATOR . $extension
->getPath()] = $name;
}
}
return $this->extensionLocations;
}
}