moved a lot of behavior to a trait
This commit is contained in:
parent
82112ba83c
commit
7b57cb4ee1
4 changed files with 118 additions and 109 deletions
|
@ -1,2 +1,3 @@
|
||||||
# html-object-strings
|
# html-object-strings
|
||||||
|
|
||||||
|
An HTML string-building library, used for building HTML strings from simple and easy-to-use objects.
|
||||||
|
|
|
@ -2,18 +2,13 @@
|
||||||
/* HTML Object Strings | https://gitlab.com/byjoby/html-object-strings | MIT License */
|
/* HTML Object Strings | https://gitlab.com/byjoby/html-object-strings | MIT License */
|
||||||
namespace HtmlObjectStrings;
|
namespace HtmlObjectStrings;
|
||||||
|
|
||||||
class GenericTag implements HtmlInterface
|
class GenericTag implements TagInterface
|
||||||
{
|
{
|
||||||
|
use TagTrait;
|
||||||
|
|
||||||
const TAG = 'span';
|
const TAG = 'span';
|
||||||
const SELFCLOSING = false;
|
const SELFCLOSING = false;
|
||||||
|
|
||||||
public $tag = 'span';
|
|
||||||
public $selfClosing = false;
|
|
||||||
public $content = null;
|
|
||||||
|
|
||||||
protected $classes = [];
|
|
||||||
protected $attributes = [];
|
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->htmlInit();
|
$this->htmlInit();
|
||||||
|
@ -24,104 +19,4 @@ class GenericTag implements HtmlInterface
|
||||||
$this->tag = static::TAG;
|
$this->tag = static::TAG;
|
||||||
$this->selfClosing = static::SELFCLOSING;
|
$this->selfClosing = static::SELFCLOSING;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function htmlContent()
|
|
||||||
{
|
|
||||||
if (is_array($this->content)) {
|
|
||||||
return implode(PHP_EOL, $this->content);
|
|
||||||
} else {
|
|
||||||
return $this->content;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function htmlAttributes()
|
|
||||||
{
|
|
||||||
$attr = $this->attributes;
|
|
||||||
if ($this->classes()) {
|
|
||||||
$attr['class'] = implode(' ', $this->classes());
|
|
||||||
}
|
|
||||||
return $attr;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function addClass(string $name)
|
|
||||||
{
|
|
||||||
if (!$name) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$this->classes[] = $name;
|
|
||||||
$this->classes = array_unique($this->classes);
|
|
||||||
sort($this->classes);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function hasClass(string $name) : bool
|
|
||||||
{
|
|
||||||
return in_array($name, $this->classes);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function removeClass(string $name)
|
|
||||||
{
|
|
||||||
$this->classes = array_filter(
|
|
||||||
$this->classes,
|
|
||||||
function ($e) use ($name) {
|
|
||||||
return $e != $name;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
sort($this->classes);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function classes() : array
|
|
||||||
{
|
|
||||||
return $this->classes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function attr(string $name, $value = null)
|
|
||||||
{
|
|
||||||
if ($value === false) {
|
|
||||||
unset($this->attributes[$name]);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if ($value !== null) {
|
|
||||||
$this->attributes[$name] = $value;
|
|
||||||
}
|
|
||||||
return @$this->attributes[$name];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function data(string $name, $value = null)
|
|
||||||
{
|
|
||||||
return $this->attr("data-$name", $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function string() : string
|
|
||||||
{
|
|
||||||
$out = '';
|
|
||||||
//build opening tag
|
|
||||||
$out .= '<'.$this->tag;
|
|
||||||
//build attributes
|
|
||||||
if ($attr = $this->htmlAttributes()) {
|
|
||||||
foreach ($attr as $key => $value) {
|
|
||||||
if (!"$value") {
|
|
||||||
$out .= " $key";
|
|
||||||
} else {
|
|
||||||
$value = htmlspecialchars($value);
|
|
||||||
$out .= " $key=\"$value\"";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//continue t close opening tag and add content and closing tag if needed
|
|
||||||
if ($this->selfClosing) {
|
|
||||||
$out .= ' />';
|
|
||||||
} else {
|
|
||||||
$out .= '>';
|
|
||||||
//build content
|
|
||||||
$out .= $this->htmlContent();
|
|
||||||
//build closing tag
|
|
||||||
$out .= '</'.$this->tag.'>';
|
|
||||||
}
|
|
||||||
return $out;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return $this->string();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
/* HTML Object Strings | https://gitlab.com/byjoby/html-object-strings | MIT License */
|
/* HTML Object Strings | https://gitlab.com/byjoby/html-object-strings | MIT License */
|
||||||
namespace HtmlObjectStrings;
|
namespace HtmlObjectStrings;
|
||||||
|
|
||||||
interface HtmlInterface
|
interface TagInterface
|
||||||
{
|
{
|
||||||
public function attr(string $name, $value = null);
|
public function attr(string $name, $value = null);
|
||||||
public function data(string $name, $value = null);
|
public function data(string $name, $value = null);
|
113
src/TagTrait.php
Normal file
113
src/TagTrait.php
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
<?php
|
||||||
|
/* HTML Object Strings | https://gitlab.com/byjoby/html-object-strings | MIT License */
|
||||||
|
namespace HtmlObjectStrings;
|
||||||
|
|
||||||
|
trait TagTrait
|
||||||
|
{
|
||||||
|
public $tag = 'span';
|
||||||
|
public $selfClosing = false;
|
||||||
|
public $content = null;
|
||||||
|
|
||||||
|
protected $classes = [];
|
||||||
|
protected $attributes = [];
|
||||||
|
|
||||||
|
protected function htmlContent()
|
||||||
|
{
|
||||||
|
if (is_array($this->content)) {
|
||||||
|
return implode(PHP_EOL, $this->content);
|
||||||
|
} else {
|
||||||
|
return $this->content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function htmlAttributes()
|
||||||
|
{
|
||||||
|
$attr = $this->attributes;
|
||||||
|
if ($this->classes()) {
|
||||||
|
$attr['class'] = implode(' ', $this->classes());
|
||||||
|
}
|
||||||
|
return $attr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addClass(string $name)
|
||||||
|
{
|
||||||
|
if (!$name) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$this->classes[] = $name;
|
||||||
|
$this->classes = array_unique($this->classes);
|
||||||
|
sort($this->classes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasClass(string $name) : bool
|
||||||
|
{
|
||||||
|
return in_array($name, $this->classes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function removeClass(string $name)
|
||||||
|
{
|
||||||
|
$this->classes = array_filter(
|
||||||
|
$this->classes,
|
||||||
|
function ($e) use ($name) {
|
||||||
|
return $e != $name;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
sort($this->classes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function classes() : array
|
||||||
|
{
|
||||||
|
return $this->classes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function attr(string $name, $value = null)
|
||||||
|
{
|
||||||
|
if ($value === false) {
|
||||||
|
unset($this->attributes[$name]);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if ($value !== null) {
|
||||||
|
$this->attributes[$name] = $value;
|
||||||
|
}
|
||||||
|
return @$this->attributes[$name];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function data(string $name, $value = null)
|
||||||
|
{
|
||||||
|
return $this->attr("data-$name", $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function string() : string
|
||||||
|
{
|
||||||
|
$out = '';
|
||||||
|
//build opening tag
|
||||||
|
$out .= '<'.$this->tag;
|
||||||
|
//build attributes
|
||||||
|
if ($attr = $this->htmlAttributes()) {
|
||||||
|
foreach ($attr as $key => $value) {
|
||||||
|
if (!"$value") {
|
||||||
|
$out .= " $key";
|
||||||
|
} else {
|
||||||
|
$value = htmlspecialchars($value);
|
||||||
|
$out .= " $key=\"$value\"";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//continue t close opening tag and add content and closing tag if needed
|
||||||
|
if ($this->selfClosing) {
|
||||||
|
$out .= ' />';
|
||||||
|
} else {
|
||||||
|
$out .= '>';
|
||||||
|
//build content
|
||||||
|
$out .= $this->htmlContent();
|
||||||
|
//build closing tag
|
||||||
|
$out .= '</'.$this->tag.'>';
|
||||||
|
}
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __toString()
|
||||||
|
{
|
||||||
|
return $this->string();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue