diff --git a/bundle/Core/Imagine/VariationPathGenerator/WebpFormatVariationPathGenerator.php b/bundle/Core/Imagine/VariationPathGenerator/WebpFormatVariationPathGenerator.php new file mode 100644 index 00000000..c56e8451 --- /dev/null +++ b/bundle/Core/Imagine/VariationPathGenerator/WebpFormatVariationPathGenerator.php @@ -0,0 +1,48 @@ +<?php + +declare(strict_types=1); + +namespace Netgen\Bundle\SiteBundle\Core\Imagine\VariationPathGenerator; + +use Ibexa\Contracts\Core\Variation\VariationPathGenerator; +use Liip\ImagineBundle\Imagine\Filter\FilterConfiguration; + +use function array_key_exists; +use function pathinfo; +use function preg_replace; + +/** + * Decorates VariationPathGenerator with .webp extension if image variation is configured for this format. + */ +final class WebpFormatVariationPathGenerator implements VariationPathGenerator +{ + private VariationPathGenerator $innerVariationPathGenerator; + + private FilterConfiguration $filterConfiguration; + + public function __construct( + VariationPathGenerator $innerVariationPathGenerator, + FilterConfiguration $filterConfiguration, + ) { + $this->innerVariationPathGenerator = $innerVariationPathGenerator; + $this->filterConfiguration = $filterConfiguration; + } + + public function getVariationPath($originalPath, $filter): string + { + $variationPath = $this->innerVariationPathGenerator->getVariationPath($originalPath, $filter); + $filterConfig = $this->filterConfiguration->get($filter); + + if (!isset($filterConfig['format']) || $filterConfig['format'] !== 'webp') { + return $variationPath; + } + + $info = pathinfo($originalPath); + + if (!array_key_exists('extension', $info) || $info['extension'] === '') { + return $variationPath . '.webp'; + } + + return preg_replace("/\\.{$info['extension']}$/", '.webp', $variationPath) ?? $variationPath; + } +} diff --git a/bundle/DependencyInjection/Compiler/WebpFormatVariationPathGeneratorDecoratorPass.php b/bundle/DependencyInjection/Compiler/WebpFormatVariationPathGeneratorDecoratorPass.php new file mode 100644 index 00000000..2588c14f --- /dev/null +++ b/bundle/DependencyInjection/Compiler/WebpFormatVariationPathGeneratorDecoratorPass.php @@ -0,0 +1,42 @@ +<?php + +declare(strict_types=1); + +namespace Netgen\Bundle\SiteBundle\DependencyInjection\Compiler; + +use Ibexa\Bundle\Core\Imagine\VariationPathGenerator\WebpFormatVariationPathGenerator as BaseWebpFormatVariationPathGenerator; +use Netgen\Bundle\SiteBundle\Core\Imagine\VariationPathGenerator\WebpFormatVariationPathGenerator; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; + +use function array_keys; +use function in_array; +use function is_array; + +class WebpFormatVariationPathGeneratorDecoratorPass implements CompilerPassInterface +{ + /** + * Overrides default Webp image alias variation path generator decorator to comply with legacy variation URL pattern + * We do this only if we have Netgen AdminUI installed (legacy-based administration). + */ + public function process(ContainerBuilder $container): void + { + if (!$container->hasParameter('kernel.bundles') || !is_array($container->getParameter('kernel.bundles'))) { + return; + } + + $activatedBundles = array_keys($container->getParameter('kernel.bundles')); + + if (!in_array('NetgenAdminUIBundle', $activatedBundles, true)) { + return; + } + + if (!$container->has(BaseWebpFormatVariationPathGenerator::class)) { + return; + } + + $container + ->findDefinition(BaseWebpFormatVariationPathGenerator::class) + ->setClass(WebpFormatVariationPathGenerator::class); + } +} diff --git a/bundle/NetgenSiteBundle.php b/bundle/NetgenSiteBundle.php index 14b1a38c..c8b1a86d 100644 --- a/bundle/NetgenSiteBundle.php +++ b/bundle/NetgenSiteBundle.php @@ -20,5 +20,6 @@ public function build(ContainerBuilder $container): void $container->addCompilerPass(new Compiler\IoStorageAllowListPass()); $container->addCompilerPass(new Compiler\PHPStormPass(), PassConfig::TYPE_OPTIMIZE); $container->addCompilerPass(new Compiler\DirectDownloadPass()); + $container->addCompilerPass(new Compiler\WebpFormatVariationPathGeneratorDecoratorPass()); } }