Verified Commit 328bb474 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3420992 by kim.pepper, mstrelan, larowlan: Convert...

Issue #3420992 by kim.pepper, mstrelan, larowlan: Convert ImageToolkitOperation plugin discovery to attributes
parent 58ecf6d4
Loading
Loading
Loading
Loading
Loading
+71 −0
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace Drupal\Core\ImageToolkit\Attribute;

use Drupal\Component\Plugin\Attribute\Plugin;
use Drupal\Core\StringTranslation\TranslatableMarkup;

/**
 * Defines a Plugin attribute for the image toolkit plugin.
 *
 * An image toolkit operation plugin provides a self-contained image
 * manipulation routine, for a specific image toolkit. Examples of image
 * toolkit operations are scaling, cropping, rotating, etc.
 *
 * Plugin namespace: Plugin\ImageToolkit\Operation
 *
 * For a working example, see
 * \Drupal\system\Plugin\ImageToolkit\Operation\gd\Crop
 *
 * @see \Drupal\Core\ImageToolkit\Annotation\ImageToolkit
 * @see \Drupal\image\Annotation\ImageEffect
 * @see \Drupal\Core\ImageToolkit\ImageToolkitOperationInterface
 * @see \Drupal\Core\ImageToolkit\ImageToolkitOperationBase
 * @see \Drupal\Core\ImageToolkit\ImageToolkitOperationManager
 * @see plugin_api
 *
 * @Annotation
 */
#[\Attribute(\Attribute::TARGET_CLASS)]
class ImageToolkitOperation extends Plugin {

  /**
   * Constructs a new ImageToolkitOperation instance.
   *
   * @param string $id
   *   The plugin ID.
   *   There are no strict requirements as to the string to be used to identify
   *   the plugin, since discovery of the appropriate operation plugin to be
   *   used to apply an operation is based on the values of the 'toolkit' and
   *   the 'operation' annotation values.
   *   However, it is recommended that the following patterns be used:
   *    - '{toolkit}_{operation}' for the first implementation of an operation
   *      by a toolkit.
   *    - '{module}_{toolkit}_{operation}' for overrides of existing
   *      implementations supplied by an alternative module, and for new
   *      module-supplied operations.
   * @param string $toolkit
   *   The id of the image toolkit plugin for which the operation is
   *   implemented.
   * @param string $operation
   *   The machine name of the image toolkit operation implemented
   *   (e.g. "crop").
   * @param \Drupal\Core\StringTranslation\TranslatableMarkup $label
   *   The human-readable name of the image toolkit operation.
   * @param \Drupal\Core\StringTranslation\TranslatableMarkup|null $description
   *   (optional) The description of the image toolkit operation.
   * @param string|null $deriver
   *   (optional) The deriver class for the image toolkit operation.
   */
  public function __construct(
    public readonly string $id,
    public readonly string $toolkit,
    public readonly string $operation,
    public readonly TranslatableMarkup $label,
    public readonly ?TranslatableMarkup $description = NULL,
    public readonly ?string $deriver = NULL,
  ) {}

}
+12 −4
Original line number Diff line number Diff line
@@ -2,12 +2,13 @@

namespace Drupal\Core\ImageToolkit;

use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Plugin\DefaultPluginManager;
use Drupal\Component\Plugin\Exception\PluginNotFoundException;
use Drupal\Component\Plugin\Factory\DefaultFactory;
use Drupal\Component\Render\FormattableMarkup;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\ImageToolkit\Attribute\ImageToolkitOperation;
use Drupal\Core\Plugin\DefaultPluginManager;
use Psr\Log\LoggerInterface;

/**
@@ -50,7 +51,14 @@ class ImageToolkitOperationManager extends DefaultPluginManager implements Image
   *   The image toolkit manager.
   */
  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler, LoggerInterface $logger, ImageToolkitManager $toolkit_manager) {
    parent::__construct('Plugin/ImageToolkit/Operation', $namespaces, $module_handler, 'Drupal\Core\ImageToolkit\ImageToolkitOperationInterface', 'Drupal\Core\ImageToolkit\Annotation\ImageToolkitOperation');
    parent::__construct(
      'Plugin/ImageToolkit/Operation',
      $namespaces,
      $module_handler,
      ImageToolkitOperationInterface::class,
      ImageToolkitOperation::class,
      'Drupal\Core\ImageToolkit\Annotation\ImageToolkitOperation',
    );

    $this->alterInfo('image_toolkit_operation');
    $this->setCacheBackend($cache_backend, 'image_toolkit_operation_plugins');
+10 −8
Original line number Diff line number Diff line
@@ -2,17 +2,19 @@

namespace Drupal\system\Plugin\ImageToolkit\Operation\gd;

use Drupal\Core\ImageToolkit\Attribute\ImageToolkitOperation;
use Drupal\Core\StringTranslation\TranslatableMarkup;

/**
 * Defines GD2 convert operation.
 *
 * @ImageToolkitOperation(
 *   id = "gd_convert",
 *   toolkit = "gd",
 *   operation = "convert",
 *   label = @Translation("Convert"),
 *   description = @Translation("Instructs the toolkit to save the image with a specified extension.")
 * )
 */
#[ImageToolkitOperation(
  id: "gd_convert",
  toolkit: "gd",
  operation: "convert",
  label: new TranslatableMarkup("Convert"),
  description: new TranslatableMarkup("Instructs the toolkit to save the image with a specified extension.")
)]
class Convert extends GDImageToolkitOperationBase {

  /**
+9 −8
Original line number Diff line number Diff line
@@ -3,18 +3,19 @@
namespace Drupal\system\Plugin\ImageToolkit\Operation\gd;

use Drupal\Component\Utility\Color;
use Drupal\Core\ImageToolkit\Attribute\ImageToolkitOperation;
use Drupal\Core\StringTranslation\TranslatableMarkup;

/**
 * Defines GD2 create_new image operation.
 *
 * @ImageToolkitOperation(
 *   id = "gd_create_new",
 *   toolkit = "gd",
 *   operation = "create_new",
 *   label = @Translation("Set a new image"),
 *   description = @Translation("Creates a new transparent object and sets it for the image.")
 * )
 */
#[ImageToolkitOperation(
  id: "gd_create_new",
  toolkit: "gd",
  operation: "create_new",
  label: new TranslatableMarkup("Set a new image"),
  description: new TranslatableMarkup("Creates a new transparent object and sets it for the image.")
)]
class CreateNew extends GDImageToolkitOperationBase {

  /**
+10 −8
Original line number Diff line number Diff line
@@ -2,17 +2,19 @@

namespace Drupal\system\Plugin\ImageToolkit\Operation\gd;

use Drupal\Core\ImageToolkit\Attribute\ImageToolkitOperation;
use Drupal\Core\StringTranslation\TranslatableMarkup;

/**
 * Defines GD2 Crop operation.
 *
 * @ImageToolkitOperation(
 *   id = "gd_crop",
 *   toolkit = "gd",
 *   operation = "crop",
 *   label = @Translation("Crop"),
 *   description = @Translation("Crops an image to a rectangle specified by the given dimensions.")
 * )
 */
#[ImageToolkitOperation(
  id: "gd_crop",
  toolkit: "gd",
  operation: "crop",
  label: new TranslatableMarkup("Crop"),
  description: new TranslatableMarkup("Crops an image to a rectangle specified by the given dimensions.")
)]
class Crop extends GDImageToolkitOperationBase {

  /**
Loading