skin->addMeta([ 'og:type' => 'website', '@url' => 'https://'.$config['domain'].'/', '@title' => lang('meta_index_title'), '@description' => lang('meta_index_description'), '@image' => 'https://'.$config['domain'].'/img/4in1-preview.jpg' ]); $this->skin->setTitle('$site_title'); $this->skin->set([ 'posts' => $posts, 'posts_lang' => $posts_lang, 'versions' => $config['book_versions'] ]); $this->skin->setRenderOptions(['is_index' => true]); $this->skin->renderPage('index.twig'); } public function GET_about() { self::redirect('/info/'); } public function GET_contacts() { self::redirect('/info/'); } public function GET_page() { global $config; list($name) = $this->input('name'); $page = pages::getByName($name); if (!$page) { if (isAdmin()) { $this->skin->setTitle($name); $this->skin->renderPage('admin_page_new.twig', [ 'short_name' => $name ]); } self::notFound(); } if (!isAdmin() && !$page->visible) self::notFound(); $bc = null; $render_opts = []; if ($page) { $this->skin->addMeta([ '@url' => 'https://'.$config['domain'].$page->getUrl(), '@title' => $page->title, ]); if ($page->parentId) { $bc = []; $parent = $page; while ($parent?->parentId) { $parent = pages::getById($parent->parentId); if ($parent) $bc[] = ['url' => $parent->getUrl(), 'text' => $parent->title]; } if (empty($bc)) $bc = null; } if ($page->shortName == 'info') $render_opts = ['head_section' => 'about']; else if ($page->shortName == $config['wiki_root']) $render_opts = ['head_section' => $page->shortName]; } $this->skin->setRenderOptions($render_opts); $this->skin->setTitle($page ? $page->title : '???'); $this->skin->renderPage('page.twig', [ 'page' => $page, 'html' => $page->getHtml(isRetina(), themes::getUserTheme()), 'bc' => $bc, 'delete_token' => self::getCSRF('delpage'.$page->shortName) ]); } public function GET_post() { global $config; list($name, $input_lang) = $this->input('name, lang'); $lang = null; try { if ($input_lang) $lang = PostLanguage::from($input_lang); } catch (ValueError $e) { self::notFound($e->getMessage()); } if (!$lang) $lang = PostLanguage::getDefault(); $post = posts::getByName($name); if (!$post || (!$post->visible && !isAdmin())) self::notFound(); if ($lang == PostLanguage::getDefault() && $input_lang == $lang->value) self::redirect($post->getUrl()); if (!$post->hasLang($lang)) self::notFound('no text for language '.$lang->name); if (!$post->visible && !isAdmin()) self::notFound(); $pt = $post->getText($lang); $other_langs = []; foreach (PostLanguage::cases() as $pl) { if ($pl == $lang) continue; if ($post->hasLang($pl)) $other_langs[] = $pl->value; } $meta = [ '@title' => $pt->title, '@url' => $config['domain'].$post->getUrl(), '@description' => $pt->getDescriptionPreview(155) ]; if ($pt->keywords) $meta['@keywords'] = $pt->keywords; $this->skin->addMeta($meta); if (($img = $pt->getFirstImage()) !== null) $this->skin->addMeta(['@image' => $img->getDirectUrl()]); $this->skin->setTitle($pt->title); $this->skin->setRenderOptions(['articles_lang' => $lang->value, 'wide' => $pt->hasTableOfContents()]); $this->skin->renderPage('post.twig', [ 'post' => $post, 'pt' => $pt, 'html' => $pt->getHtml(isRetina(), themes::getUserTheme()), 'selected_lang' => $lang->value, 'other_langs' => $other_langs, 'delete_token' => self::getCSRF('delpost'.$post->id) ]); } public function GET_rss() { global $config; $lang = PostLanguage::getDefault(); $items = array_map(function(Post $post) use ($lang) { $pt = $post->getText($lang); return [ 'title' => $pt->title, 'link' => $post->getUrl(), 'pub_date' => date(DATE_RSS, $post->getTimestamp()), 'description' => $pt->getDescriptionPreview(500) ]; }, posts::getList(0, 20, filter_by_lang: $lang)); $body = $this->skin->render('rss.twig', [ 'title' => lang('site_title'), 'link' => 'https://'.$config['domain'], 'rss_link' => 'https://'.$config['domain'].'/feed.rss', 'items' => $items ]); header('Content-Type: application/rss+xml; charset=utf-8'); echo $body; exit; } public function GET_articles() { list($lang) = $this->input('lang'); if ($lang) { $lang = PostLanguage::tryFrom($lang); if (!$lang || $lang == PostLanguage::getDefault()) self::redirect('/articles/'); } else { $lang = PostLanguage::getDefault(); } $posts = posts::getList( include_hidden: isAdmin(), filter_by_lang: $lang); $this->skin->setTitle('$articles'); $this->skin->addMeta([ '@description' => lang('blog_expl_'.$lang->value) ]); $this->skin->setRenderOptions(['head_section' => 'articles']); $this->skin->renderPage('articles.twig', [ 'posts' => $posts, 'selected_lang' => $lang->value ]); } }