129 lines
3.7 KiB
Plaintext
129 lines
3.7 KiB
Plaintext
@page "/blog/essays/{BlogKey}"
|
|
@using System.Text.Encodings.Web
|
|
@using YaeBlog.Abstraction
|
|
@using YaeBlog.Models
|
|
|
|
@inject IEssayContentService Contents
|
|
@inject NavigationManager NavigationInstance
|
|
|
|
<PageTitle>
|
|
@(_essay!.Title)
|
|
</PageTitle>
|
|
|
|
<div class="flex flex-col py-8">
|
|
<div>
|
|
<h1 id="title" class="text-4xl">@(_essay!.Title)</h1>
|
|
<div class="col-auto">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="px-6 pt-4 pb-2">
|
|
<div class="flex flex-row gap-4">
|
|
<div class="font-light">
|
|
@(_essay!.PublishTime.ToString("yyyy-MM-dd"))
|
|
</div>
|
|
|
|
@foreach (string tag in _essay!.Tags)
|
|
{
|
|
<div class="text-sky-500">
|
|
<a href="/blog/tags/?tagName=@(UrlEncoder.Default.Encode(tag))">
|
|
# @(tag)
|
|
</a>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="px-6 pt-2 pb-4">
|
|
<div class="font-light">
|
|
总字数:@(_essay!.WordCount)字,预计阅读时间 @(_essay!.ReadTime)。
|
|
</div>
|
|
</div>
|
|
|
|
<div class="grid grid-cols-3">
|
|
<div class="col-span-3 md:col-span-2 flex flex-col gap-3">
|
|
<div>
|
|
@((MarkupString)_essay!.HtmlContent)
|
|
</div>
|
|
|
|
<div>
|
|
<LicenseDisclaimer EssayFilename="@BlogKey"/>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-span-3 md:col-span-1">
|
|
<div class="flex flex-col sticky top-0 px-8">
|
|
<div>
|
|
<h3 class="text-2xl">文章目录</h3>
|
|
</div>
|
|
|
|
<div>
|
|
@foreach (BlogHeadline level2 in _headline!.Children)
|
|
{
|
|
<div class="py-2 pl-3">
|
|
<Anchor Address="@(GenerateSelectorUrl(level2.SelectorId))"
|
|
Text="@(level2.Title)"/>
|
|
</div>
|
|
|
|
@foreach (BlogHeadline level3 in level2.Children)
|
|
{
|
|
<div class="py-2 pl-6">
|
|
<Anchor Address="@(GenerateSelectorUrl(level3.SelectorId))"
|
|
Text="@(level3.Title)"/>
|
|
</div>
|
|
|
|
@foreach (BlogHeadline level4 in level3.Children)
|
|
{
|
|
<div class="py-2 pl-9">
|
|
<Anchor Address="@(GenerateSelectorUrl(level4.SelectorId))"
|
|
Text="@(level4.Title)"/>
|
|
</div>
|
|
}
|
|
}
|
|
}
|
|
</div>
|
|
|
|
@if (_headline!.Children.Count == 0)
|
|
{
|
|
<div class="row">
|
|
<div class="col fst-italic">
|
|
坏了(* Ŏ∀Ŏ),没有在文章中识别到目录
|
|
</div>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
@code {
|
|
[Parameter] public string? BlogKey { get; set; }
|
|
|
|
private BlogEssay? _essay;
|
|
|
|
private BlogHeadline? _headline;
|
|
|
|
protected override void OnInitialized()
|
|
{
|
|
base.OnInitialized();
|
|
|
|
if (string.IsNullOrWhiteSpace(BlogKey))
|
|
{
|
|
NavigationInstance.NavigateTo("/NotFound");
|
|
return;
|
|
}
|
|
|
|
if (!Contents.TryGetEssay(BlogKey, out _essay))
|
|
{
|
|
NavigationInstance.NavigateTo("/NotFound");
|
|
}
|
|
|
|
_headline = Contents.Headlines[BlogKey];
|
|
}
|
|
|
|
private string GenerateSelectorUrl(string selectorId)
|
|
=> $"/blog/essays/{BlogKey!}#{selectorId}";
|
|
|
|
}
|