mirror of https://github.com/ErsatzTV/ErsatzTV.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.7 KiB
69 lines
1.7 KiB
using Ganss.Xss; |
|
using Markdig; |
|
using Microsoft.AspNetCore.Components; |
|
using Microsoft.JSInterop; |
|
|
|
namespace ErsatzTV.Shared; |
|
|
|
public partial class MarkdownView |
|
{ |
|
private MarkupString? _markupContent; |
|
|
|
[Inject] |
|
public IHtmlSanitizer HtmlSanitizer { get; set; } |
|
|
|
[Inject] |
|
public IJSRuntime JsRuntime { get; set; } |
|
|
|
[Parameter] |
|
public string Content { get; set; } |
|
|
|
public MarkupString? HtmlContent |
|
{ |
|
get |
|
{ |
|
if (string.IsNullOrWhiteSpace(Content)) |
|
{ |
|
return null; |
|
} |
|
|
|
return _markupContent ?? (_markupContent = ConvertStringToMarkupString(Content)).Value; |
|
} |
|
} |
|
|
|
private MarkupString ConvertStringToMarkupString(string value) |
|
{ |
|
if (!string.IsNullOrWhiteSpace(value)) |
|
{ |
|
// Convert markdown string to HTML |
|
string html = Markdown.ToHtml( |
|
value, |
|
new MarkdownPipelineBuilder() |
|
.UseAdvancedExtensions() |
|
.UseSoftlineBreakAsHardlineBreak() |
|
.Build()); |
|
|
|
// Sanitize HTML before rendering |
|
string sanitizedHtml = HtmlSanitizer.Sanitize(html); |
|
|
|
// Return sanitized HTML as a MarkupString that Blazor can render |
|
return new MarkupString(sanitizedHtml); |
|
} |
|
|
|
return new MarkupString(); |
|
} |
|
|
|
protected override async Task OnAfterRenderAsync(bool firstRender) |
|
{ |
|
try |
|
{ |
|
await JsRuntime.InvokeVoidAsync("styleMarkdown"); |
|
} |
|
catch (Exception) |
|
{ |
|
// ignored |
|
} |
|
|
|
await base.OnAfterRenderAsync(true); |
|
} |
|
}
|
|
|