diff --git a/classes/TagGenerator.php b/classes/TagGenerator.php index c2db8b1..21ef909 100644 --- a/classes/TagGenerator.php +++ b/classes/TagGenerator.php @@ -15,36 +15,77 @@ use Storage; class TagGenerator { public array $breakpoints; + private $compressor; public $path; - private CompressorFactory $compressorFactory; private $defaultOptions = [ 'lazy' => false, ]; - public function __construct(CompressorFactory $compressorFactory) + public function __construct() { - $this->compressorFactory = $compressorFactory; $this->breakpoints = Setting::get('breakpoints'); ksort($this->breakpoints); } - public function size(string $name): array + public function generate(MediaPath $path, ?string $ratio = 'original', $sizes = null, array $options = []): string { - $size = collect(Setting::get('sizes'))->filter(fn ($size) => $size['name'] === $name) - ->first(); + $options = array_merge($this->defaultOptions, $options); + $this->path = $path; + $this->compressor = $this->path->compressor(); + $this->compressor->start(); - if (is_null($size)) { - throw new ResizerException("Size with name {$name} not found."); + try { + if (!$this->compressor->shouldGenerateVersions()) { + return $this->fallback(); + } + } catch (CompressorNotFoundException $e) { + return $this->fallback(); } - return explode('x', $size['aspect_ratio']); + $files = $this->possibleFiles($ratio); + + if ($files === null) { + return $this->fallback(); + } + + $sizes = $this->parseSizes($files, $sizes); + + $srcset = $files->map(function($file) { + return "{$file->get('url')} {$file->get('width')}w"; + }); + + $html = $this->htmlAttributes(collect([ + 'width' => $files->last()->get('width'), + 'height' => $files->last()->get('height'), + 'sizes' => $sizes->implode(', '), + $options['lazy'] ? 'data-srcset' : 'srcset' => $srcset->implode(', '), + $options['lazy'] ? 'data-src' : 'src' => $files->last()->get('url'), + 'class' => data_get($options, 'class'), + ])->filter(fn ($value) => (bool) $value)); + + $this->compressor->end(); + + return $html; } - public function possibleFiles(string $ratio): ?Collection + public function singleFile(MediaPath $path, ?string $ratio = 'original'): string + { + $this->path = $path; + $this->compressor = $this->path->compressor(); + $this->compressor->start(); + $versions = $this->possibleFiles($ratio); + throw_unless($versions && count($versions), Exception::class, "No files for {$path->root()} found"); + $possibleFiles = url($this->possibleFiles($ratio)->last()->get('url')); + $this->compressor->end(); + + return $possibleFiles; + } + + private function possibleFiles(string $ratio): ?Collection { $filename = $this->path->filename(); $basePath = $this->path->versionsDirPath(); - [$originalWidth, $originalHeight] = $this->path->compressor()->originalSize(); + [$originalWidth, $originalHeight] = $this->compressor->originalSize(); $aspectRatio = $ratio === 'original' ? $originalWidth / $originalHeight : $this->size($ratio)[0] / $this->size($ratio)[1]; @@ -69,52 +110,6 @@ class TagGenerator { : null; } - public function generate(MediaPath $path, ?string $ratio = 'original', $sizes = null, array $options = []): string - { - $options = array_merge($this->defaultOptions, $options); - $this->path = $path; - - try { - if (!$path->compressor()->shouldGenerateVersions()) { - return $this->fallback(); - } - } catch (CompressorNotFoundException $e) { - return $this->fallback(); - } - - $files = $this->possibleFiles($ratio); - - if ($files === null) { - return $this->fallback(); - } - - $sizes = $this->parseSizes($files, $sizes); - - $srcset = $files->map(function($file) { - return "{$file->get('url')} {$file->get('width')}w"; - }); - - return $this->htmlAttributes(collect([ - 'width' => $files->last()->get('width'), - 'height' => $files->last()->get('height'), - 'sizes' => $sizes->implode(', '), - $options['lazy'] ? 'data-srcset' : 'srcset' => $srcset->implode(', '), - $options['lazy'] ? 'data-src' : 'src' => $files->last()->get('url'), - 'class' => data_get($options, 'class'), - ])->filter(fn ($value) => (bool) $value)); - } - - public function singleFile(MediaPath $path, ?string $ratio = 'original'): string - { - $this->path = $path; - - $versions = $this->possibleFiles($ratio); - - throw_unless($versions && count($versions), Exception::class, "No files for {$path->root()} found"); - - return url($this->possibleFiles($ratio)->last()->get('url')); - } - private function htmlAttributes($attr) { return $attr->map(function($value, $key) { return "{$key}=\"{$value}\""; @@ -146,4 +141,17 @@ class TagGenerator { { return 'src="'.$this->path->publicUrl().'"'; } + + private function size(string $name): array + { + $size = collect(Setting::get('sizes'))->filter(fn ($size) => $size['name'] === $name) + ->first(); + + if (is_null($size)) { + throw new ResizerException("Size with name {$name} not found."); + } + + return explode('x', $size['aspect_ratio']); + } + } diff --git a/compressors/PdfCompressor.php b/compressors/PdfCompressor.php index de004a8..9110602 100644 --- a/compressors/PdfCompressor.php +++ b/compressors/PdfCompressor.php @@ -10,6 +10,8 @@ use Storage; class PdfCompressor extends Compressor { + private string $originalImage; + public function getExtensionRegex(): string { return 'pdf\.jpg'; @@ -41,6 +43,7 @@ class PdfCompressor extends Compressor public function start(): void { @unlink($this->imagePath()); + $this->originalImage = $this->extractImage(); } public function end(): void @@ -65,10 +68,7 @@ class PdfCompressor extends Compressor public function originalSize(): array { - $filename = $this->extractImage($this->media->root()); - $size = getimagesize($filename); - - return $size; + return getimagesize($this->originalImage); } public function shouldGenerateVersions(): bool @@ -78,10 +78,9 @@ class PdfCompressor extends Compressor public function resize(Collection $size, bool $update, callable $callback): void { - $temp = $this->extractImage(); - $tempBefore = PATHINFO($temp, PATHINFO_FILENAME).'compiled.'.pathinfo($temp, PATHINFO_EXTENSION); + $tempBefore = PATHINFO($this->originalImage, PATHINFO_FILENAME).'compiled.'.pathinfo($this->originalImage, PATHINFO_EXTENSION); - $r = app(ImageManager::class)->make($temp) + $r = app(ImageManager::class)->make($this->originalImage) ->fit($size->get('width'), $size->get('height')) ->save($tempBefore);