Add preview page

This commit is contained in:
blankie 2023-04-09 20:50:44 +07:00
parent 8674a9195d
commit 12156f3aaa
Signed by: blankie
GPG Key ID: CC15FC822C7F61F5
5 changed files with 32 additions and 10 deletions

View File

@ -21,7 +21,10 @@ const std::string& Images::original_or_thumbnail() const {
throw std::runtime_error("Images does not contain any images");
}
const std::string& Images::thumbnail_or_original() const {
const std::string& Images::thumbnail_or_original(size_t back) const {
if (this->thumbnails.size() > back) {
return this->thumbnails[this->thumbnails.size() - back - 1];
}
if (!this->thumbnails.empty()) {
return this->thumbnails.back();
}

View File

@ -12,7 +12,7 @@ struct Images {
std::vector<std::string> thumbnails;
const std::string& original_or_thumbnail() const;
const std::string& thumbnail_or_original() const;
const std::string& thumbnail_or_original(size_t back = 0) const;
};
struct User {

View File

@ -6,10 +6,12 @@
static inline bool is_true(const std::string& str);
static inline Element generate_user_link(const httplib::Request& req, const Config& config, const Illust& illust);
static inline Element generate_images(const httplib::Request& req, const Config& config, const Illust& illust);
static inline Element generate_preview_images(const httplib::Request& req, const Config& config, const Illust& illust);
static inline Element generate_illust_metadata(const Illust& illust);
void artworks_route(const httplib::Request& req, httplib::Response& res, const Config& config, PixivClient& pixiv_client) {
uint64_t illust_id = to_ull(req.matches.str(1));
bool preview = is_true(req.get_param_value("preview"));
Illust illust;
try {
@ -32,7 +34,7 @@ void artworks_route(const httplib::Request& req, httplib::Response& res, const C
Element body("body", {
Element("h2", {illust.title}),
generate_user_link(req, config, illust),
generate_images(req, config, illust),
!preview ? generate_images(req, config, illust) : generate_preview_images(req, config, illust),
Element("br"),
generate_illust_metadata(illust)
});
@ -73,6 +75,23 @@ static inline Element generate_images(const httplib::Request& req, const Config&
return div;
}
static inline Element generate_preview_images(const httplib::Request& req, const Config& config, const Illust& illust) {
Element div("div", {{"class", "grid"}}, {});
div.nodes.reserve(illust.images.size());
for (size_t i = 0; i < illust.images.size(); i++) {
const Images& images = illust.images[i];
std::string thumbnail = proxy_image_url(config, images.thumbnail_or_original(1));
std::string link = get_origin(req, config) + "/artworks/" + std::to_string(illust.illust_id) + "#" + std::to_string(i + 1);
div.nodes.push_back(Element("a", {{"href", std::move(link)}}, {
Element("img", {{"loading", "lazy"}, {"src", std::move(thumbnail)}}, {})
}));
}
return div;
}
static inline Element generate_illust_metadata(const Illust& illust) {
Element div("div", {{"class", "illustmetadata"}}, {});

View File

@ -59,21 +59,21 @@ void css_route(const httplib::Request& req, httplib::Response& res) {
margin-left: .5em;
}
/* USER ILLUSTRATIONS PAGE */
/* USER ILLUSTRATIONS PAGE (and illustrations page) */
.center {
text-align: center;
}
.userillustrations {
.grid {
display: flex;
flex-wrap: wrap;
gap: 1em;
justify-content: center;
}
.userillustrations img {
.grid img {
width: 15em;
height: 15em;
}
.userillustrations p {
.grid p {
width: 15em;
}

View File

@ -40,7 +40,7 @@ void user_illustrations_route(const httplib::Request& req, httplib::Response& re
generate_content(req, config, illusts),
generate_pager(illusts, page, false)
});
serve(req, res, config, user.display_name + " illustrations", std::move(body));
serve(req, res, config, user.display_name + "'s illustrations", std::move(body));
}
static Element generate_pager(const Illusts& illusts, size_t page, bool first_selector) {
@ -72,12 +72,12 @@ static Element generate_pager(const Illusts& illusts, size_t page, bool first_se
}
static inline Element generate_content(const httplib::Request& req, const Config& config, const Illusts& illusts) {
Element div("div", {{"class", "userillustrations"}}, {});
Element div("div", {{"class", "grid"}}, {});
div.nodes.reserve(illusts.illusts.size());
for (const Illust& i : illusts.illusts) {
std::string illust_url = get_origin(req, config) + "/artworks/" + std::to_string(i.illust_id);
std::string image_url = proxy_image_url(config, i.images[0].thumbnail_or_original());
std::string image_url = proxy_image_url(config, i.images[0].thumbnail_or_original(1));
div.nodes.push_back(Element("a", {{"href", {std::move(illust_url)}}}, {
Element("img", {{"loading", "lazy"}, {"src", std::move(image_url)}}, {}),