// lib/vendor-document-list/plant/upload/utils/file-parser.ts export interface ParsedFileName { docNumber: string stageName: string revision: string extension: string originalName: string isValid: boolean error?: string } export function parseFileName(fileName: string): ParsedFileName { try { // 확장자 분리 const lastDotIndex = fileName.lastIndexOf('.') if (lastDotIndex === -1) { return { docNumber: '', stageName: '', revision: '', extension: '', originalName: fileName, isValid: false, error: 'No file extension found' } } const extension = fileName.substring(lastDotIndex + 1) const nameWithoutExt = fileName.substring(0, lastDotIndex) // 언더스코어로 분리 (최소 3개 부분 필요) const parts = nameWithoutExt.split('_') if (parts.length < 3) { return { docNumber: '', stageName: '', revision: '', extension, originalName: fileName, isValid: false, error: `Invalid format. Expected: DocNumber_StageName_Revision.${extension}` } } // 파싱 결과 const docNumber = parts[0] const stageName = parts.slice(1, -1).join('_') // 중간 부분이 여러 개일 수 있음 const revision = parts[parts.length - 1] // 마지막 부분이 리비전 // 기본 검증 if (!docNumber || !stageName || !revision) { return { docNumber: '', stageName: '', revision: '', extension, originalName: fileName, isValid: false, error: 'Missing required parts' } } return { docNumber, stageName, revision, extension, originalName: fileName, isValid: true } } catch (error) { return { docNumber: '', stageName: '', revision: '', extension: '', originalName: fileName, isValid: false, error: 'Failed to parse filename' } } } // 리비전 번호 추출 (숫자 우선, 없으면 문자를 숫자로 변환) export function extractRevisionNumber(revision: string): number { const cleanRevision = revision.toLowerCase().replace(/[^a-z0-9]/g, '') // Rev0, Rev1 형식 const revMatch = cleanRevision.match(/rev(\d+)/) if (revMatch) return parseInt(revMatch[1]) // R0, R1 형식 const rMatch = cleanRevision.match(/r(\d+)/) if (rMatch) return parseInt(rMatch[1]) // v1, v2 형식 const vMatch = cleanRevision.match(/v(\d+)/) if (vMatch) return parseInt(vMatch[1]) // 단순 숫자 const numMatch = cleanRevision.match(/^(\d+)$/) if (numMatch) return parseInt(numMatch[1]) // RevA, RevB 또는 A, B 형식 -> 숫자로 변환 (A=1, B=2, etc.) const alphaMatch = cleanRevision.match(/^(?:rev)?([a-z])$/i) if (alphaMatch) { return alphaMatch[1].toUpperCase().charCodeAt(0) - 64 // A=1, B=2, C=3... } // 기본값 return 0 } // 리비전 코드 정규화 (DB 저장용) export function normalizeRevisionCode(revision: string): string { // Rev0 -> 0, RevA -> A, v1 -> 1 등으로 정규화 const cleanRevision = revision.toLowerCase() // Rev 제거 if (cleanRevision.startsWith('rev')) { return revision.substring(3) } // R, v 제거 if (cleanRevision.startsWith('r') || cleanRevision.startsWith('v')) { return revision.substring(1) } return revision }