@using Dpz.Core.EnumLibrary
@using AngleSharp
@using Ganss.Xss
@model Dpz.Core.Public.ViewModel.Response.MumbleResponse
@inject Microsoft.Extensions.Configuration.IConfiguration Configuration
@{
var rule = Configuration.GetSection("XSS").Get<CrossSiteRule>();
var sanitizer = rule?.CustomHtmlSanitizer() ?? new HtmlSanitizer();
var context = BrowsingContext.New(AngleSharp.Configuration.Default);
async Task<string> ProcessContentAsync(string html)
{
var document = await context.OpenAsync(y => y.Content(html));
var links = document.GetElementsByTagName("a");
foreach (var link in links)
{
var href = link.GetAttribute("href");
if (href != null && !href.StartsWith("javascript", StringComparison.CurrentCultureIgnoreCase))
{
link.SetAttribute("target", "_blank");
link.SetAttribute("rel", "noopener noreferrer");
}
}
var images = document.GetElementsByTagName("img");
foreach (var img in images)
{
var src = img.GetAttribute("src");
if (string.IsNullOrEmpty(src))
{
img.SetAttribute("src", $"{Program.AssetsHost}/images/notfound.png");
}
img.SetAttribute("loading", "lazy");
}
return sanitizer.Sanitize(document.Body?.InnerHtml ?? "");
}
}
<div class="mumble-layout">
<main class="mumble-layout__main">
<article class="mumble-card mumble-card--detail">
<div class="mumble-card__header">
<img class="mumble-card__avatar" src="@Model.Author.Avatar" alt="@Model.Author.Name" loading="lazy">
<div class="mumble-card__meta">
<div class="mumble-card__author">
@Model.Author.Name
<span
class="mumble-card__role">@(Model.Author.Permissions?.HasFlag(Permissions.System) == true ? "管理员" : "成员")</span>
</div>
<time class="mumble-card__time timeago" datetime="@Model.CreateTime">@Model.CreateTime</time>
</div>
</div>
<div class="mumble-card__content markdown-body">
@Html.Raw(await ProcessContentAsync(Model.Markdown?.MarkdownToHtml(false) ?? ""))
</div>
<div class="mumble-card__footer">
<span class="mumble-action mumble-action--active" title="详情">
<i class="fa fa-info-circle"></i>
<span>详情页</span>
</span>
<span class="mumble-action" title="评论">
<i class="fa fa-commenting"></i>
<span data-comment-count>@Model.CommentCount</span>
</span>
<button class="mumble-action" data-like-id="@Model.Id" title="点赞">
<i class="fa fa-thumbs-up"></i>
<span data-like-count>@Model.Like</span>
</button>
</div>
<!-- Comments are always visible in detail view -->
<div class="mumble-comments"
id="comments-@Model.Id">
<div class="text-muted p-3">
<partial name="_GlobalCommentPartial" model="(CommentNode.Mumble,Model.Id)"/>
</div>
</div>
</article>
</main>
<aside class="mumble-layout__sidebar">
<!-- Optional: Could add recent mumbles or history here if desired, otherwise empty or ad -->
<div class="history-widget">
<h3 class="history-widget__title">返回</h3>
<div class="history-widget__list">
<a asp-action="Index" asp-controller="Mumble" class="mumble-action" data-pjax>
<i class="fa fa-arrow-left"></i> 返回碎碎念列表
</a>
</div>
</div>
</aside>
</div>
评论加载中...