From 86114bd136f0af5745e0eb672ac4ef530b59e7ba Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Thu, 5 Jan 2023 18:44:08 +0100 Subject: [PATCH 01/30] initial code from pr !15 --- README.md | 19 +++++++++++++++++++ lib/mime.dart | 1 + lib/src/extension.dart | 33 ++++++++++++++++++++++++++++++++ test/extension_test.dart | 41 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+) create mode 100644 lib/src/extension.dart create mode 100644 test/extension_test.dart diff --git a/README.md b/README.md index 4cd060c..c83d567 100644 --- a/README.md +++ b/README.md @@ -57,3 +57,22 @@ request .map((part) => part.fold(0, (p, d) => p + d)) .listen((length) => print('Part with length $length')); ``` + +## Determining file extension by MIME type + +The top level function `lookupExtension` can be used to determine the +file extension of a given MIME type. + +```dart +print(lookupExtension('text/html')); // Will print html +print(lookupExtension('image/jpeg')); // Will print jpg +print(lookupExtension('application/pdf')); // Will print pdf +``` + +You can override the default MIME type-extension mapping using +`addMimeType`: + +```dart +addMimeType('image/jpeg', 'jpeg'); +print(lookupExtension('image/jpeg')); // Will print jpeg +``` diff --git a/lib/mime.dart b/lib/mime.dart index 12df281..1b452a2 100644 --- a/lib/mime.dart +++ b/lib/mime.dart @@ -9,6 +9,7 @@ /// [Internet media type](http://en.wikipedia.org/wiki/Internet_media_type). library mime; +export 'src/extension.dart'; export 'src/mime_multipart_transformer.dart'; export 'src/mime_shared.dart'; export 'src/mime_type.dart'; diff --git a/lib/src/extension.dart b/lib/src/extension.dart new file mode 100644 index 0000000..e27948d --- /dev/null +++ b/lib/src/extension.dart @@ -0,0 +1,33 @@ +// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'default_extension_map.dart'; + +/// Add an override for common extensions since different extensions may map +/// to the same MIME type. +final Map _preferredExtensionsMap = { + 'application/vnd.ms-excel': 'xls', + 'image/jpeg': 'jpg', + 'text/x-c': 'c' +}; + +/// Lookup file extension by a given MIME type. +/// If no extension is found, `null` is returned. +String lookupExtension(String mimeType) { + if (_preferredExtensionsMap.containsKey(mimeType)) { + return _preferredExtensionsMap[mimeType]; + } + String extension; + defaultExtensionMap.forEach((String ext, String test) { + if (mimeType.toLowerCase() == test) { + extension = ext; + } + }); + return extension; +} + +/// Allow for a user-specified MIME type-extension map that overrides the default. +void addMimeType(String mimeType, String extension) { + _preferredExtensionsMap[mimeType] = extension; +} \ No newline at end of file diff --git a/test/extension_test.dart b/test/extension_test.dart new file mode 100644 index 0000000..c5e1b49 --- /dev/null +++ b/test/extension_test.dart @@ -0,0 +1,41 @@ +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:test/test.dart'; +import 'package:mime/mime.dart'; + +void main() { + group('lookup-mime-type', () { + test('valid-mime-type', () { + expect(lookupExtension('application/dart'), equals('dart')); + expect(lookupExtension('application/javascript'), equals('js')); + expect(lookupExtension('application/pdf'), equals('pdf')); + expect(lookupExtension('application/vnd.ms-excel'), equals('xls')); + expect(lookupExtension('application/xhtml+xml'), equals('xhtml')); + expect(lookupExtension('image/jpeg'), equals('jpg')); + expect(lookupExtension('image/png'), equals('png')); + expect(lookupExtension('text/css'), equals('css')); + expect(lookupExtension('text/html'), equals('html')); + expect(lookupExtension('text/plain'), equals('txt')); + expect(lookupExtension('text/x-c'), equals('c')); + }); + + test('invalid-mime-type', () { + expect(lookupExtension('invalid-content-type'), isNull); + expect(lookupExtension('invalid/content-type'), isNull); + }); + }); + + group('add-mime-type', () { + test('new-mime-type', () { + addMimeType('custom/type', 'ct'); + expect(lookupExtension('custom/type'), equals('ct')); + }); + + test('overridden-mime-type', () { + addMimeType('image/jpeg', 'jpeg'); + expect(lookupExtension('image/jpeg'), equals('jpeg')); + }); + }); +} \ No newline at end of file From 9f1ef5509e33579f0eb23bfbf83f74a3f07438f1 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Thu, 5 Jan 2023 18:47:40 +0100 Subject: [PATCH 02/30] update copyright year --- test/extension_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/extension_test.dart b/test/extension_test.dart index c5e1b49..51432e8 100644 --- a/test/extension_test.dart +++ b/test/extension_test.dart @@ -1,4 +1,4 @@ -// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file +// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. From c9e3e15900005182c5fdb3be5d2158f11593b0d6 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Fri, 6 Jan 2023 17:13:06 +0100 Subject: [PATCH 03/30] improve lookup: case-insensitive and use firstWhereOrNull instead of for loop --- lib/src/extension.dart | 25 ++++++++++++------------- pubspec.yaml | 3 +++ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index e27948d..70e37a5 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -2,6 +2,8 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +import 'package:collection/collection.dart'; + import 'default_extension_map.dart'; /// Add an override for common extensions since different extensions may map @@ -14,20 +16,17 @@ final Map _preferredExtensionsMap = { /// Lookup file extension by a given MIME type. /// If no extension is found, `null` is returned. -String lookupExtension(String mimeType) { - if (_preferredExtensionsMap.containsKey(mimeType)) { - return _preferredExtensionsMap[mimeType]; +String? lookupExtension(String mimeType) { + final mimeTypeLC = mimeType.toLowerCase(); + if (_preferredExtensionsMap.containsKey(mimeTypeLC)) { + return _preferredExtensionsMap[mimeTypeLC]!; } - String extension; - defaultExtensionMap.forEach((String ext, String test) { - if (mimeType.toLowerCase() == test) { - extension = ext; - } - }); - return extension; + return defaultExtensionMap.entries + .firstWhereOrNull((entry) => entry.value == mimeTypeLC)?.key; } -/// Allow for a user-specified MIME type-extension map that overrides the default. +/// Allow for a user-specified MIME type-extension mapping that overrides the +/// default. void addMimeType(String mimeType, String extension) { - _preferredExtensionsMap[mimeType] = extension; -} \ No newline at end of file + _preferredExtensionsMap[mimeType.toLowerCase()] = extension.toLowerCase(); +} diff --git a/pubspec.yaml b/pubspec.yaml index 186f288..3620028 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,6 +8,9 @@ repository: https://github.com/dart-lang/mime environment: sdk: '>=2.18.0 <3.0.0' +dependencies: + collection: ^1.17.0 + dev_dependencies: lints: ^2.0.0 test: ^1.16.0 From 0f37a4b2053a814b292b23481c66e39ce945018a Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Fri, 6 Jan 2023 17:13:33 +0100 Subject: [PATCH 04/30] tests cleanup --- test/extension_test.dart | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/test/extension_test.dart b/test/extension_test.dart index 51432e8..f4ad5b3 100644 --- a/test/extension_test.dart +++ b/test/extension_test.dart @@ -2,28 +2,31 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'package:test/test.dart'; import 'package:mime/mime.dart'; +import 'package:test/test.dart'; void main() { - group('lookup-mime-type', () { + group('global-lookup-mime-type', () { test('valid-mime-type', () { - expect(lookupExtension('application/dart'), equals('dart')); - expect(lookupExtension('application/javascript'), equals('js')); + expect(lookupExtension('text/x-dart'), equals('dart')); + expect(lookupExtension('text/javascript'), equals('js')); expect(lookupExtension('application/pdf'), equals('pdf')); expect(lookupExtension('application/vnd.ms-excel'), equals('xls')); - expect(lookupExtension('application/xhtml+xml'), equals('xhtml')); + expect(lookupExtension('application/xhtml+xml'), equals('xht')); expect(lookupExtension('image/jpeg'), equals('jpg')); expect(lookupExtension('image/png'), equals('png')); expect(lookupExtension('text/css'), equals('css')); - expect(lookupExtension('text/html'), equals('html')); - expect(lookupExtension('text/plain'), equals('txt')); + expect(lookupExtension('text/html'), equals('htm')); + // expect(lookupExtension('text/plain'), equals('txt')); expect(lookupExtension('text/x-c'), equals('c')); }); test('invalid-mime-type', () { - expect(lookupExtension('invalid-content-type'), isNull); - expect(lookupExtension('invalid/content-type'), isNull); + expect(lookupExtension('invalid-mime-type'), isNull); + }); + + test('unknown-mime-type', () { + expect(lookupExtension('application/to-be-invented'), isNull); }); }); From f4c4a4f8fb4419625ba618d09ecdefdaddf51b2c Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Fri, 6 Jan 2023 17:16:14 +0100 Subject: [PATCH 05/30] check baseline --- test/extension_test.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/extension_test.dart b/test/extension_test.dart index f4ad5b3..f096f1b 100644 --- a/test/extension_test.dart +++ b/test/extension_test.dart @@ -32,11 +32,13 @@ void main() { group('add-mime-type', () { test('new-mime-type', () { + expect(lookupExtension('custom/type'), isNull); addMimeType('custom/type', 'ct'); expect(lookupExtension('custom/type'), equals('ct')); }); test('overridden-mime-type', () { + expect(lookupExtension('image/jpeg'), equals('jpg')); addMimeType('image/jpeg', 'jpeg'); expect(lookupExtension('image/jpeg'), equals('jpeg')); }); From a9ec842950f9073507ca8fbbc4141c83c00a10c3 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Fri, 6 Jan 2023 17:47:59 +0100 Subject: [PATCH 06/30] test to check whether each mimetype with multiple extensions has a preferred extension defined --- lib/src/extension.dart | 3 +++ test/extension_test.dart | 22 +++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index 70e37a5..fdc34b2 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -30,3 +30,6 @@ String? lookupExtension(String mimeType) { void addMimeType(String mimeType, String extension) { _preferredExtensionsMap[mimeType.toLowerCase()] = extension.toLowerCase(); } + +bool hasPreferredExtension(String mimeType) => + _preferredExtensionsMap.containsKey(mimeType.toLowerCase()); diff --git a/test/extension_test.dart b/test/extension_test.dart index f096f1b..06106d2 100644 --- a/test/extension_test.dart +++ b/test/extension_test.dart @@ -3,6 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'package:mime/mime.dart'; +import 'package:mime/src/default_extension_map.dart'; import 'package:test/test.dart'; void main() { @@ -42,5 +43,24 @@ void main() { addMimeType('image/jpeg', 'jpeg'); expect(lookupExtension('image/jpeg'), equals('jpeg')); }); + + test('check-preferred-present-for-non-unique', () { + final mimeTypeToExtMap = >{}; + for (var entry in defaultExtensionMap.entries) { + final extensions = mimeTypeToExtMap.putIfAbsent(entry.value, () => []); + extensions.add(entry.key); + } + final mimeTypesWithMultipleExtensions = Map.fromEntries(mimeTypeToExtMap + .entries + .where((element) => element.value.length > 1)); + for (var mimeType in mimeTypesWithMultipleExtensions.keys) { + expect( + hasPreferredExtension(mimeType), + isTrue, + reason: 'mimeType $mimeType with multiple extension, ' + 'does not have preferred extension defined', + ); + } + }); }); -} \ No newline at end of file +} From 02b9dcbf76ad1c990d6cfcabcbb095f62dcb7d94 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Fri, 6 Jan 2023 17:48:08 +0100 Subject: [PATCH 07/30] reformat --- lib/src/extension.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index fdc34b2..765c610 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -22,7 +22,8 @@ String? lookupExtension(String mimeType) { return _preferredExtensionsMap[mimeTypeLC]!; } return defaultExtensionMap.entries - .firstWhereOrNull((entry) => entry.value == mimeTypeLC)?.key; + .firstWhereOrNull((entry) => entry.value == mimeTypeLC) + ?.key; } /// Allow for a user-specified MIME type-extension mapping that overrides the From 1ad29e9effe21dc57730cd0efa3f3f64323f2de8 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Fri, 6 Jan 2023 19:05:56 +0100 Subject: [PATCH 08/30] apparently, the function already existed :roll-eyes: but the preferred extension not. for backwards compatibility: add `extensionFromMimeOrNull`, and add an `orElse` param for `extensionFromMime` as the standard behavior results in creating an invalid filename. --- lib/src/extension.dart | 10 +++++++-- lib/src/mime_type.dart | 14 ------------ test/extension_test.dart | 46 +++++++++++++++++++++++++--------------- 3 files changed, 37 insertions(+), 33 deletions(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index 765c610..4a356a1 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -14,9 +14,12 @@ final Map _preferredExtensionsMap = { 'text/x-c': 'c' }; -/// Lookup file extension by a given MIME type. +/// Lookup file extension for a given MIME type. +/// +/// If there are multiple extensions for [mimeType], return preferred extension +/// if defined, or the first occurrence in the map. /// If no extension is found, `null` is returned. -String? lookupExtension(String mimeType) { +String? extensionFromMimeOrNull(String mimeType) { final mimeTypeLC = mimeType.toLowerCase(); if (_preferredExtensionsMap.containsKey(mimeTypeLC)) { return _preferredExtensionsMap[mimeTypeLC]!; @@ -26,6 +29,9 @@ String? lookupExtension(String mimeType) { ?.key; } +String extensionFromMime(String mimeType, {String? orElse}) => + extensionFromMimeOrNull(mimeType) ?? orElse ?? mimeType; + /// Allow for a user-specified MIME type-extension mapping that overrides the /// default. void addMimeType(String mimeType, String extension) { diff --git a/lib/src/mime_type.dart b/lib/src/mime_type.dart index 03121c9..9cf9194 100644 --- a/lib/src/mime_type.dart +++ b/lib/src/mime_type.dart @@ -23,20 +23,6 @@ int get defaultMagicNumbersMaxLength => _globalResolver.magicNumbersMaxLength; String? lookupMimeType(String path, {List? headerBytes}) => _globalResolver.lookup(path, headerBytes: headerBytes); -/// Returns the extension for the given MIME type. -/// -/// If there are multiple extensions for [mime], return the first occurrence in -/// the map. If there are no extensions for [mime], return [mime]. -String extensionFromMime(String mime) { - mime = mime.toLowerCase(); - for (final entry in defaultExtensionMap.entries) { - if (defaultExtensionMap[entry.key] == mime) { - return entry.key; - } - } - return mime; -} - /// MIME-type resolver class, used to customize the lookup of mime-types. class MimeTypeResolver { final Map _extensionMap = {}; diff --git a/test/extension_test.dart b/test/extension_test.dart index 06106d2..62c084f 100644 --- a/test/extension_test.dart +++ b/test/extension_test.dart @@ -9,39 +9,51 @@ import 'package:test/test.dart'; void main() { group('global-lookup-mime-type', () { test('valid-mime-type', () { - expect(lookupExtension('text/x-dart'), equals('dart')); - expect(lookupExtension('text/javascript'), equals('js')); - expect(lookupExtension('application/pdf'), equals('pdf')); - expect(lookupExtension('application/vnd.ms-excel'), equals('xls')); - expect(lookupExtension('application/xhtml+xml'), equals('xht')); - expect(lookupExtension('image/jpeg'), equals('jpg')); - expect(lookupExtension('image/png'), equals('png')); - expect(lookupExtension('text/css'), equals('css')); - expect(lookupExtension('text/html'), equals('htm')); - // expect(lookupExtension('text/plain'), equals('txt')); - expect(lookupExtension('text/x-c'), equals('c')); + expect(extensionFromMime('text/x-dart'), equals('dart')); + expect(extensionFromMime('text/javascript'), equals('js')); + expect(extensionFromMime('application/pdf'), equals('pdf')); + expect(extensionFromMime('application/vnd.ms-excel'), equals('xls')); + expect(extensionFromMime('application/xhtml+xml'), equals('xht')); + expect(extensionFromMime('image/jpeg'), equals('jpg')); + expect(extensionFromMime('image/png'), equals('png')); + expect(extensionFromMime('text/css'), equals('css')); + expect(extensionFromMime('text/html'), equals('htm')); + // expect(extensionFromMime('text/plain'), equals('txt')); + expect(extensionFromMime('text/x-c'), equals('c')); }); test('invalid-mime-type', () { - expect(lookupExtension('invalid-mime-type'), isNull); + expect(extensionFromMime('invalid-mime-type'), 'invalid-mime-type'); + expect(extensionFromMime('invalid/mime/type'), 'invalid/mime/type'); + + expect( + extensionFromMime('invalid-mime-type', orElse: 'invalid'), 'invalid'); + expect( + extensionFromMime('invalid/mime/type', orElse: 'invalid'), 'invalid'); + + expect(extensionFromMimeOrNull('invalid-mime-type'), isNull); + expect(extensionFromMimeOrNull('invalid/mime/type'), isNull); }); test('unknown-mime-type', () { - expect(lookupExtension('application/to-be-invented'), isNull); + expect(extensionFromMime('application/to-be-invented'), + 'application/to-be-invented'); + + expect(extensionFromMimeOrNull('application/to-be-invented'), isNull); }); }); group('add-mime-type', () { test('new-mime-type', () { - expect(lookupExtension('custom/type'), isNull); + expect(extensionFromMimeOrNull('custom/type'), isNull); addMimeType('custom/type', 'ct'); - expect(lookupExtension('custom/type'), equals('ct')); + expect(extensionFromMime('custom/type'), equals('ct')); }); test('overridden-mime-type', () { - expect(lookupExtension('image/jpeg'), equals('jpg')); + expect(extensionFromMime('image/jpeg'), equals('jpg')); addMimeType('image/jpeg', 'jpeg'); - expect(lookupExtension('image/jpeg'), equals('jpeg')); + expect(extensionFromMime('image/jpeg'), equals('jpeg')); }); test('check-preferred-present-for-non-unique', () { From 84a8f43d0b7dbfc6c61716953b16353b31406c3f Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Fri, 6 Jan 2023 19:07:59 +0100 Subject: [PATCH 09/30] probably better not to enforce a preferred extension for mime types with multiple extensions. There are quite some, but most of them are legacy, and new mimetypes tend to map to 1 extension (no 3 chars limit anymore), so less useful in the future --- CONTRIBUTING.md | 4 ++++ lib/src/extension.dart | 3 --- test/extension_test.dart | 20 -------------------- 3 files changed, 4 insertions(+), 23 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6f5e0ea..50a36a2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -31,3 +31,7 @@ All files in the project must start with the following header. Contributions made by corporations are covered by a different agreement than the one above, the [Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate). + +### Adding an extension to an existing MIME type +If a MIME type ends up with multiple extensions, it is recommended to define a +preferred extension in `_preferredExtensionsMap` in `extension.dart` \ No newline at end of file diff --git a/lib/src/extension.dart b/lib/src/extension.dart index 4a356a1..04a8071 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -37,6 +37,3 @@ String extensionFromMime(String mimeType, {String? orElse}) => void addMimeType(String mimeType, String extension) { _preferredExtensionsMap[mimeType.toLowerCase()] = extension.toLowerCase(); } - -bool hasPreferredExtension(String mimeType) => - _preferredExtensionsMap.containsKey(mimeType.toLowerCase()); diff --git a/test/extension_test.dart b/test/extension_test.dart index 62c084f..0f6df28 100644 --- a/test/extension_test.dart +++ b/test/extension_test.dart @@ -3,7 +3,6 @@ // BSD-style license that can be found in the LICENSE file. import 'package:mime/mime.dart'; -import 'package:mime/src/default_extension_map.dart'; import 'package:test/test.dart'; void main() { @@ -55,24 +54,5 @@ void main() { addMimeType('image/jpeg', 'jpeg'); expect(extensionFromMime('image/jpeg'), equals('jpeg')); }); - - test('check-preferred-present-for-non-unique', () { - final mimeTypeToExtMap = >{}; - for (var entry in defaultExtensionMap.entries) { - final extensions = mimeTypeToExtMap.putIfAbsent(entry.value, () => []); - extensions.add(entry.key); - } - final mimeTypesWithMultipleExtensions = Map.fromEntries(mimeTypeToExtMap - .entries - .where((element) => element.value.length > 1)); - for (var mimeType in mimeTypesWithMultipleExtensions.keys) { - expect( - hasPreferredExtension(mimeType), - isTrue, - reason: 'mimeType $mimeType with multiple extension, ' - 'does not have preferred extension defined', - ); - } - }); }); } From 1f2ab54da7c69d99f84669b0656a9d137bbca0a4 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Fri, 6 Jan 2023 19:08:49 +0100 Subject: [PATCH 10/30] added some preferred extensions for common file formats --- lib/src/extension.dart | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index 04a8071..c70afb1 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -10,8 +10,19 @@ import 'default_extension_map.dart'; /// to the same MIME type. final Map _preferredExtensionsMap = { 'application/vnd.ms-excel': 'xls', + 'application/vnd.ms-powerpoint': 'ppt', 'image/jpeg': 'jpg', - 'text/x-c': 'c' + 'image/tiff': 'tif', + 'image/svg+xml': 'svg', + 'text/calendar': 'ics', + 'text/javascript': 'js', + 'text/plain': 'txt', + 'text/sgml': 'sgml', + 'text/x-pascal': 'pas', + 'video/mp4': 'mp4', + 'video/mpeg': 'mpg', + 'video/quicktime': 'mov', + 'video/x-matroska': 'mkv', }; /// Lookup file extension for a given MIME type. From fbf8f685cc963c019a828d2915af222434f3a6e0 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Fri, 6 Jan 2023 19:16:54 +0100 Subject: [PATCH 11/30] cleanup old tests --- test/extension_test.dart | 2 ++ test/mime_type_test.dart | 17 ----------------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/test/extension_test.dart b/test/extension_test.dart index 0f6df28..a3d7f98 100644 --- a/test/extension_test.dart +++ b/test/extension_test.dart @@ -10,6 +10,8 @@ void main() { test('valid-mime-type', () { expect(extensionFromMime('text/x-dart'), equals('dart')); expect(extensionFromMime('text/javascript'), equals('js')); + expect(extensionFromMime('application/java-archive'), equals('jar')); + expect(extensionFromMime('application/json'), equals('json')); expect(extensionFromMime('application/pdf'), equals('pdf')); expect(extensionFromMime('application/vnd.ms-excel'), equals('xls')); expect(extensionFromMime('application/xhtml+xml'), equals('xht')); diff --git a/test/mime_type_test.dart b/test/mime_type_test.dart index 5e444e2..2aec6e3 100644 --- a/test/mime_type_test.dart +++ b/test/mime_type_test.dart @@ -184,21 +184,4 @@ void main() { expect(initialMagicNumbersMaxLength, actualMaxBytes); }); - group('extensionFromMime', () { - test('returns match for mime with single extension', () { - expect(extensionFromMime('application/json'), equals('json')); - expect(extensionFromMime('application/java-archive'), equals('jar')); - }); - - test('returns first match for mime with multiple extensions', () { - expect(extensionFromMime('text/html'), equals('htm')); - expect(extensionFromMime('application/x-cbr'), equals('cb7')); - }); - - test('returns inputted string for unrecognized mime', () { - expect( - extensionFromMime('unrecognized_mime'), equals('unrecognized_mime')); - expect(extensionFromMime('i/am/not/a/mime'), equals('i/am/not/a/mime')); - }); - }); } From 6600a3fefeb96430c2dd01e6d6f2dd150fac2144 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Mon, 16 Jan 2023 15:16:02 +0100 Subject: [PATCH 12/30] test orElse param for unknown mime type --- test/extension_test.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/extension_test.dart b/test/extension_test.dart index a3d7f98..bed63b4 100644 --- a/test/extension_test.dart +++ b/test/extension_test.dart @@ -40,6 +40,9 @@ void main() { expect(extensionFromMime('application/to-be-invented'), 'application/to-be-invented'); + expect(extensionFromMime('application/to-be-invented', orElse: 'unknown'), + 'unknown'); + expect(extensionFromMimeOrNull('application/to-be-invented'), isNull); }); }); From 6fe7ecbd3b0ebd79dca2d8dc05219dacf4250950 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Mon, 16 Jan 2023 15:22:24 +0100 Subject: [PATCH 13/30] link to file --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 50a36a2..cd7d82f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,4 +34,4 @@ one above, the ### Adding an extension to an existing MIME type If a MIME type ends up with multiple extensions, it is recommended to define a -preferred extension in `_preferredExtensionsMap` in `extension.dart` \ No newline at end of file +preferred extension in `_preferredExtensionsMap` in [extension.dart](lib/src/extension.dart). \ No newline at end of file From d57b9fc66dd5cfbb636e16bdc3dc4007cbf942e3 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Mon, 16 Jan 2023 15:26:38 +0100 Subject: [PATCH 14/30] fix title to be more accurate --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cd7d82f..bd079dd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,6 +32,6 @@ Contributions made by corporations are covered by a different agreement than the one above, the [Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate). -### Adding an extension to an existing MIME type +### Adding an extension / MIME type mapping If a MIME type ends up with multiple extensions, it is recommended to define a preferred extension in `_preferredExtensionsMap` in [extension.dart](lib/src/extension.dart). \ No newline at end of file From 0d6c519db9a0f94bc86e0d11b96a07195a193d2b Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Mon, 16 Jan 2023 15:32:15 +0100 Subject: [PATCH 15/30] rename to existing function --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c83d567..7688822 100644 --- a/README.md +++ b/README.md @@ -64,9 +64,9 @@ The top level function `lookupExtension` can be used to determine the file extension of a given MIME type. ```dart -print(lookupExtension('text/html')); // Will print html -print(lookupExtension('image/jpeg')); // Will print jpg -print(lookupExtension('application/pdf')); // Will print pdf +print(extensionFromMime('text/html')); // Will print html +print(extensionFromMime('image/jpeg')); // Will print jpg +print(extensionFromMime('application/pdf')); // Will print pdf ``` You can override the default MIME type-extension mapping using @@ -74,5 +74,5 @@ You can override the default MIME type-extension mapping using ```dart addMimeType('image/jpeg', 'jpeg'); -print(lookupExtension('image/jpeg')); // Will print jpeg +print(extensionFromMime('image/jpeg')); // Will print jpeg ``` From bb9fc15fd067dbe72827fdd7af06bc0c56acb7ef Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Mon, 16 Jan 2023 15:32:41 +0100 Subject: [PATCH 16/30] add standard behavior to make example more clear --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7688822..4fdd85e 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ You can override the default MIME type-extension mapping using `addMimeType`: ```dart +print(extensionFromMime('image/jpeg')); // Will print jpg addMimeType('image/jpeg', 'jpeg'); print(extensionFromMime('image/jpeg')); // Will print jpeg ``` From 72806150b5d53c562134724e95ee78bf628cf629 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Mon, 16 Jan 2023 15:34:31 +0100 Subject: [PATCH 17/30] include text/plain mapping again --- test/extension_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/extension_test.dart b/test/extension_test.dart index bed63b4..7a22f02 100644 --- a/test/extension_test.dart +++ b/test/extension_test.dart @@ -19,7 +19,7 @@ void main() { expect(extensionFromMime('image/png'), equals('png')); expect(extensionFromMime('text/css'), equals('css')); expect(extensionFromMime('text/html'), equals('htm')); - // expect(extensionFromMime('text/plain'), equals('txt')); + expect(extensionFromMime('text/plain'), equals('txt')); expect(extensionFromMime('text/x-c'), equals('c')); }); From 40107ff862062814374b76ab4d3a0b4e976df06a Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Tue, 17 Jan 2023 10:31:44 +0100 Subject: [PATCH 18/30] remove collection dependency --- lib/src/extension.dart | 12 ++++++++++-- pubspec.yaml | 3 --- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index c70afb1..94e3f7d 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'package:collection/collection.dart'; - import 'default_extension_map.dart'; /// Add an override for common extensions since different extensions may map @@ -48,3 +46,13 @@ String extensionFromMime(String mimeType, {String? orElse}) => void addMimeType(String mimeType, String extension) { _preferredExtensionsMap[mimeType.toLowerCase()] = extension.toLowerCase(); } + +extension _IterableExtension on Iterable { + /// The first element satisfying [test], or `null` if there are none. + T? firstWhereOrNull(bool Function(T element) test) { + for (var element in this) { + if (test(element)) return element; + } + return null; + } +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 3620028..186f288 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,9 +8,6 @@ repository: https://github.com/dart-lang/mime environment: sdk: '>=2.18.0 <3.0.0' -dependencies: - collection: ^1.17.0 - dev_dependencies: lints: ^2.0.0 test: ^1.16.0 From c384ef347353368c414a7c66143e12bd91d5a8c2 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <178714+mx1up@users.noreply.github.com> Date: Fri, 27 Jan 2023 14:08:23 +0100 Subject: [PATCH 19/30] lookupExtension has been renamed to existing extensionFromMime --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4fdd85e..20670f1 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ request ## Determining file extension by MIME type -The top level function `lookupExtension` can be used to determine the +The top level function `extensionFromMime` can be used to determine the file extension of a given MIME type. ```dart From 76f80f6e39c272b4b7f68e5fdb1ae72f74a8f897 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <121732-mx1up@users.noreply.gitlab.com> Date: Wed, 13 Dec 2023 19:13:13 +0100 Subject: [PATCH 20/30] drop non-nullable extensionFromMime variant per review suggestion --- lib/src/extension.dart | 5 +---- test/extension_test.dart | 22 ++++------------------ 2 files changed, 5 insertions(+), 22 deletions(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index 94e3f7d..69a1bdc 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -28,7 +28,7 @@ final Map _preferredExtensionsMap = { /// If there are multiple extensions for [mimeType], return preferred extension /// if defined, or the first occurrence in the map. /// If no extension is found, `null` is returned. -String? extensionFromMimeOrNull(String mimeType) { +String? extensionFromMime(String mimeType) { final mimeTypeLC = mimeType.toLowerCase(); if (_preferredExtensionsMap.containsKey(mimeTypeLC)) { return _preferredExtensionsMap[mimeTypeLC]!; @@ -38,9 +38,6 @@ String? extensionFromMimeOrNull(String mimeType) { ?.key; } -String extensionFromMime(String mimeType, {String? orElse}) => - extensionFromMimeOrNull(mimeType) ?? orElse ?? mimeType; - /// Allow for a user-specified MIME type-extension mapping that overrides the /// default. void addMimeType(String mimeType, String extension) { diff --git a/test/extension_test.dart b/test/extension_test.dart index 7a22f02..a57e9c6 100644 --- a/test/extension_test.dart +++ b/test/extension_test.dart @@ -24,32 +24,18 @@ void main() { }); test('invalid-mime-type', () { - expect(extensionFromMime('invalid-mime-type'), 'invalid-mime-type'); - expect(extensionFromMime('invalid/mime/type'), 'invalid/mime/type'); - - expect( - extensionFromMime('invalid-mime-type', orElse: 'invalid'), 'invalid'); - expect( - extensionFromMime('invalid/mime/type', orElse: 'invalid'), 'invalid'); - - expect(extensionFromMimeOrNull('invalid-mime-type'), isNull); - expect(extensionFromMimeOrNull('invalid/mime/type'), isNull); + expect(extensionFromMime('invalid-mime-type'), isNull); + expect(extensionFromMime('invalid/mime/type'), isNull); }); test('unknown-mime-type', () { - expect(extensionFromMime('application/to-be-invented'), - 'application/to-be-invented'); - - expect(extensionFromMime('application/to-be-invented', orElse: 'unknown'), - 'unknown'); - - expect(extensionFromMimeOrNull('application/to-be-invented'), isNull); + expect(extensionFromMime('application/to-be-invented'), isNull); }); }); group('add-mime-type', () { test('new-mime-type', () { - expect(extensionFromMimeOrNull('custom/type'), isNull); + expect(extensionFromMime('custom/type'), isNull); addMimeType('custom/type', 'ct'); expect(extensionFromMime('custom/type'), equals('ct')); }); From 7b2804f1f0e66c2f3bbd79a0fc0851d362352fa6 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <121732-mx1up@users.noreply.gitlab.com> Date: Wed, 13 Dec 2023 19:34:09 +0100 Subject: [PATCH 21/30] doc update: try using noun phrase; don't refer to implementation details --- lib/src/extension.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index 69a1bdc..4344be9 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -23,10 +23,10 @@ final Map _preferredExtensionsMap = { 'video/x-matroska': 'mkv', }; -/// Lookup file extension for a given MIME type. +/// The extension for a given MIME type. /// /// If there are multiple extensions for [mimeType], return preferred extension -/// if defined, or the first occurrence in the map. +/// if defined, otherwise an extension chosen by the library. /// If no extension is found, `null` is returned. String? extensionFromMime(String mimeType) { final mimeTypeLC = mimeType.toLowerCase(); From 65c70168fe3abaca19a3b4a597fe5e60ccc4f554 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <121732-mx1up@users.noreply.gitlab.com> Date: Wed, 13 Dec 2023 19:37:19 +0100 Subject: [PATCH 22/30] don't use extension method --- lib/src/extension.dart | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index 4344be9..b9160ed 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -33,9 +33,11 @@ String? extensionFromMime(String mimeType) { if (_preferredExtensionsMap.containsKey(mimeTypeLC)) { return _preferredExtensionsMap[mimeTypeLC]!; } - return defaultExtensionMap.entries - .firstWhereOrNull((entry) => entry.value == mimeTypeLC) - ?.key; + + for (final entry in defaultExtensionMap.entries) { + if (entry.value == mimeTypeLC) return entry.key; + } + return null; } /// Allow for a user-specified MIME type-extension mapping that overrides the @@ -43,13 +45,3 @@ String? extensionFromMime(String mimeType) { void addMimeType(String mimeType, String extension) { _preferredExtensionsMap[mimeType.toLowerCase()] = extension.toLowerCase(); } - -extension _IterableExtension on Iterable { - /// The first element satisfying [test], or `null` if there are none. - T? firstWhereOrNull(bool Function(T element) test) { - for (var element in this) { - if (test(element)) return element; - } - return null; - } -} \ No newline at end of file From e8a6ed56c5f68b4c920092bc9a5b7fa49fb0240d Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <121732-mx1up@users.noreply.gitlab.com> Date: Wed, 13 Dec 2023 19:44:13 +0100 Subject: [PATCH 23/30] remove addMimeType and leave it for another time.. --- lib/src/extension.dart | 6 ------ test/extension_test.dart | 14 -------------- 2 files changed, 20 deletions(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index b9160ed..22b3e07 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -39,9 +39,3 @@ String? extensionFromMime(String mimeType) { } return null; } - -/// Allow for a user-specified MIME type-extension mapping that overrides the -/// default. -void addMimeType(String mimeType, String extension) { - _preferredExtensionsMap[mimeType.toLowerCase()] = extension.toLowerCase(); -} diff --git a/test/extension_test.dart b/test/extension_test.dart index a57e9c6..0a3db0f 100644 --- a/test/extension_test.dart +++ b/test/extension_test.dart @@ -32,18 +32,4 @@ void main() { expect(extensionFromMime('application/to-be-invented'), isNull); }); }); - - group('add-mime-type', () { - test('new-mime-type', () { - expect(extensionFromMime('custom/type'), isNull); - addMimeType('custom/type', 'ct'); - expect(extensionFromMime('custom/type'), equals('ct')); - }); - - test('overridden-mime-type', () { - expect(extensionFromMime('image/jpeg'), equals('jpg')); - addMimeType('image/jpeg', 'jpeg'); - expect(extensionFromMime('image/jpeg'), equals('jpeg')); - }); - }); } From f8642bd66a694ec522b83f2becd85b5da88fc32a Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <121732-mx1up@users.noreply.gitlab.com> Date: Wed, 13 Dec 2023 20:53:17 +0100 Subject: [PATCH 24/30] remove addMimeType documentation --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index 20670f1..7ea762c 100644 --- a/README.md +++ b/README.md @@ -68,12 +68,3 @@ print(extensionFromMime('text/html')); // Will print html print(extensionFromMime('image/jpeg')); // Will print jpg print(extensionFromMime('application/pdf')); // Will print pdf ``` - -You can override the default MIME type-extension mapping using -`addMimeType`: - -```dart -print(extensionFromMime('image/jpeg')); // Will print jpg -addMimeType('image/jpeg', 'jpeg'); -print(extensionFromMime('image/jpeg')); // Will print jpeg -``` From 8acfbe4a5a946882f1cbde5816a230cb9be47506 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <121732-mx1up@users.noreply.gitlab.com> Date: Mon, 19 Feb 2024 19:00:11 +0100 Subject: [PATCH 25/30] be more specific about extension --- lib/src/extension.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index 22b3e07..871ee55 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -23,7 +23,7 @@ final Map _preferredExtensionsMap = { 'video/x-matroska': 'mkv', }; -/// The extension for a given MIME type. +/// The file extension for a given MIME type. /// /// If there are multiple extensions for [mimeType], return preferred extension /// if defined, otherwise an extension chosen by the library. From f20c40f30baa21070fd218368630e033dc8a7443 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <121732-mx1up@users.noreply.gitlab.com> Date: Mon, 19 Feb 2024 19:07:41 +0100 Subject: [PATCH 26/30] review feedback: avoid abbreviations, just overwrite function param --- lib/src/extension.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index 871ee55..e77b038 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -29,13 +29,13 @@ final Map _preferredExtensionsMap = { /// if defined, otherwise an extension chosen by the library. /// If no extension is found, `null` is returned. String? extensionFromMime(String mimeType) { - final mimeTypeLC = mimeType.toLowerCase(); - if (_preferredExtensionsMap.containsKey(mimeTypeLC)) { - return _preferredExtensionsMap[mimeTypeLC]!; + mimeType = mimeType.toLowerCase(); + if (_preferredExtensionsMap.containsKey(mimeType)) { + return _preferredExtensionsMap[mimeType]!; } for (final entry in defaultExtensionMap.entries) { - if (entry.value == mimeTypeLC) return entry.key; + if (entry.value == mimeType) return entry.key; } return null; } From 2be331fae754c5c6ba0ff56e0ccf13d14f137cf4 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <121732-mx1up@users.noreply.gitlab.com> Date: Mon, 19 Feb 2024 19:25:01 +0100 Subject: [PATCH 27/30] since extensions can no longer by added at runtime, we can optimize and avoid the linear search --- lib/src/extension.dart | 43 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index e77b038..5b223a3 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -6,22 +6,24 @@ import 'default_extension_map.dart'; /// Add an override for common extensions since different extensions may map /// to the same MIME type. -final Map _preferredExtensionsMap = { - 'application/vnd.ms-excel': 'xls', - 'application/vnd.ms-powerpoint': 'ppt', - 'image/jpeg': 'jpg', - 'image/tiff': 'tif', - 'image/svg+xml': 'svg', - 'text/calendar': 'ics', - 'text/javascript': 'js', - 'text/plain': 'txt', - 'text/sgml': 'sgml', - 'text/x-pascal': 'pas', - 'video/mp4': 'mp4', - 'video/mpeg': 'mpg', - 'video/quicktime': 'mov', - 'video/x-matroska': 'mkv', -}; +final Map _defaultMimeTypeMap = { + for (var entry in defaultExtensionMap.entries) entry.value: entry.key, +}..addAll({ + 'application/vnd.ms-excel': 'xls', + 'application/vnd.ms-powerpoint': 'ppt', + 'image/jpeg': 'jpg', + 'image/tiff': 'tif', + 'image/svg+xml': 'svg', + 'text/calendar': 'ics', + 'text/javascript': 'js', + 'text/plain': 'txt', + 'text/sgml': 'sgml', + 'text/x-pascal': 'pas', + 'video/mp4': 'mp4', + 'video/mpeg': 'mpg', + 'video/quicktime': 'mov', + 'video/x-matroska': 'mkv', + }); /// The file extension for a given MIME type. /// @@ -30,12 +32,5 @@ final Map _preferredExtensionsMap = { /// If no extension is found, `null` is returned. String? extensionFromMime(String mimeType) { mimeType = mimeType.toLowerCase(); - if (_preferredExtensionsMap.containsKey(mimeType)) { - return _preferredExtensionsMap[mimeType]!; - } - - for (final entry in defaultExtensionMap.entries) { - if (entry.value == mimeType) return entry.key; - } - return null; + return _defaultMimeTypeMap[mimeType]; } From 60e9a7be55c15dc2556540836ff061ba626dbd99 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <121732-mx1up@users.noreply.gitlab.com> Date: Mon, 19 Feb 2024 19:27:23 +0100 Subject: [PATCH 28/30] local var no longer needed --- lib/src/extension.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index 5b223a3..1edaca2 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -30,7 +30,5 @@ final Map _defaultMimeTypeMap = { /// If there are multiple extensions for [mimeType], return preferred extension /// if defined, otherwise an extension chosen by the library. /// If no extension is found, `null` is returned. -String? extensionFromMime(String mimeType) { - mimeType = mimeType.toLowerCase(); - return _defaultMimeTypeMap[mimeType]; -} +String? extensionFromMime(String mimeType) => + _defaultMimeTypeMap[mimeType.toLowerCase()]; From 54da123451038f524bde787d4b8c506968ed0d1f Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <121732-mx1up@users.noreply.gitlab.com> Date: Mon, 19 Feb 2024 19:34:51 +0100 Subject: [PATCH 29/30] update docs --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bd079dd..463063a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,4 +34,4 @@ one above, the ### Adding an extension / MIME type mapping If a MIME type ends up with multiple extensions, it is recommended to define a -preferred extension in `_preferredExtensionsMap` in [extension.dart](lib/src/extension.dart). \ No newline at end of file +preferred extension in `_defaultMimeTypeMap` in [extension.dart](lib/src/extension.dart). \ No newline at end of file From d1909147a838601970351f536cb731b80a382a08 Mon Sep 17 00:00:00 2001 From: matthias sweertvaegher <121732-mx1up@users.noreply.gitlab.com> Date: Mon, 19 Feb 2024 19:38:56 +0100 Subject: [PATCH 30/30] update docs --- lib/src/extension.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/src/extension.dart b/lib/src/extension.dart index 1edaca2..35a860f 100644 --- a/lib/src/extension.dart +++ b/lib/src/extension.dart @@ -4,8 +4,8 @@ import 'default_extension_map.dart'; -/// Add an override for common extensions since different extensions may map -/// to the same MIME type. +/// Reverse map of [defaultExtensionMap] with overrides for common extensions +/// since different extensions may map to the same MIME type. final Map _defaultMimeTypeMap = { for (var entry in defaultExtensionMap.entries) entry.value: entry.key, }..addAll({ @@ -28,7 +28,9 @@ final Map _defaultMimeTypeMap = { /// The file extension for a given MIME type. /// /// If there are multiple extensions for [mimeType], return preferred extension -/// if defined, otherwise an extension chosen by the library. +/// if defined in [_defaultMimeTypeMap], otherwise an extension chosen by the +/// library. +/// /// If no extension is found, `null` is returned. String? extensionFromMime(String mimeType) => _defaultMimeTypeMap[mimeType.toLowerCase()];