$css, * @param array $options * @return array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} * @throws HtmlBuilderExcpetion */ public static function cel( string $tag, string $id = '', string $content = '', array $css = [], array $options = [] ): array { if (!preg_match("/^[A-Za-z]+$/", $tag)) { Error::setError( '201', 'invalid or empty tag', ['tag' => $tag] ); throw new HtmlBuilderExcpetion('Invalid or empty tag'); } return [ 'tag' => $tag, 'id' => $id, 'name' => $options['name'] ?? '', 'content' => $content, 'css' => $css, 'options' => $options, 'sub' => [], ]; } /** * Search element tree for id and add * if id is empty add at current * * @param array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} $base * @param array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} $attach * @param string $id * @return array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} */ public static function ael( array $base, array $attach, string $id = '' ): array { // no id or matching id if ( empty($id) || $base['id'] == $id ) { self::addSub($base, $attach); return $base; } // find id in 'id' in all 'sub' foreach ($base['sub'] as $el) { $el = self::ael($el, $attach, $id); } return $base; } /** * Undocumented function * * @param array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} $base * @param array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} ...$attach * @return array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} */ public static function aelx( array $base, array ...$attach ): array { $base = self::addSub($base, ...$attach); return $base; } /** * Undocumented function * * @param array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} $element * @param array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} $sub * @return array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} */ public static function addSub(array $element, array ...$sub): array { if (!isset($element['sub'])) { $element['sub'] = []; } array_push($element['sub'], ...$sub); return $element; } /** * Undocumented function * * @param array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} $element * @return array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} */ public static function resetSub(array $element): array { $element['sub'] = []; return $element; } // CSS Elements /** * Undocumented function * * @param array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} $element * @param string ...$css * @return array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} */ public static function acssel(array $element, string ...$css): array { $element['css'] = array_unique(array_merge($element['css'] ?? [], $css)); return $element; } /** * Undocumented function * * @param array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} $element * @param string ...$css * @return array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} */ public static function rcssel(array $element, string ...$css): array { $element['css'] = array_diff($element['css'] ?? [], $css); return $element; } /** * Undocumented function * scssel (switch) is not supported * use rcssel -> acssel * * @param array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} $element * @param array $rcss * @param array $acss * @return array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} */ public static function scssel(array $element, array $rcss, array $acss): array { return self::acssel( self::rcssel($element, ...$rcss), ...$acss ); } /** * Undocumented function * alias phfo * * @param array{tag:string,id:string,name:string,content:string,css:array,options:array,sub:array} $tree * @param bool $add_nl [default=false] * @return string */ public static function buildHtml(array $tree, bool $add_nl = false): string { if (empty($tree['tag'])) { return ''; } // print "D01: " . microtime(true) . "
"; $line = '<' . $tree['tag']; if (!empty($tree['id'])) { $line .= ' id="' . $tree['id'] . '"'; if (in_array($tree['tag'], Settings::NAME_ELEMENTS)) { $line .= ' name="' . (!empty($tree['name']) ? $tree['name'] : $tree['id']) . '"'; } } if (count($tree['css'])) { $line .= ' class="' . join(' ', $tree['css']) . '"'; } foreach ($tree['options'] ?? [] as $key => $item) { if (in_array($key, Settings::SKIP_OPTIONS)) { continue; } $line .= ' ' . $key . '="' . $item . '"'; } $line .= '>'; if (!empty($tree['content'])) { $line .= $tree['content']; } // sub nodes foreach ($tree['sub'] ?? [] as $sub) { if ($add_nl === true) { $line .= "\n"; } $line .= self::buildHtml($sub, $add_nl); if ($add_nl === true) { $line .= "\n"; } } // close line if needed if (!in_array($tree['tag'], Settings::NO_CLOSE)) { $line .= ''; } return $line; } /** * Undocumented function * alias phfa * * @param array,options:array,sub:array}> $list * @param bool $add_nl [default=false] * @return string */ public static function buildHtmlFromList(array $list, bool $add_nl = false): string { $output = ''; foreach ($list as $el) { $output .= self::buildHtml($el, $add_nl); } return $output; } /** * Undocumented function * wrapper for buildHtmlFromList * * @param array,options:array,sub:array}> $list array of Elements to build string from * @param bool $add_nl [default=false] Optional output string line break * @return string build html as string */ public static function printHtmlFromArray(array $list, bool $add_nl = false): string { return self::buildHtmlFromList($list, $add_nl); } } // __END__