gallery posts
This commit is contained in:
parent
8a2333a461
commit
31ff80c62f
|
@ -1,4 +1,4 @@
|
|||
use super::{PostNotFound, SeriesNotFound};
|
||||
use super::PostNotFound;
|
||||
use crate::{
|
||||
app::State,
|
||||
post::Post,
|
||||
|
@ -11,3 +11,21 @@ pub async fn index(state: Arc<State>) -> Result<impl Reply, Rejection> {
|
|||
let state = state.clone();
|
||||
Response::builder().html(|o| templates::galleryindex_html(o, state.gallery.clone()))
|
||||
}
|
||||
|
||||
pub async fn post_view(name: String, state: Arc<State>) -> Result<impl Reply, Rejection> {
|
||||
let mut want: Option<Post> = None;
|
||||
|
||||
for post in &state.gallery {
|
||||
if post.link == format!("gallery/{}", name) {
|
||||
want = Some(post.clone());
|
||||
}
|
||||
}
|
||||
|
||||
match want {
|
||||
None => Err(PostNotFound("blog".into(), name).into()),
|
||||
Some(post) => {
|
||||
let body = Html(post.body_html.clone());
|
||||
Response::builder().html(|o| templates::gallerypost_html(o, post, body))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -62,8 +62,14 @@ async fn main() -> Result<()> {
|
|||
.and(warp::path::end())
|
||||
.and(with_state(state.clone()))
|
||||
.and_then(handlers::gallery::index);
|
||||
let post_view = base.and(
|
||||
warp::path!(String)
|
||||
.and(with_state(state.clone()))
|
||||
.and(warp::get())
|
||||
.and_then(handlers::gallery::post_view),
|
||||
);
|
||||
|
||||
index
|
||||
index.or(post_view)
|
||||
};
|
||||
|
||||
let static_pages = {
|
||||
|
|
|
@ -0,0 +1,126 @@
|
|||
@use super::{header_html, footer_html};
|
||||
@use crate::post::Post;
|
||||
|
||||
@(post: Post, body: impl ToHtml)
|
||||
|
||||
@:header_html(Some(&post.front_matter.title.clone()), None)
|
||||
|
||||
<!-- Twitter -->
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:site" content="@@theprincessxena" />
|
||||
<meta name="twitter:title" content="@post.front_matter.title" />
|
||||
<meta name="twitter:description" content="Posted on @post.date" />
|
||||
|
||||
<!-- Facebook -->
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:title" content="@post.front_matter.title" />
|
||||
<meta property="og:site_name" content="Christine Dodrill's Blog" />
|
||||
|
||||
<!-- Description -->
|
||||
<meta name="description" content="@post.front_matter.title - Christine Dodrill's Blog" />
|
||||
<meta name="author" content="Christine Dodrill">
|
||||
|
||||
<link rel="canonical" href="https://christine.website/@post.link">
|
||||
|
||||
<script type="application/ld+json">
|
||||
@{
|
||||
"@@context": "http://schema.org",
|
||||
"@@type": "Article",
|
||||
"headline": "@post.front_matter.title",
|
||||
"image": "https://christine.website/static/img/avatar.png",
|
||||
"url": "https://christine.website/@post.link",
|
||||
"datePublished": "@post.date",
|
||||
"mainEntityOfPage": @{
|
||||
"@@type": "WebPage",
|
||||
"@@id": "https://christine.website/@post.link"
|
||||
@},
|
||||
"author": @{
|
||||
"@@type": "Person",
|
||||
"name": "Christine Dodrill"
|
||||
@},
|
||||
"publisher": @{
|
||||
"@@type": "Person",
|
||||
"name": "Christine Dodrill"
|
||||
@}
|
||||
@}
|
||||
</script>
|
||||
|
||||
<h1>@post.front_matter.title</h1>
|
||||
|
||||
@body
|
||||
|
||||
<center>
|
||||
<img src="@post.front_matter.image.as_ref().unwrap()" />
|
||||
</center>
|
||||
|
||||
<hr />
|
||||
|
||||
<!-- The button that should be clicked. -->
|
||||
<button onclick="share_on_mastodon()">Share on Mastodon</button>
|
||||
|
||||
@if post.front_matter.series.is_some() {
|
||||
<p>Series: <a href="/blog/series/@post.front_matter.series.as_ref().unwrap()">@post.front_matter.series.as_ref().unwrap()</a></p>
|
||||
}
|
||||
|
||||
@if post.front_matter.tags.is_some() {
|
||||
<p>Tags: @for tag in post.front_matter.tags.as_ref().unwrap() { <code>@tag</code> }</p>
|
||||
}
|
||||
|
||||
<script>
|
||||
|
||||
// The actual function. Set this as an onclick function for your "Share on Mastodon" button
|
||||
function share_on_mastodon() @{
|
||||
// Prefill the form with the user's previously-specified Mastodon instance, if applicable
|
||||
var default_url = localStorage['mastodon_instance'];
|
||||
|
||||
// If there is no cached instance/domain, then insert a "https://" with no domain at the start of the prompt.
|
||||
if (!default_url)
|
||||
default_url = "https://";
|
||||
|
||||
var instance = prompt("Enter your instance's address: (ex: https://linuxrocks.online)", default_url);
|
||||
if (instance) @{
|
||||
// Handle URL formats
|
||||
if ( !instance.startsWith("https://") && !instance.startsWith("http://") )
|
||||
instance = "https://" + instance;
|
||||
|
||||
// get the current page's url
|
||||
var url = window.location.href;
|
||||
|
||||
// get the page title from the og:title meta tag, if it exists.
|
||||
var title = document.querySelectorAll('meta[property="og:title"]')[0].getAttribute("content");
|
||||
|
||||
// Otherwise, use the <title> tag as the title
|
||||
if (!title) var title = document.getElementsByTagName("title")[0].innerHTML;
|
||||
|
||||
// Handle slash
|
||||
if ( !instance.endsWith("/") )
|
||||
instance = instance + "/";
|
||||
|
||||
// Cache the instance/domain for future requests
|
||||
localStorage['mastodon_instance'] = instance;
|
||||
|
||||
// Hashtags
|
||||
var hashtags = "#blogpost";
|
||||
|
||||
@if post.front_matter.series.is_some() {
|
||||
hashtags += "#@post.front_matter.series.as_ref().unwrap()";
|
||||
}
|
||||
|
||||
@if post.front_matter.tags.is_some() {
|
||||
hashtags += "@for tag in post.front_matter.tags.as_ref().unwrap() { #@tag }";
|
||||
}
|
||||
|
||||
// Tagging users, such as offical accounts or the author of the post
|
||||
var author = "@@cadey@@mst3k.interlinked.me";
|
||||
|
||||
// Create the Share URL
|
||||
// https://someinstance.tld/share?text=URL%20encoded%20text
|
||||
mastodon_url = instance + "share?text=" + encodeURIComponent(title + "\n\n" + url + "\n\n" + hashtags + " " + author);
|
||||
|
||||
// Open a new window at the share location
|
||||
window.open(mastodon_url, '_blank');
|
||||
@}
|
||||
@}
|
||||
</script>
|
||||
|
||||
@:footer_html()
|
Loading…
Reference in New Issue