mirror of
https://github.com/Tyrrrz/DiscordChatExporter.git
synced 2026-02-28 04:03:39 +00:00
@@ -1,4 +1,5 @@
|
||||
using System.Threading.Tasks;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using DiscordChatExporter.Core.Models;
|
||||
using DiscordChatExporter.Core.Rendering.Logic;
|
||||
|
||||
@@ -8,8 +9,8 @@ namespace DiscordChatExporter.Core.Rendering
|
||||
{
|
||||
private bool _isHeaderRendered;
|
||||
|
||||
public CsvMessageRenderer(string filePath, RenderContext context)
|
||||
: base(filePath, context)
|
||||
public CsvMessageRenderer(TextWriter writer, RenderContext context)
|
||||
: base(writer, context)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
112
DiscordChatExporter.Core.Rendering/FacadeMessageRenderer.cs
Normal file
112
DiscordChatExporter.Core.Rendering/FacadeMessageRenderer.cs
Normal file
@@ -0,0 +1,112 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using DiscordChatExporter.Core.Models;
|
||||
|
||||
namespace DiscordChatExporter.Core.Rendering
|
||||
{
|
||||
public partial class FacadeMessageRenderer : IMessageRenderer
|
||||
{
|
||||
private readonly string _baseFilePath;
|
||||
private readonly ExportFormat _format;
|
||||
private readonly RenderContext _context;
|
||||
|
||||
private int _partitionIndex;
|
||||
private TextWriter _writer;
|
||||
private IMessageRenderer _innerRenderer;
|
||||
|
||||
public FacadeMessageRenderer(string baseFilePath, ExportFormat format, RenderContext context)
|
||||
{
|
||||
_baseFilePath = baseFilePath;
|
||||
_format = format;
|
||||
_context = context;
|
||||
}
|
||||
|
||||
private void EnsureInnerRendererInitialized()
|
||||
{
|
||||
if (_writer != null && _innerRenderer != null)
|
||||
return;
|
||||
|
||||
// Get partition file path
|
||||
var filePath = GetPartitionFilePath(_baseFilePath, _partitionIndex);
|
||||
|
||||
// Create output directory
|
||||
var dirPath = Path.GetDirectoryName(_baseFilePath);
|
||||
if (!string.IsNullOrWhiteSpace(dirPath))
|
||||
Directory.CreateDirectory(dirPath);
|
||||
|
||||
// Create writer (will be disposed by renderer)
|
||||
_writer = File.CreateText(filePath);
|
||||
|
||||
// Create inner renderer
|
||||
if (_format == ExportFormat.PlainText)
|
||||
{
|
||||
_innerRenderer = new PlainTextMessageRenderer(_writer, _context);
|
||||
}
|
||||
else if (_format == ExportFormat.Csv)
|
||||
{
|
||||
_innerRenderer = new CsvMessageRenderer(_writer, _context);
|
||||
}
|
||||
else if (_format == ExportFormat.HtmlDark)
|
||||
{
|
||||
_innerRenderer = new HtmlMessageRenderer(_writer, _context, "Dark");
|
||||
}
|
||||
else if (_format == ExportFormat.HtmlLight)
|
||||
{
|
||||
_innerRenderer = new HtmlMessageRenderer(_writer, _context, "Light");
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException($"Unknown export format [{_format}].");
|
||||
}
|
||||
}
|
||||
|
||||
public async Task NextPartitionAsync()
|
||||
{
|
||||
// Dispose writer and inner renderer
|
||||
await DisposeAsync();
|
||||
_writer = null;
|
||||
_innerRenderer = null;
|
||||
|
||||
// Increment partition index
|
||||
_partitionIndex++;
|
||||
}
|
||||
|
||||
public async Task RenderMessageAsync(Message message)
|
||||
{
|
||||
EnsureInnerRendererInitialized();
|
||||
await _innerRenderer.RenderMessageAsync(message);
|
||||
}
|
||||
|
||||
public async ValueTask DisposeAsync()
|
||||
{
|
||||
if (_innerRenderer != null)
|
||||
await _innerRenderer.DisposeAsync();
|
||||
|
||||
if (_writer != null)
|
||||
await _writer.DisposeAsync();
|
||||
}
|
||||
}
|
||||
|
||||
public partial class FacadeMessageRenderer
|
||||
{
|
||||
private static string GetPartitionFilePath(string baseFilePath, int partitionIndex)
|
||||
{
|
||||
// First partition - no changes
|
||||
if (partitionIndex <= 0)
|
||||
return baseFilePath;
|
||||
|
||||
// Inject partition index into file name
|
||||
var fileNameWithoutExt = Path.GetFileNameWithoutExtension(baseFilePath);
|
||||
var fileExt = Path.GetExtension(baseFilePath);
|
||||
var fileName = $"{fileNameWithoutExt} [part {partitionIndex + 1}]{fileExt}";
|
||||
|
||||
// Generate new path
|
||||
var dirPath = Path.GetDirectoryName(baseFilePath);
|
||||
if (!string.IsNullOrWhiteSpace(dirPath))
|
||||
return Path.Combine(dirPath, fileName);
|
||||
|
||||
return fileName;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
@@ -22,8 +23,8 @@ namespace DiscordChatExporter.Core.Rendering
|
||||
|
||||
private bool _isLeadingBlockRendered;
|
||||
|
||||
public HtmlMessageRenderer(string filePath, RenderContext context, string themeName)
|
||||
: base(filePath, context)
|
||||
public HtmlMessageRenderer(TextWriter writer, RenderContext context, string themeName)
|
||||
: base(writer, context)
|
||||
{
|
||||
_themeName = themeName;
|
||||
|
||||
|
||||
@@ -10,14 +10,14 @@ namespace DiscordChatExporter.Core.Rendering
|
||||
|
||||
protected RenderContext Context { get; }
|
||||
|
||||
protected MessageRendererBase(string filePath, RenderContext context)
|
||||
protected MessageRendererBase(TextWriter writer, RenderContext context)
|
||||
{
|
||||
Writer = File.CreateText(filePath);
|
||||
Writer = writer;
|
||||
Context = context;
|
||||
}
|
||||
|
||||
public abstract Task RenderMessageAsync(Message message);
|
||||
|
||||
public virtual ValueTask DisposeAsync() => Writer.DisposeAsync();
|
||||
public virtual ValueTask DisposeAsync() => default;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Threading.Tasks;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using DiscordChatExporter.Core.Models;
|
||||
using DiscordChatExporter.Core.Rendering.Logic;
|
||||
|
||||
@@ -8,8 +9,8 @@ namespace DiscordChatExporter.Core.Rendering
|
||||
{
|
||||
private bool _isPreambleRendered;
|
||||
|
||||
public PlainTextMessageRenderer(string filePath, RenderContext context)
|
||||
: base(filePath, context)
|
||||
public PlainTextMessageRenderer(TextWriter writer, RenderContext context)
|
||||
: base(writer, context)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user