InfoRadar / client /src /ts /utils /pathUtils.ts
dqy08's picture
Initial release v0.1: InfoRadar public release
e5d8d3a
/**
* 路径规范化工具函数
*/
/**
* 规范化完整路径(用于demo管理器的路径导航)
* - 确保以 / 开头
* - 去除多余的连续斜杠
* - 去除尾部斜杠(除非是根路径 /)
*
* @param path 原始路径
* @returns 规范化后的路径,如果输入无效则返回 null
*
* @example
* normalizeFullPath('/folder1//folder2/') => '/folder1/folder2'
* normalizeFullPath('folder1/folder2') => '/folder1/folder2'
* normalizeFullPath('/') => '/'
*/
export const normalizeFullPath = (path?: string | null): string | null => {
if (!path) {
return null;
}
const trimmed = path.trim();
if (!trimmed) {
return null;
}
const withLeadingSlash = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
const normalized = withLeadingSlash.replace(/\/{2,}/g, '/');
return normalized.length > 1 && normalized.endsWith('/') ? normalized.slice(0, -1) : normalized;
};
/**
* 规范化demo文件路径(用于文件系统访问)
* - 去除前导 /
* - 确保以 .json 结尾
*
* @param path 原始路径
* @returns 规范化后的相对路径
*
* @example
* normalizeDemoPath('/demo1.json') => 'demo1.json'
* normalizeDemoPath('/folder/demo1') => 'folder/demo1.json'
* normalizeDemoPath('demo1') => 'demo1.json'
*/
export const normalizeDemoPath = (path: string): string => {
let normalized = path.trim();
// 去除前导 /
if (normalized.startsWith('/')) {
normalized = normalized.substring(1);
}
// 确保以 .json 结尾
if (!normalized.endsWith('.json')) {
normalized += '.json';
}
return normalized;
};
/**
* 从路径提取demo名称(文件名,不含扩展名和路径)
*
* @param path demo路径
* @returns demo名称
*
* @example
* getDemoName('/folder/demo1.json') => 'demo1'
* getDemoName('demo1.json') => 'demo1'
*/
export const getDemoName = (path: string): string => {
const normalized = normalizeDemoPath(path);
// 去除 .json 后缀,提取文件名
const fileName = normalized.replace(/\.json$/, '');
// 如果包含路径分隔符,取最后一部分
const parts = fileName.split('/');
return parts[parts.length - 1];
};