Version 1
[yaffs-website] / web / core / modules / image / src / PathProcessor / PathProcessorImageStyles.php
diff --git a/web/core/modules/image/src/PathProcessor/PathProcessorImageStyles.php b/web/core/modules/image/src/PathProcessor/PathProcessorImageStyles.php
new file mode 100644 (file)
index 0000000..5fdbd2f
--- /dev/null
@@ -0,0 +1,75 @@
+<?php
+
+namespace Drupal\image\PathProcessor;
+
+use Drupal\Core\PathProcessor\InboundPathProcessorInterface;
+use Drupal\Core\StreamWrapper\StreamWrapperManagerInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Defines a path processor to rewrite image styles URLs.
+ *
+ * As the route system does not allow arbitrary amount of parameters convert
+ * the file path to a query parameter on the request.
+ *
+ * This processor handles two different cases:
+ * - public image styles: In order to allow the webserver to serve these files
+ *   directly, the route is registered under the same path as the image style so
+ *   it took over the first generation. Therefore the path processor converts
+ *   the file path to a query parameter.
+ * - private image styles: In contrast to public image styles, private
+ *   derivatives are already using system/files/styles. Similar to public image
+ *   styles, it also converts the file path to a query parameter.
+ */
+class PathProcessorImageStyles implements InboundPathProcessorInterface {
+
+  /**
+   * The stream wrapper manager service.
+   *
+   * @var \Drupal\Core\StreamWrapper\StreamWrapperManagerInterface
+   */
+  protected $streamWrapperManager;
+
+  /**
+   * Constructs a new PathProcessorImageStyles object.
+   *
+   * @param \Drupal\Core\StreamWrapper\StreamWrapperManagerInterface $stream_wrapper_manager
+   *   The stream wrapper manager service.
+   */
+  public function __construct(StreamWrapperManagerInterface $stream_wrapper_manager) {
+    $this->streamWrapperManager = $stream_wrapper_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function processInbound($path, Request $request) {
+    $directory_path = $this->streamWrapperManager->getViaScheme('public')->getDirectoryPath();
+    if (strpos($path, '/' . $directory_path . '/styles/') === 0) {
+      $path_prefix = '/' . $directory_path . '/styles/';
+    }
+    elseif (strpos($path, '/system/files/styles/') === 0) {
+      $path_prefix = '/system/files/styles/';
+    }
+    else {
+      return $path;
+    }
+
+    // Strip out path prefix.
+    $rest = preg_replace('|^' . preg_quote($path_prefix, '|') . '|', '', $path);
+
+    // Get the image style, scheme and path.
+    if (substr_count($rest, '/') >= 2) {
+      list($image_style, $scheme, $file) = explode('/', $rest, 3);
+
+      // Set the file as query parameter.
+      $request->query->set('file', $file);
+
+      return $path_prefix . $image_style . '/' . $scheme;
+    }
+    else {
+      return $path;
+    }
+  }
+
+}