{$ctx->renderMeta($meta)} {$ctx->renderStatic($static)} if_true($opts['full_width'], ' class="full-width"')}> {$ctx->renderHeader(renderLogo($ctx, $opts['logo_path_map'], $opts['logo_link_map']))}
{$unsafe_body}
{$ctx->if_true($js != '' || !empty($lang) || $opts['dynlogo_enabled'], $ctx->renderScript, $js, $unsafe_lang, $opts['dynlogo_enabled'])} HTML; } function renderScript($ctx, $unsafe_js, $unsafe_lang, $enable_dynlogo) { return << {$ctx->if_true($unsafe_js, '(function(){'.$unsafe_js.'})();')} {$ctx->if_true($unsafe_lang, 'extend(__lang, '.$unsafe_lang.');')} {$ctx->if_true($enable_dynlogo, 'DynamicLogo.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) { global $config; $html = []; 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, $version/*, $options*/); } return implode("\n", $html); } function renderHeader($ctx, $unsafe_logo_html) { return <<
blog projects git misc contacts {$ctx->if_admin('admin')}
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 ~ 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 jsLink(string $name, $version = null): string { if ($version !== null) $name .= '?'.$version; return ''; } function cssLink(string $name, $version = null/*, $options = null*/): string { global $config; if ($config['is_dev']) { $bname = basename($name); if (($pos = strrpos($bname, '.'))) $bname = substr($bname, 0, $pos); $href = '/sass.php?name='.urlencode($bname); } else { $href = $name.($version !== null ? '?'.$version : ''); } $s = '