Skip to content

Commit

Permalink
also scan for 'srcset' elements (+ remove duplicates)
Browse files Browse the repository at this point in the history
  • Loading branch information
m-vo committed Sep 28, 2020
1 parent 9c02354 commit 71ffe3f
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 26 deletions.
41 changes: 33 additions & 8 deletions core-bundle/src/Image/Studio/ImageResult.php
Expand Up @@ -162,17 +162,42 @@ public function createIfDeferred(): void

$picture = $this->getPicture();

$deferredImages = array_filter(
array_column(
array_merge([$picture->getImg()], $picture->getSources()),
'src'
),
static function ($image): bool {
return $image instanceof DeferredImageInterface;
}
$array_flatten = static function (array $array): array {
return array_reduce($array, 'array_merge', []);
};

$findDeferredImages = static function (array $item) use ($array_flatten): array {
$candidates = array_merge(
[$item['src'] ?? null],
$array_flatten($item['srcset'] ?? [])
);

return array_filter(
$candidates,
static function ($image): bool {
return $image instanceof DeferredImageInterface;
}
);
};

// Create an array of deferred images by looking through the 'src' and
// 'srcset' attributes of both the 'img' and all 'sources' tags.
$deferredImages = array_merge(
$findDeferredImages($picture->getImg()),
$array_flatten(array_map($findDeferredImages, $picture->getSources()))
);

$resizedPaths = [];

/** @var DeferredImageInterface $deferredImage */
foreach ($deferredImages as $deferredImage) {
// Skip already processed images
if (isset($resizedPaths[$deferredImage->getPath()])) {
continue;
}

$resizedPaths[$deferredImage->getPath()] = true;

$resizer->resizeDeferredImage($deferredImage);
}
}
Expand Down
76 changes: 58 additions & 18 deletions core-bundle/tests/Image/Studio/ImageResultTest.php
Expand Up @@ -261,42 +261,82 @@ public function provideDeferredImages(): \Generator
->willReturn(true)
;

$image = new Image('image0.jpg', $imagine, $filesystem);
$deferredImage1 = new DeferredImage('image1.jpg', $imagine, $dimensions);
$deferredImage2 = new DeferredImage('image2.jpg', $imagine, $dimensions);
$deferredImage3 = new DeferredImage('image3.jpg', $imagine, $dimensions);
$image = new Image('/project/dir/assets/image0.jpg', $imagine, $filesystem);
$deferredImage1 = new DeferredImage('/project/dir/assets/image1.jpg', $imagine, $dimensions);
$deferredImage2 = new DeferredImage('/project/dir/assets/image2.jpg', $imagine, $dimensions);
$deferredImage3 = new DeferredImage('/project/dir/assets/image3.jpg', $imagine, $dimensions);
$deferredImage4 = new DeferredImage('/project/dir/assets/image4.jpg', $imagine, $dimensions);

yield 'no deferred images' => [
['src' => $image],
[],
[],
];

yield 'img and sources with deferred images' => [
['src' => $deferredImage1],
yield 'img and sources with deferred images (without duplicates)' => [
[
['src' => $deferredImage2],
['src' => $deferredImage3],
'src' => $deferredImage1,
'srcset' => [[$deferredImage2, 'foo']],
],
[$deferredImage1, $deferredImage2, $deferredImage3],
[
[
'src' => $deferredImage3,
'srcset' => [[$deferredImage4]],
],
],
[$deferredImage1, $deferredImage2, $deferredImage3, $deferredImage4],
];

yield 'img and sources with deferred images (with duplicates)' => [
[
'src' => $deferredImage1,
'srcset' => [[$deferredImage2, 'foo'], [$deferredImage3]],
],
[
[
'src' => $deferredImage3,
'srcset' => [[$deferredImage2], [$deferredImage4]],
],
[
'src' => $deferredImage2,
'srcset' => [[$deferredImage4]],
],
],
[$deferredImage1, $deferredImage2, $deferredImage3, $deferredImage4],
];

yield 'img and sources with both deferred and non-deferred images' => [
['src' => $deferredImage1],
[
['src' => $image],
['src' => $deferredImage2],
'src' => $deferredImage1,
],
[$deferredImage1, $deferredImage2],
[
[
'src' => $image,
],
[
'src' => $deferredImage2,
'srcset' => [[$deferredImage3]],
],
],
[$deferredImage1, $deferredImage2, $deferredImage3],
];

yield 'elements without src key' => [
['foo' => 'bar'],
yield 'elements without src or srcset key' => [
[
'foo' => 'bar',
],
[
['bar' => 'foo'],
['src' => $deferredImage3],
[
'bar' => 'foo',
],
[
'srcset' => [['foo'], [$deferredImage2]],
],
[
'src' => $deferredImage1,
],
],
[$deferredImage3],
[$deferredImage1, $deferredImage2],
];
}

Expand Down

0 comments on commit 71ffe3f

Please sign in to comment.