From 0b6e14336f6fbbeafc08a5f795a1e5431279d31d Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Tue, 8 Oct 2019 12:40:25 +0200 Subject: [PATCH] part 1 --- .gitignore | 6 ++ .gitmodules | 3 + .idea/.idea.Contentless/.idea/vcs.xml | 12 +++ Contentless.sln | 28 ++++++ Contentless/Contentless.csproj | 12 +++ Contentless/Program.cs | 123 ++++++++++++++++++++++++++ MonoGame | 1 + Test/Content/Content.mgcb | 30 +++++++ Test/Content/Locale/Interface.xml | 29 ++++++ Test/Content/Textures/Icons.png | Bin 0 -> 7530 bytes Test/Content/Textures/Inside.png | Bin 0 -> 15557 bytes Test/Test.csproj | 7 ++ 12 files changed, 251 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 .idea/.idea.Contentless/.idea/vcs.xml create mode 100644 Contentless.sln create mode 100644 Contentless/Contentless.csproj create mode 100644 Contentless/Program.cs create mode 160000 MonoGame create mode 100644 Test/Content/Content.mgcb create mode 100644 Test/Content/Locale/Interface.xml create mode 100644 Test/Content/Textures/Icons.png create mode 100644 Test/Content/Textures/Inside.png create mode 100644 Test/Test.csproj diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..38f4e9e --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.idea +bin +obj +packages +*.user +*.nupkg \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..4a70de7 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "MonoGame"] + path = MonoGame + url = https://github.com/MonoGame/MonoGame diff --git a/.idea/.idea.Contentless/.idea/vcs.xml b/.idea/.idea.Contentless/.idea/vcs.xml new file mode 100644 index 0000000..0e97cfa --- /dev/null +++ b/.idea/.idea.Contentless/.idea/vcs.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Contentless.sln b/Contentless.sln new file mode 100644 index 0000000..e07d337 --- /dev/null +++ b/Contentless.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contentless", "Contentless\Contentless.csproj", "{A5C68D51-B404-44C9-8DD8-BAD4FD62A82D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoGame.Framework.Content.Pipeline.Windows", "MonoGame\MonoGame.Framework.Content.Pipeline\MonoGame.Framework.Content.Pipeline.Windows.csproj", "{B950DE10-AC5D-4BD9-B817-51247C4A732D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "Test\Test.csproj", "{58716AA9-5BCE-42C5-A0E7-D8B23C0488BA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A5C68D51-B404-44C9-8DD8-BAD4FD62A82D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A5C68D51-B404-44C9-8DD8-BAD4FD62A82D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5C68D51-B404-44C9-8DD8-BAD4FD62A82D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5C68D51-B404-44C9-8DD8-BAD4FD62A82D}.Release|Any CPU.Build.0 = Release|Any CPU + {B950DE10-AC5D-4BD9-B817-51247C4A732D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B950DE10-AC5D-4BD9-B817-51247C4A732D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B950DE10-AC5D-4BD9-B817-51247C4A732D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B950DE10-AC5D-4BD9-B817-51247C4A732D}.Release|Any CPU.Build.0 = Release|Any CPU + {58716AA9-5BCE-42C5-A0E7-D8B23C0488BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58716AA9-5BCE-42C5-A0E7-D8B23C0488BA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58716AA9-5BCE-42C5-A0E7-D8B23C0488BA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58716AA9-5BCE-42C5-A0E7-D8B23C0488BA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Contentless/Contentless.csproj b/Contentless/Contentless.csproj new file mode 100644 index 0000000..42dfd03 --- /dev/null +++ b/Contentless/Contentless.csproj @@ -0,0 +1,12 @@ + + + + Exe + netcoreapp2.2 + + + + + + + diff --git a/Contentless/Program.cs b/Contentless/Program.cs new file mode 100644 index 0000000..6943b35 --- /dev/null +++ b/Contentless/Program.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using Microsoft.Xna.Framework.Content.Pipeline; + +namespace Contentless { + public static class Program { + + private static readonly ImporterInfo[] Importers = GetContentImporters().ToArray(); + private static readonly string[] ExcludedFolders = {"bin", "obj"}; + + public static void Main(string[] args) { + var contentFile = new FileInfo(Path.Combine(Environment.CurrentDirectory, args[0])); + if (!contentFile.Exists) { + Console.WriteLine($"Unable to find content file {contentFile}"); + return; + } + var content = ReadContent(contentFile); + + var changed = false; + foreach (var file in contentFile.Directory.EnumerateFiles("*", SearchOption.AllDirectories)) { + // is the file the content file? + if (file.Name == contentFile.Name) + continue; + var relative = Path.GetRelativePath(contentFile.Directory.FullName, file.FullName).Replace("\\", "/"); + + // is the file in an excluded directory? + var dirName = file.DirectoryName.Replace("\\", "/"); + if (ExcludedFolders.Any(e => dirName.Contains(e))) { + continue; + } + + // is the file already in the content file? + if (HasEntry(content, relative)) { + Console.WriteLine($"Skipping file {relative} as it is already part of the content file"); + continue; + } + + var importer = GetImporterFor(relative); + if (importer == null) { + Console.WriteLine($"No importer found for file {relative}, please add the file manually"); + continue; + } + + AddFile(content, relative, importer); + changed = true; + } + + if (changed) { + contentFile.Delete(); + using (var stream = contentFile.CreateText()) { + foreach (var line in content) + stream.WriteLine(line); + } + Console.WriteLine("Wrote changes to content file"); + } + Console.Write("Done"); + } + + private static IEnumerable GetContentImporters() { + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { + foreach (var type in assembly.GetTypes()) { + var importer = (ContentImporterAttribute) type.GetCustomAttribute(typeof(ContentImporterAttribute), true); + if (importer != null) + yield return new ImporterInfo(importer, type); + } + } + } + + private static ImporterInfo GetImporterFor(string file) { + var extension = Path.GetExtension(file); + foreach (var importer in Importers) { + if (importer.Importer.FileExtensions.Contains(extension)) + return importer; + } + return null; + } + + private static bool HasEntry(IEnumerable content, string relativeFile) { + foreach (var line in content) { + if (line.StartsWith($"#begin {relativeFile}")) + return true; + } + return false; + } + + private static List ReadContent(FileInfo file) { + var content = new List(); + using (var stream = file.OpenText()) { + string line; + while ((line = stream.ReadLine()) != null) { + content.Add(line); + } + } + return content; + } + + private static void AddFile(List content, string relative, ImporterInfo importer) { + content.Add($"#begin {relative}"); + content.Add($"/importer:{importer.Type.Name}"); + content.Add($"/processor:{importer.Importer.DefaultProcessor}"); + content.Add($"/build:{relative}"); + content.Add(""); + + Console.WriteLine($"Adding file {relative} with importer {importer.Type.Name} and processor {importer.Importer.DefaultProcessor}"); + } + + private class ImporterInfo { + + public readonly ContentImporterAttribute Importer; + public readonly Type Type; + + public ImporterInfo(ContentImporterAttribute importer, Type type) { + this.Importer = importer; + this.Type = type; + } + + } + + } +} \ No newline at end of file diff --git a/MonoGame b/MonoGame new file mode 160000 index 0000000..27bdfa9 --- /dev/null +++ b/MonoGame @@ -0,0 +1 @@ +Subproject commit 27bdfa92abf597c345c9c40bb4999b0fcd2dcaa2 diff --git a/Test/Content/Content.mgcb b/Test/Content/Content.mgcb new file mode 100644 index 0000000..d78753e --- /dev/null +++ b/Test/Content/Content.mgcb @@ -0,0 +1,30 @@ + +#----------------------------- Global Properties ----------------------------# + +/outputDir:bin +/intermediateDir:obj +/platform:DesktopGL +/config: +/profile:Reach +/compress:False + +#-------------------------------- References --------------------------------# + + +#---------------------------------- Content ---------------------------------# + +#begin Textures/Inside.png +/importer:TextureImporter +/processor:TextureProcessor +/build:Textures/Inside.png + +#begin Locale/Interface.xml +/importer:XmlImporter +/processor:PassThroughProcessor +/build:Locale/Interface.xml + +#begin Textures/Icons.png +/importer:TextureImporter +/processor:TextureProcessor +/build:Textures/Icons.png + diff --git a/Test/Content/Locale/Interface.xml b/Test/Content/Locale/Interface.xml new file mode 100644 index 0000000..d4c4f76 --- /dev/null +++ b/Test/Content/Locale/Interface.xml @@ -0,0 +1,29 @@ + + + + + Place + Place + + + Drop + Drop + + + TimeHour + h:mm tt + + + TimeDay + dddd d MMM + + + Inventory + Inventory + + + Tools + Tools + + + \ No newline at end of file diff --git a/Test/Content/Textures/Icons.png b/Test/Content/Textures/Icons.png new file mode 100644 index 0000000000000000000000000000000000000000..1910a3f9669e644621d9a03493e0624bae27e668 GIT binary patch literal 7530 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 SqJKFCEDjz2CHrT$u>TJh{I?VU literal 0 HcmV?d00001 diff --git a/Test/Test.csproj b/Test/Test.csproj new file mode 100644 index 0000000..ec0b0b9 --- /dev/null +++ b/Test/Test.csproj @@ -0,0 +1,7 @@ + + + + netcoreapp2.2 + + +