View source
<?php
namespace Drupal\markdown\PluginManager;
use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
use Drupal\Component\Plugin\Exception\PluginNotFoundException;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\markdown\Annotation\InstallableLibrary;
use Drupal\markdown\Annotation\InstallablePlugin;
use Drupal\markdown\Annotation\MarkdownExtension;
use Drupal\markdown\Annotation\InstallableRequirement;
use Drupal\markdown\Plugin\Markdown\ExtensionInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class ExtensionManager extends InstallablePluginManager implements ExtensionManagerInterface {
public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ConfigFactoryInterface $configFactory, LoggerInterface $logger, ModuleHandlerInterface $module_handler) {
parent::__construct('Plugin/Markdown', $namespaces, $configFactory, $logger, $module_handler, ExtensionInterface::class, MarkdownExtension::class);
$this
->setCacheBackend($cache_backend, 'markdown_extension_info');
$this
->alterInfo($this->cacheKey);
}
public static function create(ContainerInterface $container = NULL) {
if (!$container) {
$container = \Drupal::getContainer();
}
$instance = new static($container
->get('container.namespaces'), $container
->get('cache.discovery'), $container
->get('config.factory'), $container
->get('logger.channel.markdown'), $container
->get('module_handler'));
$instance
->setContainer($container);
return $instance;
}
protected function alterDefinitions(&$definitions, $runtime = FALSE) {
foreach ($definitions as $definition) {
if (!isset($definition['_requiredBy'])) {
$definition['_requiredBy'] = [];
}
$extensionRequirements = $definition
->getRequirementsByType('extension');
foreach ($extensionRequirements as $requirement) {
$id = $requirement
->getTypeId();
if (!isset($definitions[$id])) {
throw new PluginNotFoundException($id);
}
if ($id === $definition->id) {
throw new InvalidPluginDefinitionException($definition->id, 'Extensions cannot require themselves.');
}
if (!isset($definitions[$id]['_requiredBy'])) {
$definitions[$id]['_requiredBy'] = [];
}
if (!in_array($definition->id, $definitions[$id]['_requiredBy'])) {
$definitions[$id]['_requiredBy'][] = $definition->id;
}
}
}
parent::alterDefinitions($definitions, $runtime);
}
protected function alterDefinition(InstallablePlugin $definition, $runtime = FALSE) {
if (!$runtime) {
parent::alterDefinition($definition, $runtime);
return;
}
parent::alterDefinition($definition, $runtime);
}
protected function createObjectRequirement(InstallablePlugin $definition, InstallableLibrary $library) {
$objectRequirement = parent::createObjectRequirement($definition, $library);
$id = $objectRequirement->constraints['Installed']['name'];
$parserManager = \Drupal::service('plugin.manager.markdown.parser');
$parser = $parserManager
->getDefinitionByLibraryId($id);
foreach ($library->requirements as $requirement) {
if ($requirement
->getId() === $id || $parser && $requirement
->getType() === 'parser' && $requirement
->getTypeId() === $parser
->getId()) {
return NULL;
}
}
return $objectRequirement;
}
public function getFallbackPluginId($plugin_id = NULL, array $configuration = []) {
return '_missing_extension';
}
public function processDefinition(&$definition, $pluginId) {
if (!$definition instanceof MarkdownExtension) {
return;
}
if ($requires = $definition->requires) {
foreach ($requires as $key => $extensionId) {
$requirement = new InstallableRequirement();
$requirement->id = "extension:{$extensionId}";
$definition->runtimeRequirements[] = $requirement;
}
unset($definition->requires);
}
parent::processDefinition($definition, $pluginId);
}
}