addCandidate(SrcsetCandidate::createFromDescriptor((string)$descriptor, $referenceWidth)); } return $generator; } public function addCandidate(SrcsetCandidate $candidate): static { if (!$this->isValidCandidate($candidate)) { throw new \InvalidArgumentException(sprintf( 'Invalid mix of w and x descriptors in srcset: %s, ..., %s', $this->candidates[0]->generateSrcset(), $candidate->generateSrcset() ), 1697745459); } $this->candidates[] = $candidate; return $this; } /** * @return SrcsetCandidate[] */ public function getCandidates(): array { return $this->candidates; } public function generateSrcset(): string { $uniqueSrcset = []; foreach ($this->candidates as $candidate) { $uniqueSrcset[$candidate->getDescriptor()] = $candidate->generateSrcset(); } return implode(', ', $uniqueSrcset); } public function __toString() { return $this->generateSrcset(); } private function isValidCandidate(SrcsetCandidate $candidate): bool { if (!isset($this->candidateType)) { $this->candidateType = ($candidate instanceof DensitySrcsetCandidate) ? DensitySrcsetCandidate::class : WidthSrcsetCandidate::class; return true; } return $candidate instanceof $this->candidateType; } }