enhance(backend): Improve behavior of correctFilename
This commit is contained in:
parent
db5046ed3a
commit
cca6e4a2de
|
@ -154,6 +154,7 @@
|
||||||
"stringz": "2.1.0",
|
"stringz": "2.1.0",
|
||||||
"summaly": "github:misskey-dev/summaly",
|
"summaly": "github:misskey-dev/summaly",
|
||||||
"systeminformation": "5.18.9",
|
"systeminformation": "5.18.9",
|
||||||
|
"text-extensions": "^2.4.0",
|
||||||
"tinycolor2": "1.6.0",
|
"tinycolor2": "1.6.0",
|
||||||
"tmp": "0.2.1",
|
"tmp": "0.2.1",
|
||||||
"tsc-alias": "1.8.7",
|
"tsc-alias": "1.8.7",
|
||||||
|
|
|
@ -3,17 +3,56 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// 与えられた拡張子とファイル名が一致しているかどうかを確認し、
|
import textExts from 'text-extensions';
|
||||||
// 一致していない場合は拡張子を付与して返す
|
|
||||||
|
/**
|
||||||
|
* Array.includes()よりSet.has()の方が高速
|
||||||
|
*/
|
||||||
|
|
||||||
|
const targetExtsToSkip = new Set([
|
||||||
|
'gz',
|
||||||
|
'tar',
|
||||||
|
'tgz',
|
||||||
|
'bz2',
|
||||||
|
'xz',
|
||||||
|
'zip',
|
||||||
|
'7z',
|
||||||
|
]);
|
||||||
|
|
||||||
|
const sourceExtsToSkip = new Set(textExts);
|
||||||
|
|
||||||
|
const extRegExp = /\.([0-9a-zA-Z]+$)/i;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 与えられた拡張子とファイル名が一致しているかどうかを確認し、
|
||||||
|
* 一致していない場合は拡張子を付与して返す
|
||||||
|
*
|
||||||
|
* extはfile-typeのextを想定
|
||||||
|
*/
|
||||||
export function correctFilename(filename: string, ext: string | null) {
|
export function correctFilename(filename: string, ext: string | null) {
|
||||||
const dotExt = ext ? ext.startsWith('.') ? ext : `.${ext}` : '.unknown';
|
const dotExt = ext ? ext.startsWith('.') ? ext : `.${ext}` : '.unknown';
|
||||||
if (filename.endsWith(dotExt)) {
|
|
||||||
|
const match = extRegExp.exec(filename);
|
||||||
|
if (!match || !match[1]) {
|
||||||
|
return `${filename}${dotExt}`;
|
||||||
|
}
|
||||||
|
const filenameExt = match[1].toLowerCase();
|
||||||
|
if (filenameExt === ext) {
|
||||||
return filename;
|
return filename;
|
||||||
}
|
}
|
||||||
if (ext === 'jpg' && filename.endsWith('.jpeg')) {
|
|
||||||
return filename;
|
if (
|
||||||
}
|
ext === 'jpg' && filenameExt === 'jpeg' ||
|
||||||
if (ext === 'tif' && filename.endsWith('.tiff')) {
|
ext === 'tif' && filenameExt === 'tiff' ||
|
||||||
|
|
||||||
|
// 圧縮形式っぽければ下手に拡張子を変えない
|
||||||
|
// https://github.com/misskey-dev/misskey/issues/11482
|
||||||
|
ext !== null && targetExtsToSkip.has(ext) ||
|
||||||
|
|
||||||
|
// テキストファイル?(ext === null)かつ拡張子がテキストファイルっぽい場合は
|
||||||
|
// 拡張子を変えない
|
||||||
|
ext === null && sourceExtsToSkip.has(filenameExt)
|
||||||
|
) {
|
||||||
return filename;
|
return filename;
|
||||||
}
|
}
|
||||||
return `${filename}${dotExt}`;
|
return `${filename}${dotExt}`;
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and other misskey contributors
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { correctFilename } from '@/misc/correct-filename.js';
|
||||||
|
|
||||||
|
describe(correctFilename, () => {
|
||||||
|
it('no ext to null', () => {
|
||||||
|
expect(correctFilename('test', null)).toBe('test.unknown');
|
||||||
|
});
|
||||||
|
it('no ext to jpg', () => {
|
||||||
|
expect(correctFilename('test', 'jpg')).toBe('test.jpg');
|
||||||
|
});
|
||||||
|
it('jpg to webp', () => {
|
||||||
|
expect(correctFilename('test.jpg', 'webp')).toBe('test.jpg.webp');
|
||||||
|
});
|
||||||
|
it('jpeg to jpg', () => {
|
||||||
|
expect(correctFilename('test.jpeg', 'jpg')).toBe('test.jpeg');
|
||||||
|
});
|
||||||
|
it('JPEG to jpg', () => {
|
||||||
|
expect(correctFilename('test.JPEG', 'jpg')).toBe('test.JPEG');
|
||||||
|
});
|
||||||
|
it('jpg to jpg', () => {
|
||||||
|
expect(correctFilename('test.jpg', 'jpg')).toBe('test.jpg');
|
||||||
|
});
|
||||||
|
it('tiff to tif', () => {
|
||||||
|
expect(correctFilename('test.tiff', 'tif')).toBe('test.tiff');
|
||||||
|
});
|
||||||
|
it('skip gz', () => {
|
||||||
|
expect(correctFilename('test.unitypackage', 'gz')).toBe('test.unitypackage');
|
||||||
|
});
|
||||||
|
it('skip text file', () => {
|
||||||
|
expect(correctFilename('test.txt', null)).toBe('test.txt');
|
||||||
|
});
|
||||||
|
});
|
|
@ -358,10 +358,13 @@ importers:
|
||||||
version: 2.1.0
|
version: 2.1.0
|
||||||
summaly:
|
summaly:
|
||||||
specifier: github:misskey-dev/summaly
|
specifier: github:misskey-dev/summaly
|
||||||
version: github.com/misskey-dev/summaly/089a0ad8e8c780e5c088b1c528aa95c5827cbdcc
|
version: github.com/misskey-dev/summaly/d2d8db49943ccb201c1b1b283e9d0a630519fac7
|
||||||
systeminformation:
|
systeminformation:
|
||||||
specifier: 5.18.9
|
specifier: 5.18.9
|
||||||
version: 5.18.9
|
version: 5.18.9
|
||||||
|
text-extensions:
|
||||||
|
specifier: ^2.4.0
|
||||||
|
version: 2.4.0
|
||||||
tinycolor2:
|
tinycolor2:
|
||||||
specifier: 1.6.0
|
specifier: 1.6.0
|
||||||
version: 1.6.0
|
version: 1.6.0
|
||||||
|
@ -997,7 +1000,7 @@ importers:
|
||||||
version: github.com/misskey-dev/storybook-addon-misskey-theme/cf583db098365b2ccc81a82f63ca9c93bc32b640(@storybook/blocks@7.0.27)(@storybook/components@7.1.0)(@storybook/core-events@7.0.27)(@storybook/manager-api@7.0.27)(@storybook/preview-api@7.0.27)(@storybook/theming@7.0.27)(@storybook/types@7.0.27)(react-dom@18.2.0)(react@18.2.0)
|
version: github.com/misskey-dev/storybook-addon-misskey-theme/cf583db098365b2ccc81a82f63ca9c93bc32b640(@storybook/blocks@7.0.27)(@storybook/components@7.1.0)(@storybook/core-events@7.0.27)(@storybook/manager-api@7.0.27)(@storybook/preview-api@7.0.27)(@storybook/theming@7.0.27)(@storybook/types@7.0.27)(react-dom@18.2.0)(react@18.2.0)
|
||||||
summaly:
|
summaly:
|
||||||
specifier: github:misskey-dev/summaly
|
specifier: github:misskey-dev/summaly
|
||||||
version: github.com/misskey-dev/summaly/089a0ad8e8c780e5c088b1c528aa95c5827cbdcc
|
version: github.com/misskey-dev/summaly/d2d8db49943ccb201c1b1b283e9d0a630519fac7
|
||||||
vite-plugin-turbosnap:
|
vite-plugin-turbosnap:
|
||||||
specifier: 1.0.2
|
specifier: 1.0.2
|
||||||
version: 1.0.2
|
version: 1.0.2
|
||||||
|
@ -20428,6 +20431,11 @@ packages:
|
||||||
resolution: {integrity: sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==}
|
resolution: {integrity: sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/text-extensions@2.4.0:
|
||||||
|
resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/text-table@0.2.0:
|
/text-table@0.2.0:
|
||||||
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
|
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
|
||||||
dev: true
|
dev: true
|
||||||
|
@ -22129,8 +22137,8 @@ packages:
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
github.com/misskey-dev/summaly/089a0ad8e8c780e5c088b1c528aa95c5827cbdcc:
|
github.com/misskey-dev/summaly/d2d8db49943ccb201c1b1b283e9d0a630519fac7:
|
||||||
resolution: {tarball: https://codeload.github.com/misskey-dev/summaly/tar.gz/089a0ad8e8c780e5c088b1c528aa95c5827cbdcc}
|
resolution: {tarball: https://codeload.github.com/misskey-dev/summaly/tar.gz/d2d8db49943ccb201c1b1b283e9d0a630519fac7}
|
||||||
name: summaly
|
name: summaly
|
||||||
version: 4.0.2
|
version: 4.0.2
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
Loading…
Reference in New Issue