Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • project/sophron
  • issue/sophron-3238893
  • issue/sophron-3259032
  • issue/sophron-3281777
  • issue/sophron-3280470
  • issue/sophron-3281767
  • issue/sophron-3272647
  • issue/sophron-3250607
  • issue/sophron-3250619
  • issue/sophron-3254796
  • issue/sophron-3258963
  • issue/sophron-3294784
  • issue/sophron-3294783
  • issue/sophron-3304771
  • issue/sophron-3341086
  • issue/sophron-3341480
  • issue/sophron-3401043
  • issue/sophron-3399335
  • issue/sophron-3399339
  • issue/sophron-3408117
  • issue/sophron-3447934
  • issue/sophron-3447974
  • issue/sophron-3447935
  • issue/sophron-3448849
  • issue/sophron-3450288
  • issue/sophron-3459896
  • issue/sophron-3482029
  • issue/sophron-3458918
  • issue/sophron-3487753
  • issue/sophron-3494318
30 results
Show changes
Commits on Source (5)
...@@ -51,6 +51,9 @@ include: ...@@ -51,6 +51,9 @@ include:
variables: variables:
_PHPUNIT_CONCURRENT: '0' _PHPUNIT_CONCURRENT: '0'
_PHPUNIT_EXTRA: '-c $CI_PROJECT_DIR/$_WEB_ROOT/core --testdox --colors=always' _PHPUNIT_EXTRA: '-c $CI_PROJECT_DIR/$_WEB_ROOT/core --testdox --colors=always'
BROWSERTEST_OUTPUT_VERBOSE: 'false'
SKIP_CSPELL: '1'
OPT_IN_TEST_PREVIOUS_MAJOR: '1'
OPT_IN_TEST_PREVIOUS_MINOR: '0' OPT_IN_TEST_PREVIOUS_MINOR: '0'
OPT_IN_TEST_NEXT_MINOR: '1' OPT_IN_TEST_NEXT_MINOR: '1'
OPT_IN_TEST_NEXT_MAJOR: '1' OPT_IN_TEST_NEXT_MAJOR: '1'
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
"description": "Provides an extensive MIME types management API", "description": "Provides an extensive MIME types management API",
"require": { "require": {
"drupal/core": "^10.2 || ^11", "drupal/core": "^10.2 || ^11",
"fileeye/mimemap": "^2.1.1" "fileeye/mimemap": "^2.2.1"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
......
logo.png

7.24 KiB

...@@ -4,8 +4,3 @@ parameters: ...@@ -4,8 +4,3 @@ parameters:
message: "#^Property Drupal\\\\sophron_guesser\\\\ProxyClass\\\\SophronMimeTypeGuesser\\:\\:\\$service \\(Drupal\\\\sophron_guesser\\\\SophronMimeTypeGuesser\\) in isset\\(\\) is not nullable\\.$#" message: "#^Property Drupal\\\\sophron_guesser\\\\ProxyClass\\\\SophronMimeTypeGuesser\\:\\:\\$service \\(Drupal\\\\sophron_guesser\\\\SophronMimeTypeGuesser\\) in isset\\(\\) is not nullable\\.$#"
count: 1 count: 1
path: sophron_guesser/src/ProxyClass/SophronMimeTypeGuesser.php path: sophron_guesser/src/ProxyClass/SophronMimeTypeGuesser.php
-
message: "#^Parameter \\#2 \\$message of method Drupal\\\\Core\\\\Form\\\\FormStateInterface\\:\\:setErrorByName\\(\\) expects string, Drupal\\\\Core\\\\StringTranslation\\\\TranslatableMarkup given\\.$#"
count: 3
path: src/Form/SettingsForm.php
...@@ -325,3 +325,4 @@ ...@@ -325,3 +325,4 @@
- [setExtensionDefaultType, [wav, audio/x-wav]] - [setExtensionDefaultType, [wav, audio/x-wav]]
- [setExtensionDefaultType, [odb, application/vnd.oasis.opendocument.database]] - [setExtensionDefaultType, [odb, application/vnd.oasis.opendocument.database]]
- [setExtensionDefaultType, [sds, application/vnd.stardivision.chart]] - [setExtensionDefaultType, [sds, application/vnd.stardivision.chart]]
- [setExtensionDefaultType, [sct, text/scriptlet]]
...@@ -31,18 +31,18 @@ class SophronMimeTypeGuesser implements MimeTypeGuesserInterface { ...@@ -31,18 +31,18 @@ class SophronMimeTypeGuesser implements MimeTypeGuesserInterface {
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function guessMimeType(string $path): string { public function guessMimeType(string $path): ?string {
$extension = ''; $extension = '';
$file_parts = explode('.', $this->fileSystem->basename($path)); $file_parts = explode('.', $this->fileSystem->basename($path));
// Remove the first part: a full filename should not match an extension. // Remove the first part: a full filename should not match an extension,
array_shift($file_parts); // then iterate over the file parts, trying to find a match.
// For 'my.awesome.image.jpeg', we try: 'awesome.image.jpeg', then
// Iterate over the file parts, trying to find a match. // 'image.jpeg', then 'jpeg'.
// For 'my.awesome.image.jpeg', we try: 'jpeg', then 'image.jpeg', then // We explicitly check for NULL because that indicates that the array is
// 'awesome.image.jpeg'. // empty.
while ($additional_part = array_pop($file_parts)) { while (array_shift($file_parts) !== NULL) {
$extension = strtolower($additional_part . ($extension ? '.' . $extension : '')); $extension = strtolower(implode('.', $file_parts));
$mime_map_extension = $this->mimeMapManager->getExtension($extension); $mime_map_extension = $this->mimeMapManager->getExtension($extension);
try { try {
return $mime_map_extension->getDefaultType(); return $mime_map_extension->getDefaultType();
...@@ -52,7 +52,7 @@ class SophronMimeTypeGuesser implements MimeTypeGuesserInterface { ...@@ -52,7 +52,7 @@ class SophronMimeTypeGuesser implements MimeTypeGuesserInterface {
} }
} }
return 'application/octet-stream'; return NULL;
} }
/** /**
......
...@@ -168,7 +168,16 @@ class SettingsForm extends ConfigFormBase { ...@@ -168,7 +168,16 @@ class SettingsForm extends ConfigFormBase {
} }
// Mapping gaps. // Mapping gaps.
if ($gaps = $this->determineMapGaps()) { // @todo BC starts. Resolve in sophron:3.0.0.
if (method_exists($this->mimeMapManager, 'determineMapGaps')) {
$gaps = $this->mimeMapManager->determineMapGaps($this->mimeMapManager->getMapClass());
}
else {
// @phpstan-ignore method.deprecated
$gaps = $this->determineMapGaps();
}
// @todo BC ends.
if ($gaps !== []) {
$form['mapping']['gaps'] = [ $form['mapping']['gaps'] = [
'#type' => 'details', '#type' => 'details',
'#collapsible' => TRUE, '#collapsible' => TRUE,
...@@ -317,8 +326,15 @@ class SettingsForm extends ConfigFormBase { ...@@ -317,8 +326,15 @@ class SettingsForm extends ConfigFormBase {
* @return array * @return array
* An array of simple arrays, each having a file extension, its Drupal MIME * An array of simple arrays, each having a file extension, its Drupal MIME
* type guess, and a gap information. * type guess, and a gap information.
*
* @deprecated in sophron:2.2.0 and is removed from sophron:3.0.0. Use
* MimeMapManager::determineMapGaps() instead.
*
* @see https://www.drupal.org/project/sophron/issues/3494318
*/ */
protected function determineMapGaps(): array { protected function determineMapGaps(): array {
@trigger_error(__METHOD__ . '() is deprecated in sophron:2.2.0 and is removed from sophron:3.0.0. Use MimeMapManager::determineMapGaps() instead. See https://www.drupal.org/project/sophron/issues/3494318', E_USER_DEPRECATED);
$core_extended_guesser = new CoreExtensionMimeTypeGuesserExtended(); $core_extended_guesser = new CoreExtensionMimeTypeGuesserExtended();
$extensions = $core_extended_guesser->listExtensions(); $extensions = $core_extended_guesser->listExtensions();
......
...@@ -3259,7 +3259,6 @@ class DrupalMap extends AbstractMap { ...@@ -3259,7 +3259,6 @@ class DrupalMap extends AbstractMap {
5 => 'efi', 5 => 'efi',
6 => 'ocx', 6 => 'ocx',
7 => 'sys', 7 => 'sys',
8 => 'lib',
), ),
), ),
'application/vnd.mif' => 'application/vnd.mif' =>
...@@ -4193,7 +4192,7 @@ class DrupalMap extends AbstractMap { ...@@ -4193,7 +4192,7 @@ class DrupalMap extends AbstractMap {
array ( array (
'desc' => 'desc' =>
array ( array (
0 => 'OpenOffice.org extension', 0 => 'LibreOffice extension',
), ),
'e' => 'e' =>
array ( array (
...@@ -4652,7 +4651,10 @@ class DrupalMap extends AbstractMap { ...@@ -4652,7 +4651,10 @@ class DrupalMap extends AbstractMap {
), ),
'e' => 'e' =>
array ( array (
0 => 'sqsh', 0 => 'sfs',
1 => 'sqfs',
2 => 'sqsh',
3 => 'squashfs',
), ),
), ),
'application/vnd.stardivision.calc' => 'application/vnd.stardivision.calc' =>
...@@ -4773,7 +4775,7 @@ class DrupalMap extends AbstractMap { ...@@ -4773,7 +4775,7 @@ class DrupalMap extends AbstractMap {
array ( array (
'desc' => 'desc' =>
array ( array (
0 => 'LibreOffice Calc spreadsheet', 0 => 'OpenOffice.org 1.0 Calc spreadsheet',
), ),
'e' => 'e' =>
array ( array (
...@@ -4784,7 +4786,7 @@ class DrupalMap extends AbstractMap { ...@@ -4784,7 +4786,7 @@ class DrupalMap extends AbstractMap {
array ( array (
'desc' => 'desc' =>
array ( array (
0 => 'LibreOffice Calc template', 0 => 'OpenOffice.org 1.0 Calc template',
), ),
'e' => 'e' =>
array ( array (
...@@ -4795,7 +4797,7 @@ class DrupalMap extends AbstractMap { ...@@ -4795,7 +4797,7 @@ class DrupalMap extends AbstractMap {
array ( array (
'desc' => 'desc' =>
array ( array (
0 => 'LibreOffice Draw drawing', 0 => 'OpenOffice.org 1.0 Draw drawing',
), ),
'e' => 'e' =>
array ( array (
...@@ -4806,7 +4808,7 @@ class DrupalMap extends AbstractMap { ...@@ -4806,7 +4808,7 @@ class DrupalMap extends AbstractMap {
array ( array (
'desc' => 'desc' =>
array ( array (
0 => 'LibreOffice Draw template', 0 => 'OpenOffice.org 1.0 Draw template',
), ),
'e' => 'e' =>
array ( array (
...@@ -4817,7 +4819,7 @@ class DrupalMap extends AbstractMap { ...@@ -4817,7 +4819,7 @@ class DrupalMap extends AbstractMap {
array ( array (
'desc' => 'desc' =>
array ( array (
0 => 'LibreOffice Impress presentation', 0 => 'OpenOffice.org 1.0 Impress presentation',
), ),
'e' => 'e' =>
array ( array (
...@@ -4828,7 +4830,7 @@ class DrupalMap extends AbstractMap { ...@@ -4828,7 +4830,7 @@ class DrupalMap extends AbstractMap {
array ( array (
'desc' => 'desc' =>
array ( array (
0 => 'LibreOffice Impress template', 0 => 'OpenOffice.org 1.0 Impress template',
), ),
'e' => 'e' =>
array ( array (
...@@ -4839,7 +4841,7 @@ class DrupalMap extends AbstractMap { ...@@ -4839,7 +4841,7 @@ class DrupalMap extends AbstractMap {
array ( array (
'desc' => 'desc' =>
array ( array (
0 => 'LibreOffice Math formula', 0 => 'OpenOffice.org 1.0 Math formula',
), ),
'e' => 'e' =>
array ( array (
...@@ -4850,7 +4852,7 @@ class DrupalMap extends AbstractMap { ...@@ -4850,7 +4852,7 @@ class DrupalMap extends AbstractMap {
array ( array (
'desc' => 'desc' =>
array ( array (
0 => 'LibreOffice Writer document', 0 => 'OpenOffice.org 1.0 Writer document',
), ),
'e' => 'e' =>
array ( array (
...@@ -4861,7 +4863,7 @@ class DrupalMap extends AbstractMap { ...@@ -4861,7 +4863,7 @@ class DrupalMap extends AbstractMap {
array ( array (
'desc' => 'desc' =>
array ( array (
0 => 'LibreOffice Writer global document', 0 => 'OpenOffice.org 1.0 Writer global document',
), ),
'e' => 'e' =>
array ( array (
...@@ -4872,7 +4874,7 @@ class DrupalMap extends AbstractMap { ...@@ -4872,7 +4874,7 @@ class DrupalMap extends AbstractMap {
array ( array (
'desc' => 'desc' =>
array ( array (
0 => 'LibreOffice Writer template', 0 => 'OpenOffice.org 1.0 Writer template',
), ),
'e' => 'e' =>
array ( array (
...@@ -5424,6 +5426,7 @@ class DrupalMap extends AbstractMap { ...@@ -5424,6 +5426,7 @@ class DrupalMap extends AbstractMap {
array ( array (
0 => 'a', 0 => 'a',
1 => 'ar', 1 => 'ar',
2 => 'lib',
), ),
), ),
'application/x-arj' => 'application/x-arj' =>
...@@ -7877,6 +7880,19 @@ class DrupalMap extends AbstractMap { ...@@ -7877,6 +7880,19 @@ class DrupalMap extends AbstractMap {
0 => 'pce', 0 => 'pce',
), ),
), ),
'application/x-pcapng' =>
array (
'desc' =>
array (
0 => 'PCAPNG packet capture',
1 => 'PCAPNG: PCAP Next Generation',
),
'e' =>
array (
0 => 'pcapng',
1 => 'ntar',
),
),
'application/x-perl' => 'application/x-perl' =>
array ( array (
'a' => 'a' =>
...@@ -11315,6 +11331,14 @@ class DrupalMap extends AbstractMap { ...@@ -11315,6 +11331,14 @@ class DrupalMap extends AbstractMap {
), ),
'image/vnd.fpx' => 'image/vnd.fpx' =>
array ( array (
'a' =>
array (
0 => 'image/x-fpx',
),
'desc' =>
array (
0 => 'FlashPix image',
),
'e' => 'e' =>
array ( array (
0 => 'fpx', 0 => 'fpx',
...@@ -11759,6 +11783,19 @@ class DrupalMap extends AbstractMap { ...@@ -11759,6 +11783,19 @@ class DrupalMap extends AbstractMap {
2 => 'jpc', 2 => 'jpc',
), ),
), ),
'image/x-kiss-cel' =>
array (
'desc' =>
array (
0 => 'KiSS cel',
1 => 'KiSS: Kisekae Set System',
),
'e' =>
array (
0 => 'cel',
1 => 'kcf',
),
),
'image/x-kodak-dcr' => 'image/x-kodak-dcr' =>
array ( array (
'desc' => 'desc' =>
...@@ -11936,6 +11973,17 @@ class DrupalMap extends AbstractMap { ...@@ -11936,6 +11973,17 @@ class DrupalMap extends AbstractMap {
0 => 'pef', 0 => 'pef',
), ),
), ),
'image/x-pfm' =>
array (
'desc' =>
array (
0 => 'Portable FloatMap',
),
'e' =>
array (
0 => 'pfm',
),
),
'image/x-photo-cd' => 'image/x-photo-cd' =>
array ( array (
'desc' => 'desc' =>
...@@ -12011,6 +12059,17 @@ class DrupalMap extends AbstractMap { ...@@ -12011,6 +12059,17 @@ class DrupalMap extends AbstractMap {
0 => 'ppm', 0 => 'ppm',
), ),
), ),
'image/x-pxr' =>
array (
'desc' =>
array (
0 => 'Pixar raster',
),
'e' =>
array (
0 => 'pxr',
),
),
'image/x-quicktime' => 'image/x-quicktime' =>
array ( array (
'desc' => 'desc' =>
...@@ -12034,6 +12093,18 @@ class DrupalMap extends AbstractMap { ...@@ -12034,6 +12093,18 @@ class DrupalMap extends AbstractMap {
0 => 'rgb', 0 => 'rgb',
), ),
), ),
'image/x-sct' =>
array (
'desc' =>
array (
0 => 'Scitex CT',
1 => 'CT: Continuous Tone',
),
'e' =>
array (
0 => 'sct',
),
),
'image/x-sgi' => 'image/x-sgi' =>
array ( array (
'desc' => 'desc' =>
...@@ -12453,7 +12524,8 @@ class DrupalMap extends AbstractMap { ...@@ -12453,7 +12524,8 @@ class DrupalMap extends AbstractMap {
0 => 'ics', 0 => 'ics',
1 => 'ifb', 1 => 'ifb',
2 => 'vcs', 2 => 'vcs',
3 => 'icz', 3 => 'icalendar',
4 => 'icz',
), ),
), ),
'text/css' => 'text/css' =>
...@@ -12986,6 +13058,10 @@ class DrupalMap extends AbstractMap { ...@@ -12986,6 +13058,10 @@ class DrupalMap extends AbstractMap {
), ),
'text/x-asm' => 'text/x-asm' =>
array ( array (
'desc' =>
array (
0 => 'Assembly code',
),
'e' => 'e' =>
array ( array (
0 => 's', 0 => 's',
...@@ -13739,6 +13815,17 @@ class DrupalMap extends AbstractMap { ...@@ -13739,6 +13815,17 @@ class DrupalMap extends AbstractMap {
1 => 'nimble', 1 => 'nimble',
), ),
), ),
'text/x-nix' =>
array (
'desc' =>
array (
0 => 'Nix source code',
),
'e' =>
array (
0 => 'nix',
),
),
'text/x-objc++src' => 'text/x-objc++src' =>
array ( array (
'desc' => 'desc' =>
...@@ -16387,6 +16474,13 @@ class DrupalMap extends AbstractMap { ...@@ -16387,6 +16474,13 @@ class DrupalMap extends AbstractMap {
0 => 'chemical/x-cxf', 0 => 'chemical/x-cxf',
), ),
), ),
'cel' =>
array (
't' =>
array (
0 => 'image/x-kiss-cel',
),
),
'cer' => 'cer' =>
array ( array (
't' => 't' =>
...@@ -19250,6 +19344,13 @@ class DrupalMap extends AbstractMap { ...@@ -19250,6 +19344,13 @@ class DrupalMap extends AbstractMap {
0 => 'application/x-ica', 0 => 'application/x-ica',
), ),
), ),
'icalendar' =>
array (
't' =>
array (
0 => 'text/calendar',
),
),
'icb' => 'icb' =>
array ( array (
't' => 't' =>
...@@ -19936,6 +20037,13 @@ class DrupalMap extends AbstractMap { ...@@ -19936,6 +20037,13 @@ class DrupalMap extends AbstractMap {
1 => 'application/x-karbon', 1 => 'application/x-karbon',
), ),
), ),
'kcf' =>
array (
't' =>
array (
0 => 'image/x-kiss-cel',
),
),
'kdc' => 'kdc' =>
array ( array (
't' => 't' =>
...@@ -20265,7 +20373,7 @@ class DrupalMap extends AbstractMap { ...@@ -20265,7 +20373,7 @@ class DrupalMap extends AbstractMap {
array ( array (
't' => 't' =>
array ( array (
0 => 'application/vnd.microsoft.portable-executable', 0 => 'application/x-archive',
), ),
), ),
'link66' => 'link66' =>
...@@ -21793,6 +21901,13 @@ class DrupalMap extends AbstractMap { ...@@ -21793,6 +21901,13 @@ class DrupalMap extends AbstractMap {
0 => 'application/vnd.nitf', 0 => 'application/vnd.nitf',
), ),
), ),
'nix' =>
array (
't' =>
array (
0 => 'text/x-nix',
),
),
'nlu' => 'nlu' =>
array ( array (
't' => 't' =>
...@@ -21871,6 +21986,13 @@ class DrupalMap extends AbstractMap { ...@@ -21871,6 +21986,13 @@ class DrupalMap extends AbstractMap {
0 => 'video/x-nsv', 0 => 'video/x-nsv',
), ),
), ),
'ntar' =>
array (
't' =>
array (
0 => 'application/x-pcapng',
),
),
'ntf' => 'ntf' =>
array ( array (
't' => 't' =>
...@@ -22510,6 +22632,13 @@ class DrupalMap extends AbstractMap { ...@@ -22510,6 +22632,13 @@ class DrupalMap extends AbstractMap {
1 => 'application/vnd.tcpdump.pcap', 1 => 'application/vnd.tcpdump.pcap',
), ),
), ),
'pcapng' =>
array (
't' =>
array (
0 => 'application/x-pcapng',
),
),
'pcd' => 'pcd' =>
array ( array (
't' => 't' =>
...@@ -22682,6 +22811,7 @@ class DrupalMap extends AbstractMap { ...@@ -22682,6 +22811,7 @@ class DrupalMap extends AbstractMap {
't' => 't' =>
array ( array (
0 => 'application/x-font-type1', 0 => 'application/x-font-type1',
1 => 'image/x-pfm',
), ),
), ),
'pfr' => 'pfr' =>
...@@ -23252,6 +23382,13 @@ class DrupalMap extends AbstractMap { ...@@ -23252,6 +23382,13 @@ class DrupalMap extends AbstractMap {
0 => 'text/x-cython', 0 => 'text/x-cython',
), ),
), ),
'pxr' =>
array (
't' =>
array (
0 => 'image/x-pxr',
),
),
'py' => 'py' =>
array ( array (
't' => 't' =>
...@@ -24127,6 +24264,7 @@ class DrupalMap extends AbstractMap { ...@@ -24127,6 +24264,7 @@ class DrupalMap extends AbstractMap {
't' => 't' =>
array ( array (
0 => 'text/scriptlet', 0 => 'text/scriptlet',
1 => 'image/x-sct',
), ),
), ),
'scurl' => 'scurl' =>
...@@ -24309,6 +24447,7 @@ class DrupalMap extends AbstractMap { ...@@ -24309,6 +24447,7 @@ class DrupalMap extends AbstractMap {
't' => 't' =>
array ( array (
0 => 'application/vnd.spotfire.sfs', 0 => 'application/vnd.spotfire.sfs',
1 => 'application/vnd.squashfs',
), ),
), ),
'sfv' => 'sfv' =>
...@@ -24795,6 +24934,13 @@ class DrupalMap extends AbstractMap { ...@@ -24795,6 +24934,13 @@ class DrupalMap extends AbstractMap {
3 => 'audio/x-speex', 3 => 'audio/x-speex',
), ),
), ),
'sqfs' =>
array (
't' =>
array (
0 => 'application/vnd.squashfs',
),
),
'sql' => 'sql' =>
array ( array (
't' => 't' =>
...@@ -24824,6 +24970,13 @@ class DrupalMap extends AbstractMap { ...@@ -24824,6 +24970,13 @@ class DrupalMap extends AbstractMap {
0 => 'application/vnd.squashfs', 0 => 'application/vnd.squashfs',
), ),
), ),
'squashfs' =>
array (
't' =>
array (
0 => 'application/vnd.squashfs',
),
),
'sr2' => 'sr2' =>
array ( array (
't' => 't' =>
...@@ -29691,6 +29844,13 @@ class DrupalMap extends AbstractMap { ...@@ -29691,6 +29844,13 @@ class DrupalMap extends AbstractMap {
0 => 'application/fits', 0 => 'application/fits',
), ),
), ),
'image/x-fpx' =>
array (
't' =>
array (
0 => 'image/vnd.fpx',
),
),
'image/x-icb' => 'image/x-icb' =>
array ( array (
't' => 't' =>
......
...@@ -15,6 +15,7 @@ use FileEye\MimeMap\Extension; ...@@ -15,6 +15,7 @@ use FileEye\MimeMap\Extension;
use FileEye\MimeMap\Map\AbstractMap; use FileEye\MimeMap\Map\AbstractMap;
use FileEye\MimeMap\Map\DefaultMap; use FileEye\MimeMap\Map\DefaultMap;
use FileEye\MimeMap\MapHandler; use FileEye\MimeMap\MapHandler;
use FileEye\MimeMap\MappingException;
use FileEye\MimeMap\Type; use FileEye\MimeMap\Type;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
...@@ -55,8 +56,8 @@ class MimeMapManager implements MimeMapManagerInterface { ...@@ -55,8 +56,8 @@ class MimeMapManager implements MimeMapManagerInterface {
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function isMapClassValid(string $map_class): bool { public function isMapClassValid(string $mapClass): bool {
if (class_exists($map_class) && in_array(AbstractMap::class, class_parents($map_class))) { if (class_exists($mapClass) && in_array(AbstractMap::class, class_parents($mapClass))) {
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
...@@ -77,8 +78,8 @@ class MimeMapManager implements MimeMapManagerInterface { ...@@ -77,8 +78,8 @@ class MimeMapManager implements MimeMapManagerInterface {
break; break;
case static::CUSTOM_MAP: case static::CUSTOM_MAP:
$map_class = $this->sophronSettings->get('map_class'); $mapClass = $this->sophronSettings->get('map_class');
$this->setMapClass($this->isMapClassValid($map_class) ? $map_class : DrupalMap::class); $this->setMapClass($this->isMapClassValid($mapClass) ? $mapClass : DrupalMap::class);
break; break;
} }
...@@ -89,12 +90,12 @@ class MimeMapManager implements MimeMapManagerInterface { ...@@ -89,12 +90,12 @@ class MimeMapManager implements MimeMapManagerInterface {
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function setMapClass(string $map_class): MimeMapManagerInterface { public function setMapClass(string $mapClass): MimeMapManagerInterface {
$this->currentMapClass = $map_class; $this->currentMapClass = $mapClass;
if (!isset($this->initializedMapClasses[$map_class])) { if (!isset($this->initializedMapClasses[$mapClass])) {
$event = new MapEvent($map_class); $event = new MapEvent($mapClass);
$this->eventDispatcher->dispatch($event, MapEvent::INIT); $this->eventDispatcher->dispatch($event, MapEvent::INIT);
$this->initializedMapClasses[$map_class] = $event->getErrors(); $this->initializedMapClasses[$mapClass] = $event->getErrors();
} }
return $this; return $this;
} }
...@@ -102,9 +103,9 @@ class MimeMapManager implements MimeMapManagerInterface { ...@@ -102,9 +103,9 @@ class MimeMapManager implements MimeMapManagerInterface {
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function getMappingErrors(string $map_class): array { public function getMappingErrors(string $mapClass): array {
$this->setMapClass($map_class); $this->setMapClass($mapClass);
return $this->initializedMapClasses[$map_class] ?? []; return $this->initializedMapClasses[$mapClass] ?? [];
} }
/** /**
...@@ -149,4 +150,54 @@ class MimeMapManager implements MimeMapManagerInterface { ...@@ -149,4 +150,54 @@ class MimeMapManager implements MimeMapManagerInterface {
]; ];
} }
/**
* Returns an array of gaps of a map vs Drupal's core mapping.
*
* @param class-string<\FileEye\MimeMap\Map\MimeMapInterface> $mapClass
* A FQCN.
*
* @return array
* An array of simple arrays, each having a file extension, its Drupal MIME
* type guess, and a gap information.
*
* @todo add to interface in sophron:3.0.0
*/
public function determineMapGaps(string $mapClass): array {
$currentMapClass = $this->getMapClass();
$this->setMapClass($mapClass);
$core_extended_guesser = new CoreExtensionMimeTypeGuesserExtended();
$extensions = $core_extended_guesser->listExtensions();
sort($extensions);
$rows = [];
foreach ($extensions as $ext) {
$drupal_mime_type = $core_extended_guesser->guessMimeType('a.' . (string) $ext);
$extension = $this->getExtension((string) $ext);
try {
$mimemap_mime_type = $extension->getDefaultType();
}
catch (MappingException $e) {
$mimemap_mime_type = '';
}
$gap = '';
if ($mimemap_mime_type === '') {
$gap = $this->t('No MIME type mapped to this file extension.');
}
elseif (mb_strtolower($drupal_mime_type) != mb_strtolower($mimemap_mime_type)) {
$gap = $this->t("File extension mapped to '@type' instead.", ['@type' => $mimemap_mime_type]);
}
if ($gap !== '') {
$rows[] = [(string) $ext, $drupal_mime_type, $gap];
}
}
$this->setMapClass($currentMapClass);
return $rows;
}
} }
...@@ -130,4 +130,20 @@ interface MimeMapManagerInterface { ...@@ -130,4 +130,20 @@ interface MimeMapManagerInterface {
*/ */
public function requirements(string $phase): array; public function requirements(string $phase): array;
// phpcs:disable
/**
* Returns an array of gaps of a map vs Drupal's core mapping.
*
* @param class-string<\FileEye\MimeMap\Map\MimeMapInterface> $mapClass
* A FQCN.
*
* @return array
* An array of simple arrays, each having a file extension, its Drupal MIME
* type guess, and a gap information.
*
* @todo add to interface in sophron:3.0.0
*/
// public function determineMapGaps(string $mapClass): array;
// phpcs:enable
} }
...@@ -4,8 +4,8 @@ declare(strict_types=1); ...@@ -4,8 +4,8 @@ declare(strict_types=1);
namespace Drupal\Tests\sophron\Functional; namespace Drupal\Tests\sophron\Functional;
use Drupal\sophron\MimeMapManagerInterface;
use Drupal\Tests\BrowserTestBase; use Drupal\Tests\BrowserTestBase;
use Drupal\sophron\MimeMapManagerInterface;
use FileEye\MimeMap\MappingException; use FileEye\MimeMap\MappingException;
use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\Attributes\Group;
......
...@@ -127,4 +127,11 @@ class SophronApiTest extends KernelTestBase { ...@@ -127,4 +127,11 @@ class SophronApiTest extends KernelTestBase {
$this->assertCount(4, $manager->getMappingErrors(DefaultMap::class)); $this->assertCount(4, $manager->getMappingErrors(DefaultMap::class));
} }
/**
* Tests no mapping errors for DrupalMap vs core.
*/
public function testZeroMappingErrorsForDrupalMap(): void {
$this->assertSame([], \Drupal::service(MimeMapManagerInterface::class)->determineMapGaps(DrupalMap::class));
}
} }
...@@ -40,7 +40,7 @@ class SophronGuesserTest extends KernelTestBase { ...@@ -40,7 +40,7 @@ class SophronGuesserTest extends KernelTestBase {
*/ */
public function testGuesserNotInstalled(): void { public function testGuesserNotInstalled(): void {
$guesser = \Drupal::service('file.mime_type.guesser.extension'); $guesser = \Drupal::service('file.mime_type.guesser.extension');
$this->assertEquals('application/octet-stream', $guesser->guessMimeType('fake.jp2')); $this->assertNull($guesser->guessMimeType('fake.jp2'));
} }
/** /**
...@@ -61,13 +61,13 @@ class SophronGuesserTest extends KernelTestBase { ...@@ -61,13 +61,13 @@ class SophronGuesserTest extends KernelTestBase {
*/ */
public function testGuesserInstallUninstall(): void { public function testGuesserInstallUninstall(): void {
$guesser = \Drupal::service('file.mime_type.guesser.extension'); $guesser = \Drupal::service('file.mime_type.guesser.extension');
$this->assertEquals('application/octet-stream', $guesser->guessMimeType('fake.jp2')); $this->assertNull($guesser->guessMimeType('fake.jp2'));
\Drupal::service('module_installer')->install(['sophron_guesser']); \Drupal::service('module_installer')->install(['sophron_guesser']);
$guesser = \Drupal::service('file.mime_type.guesser.extension'); $guesser = \Drupal::service('file.mime_type.guesser.extension');
$this->assertEquals('image/jp2', $guesser->guessMimeType('fake.jp2')); $this->assertEquals('image/jp2', $guesser->guessMimeType('fake.jp2'));
\Drupal::service('module_installer')->uninstall(['sophron_guesser']); \Drupal::service('module_installer')->uninstall(['sophron_guesser']);
$guesser = \Drupal::service('file.mime_type.guesser.extension'); $guesser = \Drupal::service('file.mime_type.guesser.extension');
$this->assertEquals('application/octet-stream', $guesser->guessMimeType('fake.jp2')); $this->assertNull($guesser->guessMimeType('fake.jp2'));
} }
/** /**
...@@ -77,6 +77,8 @@ class SophronGuesserTest extends KernelTestBase { ...@@ -77,6 +77,8 @@ class SophronGuesserTest extends KernelTestBase {
* \Drupal\KernelTests\Core\File\MimeTypeTest::testFileMimeTypeDetection. * \Drupal\KernelTests\Core\File\MimeTypeTest::testFileMimeTypeDetection.
*/ */
public function testFileMimeTypeDetection(): void { public function testFileMimeTypeDetection(): void {
\Drupal::service('module_installer')->install(['sophron_guesser']);
$prefixes = ['public://', 'private://', 'temporary://', 'dummy-remote://']; $prefixes = ['public://', 'private://', 'temporary://', 'dummy-remote://'];
$test_case = [ $test_case = [
...@@ -87,9 +89,15 @@ class SophronGuesserTest extends KernelTestBase { ...@@ -87,9 +89,15 @@ class SophronGuesserTest extends KernelTestBase {
'test.jar.jpg' => 'image/jpeg', 'test.jar.jpg' => 'image/jpeg',
'test.jpg.jar' => 'application/java-archive', 'test.jpg.jar' => 'application/java-archive',
'test.pcf.Z' => 'application/x-font', 'test.pcf.Z' => 'application/x-font',
'pcf.z' => 'application/octet-stream', 'pcf.z' => 'application/x-compress',
'jar' => 'application/octet-stream', 'jar' => 'application/octet-stream',
'some.junk' => 'application/octet-stream', 'some.junk' => 'application/octet-stream',
'foo.file_test_1' => 'application/octet-stream',
'foo.file_test_2' => 'application/octet-stream',
'foo.doc' => 'application/msword',
'test.ogg' => 'audio/ogg',
'foobar.0.zip' => 'application/zip',
'foobar..zip' => 'application/zip',
]; ];
$guesser = $this->container->get('file.mime_type.guesser'); $guesser = $this->container->get('file.mime_type.guesser');
......