Skip to content

Commit b594397

Browse files
committed
Prefer custom and IANA over others and order by mime type length. Fixes #21
1 parent 01d662f commit b594397

File tree

3 files changed

+81
-39
lines changed

3 files changed

+81
-39
lines changed

src/MimeTypes/MimeTypeFunctions.ttinclude

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,48 @@
2121
public string Charset { get; set; }
2222
}
2323

24-
private static IList<(string Extension, string Type)> GetMediaTypeList()
24+
private class Mapping
25+
{
26+
public Mapping(string mimeType, string source, string extension)
27+
{
28+
MimeType = mimeType;
29+
Source = source ?? "custom";
30+
Extension = extension;
31+
}
32+
33+
public string MimeType { get; set; }
34+
35+
public string Source { get; set; }
36+
37+
public string Extension { get; set; }
38+
}
39+
40+
private class SourceComparer : IComparer<string>
41+
{
42+
public static readonly SourceComparer Instance = new();
43+
44+
public int Compare(string x, string y)
45+
{
46+
if (string.Equals(x, y))
47+
{
48+
return 0;
49+
}
50+
51+
if (x == "custom")
52+
{
53+
return 2;
54+
}
55+
56+
if (x == "iana")
57+
{
58+
return 1;
59+
}
60+
61+
return 0;
62+
}
63+
}
64+
65+
private static IList<Mapping> GetMediaTypeList()
2566
{
2667
using var client = new WebClient();
2768

@@ -32,13 +73,14 @@
3273
return GetMediaTypes(mimeTypes).ToList();
3374
}
3475

35-
private static IList<(string Extension, string Type)> GetMediaTypes(IEnumerable<KeyValuePair<string, MimeType>> mimeTypes)
36-
=> mimeTypes.Where(x => x.Value.Extensions.Any())
37-
.SelectMany(x => x.Value.Extensions.Select(e => (e, x.Key)))
38-
.Where(x => x.Item1.Length <= 8 && x.Item1.All(char.IsLetterOrDigit))
39-
.GroupBy(x => x.Item1)
40-
.Select(x => x.First())
41-
.OrderBy(x => x.Item1, StringComparer.InvariantCulture)
76+
private static IList<Mapping> GetMediaTypes(IEnumerable<KeyValuePair<string, MimeType>> mimeTypes)
77+
=> mimeTypes
78+
.SelectMany(x => x.Value.Extensions.Select(e => new Mapping(x.Key, x.Value.Source, e)))
79+
.Where(x => x.Extension.Length <= 8 && x.Extension.All(char.IsLetterOrDigit))
80+
.GroupBy(x => x.Extension)
81+
// Prefer custom and IANA sources, then shorter mime types over longer ones
82+
.Select(x => x.OrderByDescending(x => x.Source, SourceComparer.Instance).ThenBy(x => x.MimeType.Length).First())
83+
.OrderBy(x => x.Extension, StringComparer.InvariantCulture)
4284
.ToList();
4385

4486
public void GenerateClass(bool includeAttributes)
@@ -91,7 +133,7 @@ namespace $rootnamespace$
91133
s_typeMap = new Dictionary<string, string>(<#= mediaTypesCount #>, StringComparer.OrdinalIgnoreCase)
92134
{
93135
<#+ foreach (var mediaType in mediaTypes) { #>
94-
{ "<#= mediaType.Item1 #>", "<#= mediaType.Item2 #>" },
136+
{ "<#= mediaType.Extension #>", "<#= mediaType.MimeType #>" },
95137
<#+ } #>
96138
};
97139
}

src/MimeTypes/MimeTypes.NullableAttributes.cs.pp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@
275275
{ "efif", "application/vnd.picsel" },
276276
{ "ei6", "application/vnd.pg.osasli" },
277277
{ "elc", "application/octet-stream" },
278-
{ "emf", "application/x-msmetafile" },
278+
{ "emf", "image/emf" },
279279
{ "eml", "message/rfc822" },
280280
{ "emma", "application/emma+xml" },
281281
{ "emz", "application/x-msmetafile" },
@@ -290,7 +290,7 @@
290290
{ "etx", "text/x-setext" },
291291
{ "eva", "application/x-eva" },
292292
{ "evy", "application/x-envoy" },
293-
{ "exe", "application/octet-stream" },
293+
{ "exe", "application/x-msdos-program" },
294294
{ "exi", "application/exi" },
295295
{ "exp", "application/express" },
296296
{ "exr", "image/aces" },
@@ -466,7 +466,7 @@
466466
{ "jph", "image/jph" },
467467
{ "jpm", "image/jpm" },
468468
{ "jpx", "image/jpx" },
469-
{ "js", "application/javascript" },
469+
{ "js", "text/javascript" },
470470
{ "json", "application/json" },
471471
{ "json5", "application/json5" },
472472
{ "jsonld", "application/ld+json" },
@@ -596,7 +596,7 @@
596596
{ "mp21", "application/mp21" },
597597
{ "mp2a", "audio/mpeg" },
598598
{ "mp3", "audio/mp3" },
599-
{ "mp4", "application/mp4" },
599+
{ "mp4", "video/mp4" },
600600
{ "mp4a", "audio/mp4" },
601601
{ "mp4s", "application/mp4" },
602602
{ "mp4v", "video/mp4" },
@@ -606,7 +606,7 @@
606606
{ "mpeg", "video/mpeg" },
607607
{ "mpf", "application/media-policy-dataset+xml" },
608608
{ "mpg", "video/mpeg" },
609-
{ "mpg4", "application/mp4" },
609+
{ "mpg4", "video/mp4" },
610610
{ "mpga", "audio/mpeg" },
611611
{ "mpkg", "application/vnd.apple.installer+xml" },
612612
{ "mpm", "application/vnd.blueice.multipass" },
@@ -670,7 +670,7 @@
670670
{ "oas", "application/vnd.fujitsu.oasys" },
671671
{ "obd", "application/x-msbinder" },
672672
{ "obgx", "application/vnd.openblox.game+xml" },
673-
{ "obj", "application/x-tgif" },
673+
{ "obj", "model/obj" },
674674
{ "oda", "application/oda" },
675675
{ "odb", "application/vnd.oasis.opendocument.database" },
676676
{ "odc", "application/vnd.oasis.opendocument.chart" },
@@ -776,7 +776,7 @@
776776
{ "pptm", "application/vnd.ms-powerpoint.presentation.macroenabled.12" },
777777
{ "pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" },
778778
{ "pqa", "application/vnd.palm" },
779-
{ "prc", "application/x-mobipocket-ebook" },
779+
{ "prc", "model/prc" },
780780
{ "pre", "application/vnd.lotus-freelance" },
781781
{ "prf", "application/pics-rules" },
782782
{ "provx", "application/provenance+xml" },
@@ -805,7 +805,7 @@
805805
{ "qxd", "application/vnd.quark.quarkxpress" },
806806
{ "qxl", "application/vnd.quark.quarkxpress" },
807807
{ "qxt", "application/vnd.quark.quarkxpress" },
808-
{ "ra", "audio/x-pn-realaudio" },
808+
{ "ra", "audio/x-realaudio" },
809809
{ "ram", "audio/x-pn-realaudio" },
810810
{ "raml", "application/raml+yaml" },
811811
{ "rapd", "application/route-apd+xml" },
@@ -842,7 +842,7 @@
842842
{ "rsd", "application/rsd+xml" },
843843
{ "rsheet", "application/urc-ressheet+xml" },
844844
{ "rss", "application/rss+xml" },
845-
{ "rtf", "application/rtf" },
845+
{ "rtf", "text/rtf" },
846846
{ "rtx", "text/richtext" },
847847
{ "run", "application/x-makeself" },
848848
{ "rusd", "application/route-usd+xml" },
@@ -939,15 +939,15 @@
939939
{ "stf", "application/vnd.wt.stf" },
940940
{ "sti", "application/vnd.sun.xml.impress.template" },
941941
{ "stk", "application/hyperstudio" },
942-
{ "stl", "application/vnd.ms-pki.stl" },
942+
{ "stl", "model/stl" },
943943
{ "stpx", "model/step+xml" },
944944
{ "stpxz", "model/step-xml+zip" },
945945
{ "stpz", "model/step+zip" },
946946
{ "str", "application/vnd.pg.format" },
947947
{ "stw", "application/vnd.sun.xml.writer.template" },
948948
{ "styl", "text/stylus" },
949949
{ "stylus", "text/stylus" },
950-
{ "sub", "image/vnd.dvb.subtitle" },
950+
{ "sub", "text/vnd.dvb.subtitle" },
951951
{ "sus", "application/vnd.sus-calendar" },
952952
{ "susp", "application/vnd.sus-calendar" },
953953
{ "sv4cpio", "application/x-sv4cpio" },
@@ -1113,7 +1113,7 @@
11131113
{ "wm", "video/x-ms-wm" },
11141114
{ "wma", "audio/x-ms-wma" },
11151115
{ "wmd", "application/x-ms-wmd" },
1116-
{ "wmf", "application/x-msmetafile" },
1116+
{ "wmf", "image/wmf" },
11171117
{ "wml", "text/vnd.wap.wml" },
11181118
{ "wmlc", "application/vnd.wap.wmlc" },
11191119
{ "wmls", "text/vnd.wap.wmlscript" },
@@ -1158,7 +1158,7 @@
11581158
{ "xel", "application/xcap-el+xml" },
11591159
{ "xenc", "application/xenc+xml" },
11601160
{ "xer", "application/patch-ops-error+xml" },
1161-
{ "xfdf", "application/vnd.adobe.xfdf" },
1161+
{ "xfdf", "application/xfdf" },
11621162
{ "xfdl", "application/vnd.xfdl" },
11631163
{ "xht", "application/xhtml+xml" },
11641164
{ "xhtm", "application/vnd.pwg-xhtml-print+xml" },
@@ -1168,7 +1168,7 @@
11681168
{ "xla", "application/vnd.ms-excel" },
11691169
{ "xlam", "application/vnd.ms-excel.addin.macroenabled.12" },
11701170
{ "xlc", "application/vnd.ms-excel" },
1171-
{ "xlf", "application/x-xliff+xml" },
1171+
{ "xlf", "application/xliff+xml" },
11721172
{ "xlm", "application/vnd.ms-excel" },
11731173
{ "xls", "application/vnd.ms-excel" },
11741174
{ "xlsb", "application/vnd.ms-excel.sheet.binary.macroenabled.12" },
@@ -1179,7 +1179,7 @@
11791179
{ "xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template" },
11801180
{ "xlw", "application/vnd.ms-excel" },
11811181
{ "xm", "audio/xm" },
1182-
{ "xml", "application/xml" },
1182+
{ "xml", "text/xml" },
11831183
{ "xns", "application/xcap-ns+xml" },
11841184
{ "xo", "application/vnd.olpc-sugar" },
11851185
{ "xop", "application/xop+xml" },

src/MimeTypes/MimeTypes.cs.pp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@
275275
{ "efif", "application/vnd.picsel" },
276276
{ "ei6", "application/vnd.pg.osasli" },
277277
{ "elc", "application/octet-stream" },
278-
{ "emf", "application/x-msmetafile" },
278+
{ "emf", "image/emf" },
279279
{ "eml", "message/rfc822" },
280280
{ "emma", "application/emma+xml" },
281281
{ "emz", "application/x-msmetafile" },
@@ -290,7 +290,7 @@
290290
{ "etx", "text/x-setext" },
291291
{ "eva", "application/x-eva" },
292292
{ "evy", "application/x-envoy" },
293-
{ "exe", "application/octet-stream" },
293+
{ "exe", "application/x-msdos-program" },
294294
{ "exi", "application/exi" },
295295
{ "exp", "application/express" },
296296
{ "exr", "image/aces" },
@@ -466,7 +466,7 @@
466466
{ "jph", "image/jph" },
467467
{ "jpm", "image/jpm" },
468468
{ "jpx", "image/jpx" },
469-
{ "js", "application/javascript" },
469+
{ "js", "text/javascript" },
470470
{ "json", "application/json" },
471471
{ "json5", "application/json5" },
472472
{ "jsonld", "application/ld+json" },
@@ -596,7 +596,7 @@
596596
{ "mp21", "application/mp21" },
597597
{ "mp2a", "audio/mpeg" },
598598
{ "mp3", "audio/mp3" },
599-
{ "mp4", "application/mp4" },
599+
{ "mp4", "video/mp4" },
600600
{ "mp4a", "audio/mp4" },
601601
{ "mp4s", "application/mp4" },
602602
{ "mp4v", "video/mp4" },
@@ -606,7 +606,7 @@
606606
{ "mpeg", "video/mpeg" },
607607
{ "mpf", "application/media-policy-dataset+xml" },
608608
{ "mpg", "video/mpeg" },
609-
{ "mpg4", "application/mp4" },
609+
{ "mpg4", "video/mp4" },
610610
{ "mpga", "audio/mpeg" },
611611
{ "mpkg", "application/vnd.apple.installer+xml" },
612612
{ "mpm", "application/vnd.blueice.multipass" },
@@ -670,7 +670,7 @@
670670
{ "oas", "application/vnd.fujitsu.oasys" },
671671
{ "obd", "application/x-msbinder" },
672672
{ "obgx", "application/vnd.openblox.game+xml" },
673-
{ "obj", "application/x-tgif" },
673+
{ "obj", "model/obj" },
674674
{ "oda", "application/oda" },
675675
{ "odb", "application/vnd.oasis.opendocument.database" },
676676
{ "odc", "application/vnd.oasis.opendocument.chart" },
@@ -776,7 +776,7 @@
776776
{ "pptm", "application/vnd.ms-powerpoint.presentation.macroenabled.12" },
777777
{ "pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" },
778778
{ "pqa", "application/vnd.palm" },
779-
{ "prc", "application/x-mobipocket-ebook" },
779+
{ "prc", "model/prc" },
780780
{ "pre", "application/vnd.lotus-freelance" },
781781
{ "prf", "application/pics-rules" },
782782
{ "provx", "application/provenance+xml" },
@@ -805,7 +805,7 @@
805805
{ "qxd", "application/vnd.quark.quarkxpress" },
806806
{ "qxl", "application/vnd.quark.quarkxpress" },
807807
{ "qxt", "application/vnd.quark.quarkxpress" },
808-
{ "ra", "audio/x-pn-realaudio" },
808+
{ "ra", "audio/x-realaudio" },
809809
{ "ram", "audio/x-pn-realaudio" },
810810
{ "raml", "application/raml+yaml" },
811811
{ "rapd", "application/route-apd+xml" },
@@ -842,7 +842,7 @@
842842
{ "rsd", "application/rsd+xml" },
843843
{ "rsheet", "application/urc-ressheet+xml" },
844844
{ "rss", "application/rss+xml" },
845-
{ "rtf", "application/rtf" },
845+
{ "rtf", "text/rtf" },
846846
{ "rtx", "text/richtext" },
847847
{ "run", "application/x-makeself" },
848848
{ "rusd", "application/route-usd+xml" },
@@ -939,15 +939,15 @@
939939
{ "stf", "application/vnd.wt.stf" },
940940
{ "sti", "application/vnd.sun.xml.impress.template" },
941941
{ "stk", "application/hyperstudio" },
942-
{ "stl", "application/vnd.ms-pki.stl" },
942+
{ "stl", "model/stl" },
943943
{ "stpx", "model/step+xml" },
944944
{ "stpxz", "model/step-xml+zip" },
945945
{ "stpz", "model/step+zip" },
946946
{ "str", "application/vnd.pg.format" },
947947
{ "stw", "application/vnd.sun.xml.writer.template" },
948948
{ "styl", "text/stylus" },
949949
{ "stylus", "text/stylus" },
950-
{ "sub", "image/vnd.dvb.subtitle" },
950+
{ "sub", "text/vnd.dvb.subtitle" },
951951
{ "sus", "application/vnd.sus-calendar" },
952952
{ "susp", "application/vnd.sus-calendar" },
953953
{ "sv4cpio", "application/x-sv4cpio" },
@@ -1113,7 +1113,7 @@
11131113
{ "wm", "video/x-ms-wm" },
11141114
{ "wma", "audio/x-ms-wma" },
11151115
{ "wmd", "application/x-ms-wmd" },
1116-
{ "wmf", "application/x-msmetafile" },
1116+
{ "wmf", "image/wmf" },
11171117
{ "wml", "text/vnd.wap.wml" },
11181118
{ "wmlc", "application/vnd.wap.wmlc" },
11191119
{ "wmls", "text/vnd.wap.wmlscript" },
@@ -1158,7 +1158,7 @@
11581158
{ "xel", "application/xcap-el+xml" },
11591159
{ "xenc", "application/xenc+xml" },
11601160
{ "xer", "application/patch-ops-error+xml" },
1161-
{ "xfdf", "application/vnd.adobe.xfdf" },
1161+
{ "xfdf", "application/xfdf" },
11621162
{ "xfdl", "application/vnd.xfdl" },
11631163
{ "xht", "application/xhtml+xml" },
11641164
{ "xhtm", "application/vnd.pwg-xhtml-print+xml" },
@@ -1168,7 +1168,7 @@
11681168
{ "xla", "application/vnd.ms-excel" },
11691169
{ "xlam", "application/vnd.ms-excel.addin.macroenabled.12" },
11701170
{ "xlc", "application/vnd.ms-excel" },
1171-
{ "xlf", "application/x-xliff+xml" },
1171+
{ "xlf", "application/xliff+xml" },
11721172
{ "xlm", "application/vnd.ms-excel" },
11731173
{ "xls", "application/vnd.ms-excel" },
11741174
{ "xlsb", "application/vnd.ms-excel.sheet.binary.macroenabled.12" },
@@ -1179,7 +1179,7 @@
11791179
{ "xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template" },
11801180
{ "xlw", "application/vnd.ms-excel" },
11811181
{ "xm", "audio/xm" },
1182-
{ "xml", "application/xml" },
1182+
{ "xml", "text/xml" },
11831183
{ "xns", "application/xcap-ns+xml" },
11841184
{ "xo", "application/vnd.olpc-sugar" },
11851185
{ "xop", "application/xop+xml" },

0 commit comments

Comments
 (0)