using Iceshrimp.Backend.Components.PublicPreview.Schemas; using Iceshrimp.Backend.Core.Database.Tables; using Iceshrimp.Backend.Core.Extensions; using Iceshrimp.Backend.Core.Helpers.LibMfm.Conversion; using Iceshrimp.Backend.Core.Services; using Iceshrimp.MfmSharp; using JetBrains.Annotations; using Microsoft.AspNetCore.Components; namespace Iceshrimp.Backend.Components.PublicPreview.Renderers; public readonly record struct MfmRenderData(MarkupString Html, List InlineMedia); [UsedImplicitly] public class MfmRenderer(MfmConverter converter, FlagService flags) : ISingletonService { public async Task RenderAsync( string? text, string? host, List mentions, List emoji, string rootElement, List? media = null ) { if (text is null) return null; var parsed = MfmParser.Parse(text); // Ensure we are rendering HTML markup (AsyncLocal) flags.SupportsHtmlFormatting.Value = true; flags.SupportsInlineMedia.Value = true; var mfmInlineMedia = media?.Select(m => new MfmInlineMedia(MfmInlineMedia.GetType(m.MimeType), m.Url, m.Alt)).ToList(); var serialized = await converter.ToHtmlAsync(parsed, mentions, host, emoji: emoji, rootElement: rootElement, media: mfmInlineMedia); return new MfmRenderData(new MarkupString(serialized.Html), serialized.InlineMedia); } public async Task RenderSimpleAsync(string? text, string? host, List mentions, List emoji, string rootElement) { var rendered = await RenderAsync(text, host, mentions, emoji, rootElement); return rendered?.Html; } }