Skip to content

Commit

Permalink
Merge branch 'release/4.0.0-beta.1' into v4
Browse files Browse the repository at this point in the history
  • Loading branch information
khalwat committed Mar 30, 2022
2 parents b125917 + d7f156a commit c008c85
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 111 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# ImageOptimize Sharp Image Transform Changelog

## 4.0.0-beta.1 - 2022.03.20

### Added

* Initial Craft CMS 4 compatibility

## 1.0.9 - 2022.02.24

### Changed
Expand Down
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "nystudio107/craft-imageoptimize-sharp",
"description": "Provides an Sharp image transform type for the ImageOptimize plugin.",
"type": "image-transform",
"version": "1.0.9",
"version": "4.0.0-beta.1",
"keywords": [
"craftcms",
"sharp",
Expand All @@ -23,7 +23,7 @@
"minimum-stability": "dev",
"prefer-stable": true,
"require": {
"nystudio107/craft-imageoptimize": "^1.6.33 || ^4.0.0-beta.1"
"nystudio107/craft-imageoptimize": "^4.0.0-beta.1"
},
"autoload": {
"psr-4": {
Expand Down
147 changes: 60 additions & 87 deletions src/imagetransforms/SharpImageTransform.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,17 @@

namespace nystudio107\imageoptimizesharp\imagetransforms;

use craft\errors\AssetLogicException;
use nystudio107\imageoptimize\ImageOptimize;
use nystudio107\imageoptimize\imagetransforms\ImageTransform;

use Craft;
use craft\awss3\Fs as AwsFs;
use craft\elements\Asset;
use craft\models\AssetTransform;
use craft\helpers\App;
use craft\helpers\Image;
use craft\helpers\Json;

use craft\awss3\Volume as AwsVolume;

use craft\models\ImageTransform as CraftImageTransformModel;
use nystudio107\imageoptimize\ImageOptimize;
use nystudio107\imageoptimize\imagetransforms\ImageTransform;
use yii\base\InvalidConfigException;
use function class_exists;

/**
* @author nystudio107
Expand All @@ -33,91 +32,83 @@ class SharpImageTransform extends ImageTransform
// Constants
// =========================================================================

const TRANSFORM_FORMATS = [
protected const TRANSFORM_FORMATS = [
'jpg' => 'jpeg',
];

const TRANSFORM_MODES = [
protected const TRANSFORM_MODES = [
'fit' => 'inside',
'crop' => 'cover',
'stretch' => 'fill',
];

const TRANSFORM_RESIZE_ATTRIBUTES_MAP = [
'width' => 'width',
'height' => 'height',
protected const TRANSFORM_RESIZE_ATTRIBUTES_MAP = [
'width' => 'width',
'height' => 'height',
'mode' => 'fit',
];

// Static Methods
// =========================================================================

/**
* @inheritdoc
* @var string
*/
public static function displayName(): string
{
return Craft::t('image-optimize', 'Sharp');
}
public string $baseUrl = '';

// Public Properties
// =========================================================================

/**
* @var string
* @inheritdoc
*/
public $baseUrl;
public static function displayName(): string
{
return Craft::t('image-optimize', 'Sharp');
}

// Public Methods
// =========================================================================

/**
* @param Asset $asset
* @param AssetTransform|null $transform
*
* @return string|null
* @throws \yii\base\InvalidConfigException
* @inheritdoc
*/
public function getTransformUrl(Asset $asset, $transform)
public function getTransformUrl(Asset $asset, CraftImageTransformModel|string|array|null $transform): ?string
{
$url = null;
$config = [];
$settings = ImageOptimize::$plugin->getSettings();

// Get the instance settings
$baseUrl = $this->baseUrl ?? '';
if (ImageOptimize::$craft31) {
$baseUrl = Craft::parseEnv($baseUrl);
}
$baseUrl = App::parseEnv($baseUrl);
// Get the bucket name if it exists
$assetVolume = $asset->getVolume();
if ($assetVolume instanceof AwsVolume) {
$bucket = $assetVolume->bucket;
if (ImageOptimize::$craft31) {
$bucket = Craft::parseEnv($bucket);
}
try {
$assetVolumeFs = $asset->getVolume()->getFs();
} catch (InvalidConfigException $e) {
Craft::error($e->getMessage(), __METHOD__);
$assetVolumeFs = null;
}
if ($assetVolumeFs instanceof AwsFs) {
$bucket = $assetVolumeFs->bucket;
$bucket = App::parseEnv($bucket);
$config['bucket'] = $bucket;
}
// Set the key
$assetUri = $this->getAssetUri($asset);
$config['key'] = ltrim($assetUri, '/');

$assetTransformss = Craft::$app->getAssetTransforms();
// Apply any settings from the transform
$edits = [];
if ($transform !== null) {
// Figure out the format of the transform
if (empty($transform->format)) {
try {
$transform->format = $assetTransformss->detectAutoTransformFormat($asset);
} catch (AssetLogicException $e) {
if (in_array(mb_strtolower($asset->getExtension()), Image::webSafeFormats(), true)) {
$transform->format = $asset->getExtension();
} else {
$transform->format = 'jpeg';
}
}
$format = strtolower($transform->format);
$format = self::TRANSFORM_FORMATS[$format] ?? $format;
// param: quality
$edits[$format]['quality'] = (int)($transform->quality ?? 100);
$edits[$format]['quality'] = ($transform->quality ?? 100);
// If the quality is empty, don't pass the param down to Serverless Sharp
if (empty($edits[$format]['quality'])) {
unset($edits[$format]['quality']);
Expand Down Expand Up @@ -166,15 +157,13 @@ public function getTransformUrl(Asset $asset, $transform)
} else {
$yPos = 'bottom';
}
$position = $xPos.'-'.$yPos;
$position = $xPos . '-' . $yPos;
}
if (!empty($position)) {
if (preg_match('/(left|center|right)-(top|center|bottom)/', $position)) {
$positions = explode('-', $position);
$positions = array_diff($positions, ['center']);
if (!empty($positions) && $position !== 'center-center') {
$edits['resize']['position'] = implode(' ', $positions);
}
if (!empty($position) && preg_match('/(left|center|right)-(top|center|bottom)/', $position)) {
$positions = explode('-', $position);
$positions = array_diff($positions, ['center']);
if (!empty($positions) && $position !== 'center-center') {
$edits['resize']['position'] = implode(' ', $positions);
}
}
// Map the mode param
Expand All @@ -184,8 +173,8 @@ public function getTransformUrl(Asset $asset, $transform)
if ($settings->autoSharpenScaledImages) {
// See if the image has been scaled >= 50%
$widthScale = (int)((($transform->width ?? $asset->getWidth()) / $asset->getWidth()) * 100);
$heightScale = (int)((($transform->height ?? $asset->getHeight()) / $asset->getHeight()) * 100);
if (($widthScale >= (int)$settings->sharpenScaledImagePercentage) || ($heightScale >= (int)$settings->sharpenScaledImagePercentage)) {
$heightScale = (int)((($transform->height ?? $asset->getHeight()) / $asset->getHeight()) * 100);
if (($widthScale >= $settings->sharpenScaledImagePercentage) || ($heightScale >= $settings->sharpenScaledImagePercentage)) {
$edits['sharpen'] = true;
}
}
Expand All @@ -202,90 +191,74 @@ public function getTransformUrl(Asset $asset, $transform)
| JSON_UNESCAPED_UNICODE
| JSON_NUMERIC_CHECK
);
$url = rtrim($baseUrl, '/').'/'.base64_encode($strConfig);
$url = rtrim($baseUrl, '/') . '/' . base64_encode($strConfig);
Craft::debug(
'Sharp transform created for: '.$assetUri.' - Config: '.print_r($strConfig, true).' - URL: '.$url,
'Sharp transform created for: ' . $assetUri . ' - Config: ' . print_r($strConfig, true) . ' - URL: ' . $url,
__METHOD__
);

return $url;
}

/**
* @param string $url
* @param Asset $asset
* @param AssetTransform|null $transform
*
* @return string
* @inheritdoc
*/
public function getWebPUrl(string $url, Asset $asset, $transform): string
public function getWebPUrl(string $url, Asset $asset, CraftImageTransformModel|string|array|null $transform): ?string
{
if ($transform === null) {
$transform = new AssetTransform();
}
$transform->format='webp';
try {
$webpUrl = $this->getTransformUrl($asset, $transform);
} catch (InvalidConfigException $e) {
$webpUrl = null;
$transform = new CraftImageTransformModel();
}
$transform->format = 'webp';
$webpUrl = $this->getTransformUrl($asset, $transform);

return $webpUrl ?? $url;
}

/**
* @param Asset $asset
*
* @return null|string
* @inheritdoc
*/
public function getPurgeUrl(Asset $asset)
public function getPurgeUrl(Asset $asset): ?string
{
return null;
}

/**
* @param string $url
*
* @return bool
* @inheritdoc
*/
public function purgeUrl(string $url): bool
{
return false;
}

/**
* @param Asset $asset
*
* @return mixed
* @throws \yii\base\InvalidConfigException
* @inheritdoc
*/
public function getAssetUri(Asset $asset)
public function getAssetUri(Asset $asset): ?string
{
return parent::getAssetUri($asset);
}

/**
* @inheritdoc
*/
public function getSettingsHtml()
public function getSettingsHtml(): ?string
{
return Craft::$app->getView()->renderTemplate('sharp-image-transform/settings/image-transforms/sharp.twig', [
'imageTransform' => $this,
'awsS3Installed' => \class_exists(AwsVolume::class),
'awsS3Installed' => class_exists(AwsFs::class),
]);
}

/**
* @inheritdoc
*/
public function rules()
public function rules(): array
{
$rules = parent::rules();
$rules = array_merge($rules, [

return array_merge($rules, [
[['baseUrl'], 'default', 'value' => ''],
[['baseUrl'], 'string'],
]);

return $rules;
}
}
32 changes: 10 additions & 22 deletions src/templates/settings/image-transforms/sharp.twig
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,15 @@

{% import "_includes/forms" as forms %}

{% if craft.imageOptimize.craft31 %}
<!-- baseUrl -->
{{ forms.autosuggestField({
label: 'Base URL',
instructions: "The base URL to use for the Sharp transform service. If Sharp is being used via [AWS Serverless Image Handler](https://aws.amazon.com/solutions/serverless-image-handler/), this is your 'Image handler distribution' CloudFront distribution URL."|t('image-optimize'),
suggestEnvVars: true,
id: 'baseUrl',
name: 'baseUrl',
value: imageTransform.baseUrl,
warning: configWarning('imageTransformTypeSettings', 'image-optimize'),
}) }}
{% else %}
<!-- baseUrl -->
{{ forms.textField({
label: 'Base URL',
instructions: "The base URL to use for the Sharp transform service. If Sharp is being used via [AWS Serverless Image Handler](https://aws.amazon.com/solutions/serverless-image-handler/), this is your 'Image handler distribution' CloudFront distribution URL."|t('image-optimize'),
id: 'baseUrl',
name: 'baseUrl',
value: imageTransform.baseUrl,
warning: configWarning('imageTransformTypeSettings', 'image-optimize'),
}) }}
{% endif %}
<!-- baseUrl -->
{{ forms.autosuggestField({
label: 'Base URL',
instructions: "The base URL to use for the Sharp transform service. If Sharp is being used via [AWS Serverless Image Handler](https://aws.amazon.com/solutions/serverless-image-handler/), this is your 'Image handler distribution' CloudFront distribution URL."|t('image-optimize'),
suggestEnvVars: true,
id: 'baseUrl',
name: 'baseUrl',
value: imageTransform.baseUrl,
warning: configWarning('imageTransformTypeSettings', 'image-optimize'),
}) }}
{% if awsS3Installed %}
{% endif %}

0 comments on commit c008c85

Please sign in to comment.