oliverbooth.dev/OliverBooth/Pages/Blog/Article.cshtml

163 lines
4.9 KiB
Plaintext
Raw Normal View History

@page "/blog/{year:int}/{month:int}/{day:int}/{slug}"
2023-08-07 23:28:33 +00:00
@using Humanizer
@using OliverBooth.Data.Blog
@using OliverBooth.Services
@inject IBlogPostService BlogPostService
@model Article
@if (Model.ShowPasswordPrompt)
{
<div class="alert alert-danger" role="alert">
This post is private and can only be viewed by those with the password.
</div>
<form method="post">
<div class="mb-3">
<label for="password" class="form-label">Password</label>
<input type="password" class="form-control" id="password" name="password" required>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
return;
}
2023-08-08 00:34:27 +00:00
@if (Model.Post is not { } post)
{
2023-08-08 00:34:27 +00:00
return;
}
@{
ViewData["Post"] = post;
ViewData["Title"] = post.Title;
IBlogAuthor author = post.Author;
DateTimeOffset published = post.Published;
}
2023-08-08 00:34:27 +00:00
<nav style="--bs-breadcrumb-divider: '>';" aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a asp-page="Index">Blog</a>
2023-08-08 00:34:27 +00:00
</li>
<li class="breadcrumb-item active" aria-current="page">@post.Title</li>
</ol>
</nav>
2023-08-07 23:28:33 +00:00
@switch (post.Visibility)
{
case BlogPostVisibility.Private:
<div class="alert alert-danger" role="alert">
This post is private and can only be viewed by those with the password.
</div>
break;
case BlogPostVisibility.Unlisted:
<div class="alert alert-warning" role="alert">
This post is unlisted and can only be viewed by those with the link.
</div>
break;
}
2023-08-08 00:34:27 +00:00
<h1>@post.Title</h1>
<p class="text-muted">
<img class="blog-author-icon" src="@author.AvatarUrl" alt="@author.DisplayName">
@author.DisplayName &bull;
<abbr data-bs-toggle="tooltip" data-bs-title="@published.ToString("dddd, d MMMM yyyy HH:mm")">
Published @published.Humanize()
2023-08-08 00:34:27 +00:00
</abbr>
@if (post.Updated is { } updated)
{
<span>&bull;</span>
<abbr data-bs-toggle="tooltip" data-bs-title="@updated.ToString("dddd, d MMMM yyyy HH:mm")">
Updated @updated.Humanize()
</abbr>
}
2023-08-08 00:17:23 +00:00
@if (post.EnableComments)
{
2023-08-08 00:34:27 +00:00
<span>&bull;</span>
<a href="#disqus_thread" data-disqus-identifier="@post.GetDisqusIdentifier()">0 Comments</a>
2023-08-08 00:17:23 +00:00
}
2023-08-08 00:34:27 +00:00
</p>
2023-09-23 21:08:25 +00:00
<div>
@foreach (string tag in post.Tags)
{
<a asp-page="Index" asp-route-tag="@tag" class="badge bg-secondary">@tag</a>
}
</div>
<hr>
2023-08-08 00:34:27 +00:00
2023-09-28 09:58:59 +00:00
<article>
@Html.Raw(BlogPostService.RenderPost(post))
2023-08-08 00:34:27 +00:00
</article>
<hr>
<div class="row">
<div class="col-sm-12 col-md-6">
@if (BlogPostService.GetPreviousPost(post) is { } previousPost)
{
<small>Previous Post</small>
<p class="lead">
<a asp-page="Article"
asp-route-year="@previousPost.Published.Year.ToString("0000")"
asp-route-month="@previousPost.Published.Month.ToString("00")"
asp-route-day="@previousPost.Published.Day.ToString("00")"
asp-route-slug="@previousPost.Slug">
@previousPost.Title
</a>
</p>
}
</div>
<div class="col-sm-12 col-md-6" style="text-align: right;">
@if (BlogPostService.GetNextPost(post) is { } nextPost)
{
<small>Next Post</small>
<p class="lead">
<a asp-page="Article"
asp-route-year="@nextPost.Published.Year.ToString("0000")"
asp-route-month="@nextPost.Published.Month.ToString("00")"
asp-route-day="@nextPost.Published.Day.ToString("00")"
asp-route-slug="@nextPost.Slug">
@nextPost.Title
</a>
</p>
}
</div>
</div>
<hr>
2023-08-08 00:34:27 +00:00
@if (post.EnableComments)
{
<div id="disqus_thread"></div>
<script>
var disqus_config = function () {
this.page.url = "@post.GetDisqusUrl()";
this.page.identifier = "@post.GetDisqusIdentifier()";
2023-08-08 00:34:27 +00:00
this.page.title = "@post.Title";
this.page.postId = "@post.GetDisqusPostId()";
2023-08-08 00:34:27 +00:00
};
(function() {
const d = document, s = d.createElement("script");
s.async = true;
s.type = "text/javascript";
s.src = "https://oliverbooth-dev.disqus.com/embed.js";
s.setAttribute("data-timestamp", (+ new Date()).toString());
2023-08-08 00:34:27 +00:00
(d.head || d.body).appendChild(s);
})();
</script>
<script id="dsq-count-scr" src="https://oliverbooth-dev.disqus.com/count.js" async></script>
<noscript>
Please enable JavaScript to view the
<a href="https://disqus.com/?ref_noscript" rel="nofollow">
comments powered by Disqus.
</a>
</noscript>
}
else
{
<p class="text-center text-muted">Comments are not enabled for this post.</p>
}