<?php function jslog($obj) { global $config; if (!($config['log_level'] == 'DEBUG' || $config['log_level'] === Logger::DEBUG)) { return; } echo '<script>console.log('.json_encode($obj).');</script>'; } function get_page_header( ?string $page_title = null, bool $include_app_name = true, array $scripts = [] ): string { global $api; $greeting = ''; $logout_link = ''; $newpoll_class = ''; if ($api->isAuthenticated(false, true)) { $u = $api->getAuthorizedUser(); $greeting = 'Welcome, ' . ($u->name ?? '@'.$u->username); $logout_link = '<a href="logout.php" class="logout">Logout</a>'; } else { $newpoll_class = 'disabled'; $greeting = '<a href="' . $api->getAuthURL() . '">Login with pnut</a>'; } $title = ''; if ($include_app_name) { $title = $api->app_name; } if (!empty($page_title)) { $title .= $include_app_name ? ' > ' : ''; $title .= $page_title; } $script_str = ''; foreach ($scripts as $script) { $script_str .= '<script src="scripts/' . $script . '.js"></script>'; } $home_link = get_icon_link( 'index.php', 'Home', 'home', 'homelink' ); $new_poll_link = get_icon_link( 'new_poll.php', 'New Poll', 'plus', 'newpolllink' ); $favicons = '<link rel="icon" href="icons/favicon/favicon-32.png" sizes="32x32">' . '<link rel="icon" href="icons/favicon/favicon-96.png" sizes="96x96">' . '<link rel="icon" href="icons/favicon/favicon-128.png" sizes="128x128">' . '<link rel="icon" href="icons/favicon/favicon-192.png" sizes="192x192">' . '<link rel="icon" href="icons/favicon/favicon-228.png" sizes="228x228">' . '<link rel="shortcut icon" sizes="196x196" href=“icons/favicon/favicon-196.png">' . '<link rel="apple-touch-icon" href="icons/favicon/favicon-120.png" sizes="120x120">' . '<link rel="apple-touch-icon" href="path/to/favicon-152.png" sizes="152x152">' . '<link rel="apple-touch-icon" href="path/to/favicon-180.png" sizes="180x180">' . '<link rel="icon" type="image/svg+xml" href="icons/favicon/favicon.svg">'; return '<html><head><meta charset="utf-8">' . $favicons . '<title>'.$title.'</title><link rel="stylesheet" href="styles/style.css">' . $script_str . '<meta name="viewport" content="width=device-width,initial-scale=1">' . '</head><body><header>' . $home_link . $new_poll_link . $greeting . '<div class="spacer"></div>' . $logout_link . '</header><main>'; } function get_icon_link(string $href, string $label, string $icon, string $class) { return '<a href="'.$href.'" title="'.$label.'" class="'.$class.'">' . '<div class="linkcontents">' . file_get_contents(__DIR__.'/icons/'.$icon.'.svg') . '<span class="linklabel">'.$label.'</span></div></a>'; } function get_page_footer() { $version = json_decode(file_get_contents(__DIR__ . '/composer.json'), true)['version']; $repo_link = get_icon_link( 'https://phlaym.net/git/phlaym/Dragonpolls', 'Source Code', 'src', 'sourcecode' ); $issues_link = get_icon_link( 'https://github.com/hutattedonmyarm/Dragonpolls/issues', 'Issues', 'issues', 'issues' ); return '</main><footer>' . '<a href="https://phlaym.net/git/phlaym/Dragonpolls/releases/tag/'.$version.'">Version ' . $version . '</a>' . $repo_link . $issues_link . '</footer></body></html>'; } function redirect($to) { header('Location: '.$to); die('<html><meta http-equiv="refresh" content="0;url='.$to.'">' .'<script>window.location.replace("'.$to.'");</script></html>'); } function get_source_set($user, int $base_size, int $max_scale = 3): string { $srcset_entries = [$user->getAvatarUrl($base_size)]; for ($s = 2; $s <= $max_scale; $s++) { $srcset_entries[] = $user->getAvatarUrl($base_size * $s) . ' ' . $s . 'x'; } return implode(', ', $srcset_entries); } function make_banner(string $type, string $content, string $custom_symbol = null): string { if (empty($custom_symbol)) { $custom_symbol = $type === 'success' ? '✓' : '𐄂'; } return '<div class="banner-wrapper">' . ' <div class="' . $type . ' banner"><span>' . $custom_symbol . '</span>' . $content . '</div></div>'; } function quit(string $error, string $error_details = '') { die(make_banner('error', $error) . $error_details . get_page_footer()); }