get_tag_list()); $page->add_html_header(META(["name" => "keywords", "content" => $h_metatags])); $page->add_html_header(META(["property" => "og:title", "content" => $h_metatags])); $page->add_html_header(META(["property" => "og:type", "content" => "article"])); $page->add_html_header(META(["property" => "og:image", "content" => make_http($image->get_image_link())])); $page->add_html_header(META(["property" => "og:url", "content" => make_http(make_link("post/view/{$image->id}"))])); $page->add_html_header(META(["property" => "og:image:width", "content" => $image->width])); $page->add_html_header(META(["property" => "og:image:height", "content" => $image->height])); $page->add_html_header(META(["property" => "twitter:title", "content" => $h_metatags])); $page->add_html_header(META(["property" => "twitter:card", "content" => "summary_large_image"])); $page->add_html_header(META(["property" => "twitter:image:src", "content" => make_http($image->get_image_link())])); } /** * Build a page showing $image and some info about it * * @param HTMLElement[] $editor_parts */ public function display_page(Image $image, array $editor_parts): void { global $page; $page->set_title("Post {$image->id}: ".$image->get_tag_list()); $page->set_heading(html_escape($image->get_tag_list())); $page->add_block(new Block("Post {$image->id}", $this->build_navigation($image), "left", 0, "Navigationleft")); $page->add_block(new Block(null, $this->build_info($image, $editor_parts), "main", 20, "ImageInfo")); //$page->add_block(new Block(null, $this->build_pin($image), "main", 11)); $query = $this->get_query(); if (!$this->is_ordered_search()) { $page->add_html_header(LINK(["id" => "nextlink", "rel" => "next", "href" => make_link("post/next/{$image->id}", $query)])); $page->add_html_header(LINK(["id" => "prevlink", "rel" => "previous", "href" => make_link("post/prev/{$image->id}", $query)])); } } /** * @param HTMLElement[] $parts */ public function display_admin_block(Page $page, array $parts): void { if (count($parts) > 0) { $page->add_block(new Block("Post Controls", DIV(["class" => "post_controls"], joinHTML("", $parts)), "left", 50)); } } protected function get_query(): ?string { if (isset($_GET['search'])) { $query = "search=".url_escape($_GET['search']); } else { $query = null; } return $query; } /** * prev/next only work for default-ordering searches - if the user * has specified a custom order, we can't show prev/next. */ protected function is_ordered_search(): bool { if (isset($_GET['search'])) { $tags = Tag::explode($_GET['search']); foreach ($tags as $tag) { if (preg_match("/^order[=:]/", $tag) == 1) { return true; } } } return false; } protected function build_pin(Image $image): HTMLElement { $query = $this->get_query(); if ($this->is_ordered_search()) { return A(["href" => make_link()], "Index"); } else { return joinHTML(" | ", [ A(["href" => make_link("post/prev/{$image->id}", $query), "id" => "prevlink"], "Prev"), A(["href" => make_link()], "Index"), A(["href" => make_link("post/next/{$image->id}", $query), "id" => "nextlink"], "Next"), ]); } } protected function build_navigation(Image $image): string { $h_pin = $this->build_pin($image); $h_search = "

"; return "$h_pin
$h_search"; } /** * @param HTMLElement[] $editor_parts */ protected function build_info(Image $image, array $editor_parts): HTMLElement { global $user; if (count($editor_parts) == 0) { return emptyHTML($image->is_locked() ? "[Post Locked]" : ""); } if ( (!$image->is_locked() || $user->can(Permissions::EDIT_IMAGE_LOCK)) && $user->can(Permissions::EDIT_IMAGE_TAG) ) { $editor_parts[] = TR(TD( ["colspan" => 4], INPUT(["class" => "view", "type" => "button", "value" => "Edit", "onclick" => "clearViewMode()"]), INPUT(["class" => "edit", "type" => "submit", "value" => "Set"]) )); } return SHM_SIMPLE_FORM( "post/set", INPUT(["type" => "hidden", "name" => "image_id", "value" => $image->id]), TABLE( [ "class" => "image_info form", ], ...$editor_parts, ), ); } }