You are here

public function ExtensionCollection::__construct in Markdown 8.2

ExtensionCollection constructor.

Parameters

\Drupal\markdown\PluginManager\ExtensionManagerInterface $manager: The Markdown Extension Plugin Manager service.

\Drupal\markdown\Plugin\Markdown\ExtensibleParserInterface $parser: A markdown parser instance.

Overrides DefaultLazyPluginCollection::__construct

File

src/PluginManager/ExtensionCollection.php, line 31

Class

ExtensionCollection
Collection of extension plugins based on relevant parser.

Namespace

Drupal\markdown\PluginManager

Code

public function __construct(ExtensionManagerInterface $manager, ExtensibleParserInterface $parser) {
  $this->parser = $parser;
  $extensionInterfaces = $parser
    ->extensionInterfaces();

  // Filter out extensions that the parser doesn't support.
  $definitions = array_filter($manager
    ->getDefinitions(FALSE), function ($definition) use ($extensionInterfaces) {
    $supported = FALSE;
    foreach ($extensionInterfaces as $interface) {
      if (is_subclass_of($definition
        ->getClass(), $interface)) {
        $supported = TRUE;
        break;
      }
    }
    return $supported;
  });

  // Process passed configurations with known extension definitions.
  $configurations = $parser
    ->config()
    ->get('extensions') ?: [];
  foreach ($configurations as $key => &$configuration) {
    $originalKey = $key;

    // Ensure the plugin key is set in the configuration.
    if (isset($definitions[$key])) {
      $configuration[$this->pluginKey] = $key;
      continue;
    }

    // Configuration defined a plugin key, use it.
    $key = isset($configuration[$this->pluginKey]) ? $configuration[$this->pluginKey] : NULL;
    if (isset($key)) {
      $configurations[$key] = $configuration;
    }

    // Remove unknown configurations.
    if ($key !== $originalKey) {
      unset($configurations[$originalKey]);
    }
  }

  // Ensure required dependencies are enabled.
  // Note: property is prefixed with an underscore to denote it as internal.
  // @see \Drupal\markdown\PluginManager\ExtensionManager::alterDefinitions
  // @todo Figure out a better way to handle this.
  foreach ($definitions as $pluginId => $definition) {
    if (!empty($definition['_requiredBy'])) {
      foreach ($definition['_requiredBy'] as $dependent) {

        // Ensure dependent is a string.
        $dependent = (string) $dependent;
        if (isset($configurations[$dependent]) && (!isset($configurations[$dependent]['enabled']) || !empty($configurations[$dependent]['enabled']))) {
          if (!isset($configurations[$pluginId])) {
            $configurations[$pluginId] = [
              'id' => $pluginId,
            ];
          }
          $configurations[$pluginId]['enabled'] = TRUE;
          break;
        }
      }
    }
  }

  // Fill in missing definitions.
  $pluginIds = array_keys($definitions);
  $configurations += array_combine($pluginIds, array_map(function ($pluginId) {
    return [
      $this->pluginKey => $pluginId,
    ];
  }, $pluginIds));

  // Sort configurations by using the keys of the already sorted definitions.
  $configurations = array_replace(array_flip(array_keys(array_intersect_key($definitions, $configurations))), $configurations);
  parent::__construct($manager, $configurations);
}