mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
3.8 KiB
170 lines
3.8 KiB
const imageExt = [ |
|
'jpeg', |
|
'gif', |
|
'png', |
|
'png', |
|
'svg', |
|
'bmp', |
|
'ico', |
|
'jpg', |
|
'webp', |
|
'avif', |
|
'heif', |
|
'heifs', |
|
'heic', |
|
'heic-sequence', |
|
] |
|
|
|
const videoExt = [ |
|
'webm', |
|
'mpg', |
|
'mp2', |
|
'mpeg', |
|
'ogg', |
|
'mp4', |
|
'm4v', |
|
'avi', |
|
'wmv', |
|
'mov', |
|
'qt', |
|
'flv', |
|
'mkv', |
|
'3gp', |
|
'3g2', |
|
'vob', |
|
'ts', |
|
] |
|
|
|
const wordExt = ['txt', 'doc', 'docx'] |
|
|
|
const excelExt = ['xls', 'xlsx', 'csv'] |
|
|
|
const presentationExt = ['ppt', 'pptx'] |
|
|
|
const zipExt = ['zip', 'rar'] |
|
|
|
const officeExt = [ |
|
...wordExt, |
|
...excelExt, |
|
...presentationExt, |
|
...zipExt, |
|
'css', |
|
'html', |
|
'php', |
|
'c', |
|
'cpp', |
|
'h', |
|
'hpp', |
|
'js', |
|
'pdf', |
|
'pages', |
|
'ai', |
|
'psd', |
|
'tiff', |
|
'dxf', |
|
'svg', |
|
'eps', |
|
'ps', |
|
'ttf', |
|
'xps', |
|
] |
|
|
|
const isAudio = (name: string, mimetype?: string) => { |
|
return name?.toLowerCase().endsWith('.mp3') || mimetype?.startsWith('audio/') |
|
} |
|
|
|
const isVideo = (name: string, mimetype?: string) => { |
|
return videoExt.some((e) => name?.toLowerCase().endsWith(`.${e}`)) || mimetype?.startsWith('video/') |
|
} |
|
|
|
const isImage = (name: string, mimetype?: string) => { |
|
return imageExt.some((e) => name?.toLowerCase().endsWith(`.${e}`)) || mimetype?.startsWith('image/') |
|
} |
|
|
|
const isPdf = (name: string, mimetype?: string) => { |
|
return name?.toLowerCase().endsWith('.pdf') || mimetype?.startsWith('application/pdf') |
|
} |
|
|
|
const isWord = (name: string, _mimetype?: string) => { |
|
return wordExt.some((e) => name?.toLowerCase().endsWith(`.${e}`)) |
|
} |
|
|
|
const isExcel = (name: string, _mimetype?: string) => { |
|
return excelExt.some((e) => name?.toLowerCase().endsWith(`.${e}`)) |
|
} |
|
|
|
const isPresentation = (name: string, _mimetype?: string) => { |
|
return presentationExt.some((e) => name?.toLowerCase().endsWith(`.${e}`)) |
|
} |
|
|
|
const isOffice = (name: string, _mimetype?: string) => { |
|
return officeExt.some((e) => name?.toLowerCase().endsWith(`.${e}`)) |
|
} |
|
|
|
const isZip = (name: string, _mimetype?: string) => { |
|
return zipExt.some((e) => name?.toLowerCase().endsWith(`.${e}`)) |
|
} |
|
|
|
export { isImage, imageExt, isVideo, isPdf, isOffice, isAudio, isZip, isWord, isExcel, isPresentation } |
|
// Ref : https://stackoverflow.com/a/12002275 |
|
|
|
// Tested in Mozilla Firefox browser, Chrome |
|
export function readFile(FileElement: HTMLInputElement, CallBackFunction: (content?: any) => void) { |
|
try { |
|
if (!FileElement.files || !FileElement.files.length) { |
|
return CallBackFunction() |
|
} |
|
|
|
const file = FileElement.files[0] |
|
|
|
if (file) { |
|
const reader = new FileReader() |
|
reader.readAsText(file, 'UTF-8') |
|
reader.onload = function (evt) { |
|
CallBackFunction(evt.target?.result) |
|
} |
|
reader.onerror = function () { |
|
CallBackFunction() |
|
} |
|
} |
|
} catch (Exception) { |
|
const fallBack = ieReadFile(FileElement.value) |
|
// eslint-disable-next-line eqeqeq |
|
if (fallBack != false) { |
|
CallBackFunction(fallBack) |
|
} |
|
} |
|
} |
|
|
|
/// Reading files with Internet Explorer |
|
function ieReadFile(filename: string) { |
|
try { |
|
const fso = new ActiveXObject('Scripting.FileSystemObject') |
|
const fh = fso.OpenTextFile(filename, 1) |
|
const contents = fh.ReadAll() |
|
fh.Close() |
|
return contents |
|
} catch (Exception) { |
|
return false |
|
} |
|
} |
|
|
|
export function extractImageSrcFromRawHtml(rawText: string) { |
|
// Parse the provided HTML string |
|
const parser = new DOMParser() |
|
const doc = parser.parseFromString(rawText, 'text/html') |
|
|
|
// Extract the img element |
|
const imgElement = doc.querySelector('img') |
|
|
|
// Check if the img element exists |
|
if (imgElement) { |
|
// Extract the src attribute |
|
return imgElement.getAttribute('src') |
|
} |
|
} |
|
|
|
export const getReadableFileSize = (sizeInBytes: number) => { |
|
const i = Math.min(Math.floor(Math.log(sizeInBytes) / Math.log(1024)), 4) |
|
return `${(sizeInBytes / 1024 ** i).toFixed(2) * 1} ${['B', 'kB', 'MB', 'GB', 'TB'][i]}` |
|
}
|
|
|