Files
YaeBlog/YaeBlog/Components/Pages/Essays.razor
jackfiled 9a2fc9982d feat: update to .net 10.
Use ClientAssets to build tailwind styles.
Make blog anchors not open new tab.
2026-01-03 23:41:30 +08:00

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}";
}