summaryrefslogtreecommitdiff
path: root/lib/vendor-document-list/plant/upload/util/filie-parser.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vendor-document-list/plant/upload/util/filie-parser.ts')
-rw-r--r--lib/vendor-document-list/plant/upload/util/filie-parser.ts132
1 files changed, 132 insertions, 0 deletions
diff --git a/lib/vendor-document-list/plant/upload/util/filie-parser.ts b/lib/vendor-document-list/plant/upload/util/filie-parser.ts
new file mode 100644
index 00000000..42dac9b4
--- /dev/null
+++ b/lib/vendor-document-list/plant/upload/util/filie-parser.ts
@@ -0,0 +1,132 @@
+// 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
+} \ No newline at end of file