1 ? $url[1] !== '/' : true)) { return true; } $prefix = 'http' . (empty($_SERVER['HTTPS']) ? '' : 's') . '://' . $_SERVER['HTTP_HOST'] . '/'; return starts_with($url, $prefix); } function render_error(int $code, string $template = 'errors.%d'): string { return render_info(null, $code, $template); } function render_info(?string $message, int $httpCode, string $template = 'errors.%d'): string { http_response_code($httpCode); try { tpl_var('http_code', $httpCode); if (mb_strlen($message)) { tpl_var('message', $message); } $template = sprintf($template, $httpCode); if (!tpl_exists($template)) { $template = 'errors.master'; } return tpl_render(sprintf($template, $httpCode)); } catch (Exception $ex) { echo $ex->getMessage(); return $message ?? ''; } } function render_info_or_json(bool $json, string $message, int $httpCode = 200, string $template = 'errors.%d'): string { $error = $httpCode >= 400; http_response_code($httpCode); if ($json) { return json_encode([($error ? 'error' : 'message') => $message, 'success' => $error]); } return render_info($message, $httpCode, $template); } function html_link(string $url, ?string $content = null, $attributes = []): string { $content = $content ?? $url; $attributes = array_merge( is_string($attributes) ? ['class' => $attributes] : $attributes, ['href' => $url] ); if (mb_strpos($url, '://') !== false) { $attributes['target'] = '_blank'; $attributes['rel'] = 'noreferrer noopener'; } $html = ' $value) { $value = str_replace('"', '\"', $value); $html .= " {$name}=\"{$value}\""; } $html .= ">{$content}"; return $html; } function html_colour(?int $colour, $attribs = '--user-colour'): string { $colour = $colour ?? colour_none(); if (is_string($attribs)) { $attribs = [ $attribs => '%s', ]; } if (!$attribs) { $attribs = [ 'color' => '%s', '--user-colour' => '%s', ]; } $css = ''; $value = colour_get_css($colour); foreach ($attribs as $name => $format) { $css .= $name . ':' . sprintf($format, $value) . ';'; } return $css; }