diff options
Diffstat (limited to 'handler/MainHandler.php')
-rw-r--r-- | handler/MainHandler.php | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/handler/MainHandler.php b/handler/MainHandler.php new file mode 100644 index 0000000..889cb48 --- /dev/null +++ b/handler/MainHandler.php @@ -0,0 +1,147 @@ +<?php + +require_once 'lib/posts.php'; +require_once 'lib/themes.php'; + +class MainHandler extends request_handler { + + function GET_index() { + $posts = posts::getList(include_hidden: is_admin()); + $tags = tags::getAll(include_hidden: is_admin()); + + set_title("ch1p's Blog"); + set_skin_opts(['dynlogo_enabled' => false]); + render('main/index', + posts: $posts, + tags: $tags); + } + + function GET_projects() { + redirect('/projects/'); + } + + function GET_contacts() { + global $config; + set_title(lang('contacts')); + render('main/contacts', + email: $config['admin_email']); + } + + function GET_auto() { + list($name) = input('name'); + if ($name == 'coreboot-mba51-flashing') + redirect('/coreboot-mba52-flashing/'); + + if (is_numeric($name)) { + $post = posts::get((int)$name); + } else { + $post = posts::getByName($name); + } + if ($post) + return $this->renderPost($post); + + $tag = tags::get($name); + if ($tag) + return $this->renderTag($tag); + + $page = pages::getByName($name); + if ($page) + return $this->renderPage($page); + + if (is_admin()) { + set_title($name); + render('admin/pageNew', + short_name: $name); + } + + not_found(); + } + + protected function renderPost(Post $post) { + global $config; + + if (!$post->visible && !is_admin()) + not_found(); + + $tags = $post->getTags(); + + add_meta( + ['property' => 'og:title', 'content' => $post->title], + ['property' => 'og:url', 'content' => $config['domain'].$post->getUrl()] + ); + if (($img = $post->getFirstImage()) !== null) + add_meta(['property' => 'og:image', 'content' => $img->getDirectUrl()]); + + add_meta([ + 'name' => 'description', + 'property' => 'og:description', + 'content' => $post->getDescriptionPreview(155) + ]); + + set_title($post->title); + + if ($post->toc) + set_skin_opts(['wide' => true]); + + render('main/post', + title: $post->title, + id: $post->id, + unsafe_html: $post->getHtml(is_retina(), getUserTheme()), + unsafe_toc_html: $post->getToc(), + date: $post->getFullDate(), + tags: $tags, + visible: $post->visible, + url: $post->getUrl(), + email: $config['admin_email'], + urlencoded_reply_subject: 'Re: '.$post->title); + } + + protected function renderTag(Tag $tag) { + $tag = tags::get($tag); + if (!is_admin() && !$tag->visiblePostsCount) + not_found(); + + $count = posts::getCountByTagId($tag->id, is_admin()); + $posts = $count ? posts::getPostsByTagId($tag->id, is_admin()) : []; + + set_title('#'.$tag->tag); + render('main/tag', + count: $count, + posts: $posts, + tag: $tag->tag); + } + + protected function renderPage(Page $page) { + if (!is_admin() && !$page->visible) + not_found(); + + set_title($page ? $page->title : '???'); + render('main/page', + unsafe_html: $page->getHtml(is_retina(), getUserTheme()), + page_url: $page->getUrl(), + short_name: $page->shortName); + } + + function GET_rss() { + global $config; + + $items = array_map(fn(Post $post) => [ + 'title' => $post->title, + 'link' => $post->getUrl(), + 'pub_date' => date(DATE_RSS, $post->ts), + 'description' => $post->getDescriptionPreview(500), + ], posts::getList(0, 20)); + + $ctx = new SkinContext('\\skin\\rss'); + $body = $ctx->atom( + 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; + } + +}
\ No newline at end of file |