Merge pull request #50 from robrobinbin/rich-flairs
Add support for rich flairs with "Emoji"
This commit is contained in:
commit
5ab88567de
32
src/post.rs
32
src/post.rs
@ -1,5 +1,5 @@
|
|||||||
// CRATES
|
// CRATES
|
||||||
use crate::utils::{cookie, error, format_num, format_url, media, param, prefs, request, rewrite_url, val, Comment, Flags, Flair, Post, Preferences};
|
use crate::utils::{cookie, error, format_num, format_url, media, parse_rich_flair, param, prefs, request, rewrite_url, val, Comment, Flags, Flair, Post, Preferences};
|
||||||
use actix_web::{HttpRequest, HttpResponse};
|
use actix_web::{HttpRequest, HttpResponse};
|
||||||
|
|
||||||
use async_recursion::async_recursion;
|
use async_recursion::async_recursion;
|
||||||
@ -82,25 +82,25 @@ async fn parse_post(json: &serde_json::Value) -> Post {
|
|||||||
community: val(post, "subreddit"),
|
community: val(post, "subreddit"),
|
||||||
body: rewrite_url(&val(post, "selftext_html")),
|
body: rewrite_url(&val(post, "selftext_html")),
|
||||||
author: val(post, "author"),
|
author: val(post, "author"),
|
||||||
author_flair: Flair(
|
author_flair: Flair{
|
||||||
val(post, "author_flair_text"),
|
flair_parts: parse_rich_flair(val(post, "author_flair_type"), post["data"]["author_flair_richtext"].as_array(), post["data"]["author_flair_text"].as_str()),
|
||||||
val(post, "author_flair_background_color"),
|
background_color: val(post, "author_flair_background_color"),
|
||||||
val(post, "author_flair_text_color"),
|
foreground_color: val(post, "author_flair_text_color"),
|
||||||
),
|
},
|
||||||
permalink: val(post, "permalink"),
|
permalink: val(post, "permalink"),
|
||||||
score: format_num(score),
|
score: format_num(score),
|
||||||
upvote_ratio: ratio as i64,
|
upvote_ratio: ratio as i64,
|
||||||
post_type,
|
post_type,
|
||||||
thumbnail: format_url(val(post, "thumbnail").as_str()),
|
thumbnail: format_url(val(post, "thumbnail").as_str()),
|
||||||
flair: Flair(
|
flair: Flair{
|
||||||
val(post, "link_flair_text"),
|
flair_parts: parse_rich_flair(val(post, "link_flair_type"), post["data"]["link_flair_richtext"].as_array(), post["data"]["link_flair_text"].as_str()),
|
||||||
val(post, "link_flair_background_color"),
|
background_color: val(post, "link_flair_background_color"),
|
||||||
if val(post, "link_flair_text_color") == "dark" {
|
foreground_color: if val(post, "link_flair_text_color") == "dark" {
|
||||||
"black".to_string()
|
"black".to_string()
|
||||||
} else {
|
} else {
|
||||||
"white".to_string()
|
"white".to_string()
|
||||||
},
|
},
|
||||||
),
|
},
|
||||||
flags: Flags {
|
flags: Flags {
|
||||||
nsfw: post["data"]["over_18"].as_bool().unwrap_or(false),
|
nsfw: post["data"]["over_18"].as_bool().unwrap_or(false),
|
||||||
stickied: post["data"]["stickied"].as_bool().unwrap_or(false),
|
stickied: post["data"]["stickied"].as_bool().unwrap_or(false),
|
||||||
@ -145,11 +145,11 @@ async fn parse_comments(json: &serde_json::Value) -> Vec<Comment> {
|
|||||||
score: format_num(score),
|
score: format_num(score),
|
||||||
time: OffsetDateTime::from_unix_timestamp(unix_time).format("%b %d %Y %H:%M UTC"),
|
time: OffsetDateTime::from_unix_timestamp(unix_time).format("%b %d %Y %H:%M UTC"),
|
||||||
replies,
|
replies,
|
||||||
flair: Flair(
|
flair: Flair{
|
||||||
val(&comment, "author_flair_text"),
|
flair_parts: parse_rich_flair(val(&comment, "author_flair_type"), comment["data"]["author_flair_richtext"].as_array(), comment["data"]["author_flair_text"].as_str()),
|
||||||
val(&comment, "author_flair_background_color"),
|
background_color: val(&comment, "author_flair_background_color"),
|
||||||
val(&comment, "author_flair_text_color"),
|
foreground_color: val(&comment, "author_flair_text_color"),
|
||||||
),
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,8 @@ pub async fn handler(web::Path(b64): web::Path<String>) -> Result<HttpResponse>
|
|||||||
// THUMBNAILS
|
// THUMBNAILS
|
||||||
"a.thumbs.redditmedia.com",
|
"a.thumbs.redditmedia.com",
|
||||||
"b.thumbs.redditmedia.com",
|
"b.thumbs.redditmedia.com",
|
||||||
|
// EMOJI
|
||||||
|
"emoji.redditmedia.com",
|
||||||
// ICONS
|
// ICONS
|
||||||
"styles.redditmedia.com",
|
"styles.redditmedia.com",
|
||||||
"www.redditstatic.com",
|
"www.redditstatic.com",
|
||||||
|
63
src/utils.rs
63
src/utils.rs
@ -5,7 +5,7 @@ use actix_web::{cookie::Cookie, HttpRequest, HttpResponse, Result};
|
|||||||
use askama::Template;
|
use askama::Template;
|
||||||
use base64::encode;
|
use base64::encode;
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use serde_json::from_str;
|
use serde_json::{from_str, Value};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use time::{OffsetDateTime, Duration};
|
use time::{OffsetDateTime, Duration};
|
||||||
use url::Url;
|
use url::Url;
|
||||||
@ -13,8 +13,18 @@ use url::Url;
|
|||||||
//
|
//
|
||||||
// STRUCTS
|
// STRUCTS
|
||||||
//
|
//
|
||||||
// Post flair with text, background color and foreground color
|
// Post flair with content, background color and foreground color
|
||||||
pub struct Flair(pub String, pub String, pub String);
|
pub struct Flair{
|
||||||
|
pub flair_parts: Vec<FlairPart>,
|
||||||
|
pub background_color: String,
|
||||||
|
pub foreground_color: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct FlairPart{
|
||||||
|
pub flair_part_type: String,
|
||||||
|
pub value: String,
|
||||||
|
}
|
||||||
|
|
||||||
// Post flags with nsfw and stickied
|
// Post flags with nsfw and stickied
|
||||||
pub struct Flags {
|
pub struct Flags {
|
||||||
pub nsfw: bool,
|
pub nsfw: bool,
|
||||||
@ -190,6 +200,33 @@ pub async fn media(data: &serde_json::Value) -> (String, String) {
|
|||||||
(post_type.to_string(), url)
|
(post_type.to_string(), url)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn parse_rich_flair(flair_type: String, rich_flair: Option<&Vec<Value>>, text_flair: Option<&str>) -> Vec<FlairPart> {
|
||||||
|
let mut result: Vec<FlairPart> = Vec::new();
|
||||||
|
if flair_type == "richtext" && !rich_flair.is_none() {
|
||||||
|
for part in rich_flair.unwrap() {
|
||||||
|
let flair_part_type = part["e"].as_str().unwrap_or_default().to_string();
|
||||||
|
let value = if flair_part_type == "text" {
|
||||||
|
part["t"].as_str().unwrap_or_default().to_string()
|
||||||
|
|
||||||
|
} else if flair_part_type == "emoji" {
|
||||||
|
format_url(part["u"].as_str().unwrap_or_default())
|
||||||
|
} else {
|
||||||
|
"".to_string()
|
||||||
|
};
|
||||||
|
result.push(FlairPart {
|
||||||
|
flair_part_type,
|
||||||
|
value,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if flair_type == "text" && !text_flair.is_none() {
|
||||||
|
result.push(FlairPart {
|
||||||
|
flair_part_type: "text".to_string(),
|
||||||
|
value: text_flair.unwrap().to_string(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
pub fn time(unix_time: i64) -> String {
|
pub fn time(unix_time: i64) -> String {
|
||||||
let time = OffsetDateTime::from_unix_timestamp(unix_time);
|
let time = OffsetDateTime::from_unix_timestamp(unix_time);
|
||||||
let time_delta = OffsetDateTime::now_utc() - time;
|
let time_delta = OffsetDateTime::now_utc() - time;
|
||||||
@ -255,26 +292,26 @@ pub async fn fetch_posts(path: &str, fallback_title: String) -> Result<(Vec<Post
|
|||||||
community: val(post, "subreddit"),
|
community: val(post, "subreddit"),
|
||||||
body: rewrite_url(&val(post, "body_html")),
|
body: rewrite_url(&val(post, "body_html")),
|
||||||
author: val(post, "author"),
|
author: val(post, "author"),
|
||||||
author_flair: Flair(
|
author_flair: Flair{
|
||||||
val(post, "author_flair_text"),
|
flair_parts: parse_rich_flair(val(post, "author_flair_type"), post["data"]["author_flair_richtext"].as_array(), post["data"]["author_flair_text"].as_str()),
|
||||||
val(post, "author_flair_background_color"),
|
background_color: val(post, "author_flair_background_color"),
|
||||||
val(post, "author_flair_text_color"),
|
foreground_color: val(post, "author_flair_text_color"),
|
||||||
),
|
},
|
||||||
score: format_num(score),
|
score: format_num(score),
|
||||||
upvote_ratio: ratio as i64,
|
upvote_ratio: ratio as i64,
|
||||||
post_type,
|
post_type,
|
||||||
thumbnail: format_url(val(post, "thumbnail").as_str()),
|
thumbnail: format_url(val(post, "thumbnail").as_str()),
|
||||||
media,
|
media,
|
||||||
domain: val(post, "domain"),
|
domain: val(post, "domain"),
|
||||||
flair: Flair(
|
flair: Flair{
|
||||||
val(post, "link_flair_text"),
|
flair_parts: parse_rich_flair(val(post, "link_flair_type"), post["data"]["link_flair_richtext"].as_array(), post["data"]["link_flair_text"].as_str()),
|
||||||
val(post, "link_flair_background_color"),
|
background_color: val(post, "link_flair_background_color"),
|
||||||
if val(post, "link_flair_text_color") == "dark" {
|
foreground_color: if val(post, "link_flair_text_color") == "dark" {
|
||||||
"black".to_string()
|
"black".to_string()
|
||||||
} else {
|
} else {
|
||||||
"white".to_string()
|
"white".to_string()
|
||||||
},
|
},
|
||||||
),
|
},
|
||||||
flags: Flags {
|
flags: Flags {
|
||||||
nsfw: post["data"]["over_18"].as_bool().unwrap_or_default(),
|
nsfw: post["data"]["over_18"].as_bool().unwrap_or_default(),
|
||||||
stickied: post["data"]["stickied"].as_bool().unwrap_or_default(),
|
stickied: post["data"]["stickied"].as_bool().unwrap_or_default(),
|
||||||
|
@ -499,6 +499,16 @@ input[type="submit"]:hover { color: var(--accent); }
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.emoji {
|
||||||
|
width: 1em;
|
||||||
|
height: 1em;
|
||||||
|
display: inline-block;
|
||||||
|
background-size: contain;
|
||||||
|
background-position: 50% 50%;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
.nsfw {
|
.nsfw {
|
||||||
color: var(--nsfw);
|
color: var(--nsfw);
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
|
@ -22,8 +22,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<details class="comment_right" open>
|
<details class="comment_right" open>
|
||||||
<summary class="comment_data"><a class="comment_author {% if item.author == post.author %}op{% endif %}" href="/u/{{ item.author }}">u/{{ item.author }}</a>
|
<summary class="comment_data"><a class="comment_author {% if item.author == post.author %}op{% endif %}" href="/u/{{ item.author }}">u/{{ item.author }}</a>
|
||||||
{% if item.flair.0 != "" %}
|
{% if item.flair.flair_parts.len() > 0 %}
|
||||||
<small class="author_flair">{{ item.flair.0 }}</small>
|
<small class="author_flair">{% call utils::render_flair(item.flair.flair_parts) %}</small>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<span class="datetime">{{ item.time }}</span>
|
<span class="datetime">{{ item.time }}</span>
|
||||||
</summary>
|
</summary>
|
||||||
@ -50,16 +50,16 @@
|
|||||||
<a class="post_subreddit" href="/r/{{ post.community }}">r/{{ post.community }}</a>
|
<a class="post_subreddit" href="/r/{{ post.community }}">r/{{ post.community }}</a>
|
||||||
<span class="dot">•</span>
|
<span class="dot">•</span>
|
||||||
<a class="post_author" href="/u/{{ post.author }}">u/{{ post.author }}</a>
|
<a class="post_author" href="/u/{{ post.author }}">u/{{ post.author }}</a>
|
||||||
{% if post.author_flair.0 != "" %}
|
{% if post.author_flair.flair_parts.len() > 0 %}
|
||||||
<small class="author_flair">{{ post.author_flair.0 }}</small>
|
<small class="author_flair">{% call utils::render_flair(post.author_flair.flair_parts) %}</small>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<span class="dot">•</span>
|
<span class="dot">•</span>
|
||||||
<span class="datetime">{{ post.time }}</span>
|
<span class="datetime">{{ post.time }}</span>
|
||||||
</p>
|
</p>
|
||||||
<a href="{{ post.permalink }}" class="post_title">
|
<a href="{{ post.permalink }}" class="post_title">
|
||||||
{{ post.title }}
|
{{ post.title }}
|
||||||
{% if post.flair.0 != "" %}
|
{% if post.flair.flair_parts.len() > 0 %}
|
||||||
<small class="post_flair" style="color:{{ post.flair.2 }}; background:{{ post.flair.1 }}">{{ post.flair.0 }}</small>
|
<small class="post_flair" style="color:{{ post.flair.foreground_color }}; background:{{ post.flair.background_color }}">{% call utils::render_flair(post.flair.flair_parts) %}</small>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
@ -34,15 +34,15 @@
|
|||||||
<a class="post_subreddit" href="/r/{{ post.community }}">r/{{ post.community }}</a>
|
<a class="post_subreddit" href="/r/{{ post.community }}">r/{{ post.community }}</a>
|
||||||
<span class="dot">•</span>
|
<span class="dot">•</span>
|
||||||
<a class="post_author" href="/u/{{ post.author }}">u/{{ post.author }}</a>
|
<a class="post_author" href="/u/{{ post.author }}">u/{{ post.author }}</a>
|
||||||
{% if post.author_flair.0 != "" %}
|
{% if post.author_flair.flair_parts.len() > 0 %}
|
||||||
<small class="author_flair">{{ post.author_flair.0 }}</small>
|
<small class="author_flair">{% call utils::render_flair(post.author_flair.flair_parts) %}</small>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<span class="dot">•</span>
|
<span class="dot">•</span>
|
||||||
<span class="datetime">{{ post.time }}</span>
|
<span class="datetime">{{ post.time }}</span>
|
||||||
</p>
|
</p>
|
||||||
<p class="post_title">
|
<p class="post_title">
|
||||||
{% if post.flair.0 != "" %}
|
{% if post.flair.flair_parts.len() > 0 %}
|
||||||
<small class="post_flair" style="color:{{ post.flair.2 }}; background:{{ post.flair.1 }}">{{ post.flair.0 }}</small>
|
<small class="post_flair" style="color:{{ post.flair.foreground_color }}; background:{{ post.flair.background_color }}">{% call utils::render_flair(post.flair.flair_parts) %}</small>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="{{ post.permalink }}">{{ post.title }}</a>
|
<a href="{{ post.permalink }}">{{ post.title }}</a>
|
||||||
</p>
|
</p>
|
||||||
|
@ -46,8 +46,8 @@
|
|||||||
<span class="datetime">{{ post.time }}</span>
|
<span class="datetime">{{ post.time }}</span>
|
||||||
</p>
|
</p>
|
||||||
<p class="post_title">
|
<p class="post_title">
|
||||||
{% if post.flair.0 != "" %}
|
{% if post.flair.flair_parts.len() > 0 %}
|
||||||
<small class="post_flair" style="color:{{ post.flair.2 }}; background:{{ post.flair.1 }}">{{ post.flair.0 }}</small>
|
<small class="post_flair" style="color:{{ post.flair.foreground_color }}; background:{{ post.flair.background_color }}">{% call utils::render_flair(post.flair.flair_parts) %}</small>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="{{ post.permalink }}">{{ post.title }}</a>
|
<a href="{{ post.permalink }}">{{ post.title }}</a>
|
||||||
</p>
|
</p>
|
||||||
|
@ -32,17 +32,17 @@
|
|||||||
<div class="post_text">
|
<div class="post_text">
|
||||||
<p class="post_header">
|
<p class="post_header">
|
||||||
<a class="post_subreddit" href="/r/{{ post.community }}">r/{{ post.community }}</a>
|
<a class="post_subreddit" href="/r/{{ post.community }}">r/{{ post.community }}</a>
|
||||||
{% if post.author_flair.0 != "" %}
|
{% if post.author_flair.flair_parts.len() > 0 %}
|
||||||
<small class="author_flair">{{ post.author_flair.0 }}</small>
|
<small class="author_flair">{% call utils::render_flair(post.author_flair.flair_parts) %}</small>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<span class="dot">•</span>
|
<span class="dot">•</span>
|
||||||
<span class="datetime">{{ post.time }}</span>
|
<span class="datetime">{{ post.time }}</span>
|
||||||
</p>
|
</p>
|
||||||
<p class="post_title">
|
<p class="post_title">
|
||||||
{% if post.flair.0 == "Comment" %}
|
{% if post.flair.background_color == "Comment" %}
|
||||||
{% else if post.flair.0 == "" %}
|
{% else if post.flair.background_color == "" %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<small class="post_flair" style="color:{{ post.flair.2 }}; background:{{ post.flair.1 }}">{{ post.flair.0 }}</small>
|
<small class="post_flair" style="color:{{ post.flair.foreground_color }}; background:{{ post.flair.background_color }}">{% call utils::render_flair(post.flair.flair_parts) %}</small>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="{{ post.permalink }}">{{ post.title }}</a>
|
<a href="{{ post.permalink }}">{{ post.title }}</a>
|
||||||
</p>
|
</p>
|
||||||
|
@ -26,3 +26,7 @@
|
|||||||
<input type="submit" value="→">
|
<input type="submit" value="→">
|
||||||
</form>
|
</form>
|
||||||
{%- endmacro %}
|
{%- endmacro %}
|
||||||
|
|
||||||
|
{% macro render_flair(flair) -%}
|
||||||
|
{% for flair_part in flair %}{% if flair_part.flair_part_type == "emoji" %}<span class="emoji" style="background-image:url('{{ flair_part.value }}')"></span>{% else if flair_part.flair_part_type == "text" %}<span>{{ flair_part.value }}</span>{% endif %}{% endfor %}
|
||||||
|
{%- endmacro %}
|
||||||
|
Loading…
Reference in New Issue
Block a user