Team-Resurgent/PrometheOS/PrometheOS-Firmware-1.5.0/PrometheOSUtility/PrometheOSPacker/Helpers/Minify.cs
2025-07-11 21:28:24 +02:00

123 lines
4.3 KiB
C#

using BundlerMinifier;
using System.Text;
namespace PrometheOSPacker.Helpers
{
internal static class Minify
{
private static void BundleFile(string sourceFolder, string destFolder, string filename)
{
var sourceFile = Path.Combine(sourceFolder, filename);
var destFile = Path.Combine(destFolder, filename);
if (Path.GetExtension(filename).Equals(".ico", StringComparison.OrdinalIgnoreCase))
{
File.Copy(sourceFile, destFile, true);
return;
}
var bundleJson = Path.Combine(Utility.GetAppFolder(), "bundle.json");
if (File.Exists(bundleJson))
{
File.Delete(bundleJson);
}
var bundle = new Bundle
{
IncludeInProject = false,
OutputFileName = destFile
};
bundle.InputFiles.Add(sourceFile);
BundleHandler.AddBundle(bundleJson, bundle);
var bundleProcessor = new BundleFileProcessor();
var bundles = BundleHandler.GetBundles(bundleJson);
bundleProcessor.Process(bundleJson, bundles);
var minFile = Path.Combine(destFolder, $"{Path.GetFileNameWithoutExtension(filename)}.min{Path.GetExtension(filename)}");
if (File.Exists(minFile) == true && File.Exists(destFile))
{
File.Move(minFile, destFile, true);
}
File.Delete(bundleJson);
}
private static void IncludeFile(string ipToReplace, string sourceFolder, string destFolder, string filename)
{
var includeName = filename.Replace(".", "_");
var headerName = $"{includeName}.h";
var sourceFile = Path.Combine(sourceFolder, filename);
var destFile = Path.Combine(destFolder, headerName);
byte[] sourceData;
if (Path.GetExtension(sourceFile).Equals(".ico", StringComparison.OrdinalIgnoreCase))
{
sourceData = File.ReadAllBytes(sourceFile);
}
else
{
var sourceText = File.ReadAllText(sourceFile);
sourceText = sourceText.Replace($"http://{ipToReplace}", "");
sourceData = Encoding.UTF8.GetBytes(sourceText);
}
var resultBuilder = new StringBuilder();
resultBuilder.AppendLine("#pragma once");
resultBuilder.AppendLine("");
resultBuilder.AppendLine($"const uint8_t {includeName}[] = {{");
for (var i = 0; i < sourceData.Length; i++)
{
if (i % 16 == 0)
{
resultBuilder.Append(" ");
}
resultBuilder.Append("0x");
resultBuilder.Append(sourceData[i].ToString("x2"));
if (i < sourceData.Length - 1)
{
resultBuilder.Append(',');
if (i % 16 != 15)
{
resultBuilder.Append(' ');
}
}
if (i % 16 == 15)
{
resultBuilder.AppendLine();
}
}
resultBuilder.AppendLine();
resultBuilder.AppendLine("};");
var result = resultBuilder.ToString();
File.WriteAllText(destFile, result);
}
public static void Process(string ipToReplace)
{
var slnFolder = Utility.GetSlnFolder();
var webFolder = Path.Combine(slnFolder, "PrometheOSWeb", "wwwroot");
var bundleFolder = Path.Combine(slnFolder, "PrometheOSPacker", "bundle");
Directory.CreateDirectory(bundleFolder);
var webFiles = Directory.GetFiles(webFolder);
foreach (var webFile in webFiles)
{
BundleFile(webFolder, bundleFolder, Path.GetFileName(webFile));
}
var includeFolder = Path.GetFullPath("..\\PrometheOSXbe\\PrometheOSXbe\\Assets\\Web", slnFolder);
var bundleFiles = Directory.GetFiles(bundleFolder);
foreach (var bundleFile in bundleFiles)
{
IncludeFile(ipToReplace, bundleFolder, includeFolder, Path.GetFileName(bundleFile));
}
}
}
}