From e752269467575d8b242a4b1255bedf7e635aed6a Mon Sep 17 00:00:00 2001 From: Oleksii Holub <1935960+Tyrrrz@users.noreply.github.com> Date: Thu, 3 Nov 2022 18:56:45 +0200 Subject: [PATCH] Migrate from MiniRazor to RazorBlade --- .../DiscordChatExporter.Core.csproj | 4 +- .../Writers/Html/MessageGroupTemplate.cshtml | 61 +++++++++++-------- .../Html/MessageGroupTemplateContext.cs | 22 ------- .../Writers/Html/PostambleTemplate.cshtml | 22 +++++-- .../Writers/Html/PostambleTemplateContext.cs | 14 ----- .../Writers/Html/PreambleTemplate.cshtml | 53 +++++++++------- .../Writers/Html/PreambleTemplateContext.cs | 20 ------ .../Exporting/Writers/HtmlMessageWriter.cs | 36 ++++++----- .../Views/Components/DashboardView.xaml | 2 +- 9 files changed, 109 insertions(+), 125 deletions(-) delete mode 100644 DiscordChatExporter.Core/Exporting/Writers/Html/MessageGroupTemplateContext.cs delete mode 100644 DiscordChatExporter.Core/Exporting/Writers/Html/PostambleTemplateContext.cs delete mode 100644 DiscordChatExporter.Core/Exporting/Writers/Html/PreambleTemplateContext.cs diff --git a/DiscordChatExporter.Core/DiscordChatExporter.Core.csproj b/DiscordChatExporter.Core/DiscordChatExporter.Core.csproj index 20c5d8e..1fc2f48 100644 --- a/DiscordChatExporter.Core/DiscordChatExporter.Core.csproj +++ b/DiscordChatExporter.Core/DiscordChatExporter.Core.csproj @@ -7,14 +7,14 @@ - + - + \ No newline at end of file diff --git a/DiscordChatExporter.Core/Exporting/Writers/Html/MessageGroupTemplate.cshtml b/DiscordChatExporter.Core/Exporting/Writers/Html/MessageGroupTemplate.cshtml index 738ac2c..f0d0555 100644 --- a/DiscordChatExporter.Core/Exporting/Writers/Html/MessageGroupTemplate.cshtml +++ b/DiscordChatExporter.Core/Exporting/Writers/Html/MessageGroupTemplate.cshtml @@ -1,43 +1,56 @@ @using System +@using System.Collections.Generic @using System.Linq +@using System.Threading @using System.Threading.Tasks @using DiscordChatExporter.Core.Discord.Data @using DiscordChatExporter.Core.Discord.Data.Embeds -@using DiscordChatExporter.Core.Exporting.Writers.Html; +@using DiscordChatExporter.Core.Exporting +@using DiscordChatExporter.Core.Exporting.Writers.Html +@using DiscordChatExporter.Core.Exporting.Writers.MarkdownVisitors @using DiscordChatExporter.Core.Utils.Extensions -@namespace DiscordChatExporter.Core.Exporting.Writers.Html -@inherits MiniRazor.TemplateBase +@inherits RazorBlade.HtmlTemplate + +@functions { + // RazorBlade does not provide built-in support for cancellation + // https://github.com/ltrzesniewski/RazorBlade/issues/2 + public CancellationToken CancellationToken { get; init; } + + public ExportContext ExportContext { get; init; } = default!; + + public IReadOnlyList Messages { get; init; } = Array.Empty(); +} @{ ValueTask ResolveAssetUrlAsync(string url) => - Model.ExportContext.ResolveAssetUrlAsync(url); + ExportContext.ResolveAssetUrlAsync(url, CancellationToken); string FormatDate(DateTimeOffset date) => - Model.ExportContext.FormatDate(date); + ExportContext.FormatDate(date); ValueTask FormatMarkdownAsync(string markdown) => - Model.FormatMarkdownAsync(markdown); + HtmlMarkdownVisitor.FormatAsync(ExportContext, markdown); ValueTask FormatEmbedMarkdownAsync(string markdown) => - Model.FormatMarkdownAsync(markdown, false); + HtmlMarkdownVisitor.FormatAsync(ExportContext, markdown, false); - var firstMessage = Model.Messages.First(); + var firstMessage = Messages.First(); - var userMember = Model.ExportContext.TryGetMember(firstMessage.Author.Id); + var userMember = ExportContext.TryGetMember(firstMessage.Author.Id); - var userColor = Model.ExportContext.TryGetUserColor(firstMessage.Author.Id); + var userColor = ExportContext.TryGetUserColor(firstMessage.Author.Id); var userNick = firstMessage.Author.IsBot ? firstMessage.Author.Name : userMember?.Nick ?? firstMessage.Author.Name; var referencedUserMember = firstMessage.ReferencedMessage is not null - ? Model.ExportContext.TryGetMember(firstMessage.ReferencedMessage.Author.Id) + ? ExportContext.TryGetMember(firstMessage.ReferencedMessage.Author.Id) : null; var referencedUserColor = firstMessage.ReferencedMessage is not null - ? Model.ExportContext.TryGetUserColor(firstMessage.ReferencedMessage.Author.Id) + ? ExportContext.TryGetUserColor(firstMessage.ReferencedMessage.Author.Id) : null; var referencedUserNick = firstMessage.ReferencedMessage is not null @@ -48,7 +61,7 @@ }
-@foreach (var (message, i) in Model.Messages.WithIndex()) +@foreach (var (message, i) in Messages.WithIndex()) { var isFirst = i == 0; @@ -59,8 +72,8 @@ { // System notifications are grouped even if the message author is different. // That's why we have to update the user values with the author of the current message. - userMember = Model.ExportContext.TryGetMember(message.Author.Id); - userColor = Model.ExportContext.TryGetUserColor(message.Author.Id); + userMember = ExportContext.TryGetMember(message.Author.Id); + userColor = ExportContext.TryGetUserColor(message.Author.Id); userNick = message.Author.IsBot ? message.Author.Name : userMember?.Nick ?? message.Author.Name; @@ -129,7 +142,7 @@ @if (!string.IsNullOrWhiteSpace(message.ReferencedMessage.Content) && !message.ReferencedMessage.IsContentHidden()) { - @Raw(await FormatEmbedMarkdownAsync(message.ReferencedMessage.Content)) + @Html.Raw(await FormatEmbedMarkdownAsync(message.ReferencedMessage.Content)) } else if (message.ReferencedMessage.Attachments.Any() || message.ReferencedMessage.Embeds.Any()) { @@ -180,7 +193,7 @@ @{/* Text */} @if (!string.IsNullOrWhiteSpace(message.Content) && !message.IsContentHidden()) { - @Raw(await FormatMarkdownAsync(message.Content)) + @Html.Raw(await FormatMarkdownAsync(message.Content)) } @{/* Edited timestamp */} @@ -300,12 +313,12 @@ @if (!string.IsNullOrWhiteSpace(embed.Url)) { -
@Raw(await FormatEmbedMarkdownAsync(embed.Title))
+
@Html.Raw(await FormatEmbedMarkdownAsync(embed.Title))
} else { -
@Raw(await FormatEmbedMarkdownAsync(embed.Title))
+
@Html.Raw(await FormatEmbedMarkdownAsync(embed.Title))
}
} @@ -386,12 +399,12 @@ @if (!string.IsNullOrWhiteSpace(embed.Url)) { -
@Raw(await FormatEmbedMarkdownAsync(embed.Title))
+
@Html.Raw(await FormatEmbedMarkdownAsync(embed.Title))
} else { -
@Raw(await FormatEmbedMarkdownAsync(embed.Title))
+
@Html.Raw(await FormatEmbedMarkdownAsync(embed.Title))
} } @@ -400,7 +413,7 @@ @if (!string.IsNullOrWhiteSpace(embed.Description)) {
-
@Raw(await FormatEmbedMarkdownAsync(embed.Description))
+
@Html.Raw(await FormatEmbedMarkdownAsync(embed.Description))
} @@ -414,14 +427,14 @@ @if (!string.IsNullOrWhiteSpace(field.Name)) {
-
@Raw(await FormatEmbedMarkdownAsync(field.Name))
+
@Html.Raw(await FormatEmbedMarkdownAsync(field.Name))
} @if (!string.IsNullOrWhiteSpace(field.Value)) {
-
@Raw(await FormatEmbedMarkdownAsync(field.Value))
+
@Html.Raw(await FormatEmbedMarkdownAsync(field.Value))
} diff --git a/DiscordChatExporter.Core/Exporting/Writers/Html/MessageGroupTemplateContext.cs b/DiscordChatExporter.Core/Exporting/Writers/Html/MessageGroupTemplateContext.cs deleted file mode 100644 index 8e5943d..0000000 --- a/DiscordChatExporter.Core/Exporting/Writers/Html/MessageGroupTemplateContext.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using DiscordChatExporter.Core.Discord.Data; -using DiscordChatExporter.Core.Exporting.Writers.MarkdownVisitors; - -namespace DiscordChatExporter.Core.Exporting.Writers.Html; - -internal class MessageGroupTemplateContext -{ - public ExportContext ExportContext { get; } - - public IReadOnlyList Messages { get; } - - public MessageGroupTemplateContext(ExportContext exportContext, IReadOnlyList messages) - { - ExportContext = exportContext; - Messages = messages; - } - - public ValueTask FormatMarkdownAsync(string? markdown, bool isJumboAllowed = true) => - HtmlMarkdownVisitor.FormatAsync(ExportContext, markdown ?? "", isJumboAllowed); -} \ No newline at end of file diff --git a/DiscordChatExporter.Core/Exporting/Writers/Html/PostambleTemplate.cshtml b/DiscordChatExporter.Core/Exporting/Writers/Html/PostambleTemplate.cshtml index 3d508bd..0da2161 100644 --- a/DiscordChatExporter.Core/Exporting/Writers/Html/PostambleTemplate.cshtml +++ b/DiscordChatExporter.Core/Exporting/Writers/Html/PostambleTemplate.cshtml @@ -1,15 +1,27 @@ -@using DiscordChatExporter.Core.Exporting.Writers.Html; +@using System.Threading +@using DiscordChatExporter.Core.Exporting -@namespace DiscordChatExporter.Core.Exporting.Writers.Html -@inherits MiniRazor.TemplateBase +@inherits RazorBlade.HtmlTemplate -@{/* Close elements opened by preamble */} +@functions { + // RazorBlade does not provide built-in support for cancellation + // https://github.com/ltrzesniewski/RazorBlade/issues/2 + public CancellationToken CancellationToken { get; init; } + + public ExportContext ExportContext { get; init; } = default!; + + public long MessagesWritten { get; init; } +} + +@{ + /* Close elements opened by preamble */ +}
-
Exported @Model.MessagesWritten.ToString("N0") message(s)
+
Exported @MessagesWritten.ToString("N0") message(s)
diff --git a/DiscordChatExporter.Core/Exporting/Writers/Html/PostambleTemplateContext.cs b/DiscordChatExporter.Core/Exporting/Writers/Html/PostambleTemplateContext.cs deleted file mode 100644 index 897fd99..0000000 --- a/DiscordChatExporter.Core/Exporting/Writers/Html/PostambleTemplateContext.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace DiscordChatExporter.Core.Exporting.Writers.Html; - -internal class PostambleTemplateContext -{ - public ExportContext ExportContext { get; } - - public long MessagesWritten { get; } - - public PostambleTemplateContext(ExportContext exportContext, long messagesWritten) - { - ExportContext = exportContext; - MessagesWritten = messagesWritten; - } -} \ No newline at end of file diff --git a/DiscordChatExporter.Core/Exporting/Writers/Html/PreambleTemplate.cshtml b/DiscordChatExporter.Core/Exporting/Writers/Html/PreambleTemplate.cshtml index d5710fb..4ac127c 100644 --- a/DiscordChatExporter.Core/Exporting/Writers/Html/PreambleTemplate.cshtml +++ b/DiscordChatExporter.Core/Exporting/Writers/Html/PreambleTemplate.cshtml @@ -1,13 +1,24 @@ @using System +@using System.Threading @using System.Threading.Tasks -@using DiscordChatExporter.Core.Exporting.Writers.Html; +@using DiscordChatExporter.Core.Exporting +@using DiscordChatExporter.Core.Exporting.Writers.MarkdownVisitors -@namespace DiscordChatExporter.Core.Exporting.Writers.Html -@inherits MiniRazor.TemplateBase +@inherits RazorBlade.HtmlTemplate + +@functions { + // RazorBlade does not provide built-in support for cancellation + // https://github.com/ltrzesniewski/RazorBlade/issues/2 + public CancellationToken CancellationToken { get; init; } + + public ExportContext ExportContext { get; init; } = default!; + + public string ThemeName { get; init; } = "Dark"; +} @{ string Themed(string darkVariant, string lightVariant) => - string.Equals(Model.ThemeName, "Dark", StringComparison.OrdinalIgnoreCase) + string.Equals(ThemeName, "Dark", StringComparison.OrdinalIgnoreCase) ? darkVariant : lightVariant; @@ -15,20 +26,20 @@ $"https://cdn.jsdelivr.net/gh/Tyrrrz/DiscordFonts@master/whitney-{weight}.woff"; ValueTask ResolveAssetUrlAsync(string url) => - Model.ExportContext.ResolveAssetUrlAsync(url, CancellationToken); + ExportContext.ResolveAssetUrlAsync(url, CancellationToken); string FormatDate(DateTimeOffset date) => - Model.ExportContext.FormatDate(date); + ExportContext.FormatDate(date); ValueTask FormatMarkdownAsync(string markdown) => - Model.FormatMarkdownAsync(markdown); + HtmlMarkdownVisitor.FormatAsync(ExportContext, markdown); } - @Model.ExportContext.Request.Guild.Name - @Model.ExportContext.Request.Channel.Name + @ExportContext.Request.Guild.Name - @ExportContext.Request.Channel.Name @@ -755,7 +766,7 @@ @{/* Syntax highlighting */} - +