xesite/templates/blogpost.rs.html

173 lines
6.7 KiB
HTML

@use super::{header_html, footer_html, mara};
@use crate::post::Post;
@use chrono::prelude::*;
@(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.format("%Y-%m-%d")" />
<!-- Facebook -->
<meta property="og:type" content="website" />
<meta property="og:title" content="@post.front_matter.title" />
<meta property="og:site_name" content="Xe's Blog" />
<!-- Description -->
<meta name="description" content="@post.front_matter.title - Xe's Blog" />
<meta name="author" content="Xe Iaso" />
@if post.front_matter.redirect_to.is_none() {
<link rel="canonical" href="https://xeiaso.net/@post.link" />
} else {
<link rel="canonical" href="@post.front_matter.redirect_to.as_ref().unwrap()" />
}
<script type="module" src="/static/js/conversation.js"></script>
<script type="application/ld+json">
@{
"@@context": "http://schema.org",
"@@type": "Article",
"headline": "@post.front_matter.title",
"image": "https://xeiaso.net/static/img/avatar.png",
"url": "https://xeiaso.net/@post.link",
"datePublished": "@post.date.format("%Y-%m-%d")",
"mainEntityOfPage": @{
"@@type": "WebPage",
"@@id": "https://xeiaso.net/@post.link"
@},
"author": @{
"@@type": "Person",
"name": "Xe Iaso"
@},
"publisher": @{
"@@type": "Person",
"name": "Xe Iaso"
@}
@}
</script>
@if let Some(to) = post.front_matter.redirect_to.clone() {
<meta http-equiv="refresh" content="0;URL='@to'" />
<script>
window.location.replace("@to");
</script>
}
<div id="refererNotice"></div>
<script type="module" src="/static/js/hnwarn.js"></script>
<h1>@post.front_matter.title</h1>
@if Utc::today().num_days_from_ce() < post.date.num_days_from_ce() {
<div class="warning">
@:mara("hacker", "Mara", Html(format!(r#"Hey, this post is set to go live to the public on {} UTC. Right now you are reading a pre-publication version of this post. Please do not share this on social media. This post will automatically go live for everyone on the intended publication date. If you want access to these posts, please join the <a href="https://patreon.com/cadey">Patreon</a>. It helps me afford the copyeditor that I contract for the technical content I write."#, post.detri())))
</div>
} else {
<script async src="https://media.ethicalads.io/media/client/ethicalads.min.js"></script>
}
<small>A @post.read_time_estimate_minutes minute read.</small>
@body
<div class="adaptive" data-ea-publisher="christinewebsite" data-ea-type="image" data-ea-style="stickybox"></div>
<hr />
@if post.front_matter.vod.is_some() {
<p>This post was written live on <a href="https://twitch.tv/princessxen">Twitch</a>. You can check out the stream recording on Twitch <a href="@post.front_matter.vod.as_ref().unwrap().twitch">here</a> and on YouTube <a href="@post.front_matter.vod.as_ref().unwrap().youtube">here</a>.</p>
}
<!-- The button that should be clicked. -->
<button onclick="share_on_mastodon()">Share on Mastodon</button>
<p>This article was posted on @post.detri(). Facts and circumstances may have changed since publication. Please <a href="/contact">contact me</a> before jumping to conclusions if something seems wrong or unclear.</p>
@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>
}
@if post.mentions.len() != 0 {
<p>This post was <a href="https://www.w3.org/TR/webmention/">WebMention</a>ed at the following URLs:
<ul>
@for mention in post.mentions {
<li><a href="@mention.source">@mention.title.unwrap_or(mention.source)</a></li>
}
</ul>
</p>
} else {
<p>This post was not <a href="https://www.w3.org/TR/webmention/">WebMention</a>ed yet. You could be the first!</p>
}
<p>The art for Mara was drawn by <a href="https://selic.re/">Selicre</a>.</p>
<p>The art for Cadey was drawn by <a href="https://artzorastudios.weebly.com/">ArtZora Studios</a>.</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@@pony.social";
// 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()