$config['domain'], 'devMode' => $config['is_dev'], 'cookieHost' => $config['cookie_host'], ]); return << {$title} {$ctx->renderMeta($meta)} {$ctx->renderStatic($static, $theme)} if_true($opts['full_width'], ' class="full-width"')}> {$ctx->renderHeader($theme, renderLogo($ctx, $opts['logo_path_map'], $opts['logo_link_map']))}
{$unsafe_body}
{$ctx->renderScript($js, $unsafe_lang, $opts['dynlogo_enabled'])} HTML; } function renderScript($ctx, $unsafe_js, $unsafe_lang, $enable_dynlogo) { global $config; $styles = json_encode($ctx->styleNames); $versions = !$config['is_dev'] ? json_encode($config['static']) : '{}'; return << StaticManager.setStyles({$styles}, {$versions}); {$ctx->if_true($unsafe_js, '(function(){'.$unsafe_js.'})();')} {$ctx->if_true($unsafe_lang, 'extend(__lang, '.$unsafe_lang.');')} {$ctx->if_true($enable_dynlogo, 'DynamicLogo.init();')} ThemeSwitcher.init(); HTML; } function renderMeta($ctx, $meta) { if (empty($meta)) return ''; return implode('', array_map(function(array $item): string { $s = ' $v) $s .= ' '.htmlescape($k).'="'.htmlescape($v).'"'; $s .= '>'; return $s; }, $meta)); } function renderStatic($ctx, $static, $theme) { global $config; $html = []; $dark = $theme == 'dark'; $ctx->styleNames = []; foreach ($static as $name) { // list($name, $options) = $item; $version = $config['is_dev'] ? time() : $config['static'][substr($name, 1)] ?? 'notfound'; if (str_ends_with($name, '.js')) $html[] = jsLink($name, $version); else if (str_ends_with($name, '.css')) { $html[] = cssLink($name, 'light', $version, $style_name); $ctx->styleNames[] = $style_name; if ($dark) $html[] = cssLink($name, 'dark', $version, $style_name); else if (!$config['is_dev']) $html[] = cssPrefetchLink(str_replace('.css', '_dark.css', $name), $version); } } return implode("\n", $html); } function jsLink(string $name, $version = null): string { if ($version !== null) $name .= '?'.$version; return ''; } function cssLink(string $name, string $theme, $version = null, &$bname = null): string { global $config; $dname = dirname($name); $bname = basename($name); if (($pos = strrpos($bname, '.'))) $bname = substr($bname, 0, $pos); if ($config['is_dev']) { $href = '/sass.php?name='.urlencode($bname).'&theme='.$theme; } else { $href = $dname.'/'.$bname.($theme == 'dark' ? '_dark' : '').'.css'.($version !== null ? '?'.$version : ''); } $id = 'style_'.$bname; if ($theme == 'dark') $id .= '_dark'; return ''; } function cssPrefetchLink(string $name, $verison = null): string { $url = $name; if ($verison) $url .= '?'.$verison; return << HTML; } function renderHeader($ctx, $theme, $unsafe_logo_html) { return <<
HTML; } // TODO rewrite this fcking crap function renderLogo($ctx, array $path_map = [], array $link_map = []): string { $uri = RequestDispatcher::path(); if (!admin::isAdmin()) { $prompt_sign = '$'; } else { $prompt_sign = '#'; } if ($uri == '/') { $html = '/home/'.$ctx->lang('ch1p').' '.$prompt_sign; } else { $uri_len = strlen($uri); $html = ''; $close_tags = 0; $path_parts = []; $path_links = []; $last_pos = 0; $cur_path = ''; while ($last_pos < $uri_len) { $first = $last_pos === 0; $end = false; $pos = strpos($uri, '/', $last_pos); if ($pos === false || $pos == $uri_len-1) { $pos = $uri_len-1; $end = true; } $part = substr($uri, $last_pos, $pos - $last_pos + 1); $cur_path .= $part; if ($end) { if (substr($part, -1) == '/') $part = substr($part, 0, strlen($part)-1); $cur_path = '/'; $html .= str_repeat('', $close_tags-1); $close_tags = 1; } $span_class = 'head-logo-path'; if ($first) { $span_class .= ' alwayshover'; } else if ($end) { $span_class .= ' neverhover'; } $html .= '${{'.count($path_parts).'}}'; $path_parts[] = ($first ? '~' : '').$part; $path_links[] = $cur_path; $last_pos = $pos + 1; $close_tags++; } $html .= str_repeat('', $close_tags).' '.$prompt_sign.' cd ~ '.enterIcon().'Enter'; for ($i = count($path_parts)-1, $j = 0; $i >= 0; $i--, $j++) { if (isset($path_map[$j])) { $tmp = htmlescape(strtrim($path_map[$j], 40, $trimmed)); if ($trimmed) $tmp .= '…'; $tmp_html = ''.$tmp.''; if ($j > 0) $tmp_html .= '/'; $html = str_replace_once('${{'.$i.'}}', $tmp_html, $html); } else { $html = str_replace_once('${{'.$i.'}}', $path_parts[$i], $html); } if (isset($link_map[$j])) { $html = str_replace_once('$[['.$i.']]', $link_map[$j], $html); } else { $html = str_replace_once('$[['.$i.']]', $path_links[$i], $html); } } } return $html; } function enterIcon() { return << SVG; } function renderMoonIcon($ctx) { return << SVG; }