<?php
declare(strict_types=1);
namespace Arcanedev\Html\Entities;
use Arcanedev\Html\Contracts\Renderable;
use Arcanedev\Html\Elements\HtmlElement;
use Arcanedev\Html\Exceptions\InvalidChildException;
use Illuminate\Support\{Collection, HtmlString};
use Illuminate\Contracts\Support\Htmlable;
/**
* Class ChildrenCollection
*
* @author ARCANEDEV <arcanedev.maroc@gmail.com>
*/
class ChildrenCollection extends Collection implements Renderable
{
/* -----------------------------------------------------------------
| Main Methods
| -----------------------------------------------------------------
*/
/**
* @param mixed $children
* @param \Closure|null $mapper
*
* @return static
*/
public static function parse($children, $mapper = null)
{
return static::make($children)
->unless(is_null($mapper), function (ChildrenCollection $items) use ($mapper) {
return $items->map($mapper);
})
->each(function ($child) {
if ( ! static::isValidChild($child))
throw new InvalidChildException;
});
}
/**
* Render the object as a string of HTML.
*
* @return \Illuminate\Support\HtmlString
*/
public function render()
{
return new HtmlString($this->toHtml());
}
/**
* Get content as a string of HTML.
*
* @return string
*/
public function toHtml()
{
$mapper = function ($child): string {
if (is_null($child))
return '';
if ($child instanceof Htmlable)
return $child->toHtml();
if (is_string($child) || is_numeric($child))
return strval($child);
throw new InvalidChildException;
};
return $this->map($mapper)->implode('');
}
/* -----------------------------------------------------------------
| Other Methods
| -----------------------------------------------------------------
*/
/**
* Results array of items from Collection or Arrayable.
*
* @param mixed $items
*
* @return array
*/
protected function getArrayableItems($items)
{
if ($items instanceof HtmlElement || $items instanceof HtmlString)
return [$items];
return parent::getArrayableItems($items);
}
/**
* Check if valid child.
*
* @param mixed $child
*
* @return bool
*/
protected static function isValidChild($child)
{
return $child instanceof Htmlable
|| is_string($child)
|| is_numeric($child)
|| is_null($child);
}
}