using Robust.Shared.Utility;
namespace Robust.Packaging.AssetProcessing.Passes;
///
/// Normalizes text files to make sure there is no BOM and EOLs are LF.
///
public sealed class AssetPassNormalizeText : AssetPass
{
private readonly HashSet _textFileExtensions = new()
{
"txt",
"json",
"yml",
"html",
"css",
"js",
"ftl",
"swsl",
"toml",
"svg",
"xml"
};
///
/// The file extensions that are considered text files. Does not include the period.
///
public ISet TextFileExtensions => _textFileExtensions;
protected override AssetFileAcceptResult AcceptFile(AssetFile file)
{
var extensionPeriod = file.Path.LastIndexOf('.');
var extension = file.Path[(extensionPeriod + 1)..];
if (!_textFileExtensions.Contains(extension))
return AssetFileAcceptResult.Pass;
// Console.WriteLine($"Normalizing EOLs: {file.Path}");
using var fileStream = file.Open();
using var sr = new StreamReader(fileStream);
using var output = new MemoryStream();
using var sw = new StreamWriter(output, EncodingHelpers.UTF8);
while (sr.ReadLine() is { } line)
{
sw.Write(line);
sw.Write("\n");
}
sw.Flush();
SendFile(new AssetFileMemory(file.Path, output.ToArray()));
return AssetFileAcceptResult.Consumed;
}
}