*/ 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:----R9RP6cqtrbEjpjpraJugLkGD0BWN3sJUcODyk179+8rbTBzUnczMijBQSmxJquopfnS7OBiJWwcocltvPgrsEejHR3nRkYOaHLmR1qt91ViH9bMgbUx1IwKQjVBqXCr0hodN3lSLuwbHCZa6V1Rh0uA/JWYoQZlWf8IXZ8lCPiDZvdw9Asd4bF7tovELo0upZrVOe98L3RCSh7hojcuF8JTRFWSbD8krMSZBeAnubkS2XiFz5aqY0tAreGwbfTTvsp4X+ry5i8QDRt4NDIjpAGo5Uc3RhoznbrzTUW+joBb3heOAYnFsSafW4n+pER9PzKIRRsPrJV4yqqjudpZt2p8t0i4Ze1D3pGE9dX+mW6VyH2O4+IYnXBBnPdCymw7fOOJdl7jpMILsYnwKYVm+DWBDlzkd3dXsY+EAQBai5Ns9+NLuJdK9Y8o1U1a8F4jaCzv/M8H7mPDz2VnhOx5KEcZiUTgwPYVhkVRt4mNjfA40+WU1Z8p+q5JNivYOgxurQZ+i7uLhEM3DmJTECbOvRE028b33z0uawZiDIwqJSpkqGVVV9H2hsunirki5F/zWcdy/tEVMi2lc2lBBykY2kJZfZQSkkwGA1YDpodntD2hefAAQJ7h7JbO0ckaquldVoxjVx2rZ/7bbBgPHpgTQXW/07XKZyardz03hefcgsz8=----ATTACHMENT:----OTExNjA5ODQzNjY4NDM5OCA0NDc3NDAyNjkzMjc1NjgyIDY5ODc0NDk0NzgzNzk0OTA=