Skip to content

Commit

Permalink
Merge pull request #11 from sitegeist/feature/addSetDimensionsAndPres…
Browse files Browse the repository at this point in the history
…erverAspect

FEATURE: add `setDimensions` to imageSourceInterface and add second `preserveAspect` argument to `setWidth` and `setHeight`
  • Loading branch information
mficzel committed Jun 26, 2019
2 parents d6a77eb + f128ae5 commit 3528c74
Show file tree
Hide file tree
Showing 7 changed files with 148 additions and 88 deletions.
29 changes: 26 additions & 3 deletions Classes/EelHelpers/AbstractImageSourceHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,39 @@ abstract class AbstractImageSourceHelper implements ImageSourceHelperInterface
*/
protected $thumbnailPresets;

public function setWidth(int $targetWidth = null) : ImageSourceHelperInterface
/**
* @param int|null $targetWidth
* @param bool $preserveAspectRatio
* @return ImageSourceHelperInterface
*/
public function setWidth(int $targetWidth = null, bool $preserveAspect = false) : ImageSourceHelperInterface
{
$newSource = clone($this);
$newSource->targetWidth = $targetWidth;
return $newSource;
}

public function setHeight(int $targetHeight = null) : ImageSourceHelperInterface
/**
* @param int|null $targetHeight
* @param bool $preserverAspectRatio
* @return ImageSourceHelperInterface
*/
public function setHeight(int $targetHeight = null, bool $preserveAspect = false) : ImageSourceHelperInterface
{
$newSource = clone($this);
$newSource->targetHeight = $targetHeight;
return $newSource;
}

/**
* @param int|null $targetWidth
* @param int|null $targetHeight
* @return ImageSourceHelperInterface
*/
public function setDimensions(int $targetWidth = null, int $targetHeight = null) : ImageSourceHelperInterface
{
$newSource = clone($this);
$newSource->targetWidth = $targetWidth;
$newSource->targetHeight = $targetHeight;
return $newSource;
}
Expand Down Expand Up @@ -111,7 +134,7 @@ public function srcset($mediaDescriptors): string
*/
public function allowsCallOfMethod($methodName)
{
if (in_array($methodName, ['setWidth', 'setHeight', 'applyPreset', 'src', 'srcset'])) {
if (in_array($methodName, ['setWidth', 'setHeight', 'setDimensions', 'applyPreset', 'src', 'srcset'])) {
return true;
} else {
return false;
Expand Down
99 changes: 99 additions & 0 deletions Classes/EelHelpers/AbstractScalableImageSourceHelper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
<?php
namespace Sitegeist\Kaleidoscope\EelHelpers;


abstract class AbstractScalableImageSourceHelper extends AbstractImageSourceHelper implements ScalableImageSourceHelperInterface
{
/**
* @var int
*/
protected $baseWidth = null;

/**
* @var int
*/
protected $baseHeight = null;

/**
* @param int|null $targetWidth
* @param bool $preserveAspectRatio
* @return ImageSourceHelperInterface
*/
public function setWidth(int $targetWidth = null, bool $preserveAspect = false) : ImageSourceHelperInterface
{
$newSource = clone($this);
$newSource->targetWidth = $targetWidth;
if ($preserveAspect === true) {
$aspect = ($this->targetWidth ?: $this->baseWidth) / ($this->targetHeight ?: $this->baseHeight);
$newSource->targetHeight = round($targetWidth / $aspect);
}
return $newSource;
}

/**
* @param int|null $targetHeight
* @param bool $preserverAspectRatio
* @return ImageSourceHelperInterface
*/
public function setHeight(int $targetHeight = null, bool $preserveAspect = false) : ImageSourceHelperInterface
{
$newSource = clone($this);
$newSource->targetHeight = $targetHeight;
if ($preserveAspect === true) {
$aspect = ($this->targetWidth ?: $this->baseWidth) / ($this->targetHeight ?: $this->baseHeight);
$newSource->targetWidth = round($targetHeight * $aspect);
}
return $newSource;
}

/**
* @param float $factor
* @return ImageSourceHelperInterface
*/
public function scale(float $factor): ImageSourceHelperInterface
{
$scaledHelper = clone($this);

if ($this->targetWidth && $this->targetHeight) {
$scaledHelper = $scaledHelper->setDimensions(round($factor * $this->targetWidth), round($factor * $this->targetHeight));
} elseif ($this->targetWidth) {
$scaledHelper = $scaledHelper->setWidth(round($factor * $this->targetWidth));
} elseif ($this->targetHeight) {
$scaledHelper = $scaledHelper->setHeight(round($factor * $this->targetHeight));
} else {
$scaledHelper = $scaledHelper->setWidth(round($factor * $this->baseWidth));
}

return $scaledHelper;
}

/**
* @return int
*/
public function getCurrentWidth() : int
{
if ($this->targetWidth) {
return $this->targetWidth;
} elseif ($this->targetHeight) {
return round($this->targetHeight * $this->baseWidth/ $this->baseHeight);
} else {
return $this->baseWidth;
}
}


/**
* @return int
*/
public function getCurrentHeight() : int
{
if ($this->targetHeight) {
return $this->targetHeight;
} elseif ($this->targetWidth) {
return round($this->targetWidth * $this->baseHeight / $this->baseWidth);
} else {
return $this->baseHeight;
}
}

}
50 changes: 9 additions & 41 deletions Classes/EelHelpers/AssetImageSourceHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
use Neos\Media\Domain\Model\ThumbnailConfiguration;
use Neos\Flow\Mvc\ActionRequest;

class AssetImageSourceHelper extends AbstractImageSourceHelper implements ScalableImageSourceHelperInterface
class AssetImageSourceHelper extends AbstractScalableImageSourceHelper
{

/**
Expand Down Expand Up @@ -45,6 +45,8 @@ class AssetImageSourceHelper extends AbstractImageSourceHelper implements Scalab
public function __construct(ImageInterface $asset)
{
$this->asset = $asset;
$this->baseWidth = $this->asset->getWidth();
$this->baseHeight = $this->asset->getHeight();
}


Expand All @@ -64,25 +66,12 @@ public function setRequest(ActionRequest $request): void
$this->request = $request;
}

public function scale(float $factor): ImageSourceHelperInterface
{
$scaledHelper = clone($this);

if ($this->targetWidth) {
$scaledHelper = $scaledHelper->setWidth(round($factor * $this->targetWidth));
} else {
$scaledHelper = $scaledHelper->setWidth(round($factor * $this->asset->getWidth()));
}

if ($this->targetHeight) {
$scaledHelper = $scaledHelper->setHeight(round($factor * $this->targetHeight));
} else if (!$this->targetWidth) {
$scaledHelper = $scaledHelper->setHeight(round($factor * $this->asset->getHeight()));
}

return $scaledHelper;
}

/**
* @return string
* @throws \Neos\Flow\Mvc\Routing\Exception\MissingActionNameException
* @throws \Neos\Media\Exception\AssetServiceException
* @throws \Neos\Media\Exception\ThumbnailServiceException
*/
public function src(): string
{
$async = $this->request ? $this->async : false;
Expand Down Expand Up @@ -112,26 +101,5 @@ public function src(): string
return $thumbnailData['src'];
}

public function getCurrentWidth() : int
{
if ($this->targetWidth) {
return $this->targetWidth;
} elseif ($this->targetHeight) {
return round($this->targetHeight * $this->asset->getWidth() / $this->asset->getHeight());
} else {
return $this->asset->getWidth();
}
}


public function getCurrentHeight() : int
{
if ($this->targetHeight) {
return $this->targetHeight;
} elseif ($this->targetWidth) {
return round($this->targetWidth * $this->asset->getHeight() / $this->asset->getWidth());
} else {
return $this->asset->getHeight();
}
}
}
44 changes: 4 additions & 40 deletions Classes/EelHelpers/DummyImageSourceHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

use Neos\Flow\Annotations as Flow;

class DummyImageSourceHelper extends AbstractImageSourceHelper implements ScalableImageSourceHelperInterface
class DummyImageSourceHelper extends AbstractScalableImageSourceHelper
{
protected $baseWidth = 600;

Expand Down Expand Up @@ -65,22 +65,9 @@ public function setText($text): void
$this->text = $text;
}

public function scale(float $factor): ImageSourceHelperInterface
{
$scaledHelper = clone($this);
$scaledHelper->setBaseWidth(round($factor * $this->baseWidth));
$scaledHelper->setBaseHeight(round($factor * $this->baseHeight));

if ($this->targetWidth) {
$scaledHelper = $scaledHelper->setWidth(round($factor * $this->targetWidth));
}
if ($this->targetHeight) {
$scaledHelper = $scaledHelper->setHeight(round($factor * $this->targetHeight));
}

return $scaledHelper;
}

/**
* @return string
*/
public function src(): string
{
$uri = $this->baseUri . '?' . http_build_query (
Expand All @@ -94,27 +81,4 @@ public function src(): string
);
return $uri;
}

public function getCurrentWidth() : int
{
if ($this->targetWidth) {
return $this->targetWidth;
} elseif ($this->targetHeight) {
return round($this->targetHeight * $this->baseWidth / $this->baseHeight);
} else {
return $this->baseWidth;
}
}


public function getCurrentHeight() : int
{
if ($this->targetHeight) {
return $this->targetHeight;
} elseif ($this->targetWidth) {
return round($this->targetWidth * $this->baseHeight / $this->baseWidth);
} else {
return $this->baseHeight;
}
}
}
6 changes: 4 additions & 2 deletions Classes/EelHelpers/ImageSourceHelperInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@

interface ImageSourceHelperInterface extends ProtectedContextAwareInterface
{
public function setWidth(int $width = null) : ImageSourceHelperInterface;
public function setWidth(int $width = null, bool $preserveAspect = false) : ImageSourceHelperInterface;

public function setHeight(int $height = null) : ImageSourceHelperInterface;
public function setHeight(int $height = null, bool $preserveAspect = false) : ImageSourceHelperInterface;

public function setDimensions(int $width = null, int $height = null) : ImageSourceHelperInterface;

public function applyPreset(string $name) : ImageSourceHelperInterface;

Expand Down
3 changes: 3 additions & 0 deletions Classes/EelHelpers/UriImageSourceHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ public function __construct(string $uri)
$this->uri = $uri;
}

/**
* @return string
*/
public function src(): string
{
return $this->uri;
Expand Down
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -274,8 +274,9 @@ dimensions and to render the `src` and `srcset`-attributes.
Methods of ImageSource-Helpers that are accessible via EEL:

- `applyPreset( string )`: Set width and/or height via named-preset from Settings `Neos.Media.thumbnailPresets`
- `setWidth( integer )`: Set the intend width
- `setHeight( integer )`: Set the intended height
- `setWidth( integer $width, bool $preserveAspect = false )`: Set the intend width modify height aswell if
- `setHeight( integer $height, bool $preserveAspect = false )`: Set the intended height
- `setDimensions( integer, interger)`: Set the intended width and height
- `src ()` : Render a src attribute for the given ImageSource-object
- `srcset ( array of descriptors )` : render a srcset attribute for the ImageSource with given media descriptors like `2.x` or `800w`

Expand Down

0 comments on commit 3528c74

Please sign in to comment.