2023-07-27 07:31:52 +02:00
|
|
|
/*
|
|
|
|
* SPDX-FileCopyrightText: syuilo and other misskey contributors
|
|
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
*/
|
|
|
|
|
2023-08-08 06:24:30 +02:00
|
|
|
/**
|
|
|
|
* Array.includes()よりSet.has()の方が高速
|
|
|
|
*/
|
|
|
|
const targetExtsToSkip = new Set([
|
|
|
|
'.gz',
|
|
|
|
'.tar',
|
|
|
|
'.tgz',
|
|
|
|
'.bz2',
|
|
|
|
'.xz',
|
|
|
|
'.zip',
|
|
|
|
'.7z',
|
|
|
|
]);
|
|
|
|
|
|
|
|
const extRegExp = /\.[0-9a-zA-Z]+$/i;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 与えられた拡張子とファイル名が一致しているかどうかを確認し、
|
|
|
|
* 一致していない場合は拡張子を付与して返す
|
|
|
|
*
|
|
|
|
* extはfile-typeのextを想定
|
|
|
|
*/
|
2023-03-04 08:51:07 +01:00
|
|
|
export function correctFilename(filename: string, ext: string | null) {
|
2023-08-08 06:24:30 +02:00
|
|
|
const dotExt = ext ? ext[0] === '.' ? ext : `.${ext}` : '.unknown';
|
|
|
|
|
|
|
|
const match = extRegExp.exec(filename);
|
|
|
|
if (!match || !match[0]) {
|
|
|
|
// filenameが拡張子を持っていない場合は拡張子をつける
|
|
|
|
return `${filename}${dotExt}`;
|
2023-03-20 05:00:21 +01:00
|
|
|
}
|
2023-08-08 06:24:30 +02:00
|
|
|
|
|
|
|
const filenameExt = match[0].toLowerCase();
|
|
|
|
if (
|
|
|
|
// 未知のファイル形式かつ拡張子がある場合は何もしない
|
|
|
|
ext === null ||
|
|
|
|
// 拡張子が一致している場合は何もしない
|
|
|
|
filenameExt === dotExt ||
|
|
|
|
|
|
|
|
// jpeg, tiffを同一視
|
|
|
|
dotExt === '.jpg' && filenameExt === '.jpeg' ||
|
|
|
|
dotExt === '.tif' && filenameExt === '.tiff' ||
|
2023-08-12 17:01:17 +02:00
|
|
|
// dllもexeもportable executableなので判定が正しく行われない
|
|
|
|
dotExt === '.exe' && filenameExt === '.dll' ||
|
2023-08-08 06:24:30 +02:00
|
|
|
|
|
|
|
// 圧縮形式っぽければ下手に拡張子を変えない
|
|
|
|
// https://github.com/misskey-dev/misskey/issues/11482
|
|
|
|
targetExtsToSkip.has(dotExt)
|
|
|
|
) {
|
2023-03-20 05:00:21 +01:00
|
|
|
return filename;
|
|
|
|
}
|
2023-08-08 06:24:30 +02:00
|
|
|
|
|
|
|
// 拡張子があるが一致していないなどの場合は拡張子を付け足す
|
2023-03-20 05:00:21 +01:00
|
|
|
return `${filename}${dotExt}`;
|
2023-03-04 08:51:07 +01:00
|
|
|
}
|