sterzycom/kirby/toolkit/lib/brick.php

204 lines
No EOL
4.5 KiB
PHP

<?php
class Brick {
public static $bricks = array();
public $tag = null;
public $attr = array();
public $html = null;
public $events = array();
public function __construct($tag, $html = false, $attr = array()) {
if(is_array($html)) {
$attr = $html;
$html = false;
}
$this->tag($tag);
$this->html($html);
$this->attr($attr);
}
public function __set($attr, $value) {
$this->attr($attr, $value);
}
public function on($event, $callback) {
if(!isset($this->events[$event])) $this->events[$event] = array();
$this->events[$event][] = $callback;
return $this;
}
public function trigger($event, $args = array()) {
if(isset($this->events[$event])) {
array_unshift($args, $this);
foreach($this->events[$event] as $e) {
call_user_func_array($e, $args);
}
}
}
public function tag($tag = null) {
if(is_null($tag)) return $this->tag;
$this->tag = $tag;
return $this;
}
public function attr($key = null, $value = null) {
if(is_null($key)) {
return $this->attr;
} else if(is_array($key)) {
foreach($key as $k => $v) {
$this->attr($k, $v);
}
return $this;
} else if(is_null($value)) {
return a::get($this->attr, $key);
} else if($key == 'class') {
$this->addClass($value);
return $this;
} else {
$this->attr[$key] = $value;
return $this;
}
}
public function data($key = null, $value = null) {
if(is_null($key)) {
$data = array();
foreach($this->attr as $key => $val) {
if(str::startsWith($key, 'data-')) {
$data[$key] = $val;
}
}
return $data;
} else if(is_array($key)) {
foreach($key as $k => $v) {
$this->data($k, $v);
}
return $this;
} else if(is_null($value)) {
return a::get($this->attr, 'data-' . $key);
} else {
$this->attr['data-' . $key] = $value;
return $this;
}
}
public function removeAttr($key) {
unset($this->attr[$key]);
}
public function classNames() {
if(!isset($this->attr['class'])) {
$this->attr['class'] = array();
} else if(is_string($this->attr['class'])) {
$raw = $this->attr['class'];
$this->attr['class'] = array();
$this->addClass($raw);
}
return $this->attr['class'];
}
public function val($value = null) {
return $this->attr('value', $value);
}
public function addClass($class) {
$classNames = $this->classNames();
$classIndex = array_map('strtolower', $classNames);
foreach(str::split($class, ' ') as $c) {
if(!in_array(strtolower($c), $classIndex)) {
$classNames[] = $c;
}
}
$this->attr['class'] = $classNames;
return $this;
}
public function removeClass($class) {
$classNames = $this->classNames();
foreach(str::split($class, ' ') as $c) {
$classNames = array_filter($classNames, function($e) use($c) {
return (strtolower($e) !== strtolower($c));
});
}
$this->attr['class'] = $classNames;
return $this;
}
public function replaceClass($classA, $classB) {
return $this->removeClass($classA)->addClass($classB);
}
public function text($text = null) {
if(is_null($text)) return trim(strip_tags($this->html));
$this->html = html($text, false);
return $this;
}
public function html($html = null) {
if(is_null($html)) {
return $this->html = $this->isVoid() ? null : $this->html;
}
$this->html = $html;
return $this;
}
public function prepend($html) {
if(is_callable($html)) $html = $html();
$this->html = $html . $this->html;
return $this;
}
public function append($html) {
if(is_callable($html)) $html = $html();
$this->html = $this->html . $html;
return $this;
}
public function isVoid() {
return html::isVoid($this->tag());
}
public function toString() {
$this->attr['class'] = implode(' ', $this->classNames());
return html::tag($this->tag(), $this->html(), $this->attr());
}
public function __toString() {
try {
return $this->toString();
} catch(Exception $e) {
return 'Error: ' . $e->getMessage();
}
}
public static function make($id, $callback) {
static::$bricks[$id] = $callback;
}
public static function get($id) {
if(!isset(static::$bricks[$id])) return false;
$args = array_slice(func_get_args(), 1);
return call_user_func_array(static::$bricks[$id], $args);
}
}