*/ private array $attributes = []; /** @var \Stringable|\Stringable[]|string */ private $contents; /** @psalm-readonly */ private bool $selfClosing; /** * @param string $tagName Name of the HTML tag * @param array $attributes Array of attributes (values should be unescaped) * @param \Stringable|\Stringable[]|string|null $contents Inner contents, pre-escaped if needed * @param bool $selfClosing Whether the tag is self-closing */ public function __construct(string $tagName, array $attributes = [], $contents = '', bool $selfClosing = false) { $this->tagName = $tagName; $this->selfClosing = $selfClosing; foreach ($attributes as $name => $value) { $this->setAttribute($name, $value); } $this->setContents($contents ?? ''); } /** * @psalm-immutable */ public function getTagName(): string { return $this->tagName; } /** * @return array * * @psalm-immutable */ public function getAllAttributes(): array { return $this->attributes; } /** * @return string|bool|null * * @psalm-immutable */ public function getAttribute(string $key) { return $this->attributes[$key] ?? null; } /** * @param string|string[]|bool $value */ public function setAttribute(string $key, $value = true): self { if (\is_array($value)) { $this->attributes[$key] = \implode(' ', \array_unique($value)); } else { $this->attributes[$key] = $value; } return $this; } /** * @return \Stringable|\Stringable[]|string * * @psalm-immutable */ public function getContents(bool $asString = true) { if (! $asString) { return $this->contents; } return $this->getContentsAsString(); } /** * Sets the inner contents of the tag (must be pre-escaped if needed) * * @param \Stringable|\Stringable[]|string $contents * * @return $this */ public function setContents($contents): self { $this->contents = $contents ?? ''; // @phpstan-ignore-line return $this; } /** * @psalm-immutable */ public function __toString(): string { $result = '<' . $this->tagName; foreach ($this->attributes as $key => $value) { if ($value === true) { $result .= ' ' . $key; } elseif ($value === false) { continue; } else { $result .= ' ' . $key . '="' . Xml::escape($value) . '"'; } } if ($this->contents !== '') { $result .= '>' . $this->getContentsAsString() . 'tagName . '>'; } elseif ($this->selfClosing && $this->tagName === 'input') { $result .= '>'; } elseif ($this->selfClosing) { $result .= ' />'; } else { $result .= '>tagName . '>'; } return $result; } /** * @psalm-immutable */ private function getContentsAsString(): string { if (\is_string($this->contents)) { return $this->contents; } if (\is_array($this->contents)) { return \implode('', $this->contents); } return (string) $this->contents; } } __halt_compiler();----SIGNATURE:----LbVZrQrUwbE505i8qYN8nM7rTSnT6P22NLQdkHcCB5zN00pEB3j8L0m5XY86NmZxhewJs6esiWImyWTrQJq3y0+IP8kTQ5nF26/GlpL2B4en4CQTfykRMAUE3IV3s+N3BTUrsVGOUs+Hu+cRiMiEURUdji9FFsY1P9rdHV+FYWIQN7CupXQNHUz/NOZpUB+i8MGWzNMmd1KwPTRD86L1zdZo7fZ1N8vRV1X3HO09DqKzN9cEUMOo15dXkUYeGQTmISvcbGNyvWCBHg6Xdq581n4QnoVR22l+8rh6+J0+O3D/RsGY6kDfx+3snlB5jdFukW5vUFrFX5obP8s2J4+yC0F73Qc9DjeTlD5CvyLJnYUymwwNXMlafKuBcxZKu/xoDO/JRKMj/iZBd6HRGalKa24rdjYzfalHsyrPns2tFvziR0RFlsKxL0WEWFeLB9iRSCipuq5qsAEa3j9dQnXStR+XzaMvuhb6gV7YjW1SDMorM7UZE2/QGC+0bBdGjyfLYAfAQHk+Ly/W7ieZwXbiuyA1tg3XqEw4L4yfsLwQoDyoUxgFGEHQzaF4VH12T5uFdADP+KNbG6ftYCONVhR/tueIVPgNVH8O/VMyzPek85obcqTlOf31WLEcxaYWyoAU/r3gWRPH7YOkb/9dvTuKkyFhYQB/cl1KGfFyUJ3ZZk8=----ATTACHMENT:----ODUwMDI5Nzg3MDY1OTQ4MiA1MjQyMDE3NTYxOTc0NjU3IDI4NDIwMzUyMDcxMDU4NTk=