diff core/lib/Drupal/Core/Asset/LibraryDependencyResolver.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 129ea1e6d783
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/lib/Drupal/Core/Asset/LibraryDependencyResolver.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,95 @@
+<?php
+
+namespace Drupal\Core\Asset;
+
+/**
+ * Resolves the dependencies of asset (CSS/JavaScript) libraries.
+ */
+class LibraryDependencyResolver implements LibraryDependencyResolverInterface {
+
+  /**
+   * The library discovery service.
+   *
+   * @var \Drupal\Core\Asset\LibraryDiscoveryInterface
+   */
+  protected $libraryDiscovery;
+
+  /**
+   * Constructs a new LibraryDependencyResolver instance.
+   *
+   * @param \Drupal\Core\Asset\LibraryDiscoveryInterface $library_discovery
+   *   The library discovery service.
+   */
+  public function __construct(LibraryDiscoveryInterface $library_discovery) {
+    $this->libraryDiscovery = $library_discovery;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getLibrariesWithDependencies(array $libraries) {
+    return $this->doGetDependencies($libraries);
+  }
+
+  /**
+   * Gets the given libraries with its dependencies.
+   *
+   * Helper method for ::getLibrariesWithDependencies().
+   *
+   * @param string[] $libraries_with_unresolved_dependencies
+   *   A list of libraries, with unresolved dependencies, in the order they
+   *   should be loaded.
+   * @param string[] $final_libraries
+   *   The final list of libraries (the return value) that is being built
+   *   recursively.
+   *
+   * @return string[]
+   *   A list of libraries, in the order they should be loaded, including their
+   *   dependencies.
+   */
+  protected function doGetDependencies(array $libraries_with_unresolved_dependencies, array $final_libraries = []) {
+    foreach ($libraries_with_unresolved_dependencies as $library) {
+      if (!in_array($library, $final_libraries)) {
+        list($extension, $name) = explode('/', $library, 2);
+        $definition = $this->libraryDiscovery->getLibraryByName($extension, $name);
+        if (!empty($definition['dependencies'])) {
+          $final_libraries = $this->doGetDependencies($definition['dependencies'], $final_libraries);
+        }
+        $final_libraries[] = $library;
+      }
+    }
+    return $final_libraries;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getMinimalRepresentativeSubset(array $libraries) {
+    $minimal = [];
+
+    // Determine each library's dependencies.
+    $with_deps = [];
+    foreach ($libraries as $library) {
+      $with_deps[$library] = $this->getLibrariesWithDependencies([$library]);
+    }
+
+    foreach ($libraries as $library) {
+      $exists = FALSE;
+      foreach ($with_deps as $other_library => $dependencies) {
+        if ($library == $other_library) {
+          continue;
+        }
+        if (in_array($library, $dependencies)) {
+          $exists = TRUE;
+          break;
+        }
+      }
+      if (!$exists) {
+        $minimal[] = $library;
+      }
+    }
+
+    return $minimal;
+  }
+
+}