From da6e70c51712242391449153d69939296cd93751 Mon Sep 17 00:00:00 2001 From: FK Date: Thu, 18 Feb 2021 17:13:55 +0100 Subject: [PATCH 1/3] Add Helper in core and media modules - Core EmbeddedUrlHelper: Makes relative urls (starting with /var/public) in text absolute (prefixing with host and baseurl) - Media ImageHelper: Create compressed full path or compressed full paths for breakpoints (used in among others CMS, EMV) - Media EmbeddedImageHelper: Replace img src with relative original path in text with compressed full path or whole img tag with picture tag (replacing based of size parameter) --- .../Modules/Core/Helper/EmbeddedUrlHelper.php | 39 ++++++ .../Media/Helper/EmbeddedImageHelper.php | 75 ++++++++++++ Engine/Modules/Media/Helper/ImageHelper.php | 114 ++++++++++++++++++ 3 files changed, 228 insertions(+) create mode 100644 Engine/Modules/Core/Helper/EmbeddedUrlHelper.php create mode 100644 Engine/Modules/Media/Helper/EmbeddedImageHelper.php create mode 100644 Engine/Modules/Media/Helper/ImageHelper.php diff --git a/Engine/Modules/Core/Helper/EmbeddedUrlHelper.php b/Engine/Modules/Core/Helper/EmbeddedUrlHelper.php new file mode 100644 index 000000000..055dcbdd0 --- /dev/null +++ b/Engine/Modules/Core/Helper/EmbeddedUrlHelper.php @@ -0,0 +1,39 @@ + $size If array, img tag will be replaced by picture tag + * + * @return string + */ + public static function resolveSingle(?string $text, $size = 0) : string + { + if (empty($text)) { + return $text; + } + // Array + // ( + // [0] => + // [1] => " + // [4] => var/public/images/path + // [5] => " id=asd> + // [6] => " + // [7] => id=asd + // ) + $newText = preg_replace_callback( + '/()/m', + function (array $matches) use ($size) { + $imagePath = trim($matches[4]); + $attributes = rtrim(' ' . trim($matches[2]) . ' ' . trim($matches[7])); + $quoteStart = trim($matches[3]); + $quoteEnd = trim($matches[6]); + + $imagePaths = ImageHelper::resolveSingle($imagePath, $size); + if ($imagePaths === null) { + return $matches[0]; + } + if (is_array($imagePaths)) { + $sources = ''; + foreach ($imagePaths as $breakpoint => $url) { + $sources .= ""; + } + + return "$sources"; + } else { + return ""; + } + }, + $text + ); + + return ($newText ?? $text); + } + +} diff --git a/Engine/Modules/Media/Helper/ImageHelper.php b/Engine/Modules/Media/Helper/ImageHelper.php new file mode 100644 index 000000000..9b4c0044a --- /dev/null +++ b/Engine/Modules/Media/Helper/ImageHelper.php @@ -0,0 +1,114 @@ +Services()->get('image.compress'); + } catch (ServiceNotFoundException $exception) { + Oforge()->Logger()->logException($exception); + + return null; + } + } + $result = []; + if ($addOriginalImageUrl) { + try { + $relativePath = self::$imageCompressService->getPath($idOrPath, 0); + if ($relativePath !== null) { + $result['full'] = self::finaliseUrl($relativePath, 0); + } + } catch (Exception $exception) { + Oforge()->Logger()->logException($exception); + } + } + if (is_array($size)) { + foreach ($size as $breakpoint => $maxSize) { + try { + $relativePath = self::$imageCompressService->getPath($idOrPath, $maxSize); + if ($relativePath !== null) { + $result[$breakpoint] = self::finaliseUrl($relativePath, $maxSize); + } + } catch (Exception $exception) { + Oforge()->Logger()->logException($exception); + } + } + } else { + try { + $relativePath = self::$imageCompressService->getPath($idOrPath, $size); + if ($relativePath === null) { + return null; + } + $fullUrl = self::finaliseUrl($relativePath, $size); + if ($addOriginalImageUrl) { + $result[$size] = $fullUrl; + } else { + return $fullUrl; + } + } catch (Exception $exception) { + Oforge()->Logger()->logException($exception); + + return null; + } + } + + return $result; + } + + /** + * @param string $relativePath + * @param int $maxSize + * + * @return string + */ + private static function finaliseUrl(string $relativePath, int $maxSize) : string + { + if (self::DEBUG_SIZE) { + $relativePath .= (strpos($relativePath, '?') === false ? '?' : '&') . 'size=' . $maxSize; + } + + return RouteHelper::getFullUrl(str_replace(" ", "%20", $relativePath)); + } + +} From 9371e2735be0f47a12c040547ed06b3ba7bc28a6 Mon Sep 17 00:00:00 2001 From: FK Date: Thu, 18 Feb 2021 18:14:54 +0100 Subject: [PATCH 2/3] ImageHelper::resolveSingle: Rename to compressSingle, add missing img tag in picture --- Engine/Modules/Media/Helper/EmbeddedImageHelper.php | 13 +++++++++---- Engine/Modules/Media/Helper/ImageHelper.php | 8 ++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Engine/Modules/Media/Helper/EmbeddedImageHelper.php b/Engine/Modules/Media/Helper/EmbeddedImageHelper.php index 0a825a45f..2ada5f59d 100644 --- a/Engine/Modules/Media/Helper/EmbeddedImageHelper.php +++ b/Engine/Modules/Media/Helper/EmbeddedImageHelper.php @@ -51,19 +51,24 @@ function (array $matches) use ($size) { $quoteStart = trim($matches[3]); $quoteEnd = trim($matches[6]); - $imagePaths = ImageHelper::resolveSingle($imagePath, $size); + $imagePaths = ImageHelper::compressSingle($imagePath, $size); if ($imagePaths === null) { return $matches[0]; } if (is_array($imagePaths)) { $sources = ''; + $minBreakpoint = 999999999; foreach ($imagePaths as $breakpoint => $url) { - $sources .= ""; + if (is_numeric($breakpoint)) { + $minBreakpoint = min($minBreakpoint, $breakpoint); + } + $sources .= ''; } + $sources .= ''; - return "$sources"; + return '' . $sources . ''; } else { - return ""; + return ''; } }, $text diff --git a/Engine/Modules/Media/Helper/ImageHelper.php b/Engine/Modules/Media/Helper/ImageHelper.php index 9b4c0044a..34f94701e 100644 --- a/Engine/Modules/Media/Helper/ImageHelper.php +++ b/Engine/Modules/Media/Helper/ImageHelper.php @@ -23,12 +23,12 @@ private function __construct() { } - public static function resolveInArray(array &$data, string $key, $size = 0, bool $addOriginalImageUrl = ImageHelper::DEFAULT_ADD_ORIGINAL_IMAGE_URL) : void + public static function compressInArray(array &$data, string $key, $size = 0, bool $addOriginalImageUrl = ImageHelper::DEFAULT_ADD_ORIGINAL_IMAGE_URL) : void { if ( !isset($data[$key]) || empty($data[$key])) { return; } - $result = self::resolveSingle($data[$key], $size, $addOriginalImageUrl); + $result = self::compressSingle($data[$key], $size, $addOriginalImageUrl); if ($result !== null) { $data[$key] = $result; } @@ -41,7 +41,7 @@ public static function resolveInArray(array &$data, string $key, $size = 0, bool * * @return array|string|null Returns null on error, full url string for int $size, or responsive array. */ - public static function resolveSingle($idOrPath, $size = 0, bool $addOriginalImageUrl = ImageHelper::DEFAULT_ADD_ORIGINAL_IMAGE_URL) + public static function compressSingle($idOrPath, $size = 0, bool $addOriginalImageUrl = ImageHelper::DEFAULT_ADD_ORIGINAL_IMAGE_URL) { if (self::$imageCompressService === null) { try { @@ -108,7 +108,7 @@ private static function finaliseUrl(string $relativePath, int $maxSize) : string $relativePath .= (strpos($relativePath, '?') === false ? '?' : '&') . 'size=' . $maxSize; } - return RouteHelper::getFullUrl(str_replace(" ", "%20", $relativePath)); + return RouteHelper::getFullUrl(str_replace(' ', '%20', $relativePath)); } } From 07ac1eace61e4baff8d74ed2ddcfb8c747739401 Mon Sep 17 00:00:00 2001 From: FK Date: Fri, 19 Feb 2021 00:00:28 +0100 Subject: [PATCH 3/3] Include lazy loading --- .../Media/Helper/EmbeddedImageHelper.php | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/Engine/Modules/Media/Helper/EmbeddedImageHelper.php b/Engine/Modules/Media/Helper/EmbeddedImageHelper.php index 2ada5f59d..a0b6e5ba4 100644 --- a/Engine/Modules/Media/Helper/EmbeddedImageHelper.php +++ b/Engine/Modules/Media/Helper/EmbeddedImageHelper.php @@ -37,38 +37,35 @@ public static function resolveSingle(?string $text, $size = 0) : string // [0] => // [1] => " - // [4] => var/public/images/path - // [5] => " id=asd> - // [6] => " - // [7] => id=asd + // [3] => var/public/images/path + // [4] => " id=asd> + // [5] => id=asd // ) $newText = preg_replace_callback( - '/()/m', + '/()/m', function (array $matches) use ($size) { - $imagePath = trim($matches[4]); - $attributes = rtrim(' ' . trim($matches[2]) . ' ' . trim($matches[7])); - $quoteStart = trim($matches[3]); - $quoteEnd = trim($matches[6]); + $imagePath = trim($matches[3]); + $attributes = rtrim(' ' . trim($matches[2]) . ' ' . trim($matches[5])); + $attributes = preg_replace('/(.*?class=[\'"])(.*?)([\'"].*?)/', '$1$2 lazy$3', $attributes) ?? $attributes; $imagePaths = ImageHelper::compressSingle($imagePath, $size); if ($imagePaths === null) { return $matches[0]; } if (is_array($imagePaths)) { - $sources = ''; + $sources = ''; $minBreakpoint = 999999999; foreach ($imagePaths as $breakpoint => $url) { if (is_numeric($breakpoint)) { $minBreakpoint = min($minBreakpoint, $breakpoint); } - $sources .= ''; + $sources .= ''; } - $sources .= ''; + $sources .= ''; return '' . $sources . ''; } else { - return ''; + return ''; } }, $text