feat:脚本文件预览
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
/** 数据资源预览:扩展名分流与展示名。 */
|
||||
|
||||
export type DataResourcePreviewKind = "excel" | "text" | "table";
|
||||
|
||||
export const EXCEL_EXTENSIONS = [".xlsx", ".xls"] as const;
|
||||
export const TEXT_EXTENSIONS = [".txt", ".json"] as const;
|
||||
export const TABLE_EXTENSIONS = [".csv", ".tsv"] as const;
|
||||
|
||||
/** Excel 整文件拉取上限。 */
|
||||
export const EXCEL_PREVIEW_MAX_BYTES = 80 * 1024 * 1024;
|
||||
/** 文本预览拉取上限。 */
|
||||
export const TEXT_PREVIEW_MAX_BYTES = 5 * 1024 * 1024;
|
||||
|
||||
export type DataResourcePreviewTarget = {
|
||||
resourceId: string;
|
||||
resourceName: string;
|
||||
fileExtension: string | null;
|
||||
sizeBytes: number;
|
||||
kind: DataResourcePreviewKind;
|
||||
};
|
||||
|
||||
function lowerName(name: string | null | undefined): string {
|
||||
return (name ?? "").toLowerCase();
|
||||
}
|
||||
|
||||
function matchesExt(name: string, exts: readonly string[]): boolean {
|
||||
return exts.some((ext) => name.endsWith(ext));
|
||||
}
|
||||
|
||||
export function isExcelFileName(name: string | null | undefined): boolean {
|
||||
return matchesExt(lowerName(name), EXCEL_EXTENSIONS);
|
||||
}
|
||||
|
||||
export function isTextPreviewFileName(name: string | null | undefined): boolean {
|
||||
return matchesExt(lowerName(name), TEXT_EXTENSIONS);
|
||||
}
|
||||
|
||||
export function isTablePreviewFileName(name: string | null | undefined): boolean {
|
||||
return matchesExt(lowerName(name), TABLE_EXTENSIONS);
|
||||
}
|
||||
|
||||
export function previewKindFromFileName(
|
||||
name: string | null | undefined,
|
||||
): DataResourcePreviewKind | null {
|
||||
const lower = lowerName(name);
|
||||
if (matchesExt(lower, EXCEL_EXTENSIONS)) return "excel";
|
||||
if (matchesExt(lower, TEXT_EXTENSIONS)) return "text";
|
||||
if (matchesExt(lower, TABLE_EXTENSIONS)) return "table";
|
||||
return null;
|
||||
}
|
||||
|
||||
export function canPreviewDataResource(name: string | null | undefined): boolean {
|
||||
return previewKindFromFileName(name) !== null;
|
||||
}
|
||||
|
||||
export function resourceDisplayName(
|
||||
resourceName: string,
|
||||
fileExtension: string | null | undefined,
|
||||
): string {
|
||||
if (!fileExtension) return resourceName;
|
||||
const ext = fileExtension.startsWith(".")
|
||||
? fileExtension
|
||||
: `.${fileExtension}`;
|
||||
if (resourceName.toLowerCase().endsWith(ext.toLowerCase())) {
|
||||
return resourceName;
|
||||
}
|
||||
return `${resourceName}${ext}`;
|
||||
}
|
||||
|
||||
/** @deprecated use resourceDisplayName */
|
||||
export const excelDisplayName = resourceDisplayName;
|
||||
|
||||
export function monacoLanguageFromFileName(name: string): string {
|
||||
const lower = lowerName(name);
|
||||
if (lower.endsWith(".json")) return "json";
|
||||
return "plaintext";
|
||||
}
|
||||
Reference in New Issue
Block a user