* * @var bool */ protected $trailingSlash = true; /** * Tag noise */ protected $noise = ''; /** * The encoding class to... encode the tags * * @var mixed */ protected $encode = null; /** * Sets up the tag with a name. * * @param $name */ public function __construct(string $name) { $this->name = $name; } /** * Magic method to get any of the attributes. * * @param string $key * @return mixed */ public function __get($key) { return $this->getAttribute($key); } /** * Magic method to set any attribute. * * @param string $key * @param mixed $value */ public function __set($key, $value) { $this->setAttribute($key, $value); } /** * Returns the name of this tag. * * @return string */ public function name(): string { return $this->name; } /** * Sets the tag to be self closing. * * @return Tag * @chainable */ public function selfClosing(): Tag { $this->selfClosing = true; return $this; } /** * Sets the tag to not use a trailing slash. * * @return Tag * @chainable */ public function noTrailingSlash(): Tag { $this->trailingSlash = false; return $this; } /** * Checks if the tag is self closing. * * @return bool */ public function isSelfClosing(): bool { return $this->selfClosing; } /** * Sets the encoding type to be used. * * @param Encode $encode * @return void */ public function setEncoding(Encode $encode): void { $this->encode = $encode; } /** * Sets the noise for this tag (if any) * * @param string $noise * @return Tag * @chainable */ public function noise(string $noise): Tag { $this->noise = $noise; return $this; } /** * Set an attribute for this tag. * * @param string $key * @param string|array $value * @return Tag * @chainable */ public function setAttribute(string $key, $value): Tag { $key = strtolower($key); if ( ! is_array($value)) { $value = [ 'value' => $value, 'doubleQuote' => true, ]; } $this->attr[$key] = $value; return $this; } /** * Set inline style attribute value. * * @param mixed $attr_key * @param mixed $attr_value */ public function setStyleAttributeValue($attr_key, $attr_value): void { $style_array = $this->getStyleAttributeArray(); $style_array[$attr_key] = $attr_value; $style_string = ''; foreach ($style_array as $key => $value) { $style_string .= $key . ':' . $value . ';'; } $this->setAttribute('style', $style_string); } /** * Get style attribute in array * * @return array */ public function getStyleAttributeArray(): array { $value = $this->getAttribute('style')['value']; if ($value === null) { return []; } $value = explode(';', substr(trim($value), 0, -1)); $result = []; foreach ($value as $attr) { $attr = explode(':', $attr); $result[$attr[0]] = $attr[1]; } return $result; } /** * Removes an attribute from this tag. * * @param mixed $key * @return void */ public function removeAttribute($key) { $key = strtolower($key); unset($this->attr[$key]); } /** * Removes all attributes on this tag. * * @return void */ public function removeAllAttributes() { $this->attr = []; } /** * Sets the attributes for this tag * * @param array $attr * @return $this */ public function setAttributes(array $attr) { foreach ($attr as $key => $value) { $this->setAttribute($key, $value); } return $this; } /** * Returns all attributes of this tag. * * @return array */ public function getAttributes() { $return = []; foreach ($this->attr as $attr => $info) { $return[$attr] = $this->getAttribute($attr); } return $return; } /** * Returns an attribute by the key * * @param string $key * @return mixed */ public function getAttribute(string $key) { if ( ! isset($this->attr[$key])) { return null; } $value = $this->attr[$key]['value']; if (is_string($value) && ! is_null($this->encode)) { // convert charset $this->attr[$key]['value'] = $this->encode->convert($value); } return $this->attr[$key]; } /** * Returns TRUE if node has attribute * * @param string $key * @return bool */ public function hasAttribute(string $key) { return isset($this->attr[$key]); } /** * Generates the opening tag for this object. * * @return string */ public function makeOpeningTag() { $return = '<'.$this->name; // add the attributes foreach ($this->attr as $key => $info) { $info = $this->getAttribute($key); $val = $info['value']; if (is_null($val)) { $return .= ' '.$key; } elseif ($info['doubleQuote']) { $return .= ' '.$key.'="'.$val.'"'; } else { $return .= ' '.$key.'=\''.$val.'\''; } } if ($this->selfClosing && $this->trailingSlash) { return $return.' />'; } else { return $return.'>'; } } /** * Generates the closing tag for this object. * * @return string */ public function makeClosingTag() { if ($this->selfClosing) { return ''; } return 'name.'>'; } }