Files
nexus-terminal/packages/frontend/src/stores/session/utils.ts
T
2025-05-09 17:49:37 +08:00

80 lines
3.1 KiB
TypeScript

// packages/frontend/src/stores/session/utils.ts
import * as iconv from '@vscode/iconv-lite-umd';
import { Buffer } from 'buffer/';
/**
* 生成唯一的会话 ID。
* @returns {string} 新的会话 ID。
*/
export function generateSessionId(): string {
return Date.now().toString(36) + Math.random().toString(36).substring(2);
}
/**
* 根据文件名获取 Monaco Editor 对应的语言标识符。
* @param {string} filename - 文件名。
* @returns {string} 语言标识符,默认为 'plaintext'。
*/
export const getLanguageFromFilename = (filename: string): string => {
const extension = filename.split('.').pop()?.toLowerCase();
switch (extension) {
case 'js': return 'javascript';
case 'ts': return 'typescript';
case 'json': return 'json';
case 'html': return 'html';
case 'css': return 'css';
case 'scss': return 'scss';
case 'less': return 'less';
case 'py': return 'python';
case 'java': return 'java';
case 'c': return 'c';
case 'cpp': return 'cpp';
case 'cs': return 'csharp';
case 'go': return 'go';
case 'php': return 'php';
case 'rb': return 'ruby';
case 'rs': return 'rust';
case 'sql': return 'sql';
case 'sh': return 'shell';
case 'yaml': case 'yml': return 'yaml';
case 'md': return 'markdown';
case 'xml': return 'xml';
case 'ini': return 'ini';
case 'bat': return 'bat';
case 'dockerfile': return 'dockerfile';
default: return 'plaintext';
}
};
/**
* 使用指定的编码解码 Base64 编码的原始文件内容。
* @param {string} rawContentBase64 - Base64 编码的原始文件内容。
* @param {string} encoding - 用于解码的字符编码。
* @returns {string} 解码后的文件内容。如果解码失败,则返回错误信息。
*/
export const decodeRawContent = (rawContentBase64: string, encoding: string): string => {
try {
const buffer = Buffer.from(rawContentBase64, 'base64');
const normalizedEncoding = encoding.toLowerCase().replace(/[^a-z0-9]/g, ''); // 标准化编码名称
// 优先使用 TextDecoder 处理标准编码
if (['utf8', 'utf16le', 'utf16be'].includes(normalizedEncoding)) {
const decoder = new TextDecoder(encoding); // TextDecoder 使用原始编码名称
return decoder.decode(buffer);
}
// 使用 iconv-lite 处理其他编码
else if (iconv.encodingExists(normalizedEncoding)) {
return iconv.decode(buffer, normalizedEncoding);
}
// 如果 iconv-lite 也不支持,回退到 UTF-8 并警告
else {
console.warn(`[SessionUtils decodeRawContent] Unsupported encoding "${encoding}" requested. Falling back to UTF-8.`);
const decoder = new TextDecoder('utf-8');
return decoder.decode(buffer);
}
} catch (error: any) {
console.error(`[SessionUtils decodeRawContent] Error decoding content with encoding "${encoding}":`, error);
return `// Error decoding content: ${error.message}`; // 返回错误信息
}
};