|
|
|
|
using System.Text;
|
|
|
|
|
using DiscordChatExporter.Core.Discord;
|
|
|
|
|
using DiscordChatExporter.Core.Markdown;
|
|
|
|
|
using DiscordChatExporter.Core.Markdown.Parsing;
|
|
|
|
|
using DiscordChatExporter.Core.Utils.Extensions;
|
|
|
|
|
|
|
|
|
|
namespace DiscordChatExporter.Core.Exporting.Writers.MarkdownVisitors
|
|
|
|
|
{
|
|
|
|
|
internal partial class PlainTextMarkdownVisitor : MarkdownVisitor
|
|
|
|
|
{
|
|
|
|
|
private readonly ExportContext _context;
|
|
|
|
|
private readonly StringBuilder _buffer;
|
|
|
|
|
|
|
|
|
|
public PlainTextMarkdownVisitor(ExportContext context, StringBuilder buffer)
|
|
|
|
|
{
|
|
|
|
|
_context = context;
|
|
|
|
|
_buffer = buffer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override MarkdownNode VisitText(TextNode text)
|
|
|
|
|
{
|
|
|
|
|
_buffer.Append(text.Text);
|
|
|
|
|
return base.VisitText(text);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override MarkdownNode VisitEmoji(EmojiNode emoji)
|
|
|
|
|
{
|
|
|
|
|
_buffer.Append(
|
|
|
|
|
emoji.IsCustomEmoji
|
|
|
|
|
? $":{emoji.Name}:"
|
|
|
|
|
: emoji.Name
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return base.VisitEmoji(emoji);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override MarkdownNode VisitMention(MentionNode mention)
|
|
|
|
|
{
|
|
|
|
|
var mentionId = Snowflake.TryParse(mention.Id);
|
|
|
|
|
if (mention.Kind == MentionKind.Meta)
|
|
|
|
|
{
|
|
|
|
|
_buffer.Append($"@{mention.Id}");
|
|
|
|
|
}
|
|
|
|
|
else if (mention.Kind == MentionKind.User)
|
|
|
|
|
{
|
|
|
|
|
var member = mentionId?.Pipe(_context.TryGetMember);
|
|
|
|
|
var name = member?.User.Name ?? "Unknown";
|
|
|
|
|
|
|
|
|
|
_buffer.Append($"@{name}");
|
|
|
|
|
}
|
|
|
|
|
else if (mention.Kind == MentionKind.Channel)
|
|
|
|
|
{
|
|
|
|
|
var channel = mentionId?.Pipe(_context.TryGetChannel);
|
|
|
|
|
var name = channel?.Name ?? "deleted-channel";
|
|
|
|
|
|
|
|
|
|
_buffer.Append($"#{name}");
|
|
|
|
|
|
|
|
|
|
// Voice channel marker
|
|
|
|
|
if (channel?.IsVoiceChannel == true)
|
|
|
|
|
_buffer.Append(" [voice]");
|
|
|
|
|
}
|
|
|
|
|
else if (mention.Kind == MentionKind.Role)
|
|
|
|
|
{
|
|
|
|
|
var role = mentionId?.Pipe(_context.TryGetRole);
|
|
|
|
|
var name = role?.Name ?? "deleted-role";
|
|
|
|
|
|
|
|
|
|
_buffer.Append($"@{name}");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return base.VisitMention(mention);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override MarkdownNode VisitUnixTimestamp(UnixTimestampNode timestamp)
|
|
|
|
|
{
|
|
|
|
|
_buffer.Append(
|
|
|
|
|
_context.FormatDate(timestamp.Value)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return base.VisitUnixTimestamp(timestamp);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal partial class PlainTextMarkdownVisitor
|
|
|
|
|
{
|
|
|
|
|
public static string Format(ExportContext context, string markdown)
|
|
|
|
|
{
|
|
|
|
|
var nodes = MarkdownParser.ParseMinimal(markdown);
|
|
|
|
|
var buffer = new StringBuilder();
|
|
|
|
|
|
|
|
|
|
new PlainTextMarkdownVisitor(context, buffer).Visit(nodes);
|
|
|
|
|
|
|
|
|
|
return buffer.ToString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|