'@Folder modUtf8File
Option Explicit

'==========================================================
' UTF-8 파일 입출력 유틸리티
'==========================================================

Public Sub SaveUtf8NoBom(ByVal filePath As String, ByVal textData As String)

    Dim stm As Object
    Dim bytes() As Byte
    
    Set stm = CreateObject("ADODB.Stream")
    
    With stm
        .Type = 2                  ' text
        .Charset = "utf-8"
        .Open
        .WriteText textData
        
        .Position = 0
        .Type = 1                  ' binary
        bytes = .Read
        .Close
    End With
    
    If UBound(bytes) >= 2 Then
        If bytes(0) = &HEF And bytes(1) = &HBB And bytes(2) = &HBF Then
            Dim i As Long
            Dim newBytes() As Byte
            
            ReDim newBytes(UBound(bytes) - 3)
            
            For i = 3 To UBound(bytes)
                newBytes(i - 3) = bytes(i)
            Next i
            
            bytes = newBytes
        End If
    End If
    
    Set stm = CreateObject("ADODB.Stream")
    
    With stm
        .Type = 1                  ' binary
        .Open
        .Write bytes
        .SaveToFile filePath, 2    ' adSaveCreateOverWrite
        .Close
    End With

End Sub

Public Function ReadUtf8Text(ByVal filePath As String) As String

    Dim stm As Object
    
    Set stm = CreateObject("ADODB.Stream")
    
    With stm
        .Type = 2
        .Charset = "utf-8"
        .Open
        .LoadFromFile filePath
        ReadUtf8Text = .ReadText
        .Close
    End With

End Function

Public Sub ConvertFileToUtf8(ByVal filePath As String)

    Dim fso As Object
    Dim ts As Object
    Dim textData As String

    Set fso = CreateObject("Scripting.FileSystemObject")

    '--- 파일 존재 확인 ---
    If Not fso.FileExists(filePath) Then
        Debug.Print "파일 없음: " & filePath
        Exit Sub
    End If

    On Error GoTo ReadErr

    '--- 읽기 ---
    Set ts = fso.OpenTextFile(filePath, 1, False)
    
    If ts.AtEndOfStream Then
        textData = ""
    Else
        textData = ts.ReadAll
    End If
    
    ts.Close

    '--- UTF-8로 저장 ---
    Call SaveUtf8NoBom(filePath, textData)

    Exit Sub

ReadErr:
    Debug.Print "읽기 오류: " & filePath
    Debug.Print Err.Number & " : " & Err.Description

    On Error Resume Next
    If Not ts Is Nothing Then ts.Close

End Sub

Public Function RemoveAttributeLines(ByVal codeText As String) As String

    Dim lines() As String
    Dim result As String
    Dim i As Long
    Dim oneLine As String
    
    codeText = Replace(codeText, vbCrLf, vbLf)
    codeText = Replace(codeText, vbCr, vbLf)
    
    lines = Split(codeText, vbLf)
    
    For i = LBound(lines) To UBound(lines)
        oneLine = lines(i)
        
        If Left$(Trim$(oneLine), 10) <> "Attribute " Then
            result = result & oneLine & vbCrLf
        End If
    Next i
    
    RemoveAttributeLines = result

End Function

Public Function ReadTextFile(ByVal filePath As String) As String

    Dim fso As Object
    Dim ts As Object
    
    If Dir$(filePath) = vbNullString Then Exit Function
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Set ts = fso.OpenTextFile(filePath, 1, False)
    
    If Not ts.AtEndOfStream Then
        ReadTextFile = ts.ReadAll
    End If
    
    ts.Close

End Function

Public Function RemoveVbeExportHeader(ByVal codeText As String) As String

    Dim lines() As String
    Dim result As String
    Dim i As Long
    Dim oneLine As String
    Dim inBeginBlock As Boolean
    
    codeText = Replace(codeText, vbCrLf, vbLf)
    codeText = Replace(codeText, vbCr, vbLf)
    
    lines = Split(codeText, vbLf)
    
    For i = LBound(lines) To UBound(lines)
        oneLine = lines(i)
        
        If Left$(Trim$(oneLine), 8) = "VERSION " Then
            ' skip
        ElseIf Left$(Trim$(oneLine), 10) = "Attribute " Then
            ' skip
        ElseIf Trim$(oneLine) = "BEGIN" Then
            inBeginBlock = True
        ElseIf inBeginBlock And Trim$(oneLine) = "END" Then
            inBeginBlock = False
        ElseIf inBeginBlock Then
            ' skip
        Else
            result = result & oneLine & vbCrLf
        End If
    Next i
    
    RemoveVbeExportHeader = result

End Function

'==========================================================
' 시스템 기본 문자 코드(한국어판 Windows는 CP949)로 저장
'
' VBComponents.Import 는 파일을 ANSI로 읽으므로
' 가져오기용 임시 파일은 이 함수로 만든다.
' 해당 문자 코드에 없는 문자는 "?"로 바뀐다
' (VBE 자체가 ANSI로 코드를 보관하므로 원래 들어갈 수 없는 문자).
'==========================================================
Public Sub SaveAnsiText(ByVal filePath As String, ByVal textData As String)

    Dim bytes() As Byte
    Dim fileNumber As Integer
    
    If Dir$(filePath) <> vbNullString Then Kill filePath
    
    fileNumber = FreeFile
    Open filePath For Binary Access Write As #fileNumber
    
    If Len(textData) > 0 Then
        bytes = StrConv(textData, vbFromUnicode)
        Put #fileNumber, , bytes
    End If
    
    Close #fileNumber

End Sub

