Skip to content

Commit 3889830

Browse files
committed
updates
1 parent 74fd4a0 commit 3889830

File tree

6 files changed

+142
-40
lines changed

6 files changed

+142
-40
lines changed

ManagedCode.MimeTypes.Generator/ManagedCode.MimeTypes.Generator.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netstandard2.0</TargetFramework>
54
<LangVersion>10</LangVersion>
65
<IsPackable>false</IsPackable>
6+
<TargetFrameworks>netstandard2.0;net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
77
</PropertyGroup>
88

99
<ItemGroup>
@@ -24,5 +24,5 @@
2424
<TargetPathWithTargetPlatformMoniker Include="@(ResolvedCompileFileDefinitions)" IncludeRuntimeDependency="false" />
2525
</ItemGroup>
2626
</Target>
27-
27+
2828
</Project>

ManagedCode.MimeTypes.Generator/MimeTypeSourceGenerator.cs

Lines changed: 91 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,57 +13,122 @@ namespace ManagedCode.MimeTypes.Generator;
1313
[Generator]
1414
public class MimeTypeSourceGenerator : ISourceGenerator
1515
{
16-
public void Initialize(GeneratorInitializationContext context) {}
17-
18-
public void Execute(GeneratorExecutionContext context)
16+
public void Initialize(GeneratorInitializationContext context)
1917
{
20-
2118
#if DEBUG
2219
if (!Debugger.IsAttached)
2320
{
2421
Debugger.Launch();
2522
}
2623
#endif
27-
var mime = JObject.Parse(File.ReadAllText("mimeTypes.json")).Properties().ToList();
28-
29-
StringBuilder defineDictionaryBuilder = new();
30-
StringBuilder propertyBuilder = new();
31-
Dictionary<string, string> types = new Dictionary<string, string>();
24+
}
25+
26+
public void Execute(GeneratorExecutionContext context)
27+
{
28+
try
29+
{
30+
// Find the mimeTypes.json file
31+
var mimeTypesPath = GetMimeTypesPath(context);
32+
33+
if (!File.Exists(mimeTypesPath))
34+
{
35+
context.ReportDiagnostic(Diagnostic.Create(
36+
new DiagnosticDescriptor(
37+
"MIME001",
38+
"MimeTypes.json not found",
39+
"Could not find mimeTypes.json at {0}",
40+
"MimeTypes",
41+
DiagnosticSeverity.Error,
42+
true),
43+
Location.None,
44+
mimeTypesPath));
45+
return;
46+
}
3247

33-
foreach (var item in mime)
34-
{
35-
defineDictionaryBuilder.AppendLine($"MimeTypes.Add(string.Intern(\"{item.Name}\"),string.Intern(\"{item.Value}\"));");
36-
37-
types[ParseKey(item.Name)] = item.Value.ToString();
38-
39-
}
48+
var mime = JObject.Parse(File.ReadAllText(mimeTypesPath));
49+
var properties = mime.Properties().ToList();
50+
51+
context.ReportDiagnostic(Diagnostic.Create(
52+
new DiagnosticDescriptor(
53+
"MIME002",
54+
"MimeTypes loaded",
55+
"Successfully loaded {0} mime types",
56+
"MimeTypes",
57+
DiagnosticSeverity.Info,
58+
true),
59+
Location.None,
60+
properties.Count));
4061

41-
foreach (var item in types)
42-
{
43-
propertyBuilder.AppendLine($"public static string {item.Key} => \"{item.Value}\";");
44-
}
45-
46-
47-
context.AddSource("MimeHelper.Properties.cs", SourceText.From(@$"
62+
StringBuilder defineDictionaryBuilder = new();
63+
StringBuilder propertyBuilder = new();
64+
Dictionary<string, string> types = new Dictionary<string, string>();
65+
66+
foreach (var item in properties)
67+
{
68+
defineDictionaryBuilder.AppendLine($"MimeTypes.Add(string.Intern(\"{item.Name}\"),string.Intern(\"{item.Value}\"));");
69+
types[ParseKey(item.Name)] = item.Value.ToString();
70+
}
71+
72+
foreach (var item in types)
73+
{
74+
propertyBuilder.AppendLine($"public static string {item.Key} => \"{item.Value}\";");
75+
}
76+
77+
context.AddSource("MimeHelper.Properties.cs", SourceText.From(@$"
4878
namespace ManagedCode.MimeTypes
4979
{{
5080
public static partial class MimeHelper
5181
{{
5282
static partial void Init()
5383
{{
54-
{defineDictionaryBuilder.ToString()}
84+
{defineDictionaryBuilder}
5585
}}
56-
{propertyBuilder.ToString()}
86+
{propertyBuilder}
5787
}}
5888
}}
5989
", Encoding.UTF8));
90+
}
91+
catch (Exception ex)
92+
{
93+
context.ReportDiagnostic(Diagnostic.Create(
94+
new DiagnosticDescriptor(
95+
"MIME003",
96+
"Generator Error",
97+
"Error generating mime types: {0}",
98+
"MimeTypes",
99+
DiagnosticSeverity.Error,
100+
true),
101+
Location.None,
102+
ex.ToString()));
103+
}
104+
}
105+
106+
private string GetMimeTypesPath(GeneratorExecutionContext context)
107+
{
108+
// Try to find mimeTypes.json in the project directory
109+
var compilation = context.Compilation;
110+
var projectDir = Path.GetDirectoryName(compilation.SyntaxTrees.First().FilePath);
111+
112+
var possiblePaths = new[]
113+
{
114+
// Try current directory
115+
Path.Combine(Directory.GetCurrentDirectory(), "mimeTypes.json"),
116+
// Try project directory
117+
Path.Combine(projectDir ?? "", "mimeTypes.json"),
118+
// Try one level up (solution directory)
119+
Path.Combine(Directory.GetParent(projectDir ?? "")?.FullName ?? "", "mimeTypes.json"),
120+
// Try in the Generator project
121+
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "mimeTypes.json")
122+
};
123+
124+
return possiblePaths.FirstOrDefault(File.Exists) ?? possiblePaths[0];
60125
}
61126

62127
private string ParseKey(string key)
63128
{
64129
if (char.IsDigit(key[0]))
65130
{
66-
key = $"_" + key;
131+
key = "_" + key;
67132
}
68133

69134
key = key.Replace("-", "_");

ManagedCode.MimeTypes.Tests/GeneratorTests.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,22 @@ public void EmptyExtensionsTest()
2323
}
2424

2525
[Fact]
26-
public void PropertyTest()
26+
public void GeneratedPropertiesTest()
2727
{
28-
MimeHelper.PDF.Should().Be("application/pdf");
29-
MimeHelper.GZ.Should().Be("application/gzip");
28+
// Test static properties generated from mimeTypes.json
29+
MimeHelper.PDF.ShouldBe("application/pdf");
30+
MimeHelper.DOCX.ShouldBe("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
31+
MimeHelper.PNG.ShouldBe("image/png");
32+
MimeHelper.MP4.ShouldBe("video/mp4");
33+
MimeHelper._7Z.ShouldBe("application/x-7z-compressed");
34+
}
35+
36+
[Fact]
37+
public void GeneratedDictionaryTest()
38+
{
39+
// Test if dictionary is properly initialized
40+
MimeHelper.GetMimeType(".pdf").ShouldBe("application/pdf");
41+
MimeHelper.GetMimeType(".docx").ShouldBe("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
42+
MimeHelper.GetMimeType(".7z").ShouldBe("application/x-7z-compressed");
3043
}
3144
}

ManagedCode.MimeTypes.Tests/MimeCategoryTests.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,34 @@ public void EmptyMimeTypes_ShouldBeUnknown(string mime)
8888

8989
[Theory]
9090
[InlineData("application/msword")]
91-
[InlineData("application/vnd.ms-excel")]
9291
[InlineData("application/vnd.openxmlformats-officedocument.wordprocessingml.document")]
93-
public void DocumentMimeTypes_ShouldBeDocument(string mime)
92+
[InlineData("application/vnd.oasis.opendocument.text")]
93+
public void WordDocumentMimeTypes_ShouldBeDocument(string mime)
9494
{
9595
MimeHelper.GetMimeCategory(mime).ShouldBe(MimeTypeCategory.Document);
9696
MimeHelper.IsDocument(mime).ShouldBeTrue();
9797
}
9898

99+
[Theory]
100+
[InlineData("application/vnd.ms-excel")]
101+
[InlineData("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")]
102+
[InlineData("application/vnd.oasis.opendocument.spreadsheet")]
103+
public void SpreadsheetMimeTypes_ShouldBeSpreadsheet(string mime)
104+
{
105+
MimeHelper.GetMimeCategory(mime).ShouldBe(MimeTypeCategory.Spreadsheet);
106+
MimeHelper.IsSpreadsheet(mime).ShouldBeTrue();
107+
}
108+
109+
[Theory]
110+
[InlineData("application/vnd.ms-powerpoint")]
111+
[InlineData("application/vnd.openxmlformats-officedocument.presentationml.presentation")]
112+
[InlineData("application/vnd.oasis.opendocument.presentation")]
113+
public void PresentationMimeTypes_ShouldBePresentation(string mime)
114+
{
115+
MimeHelper.GetMimeCategory(mime).ShouldBe(MimeTypeCategory.Presentation);
116+
MimeHelper.IsPresentation(mime).ShouldBeTrue();
117+
}
118+
99119
[Fact]
100120
public void InvalidMimeType_ShouldBeUnknown()
101121
{

ManagedCode.MimeTypes/ManagedCode.MimeTypes.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netstandard2.0</TargetFramework>
54
<Nullable>enable</Nullable>
65
<LangVersion>13</LangVersion>
6+
<TargetFrameworks>netstandard2.0;net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
7+
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
8+
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)Generated</CompilerGeneratedFilesOutputPath>
79
</PropertyGroup>
810

911
<ItemGroup>

ManagedCode.MimeTypes/MimeHelper.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,23 +57,25 @@ public static MimeTypeCategory GetMimeCategory(string mime)
5757

5858
var m = mime.ToLowerInvariant();
5959

60+
// Check formats that can appear in multiple primary types first
61+
if (XmlPattern.IsMatch(m)) return MimeTypeCategory.Xml;
62+
if (JsonPattern.IsMatch(m)) return MimeTypeCategory.Json;
63+
6064
// Primary types
6165
if (m.StartsWith("video/")) return MimeTypeCategory.Video;
6266
if (m.StartsWith("audio/")) return MimeTypeCategory.Audio;
6367
if (m.StartsWith("image/")) return MimeTypeCategory.Image;
64-
if (m.StartsWith("text/")) return MimeTypeCategory.Text;
6568
if (m.StartsWith("font/")) return MimeTypeCategory.Font;
6669
if (m.StartsWith("model/")) return MimeTypeCategory.Model;
6770

71+
// Text types (after checking for XML/JSON)
72+
if (m.StartsWith("text/")) return MimeTypeCategory.Text;
73+
6874
// Document types
6975
if (m == "application/pdf") return MimeTypeCategory.Pdf;
70-
if (WordPattern.IsMatch(m)) return MimeTypeCategory.Document;
7176
if (SpreadsheetPattern.IsMatch(m)) return MimeTypeCategory.Spreadsheet;
7277
if (PresentationPattern.IsMatch(m)) return MimeTypeCategory.Presentation;
73-
74-
// Data formats
75-
if (JsonPattern.IsMatch(m)) return MimeTypeCategory.Json;
76-
if (XmlPattern.IsMatch(m)) return MimeTypeCategory.Xml;
78+
if (WordPattern.IsMatch(m)) return MimeTypeCategory.Document;
7779

7880
// Special types
7981
if (ArchivePattern.IsMatch(m)) return MimeTypeCategory.Archive;

0 commit comments

Comments
 (0)