'MacroName:Latin2Bengali
'MacroDescription:Automatically untransliterate a field with Latin characters into Bengali or Assamese characters
'Macro created by: Joel Hahn
'Macro last modified: 15 Oct 2016

Option Explicit
Option Compare Binary

Declare Function TransBengali(sField As String, CharacterSet As Integer) As String

Sub Main
   Dim sField As String
   Dim bool As Integer
   Dim sTranslit As String
   Dim i As Integer
   Dim CharacterSet As Integer
   Dim sLang As String

   Dim CS As Object
   On Error Resume Next
   Set CS  = GetObject(,"Connex.Client")
   On Error GoTo 0
   If CS  Is Nothing Then
      Set CS  = CreateObject("Connex.Client")
   End If

'   Select Case CS.ItemType
'     Case -1, 5 To 13, 15 To 16, 21 To 25
'       MsgBox "Not viewing a MARC record. Exiting..."
'       Exit Sub
'   End Select

    bool = CS.GetFixedField("Lang", sLang)
    Select Case sLang
      Case "ben" 
        CharacterSet = 0
      Case "asm"
        CharacterSet = 1
      Case Else
        'Set the default transliteration table selection
        ' 0 = Bengali
        ' 1 = Assamese
        CharacterSet = 0
    End Select

'   Dim CharSets(6) As String
'   CharSets(0) = "Bengali"
'   CharSets(1) = "Assamese"

'   Begin Dialog newdlg 183, 60, "Transliteration Options"
'      OkButton  35, 42, 50, 14
'      CancelButton  95, 42, 50, 14
'      Text  3, 3, 177, 10, "Please select the LC Devanagari transliteration table to use:"
'      DropListBox  52, 11, 78, 98, CharSets(), .Langs
'   End Dialog
'   Dim CharSelect As newdlg
'   CharSelect.Langs = CharacterSet
'   response = Dialog(CharSelect)
'   If response = 0 Then
'     Exit Sub
'   End If

'   CharacterSet = CharSelect.Langs   

   bool = CS.GetFieldLine(CS.CursorRow, sField)
   If InStr(sField, "Data contains non-latin script") Then
     MsgBox "The selected field already contains vernacular data. Exiting..."
     Exit Sub
   ElseIf sField = Chr(252) & Chr(252) & Chr(252) & "  "  Or Trim(Mid(sField, 6)) = "" Then
     MsgBox "The selected field contains no data. Exiting..."
     Exit Sub
   End If

   For i = 1 to 5
     If Asc(Mid(sField, i, 1)) = 252 Then
       sTranslit = sTranslit & "∎" 
     Else
       sTranslit = sTranslit & Mid(sField, i, 1)
     End If
   Next

   'Select Case CharacterSet
   '   Case 0
         sTranslit = sTranslit & TransBengali(sField, CharacterSet)
   '   Case 1
   '      sTranslit = sTranslit & TransMarathi(sField)
   '   Case 2
   '      sTranslit = sTranslit & TransSanskrit(sField)
   '   Case Else
   '      Exit Sub
   '   End Select

   bool = CS.AddFieldLine(CS.CursorRow, sTranslit)

   CS.SendKeys "%ekl", -1

End Sub

'################################################################################

Function TransBengali(sField As String, CharacterSet As Integer) As String
  Dim i As Long
  Dim sCurVowel As Integer
  Dim sNewField As String
  sNewField = ""
  Dim sTransNumbers As String
  sTransNumbers = "N"

  i = 6
  Do
    If Mid(sField, i, 1) = Chr(223) Then
      sNewField = sNewField & "ǂ" & Mid(sField, i+1, 1)
      i = i + 2

    Else
       If InStr(" !@#$%^&*()[]{};:.,/?\=+-" & Chr(34), Mid(sField, i, 1)) Then
         sCurVowel = 2
         sNewField = sNewField & Mid(sField, i, 1)
       
       ElseIf Mid(sField, i, 1) = "'" Then
         sCurVowel = 2
         sNewField = sNewField & "ঽ"
       
       ElseIf InStr("0123456789", Mid(sField, i, 1)) Then
         If sTransNumbers = "N" Then
           sCurVowel = 2
           sNewField = sNewField & Mid(sField, i, 1)
         Else
           sCurVowel = 2
           If Mid(sField, i, 1) = "0" Then
             sNewField = sNewField & "০"
           ElseIf Mid(sField, i, 1) = "1" Then
             sNewField = sNewField & "১"
           ElseIf Mid(sField, i, 1) = "2" Then
             sNewField = sNewField & "২"
           ElseIf Mid(sField, i, 1) = "3" Then
             sNewField = sNewField & "৩"
           ElseIf Mid(sField, i, 1) = "4" Then
             sNewField = sNewField & "৪"
           ElseIf Mid(sField, i, 1) = "5" Then
             sNewField = sNewField & "৫"
           ElseIf Mid(sField, i, 1) = "6" Then
             sNewField = sNewField & "৬"
           ElseIf Mid(sField, i, 1) = "7" Then
             sNewField = sNewField & "৭"
           ElseIf Mid(sField, i, 1) = "8" Then
             sNewField = sNewField & "৮"
           ElseIf Mid(sField, i, 1) = "9" Then
             sNewField = sNewField & "৯"
           End If
         End If

       ElseIf UCase(Mid(sField, i, 1)) = "A" Then
         If i = 6 Or sCurVowel <> 0 Or Not (Right(sNewField, 2) Like "[0-9A-F];") Then
           'If LCase(Mid(sField, i+1, 2)) = Chr(230) & "i" Then
           '  sNewField = sNewField & "&#x220E;" 'not a valid Unicode character
           '  i = i + 2
           'ElseIf LCase(Mid(sField, i+1, 2)) = Chr(230) & "u" Then
           '  sNewField = sNewField & "&#x09F5;"
           '  i = i + 2
           If LCase(Mid(sField, i+1, 2)) = "i" & Chr(229) Then
             'just do the A and go on to the next, separate vowel
             sNewField = sNewField & "&#x0985;" 
           ElseIf LCase(Mid(sField, i+1, 1)) = "i" Then
             sNewField = sNewField & "&#x0990;"
             i = i + 1
           ElseIf LCase(Mid(sField, i+1, 2)) = "u" & Chr(229) Then
             'just do the A and go on to the next, separate vowel
             sNewField = sNewField & "&#x0985;" 
           ElseIf LCase(Mid(sField, i+1, 1)) = "u" Then
             sNewField = sNewField & "&#x0994;"
             i = i + 1
           ElseIf Mid(sField, i+1, 1) = Chr(229) Then
             sNewField = sNewField & "&#x0986;"
             i = i + 1
           Else
             sNewField = sNewField & "&#x0985;"
           End If
         Else
           'If LCase(Mid(sField, i+1, 2)) = Chr(230) & "i" Then
           '  sNewField = sNewField & "&#x220E;" 
           '  i = i + 2
           'ElseIf LCase(Mid(sField, i+1, 2)) = Chr(230) & "u" Then
           '  sNewField = sNewField & "&#x09CF;"
           '  i = i + 2
           If LCase(Mid(sField, i+1, 2)) = "i" & Chr(229) Then
             'skip the a and go to the next, separate vowel 
           ElseIf LCase(Mid(sField, i+1, 1)) = "i" Then
             sNewField = sNewField & "&#x09C8;"
             i = i + 1
           ElseIf LCase(Mid(sField, i+1, 2)) = "u" & Chr(229) Then
             'skip the a and go to the next, separate vowel 
           ElseIf LCase(Mid(sField, i+1, 1)) = "u" Then
             sNewField = sNewField & "&#x09CC;"
             i = i + 1
           ElseIf Mid(sField, i+1, 1) = Chr(229) Then
             sNewField = sNewField & "&#x09BE;"
             i = i + 1
           Else
             'Implied, not written
           End If
         End If
         sCurVowel = 1
       ElseIf UCase(Mid(sField, i, 1)) = "E" Then
         If i = 6 Or sCurVowel <> 0 Or Not (Right(sNewField, 2) Like "[0-9A-F];") Then
           If Mid(sField, i+1, 1) = Chr(230) Then
             sNewField = sNewField & "&#x0984;"
             i = i + 1
           ElseIf Mid(sField, i+1, 1) = Chr(227) Then
             sNewField = sNewField & "&#x09F2;"
             i = i + 1
           Else
             sNewField = sNewField & "&#x098F;"
           End If
         Else
           If Mid(sField, i+1, 1) = Chr(230) Then
             sNewField = sNewField & "&#x220E;"
             i = i + 1
           ElseIf Mid(sField, i+1, 1) = Chr(227) Then
             sNewField = sNewField & "&#x220E;"
             i = i + 1
           Else
             sNewField = sNewField & "&#x09C7;"
           End If
         End If
         sCurVowel = 1
       ElseIf UCase(Mid(sField, i, 1)) = "I" Then
         If i = 6 Or sCurVowel <> 0 Or Not (Right(sNewField, 2) Like "[0-9A-F];") Then
           If Mid(sField, i+1, 1) = Chr(229) Then
             sNewField = sNewField & "&#x0988;"
             i = i + 1
           Else
             sNewField = sNewField & "&#x0987;"
           End If
         Else
           If Mid(sField, i+1, 1) = Chr(229) Then
             sNewField = sNewField & "&#x09C0;"
             i = i + 1
           Else
             sNewField = sNewField & "&#x09BF;"
           End If
         End If
         sCurVowel = 1
       ElseIf UCase(Mid(sField, i, 1)) = "O" Then
         If i = 6 Or sCurVowel <> 0 Or Not (Right(sNewField, 2) Like "[0-9A-F];") Then
           If Mid(sField, i+1, 1) = Chr(230) Then
             sNewField = sNewField & "&#x0992;"
             i = i + 1
           ElseIf Mid(sField, i+1, 1) = Chr(227) Then
             sNewField = sNewField & "&#x0991;"
             i = i + 1
           Else
             sNewField = sNewField & "&#x0993;"
           End If
         Else
           If Mid(sField, i+1, 1) = Chr(230) Then
             sNewField = sNewField & "&#x09CA;"
             i = i + 1
           ElseIf Mid(sField, i+1, 1) = Chr(227) Then
             sNewField = sNewField & "&#x09C9;"
             i = i + 1
           Else
             sNewField = sNewField & "&#x09CB;"
           End If
         End If
         sCurVowel = 1
       ElseIf UCase(Mid(sField, i, 1)) = "U" Then
         If i = 6 Or sCurVowel <> 0 Or Not (Right(sNewField, 2) Like "[0-9A-F];") Then
           If Mid(sField, i+1, 1) = Chr(229) Then
             sNewField = sNewField & "&#x098A;"
             i = i + 1
           Else
             sNewField = sNewField & "&#x0989;"
           End If
         Else
           If Mid(sField, i+1, 1) = Chr(229) Then
             sNewField = sNewField & "&#x09C2;"
             i = i + 1
           Else
             sNewField = sNewField & "&#x09C1;"
           End If
         End If
         sCurVowel = 1

       ElseIf UCase(Mid(sField, i, 1)) = "K" Then
         sCurVowel = 0
         If LCase(Mid(sField, i+1, 3)) = Chr(246) & "h" & Chr(246) Then
           sNewField = sNewField & "&#x0996;&#x09BC;"
           i = i + 3
         ElseIf LCase(Mid(sField, i+1, 1)) = "h" Then
           sNewField = sNewField & "&#x0996;"
           i = i + 1
         Else
           sNewField = sNewField & "&#x0995;"
         End If
       ElseIf UCase(Mid(sField, i, 1)) = "Q" Then
         sCurVowel = 0
         sNewField = sNewField & "&#x0995;&#x09BC;"
       ElseIf UCase(Mid(sField, i, 1)) = "G" Then
         sCurVowel = 0
         If LCase(Mid(sField, i+1, 3)) = Chr(246) & "h" & Chr(246) Then
           sNewField = sNewField & "&#x0997;&#x09BC;"
           i = i + 3
         ElseIf LCase(Mid(sField, i+1, 3)) = Chr(245) & "h" & Chr(245) Then
           sNewField = sNewField & "&#x0998;&#x09BC;"
           i = i + 3
         ElseIf LCase(Mid(sField, i+1, 1)) = "h" Then
           sNewField = sNewField & "&#x0998;"
           i = i + 1
         Else
           sNewField = sNewField & "&#x0997;"
         End If

       ElseIf UCase(Mid(sField, i, 1)) = "C" Then
         sCurVowel = 0
         If LCase(Mid(sField, i+1, 1)) = "h" Then
           sNewField = sNewField & "&#x099B;"
           i = i + 1
         Else
           sNewField = sNewField & "&#x099A;"
         End If
       ElseIf UCase(Mid(sField, i, 1)) = "J" Then
         sCurVowel = 0
         If LCase(Mid(sField, i+1, 1)) = "h" Then
           sNewField = sNewField & "&#x099D;"
           i = i + 1
         Else
           sNewField = sNewField & "&#x099C;"
         End If
       ElseIf UCase(Mid(sField, i, 1)) = "Z" Then
         sCurVowel = 0
         sNewField = sNewField & "&#x099C;&#x09BC;"

       ElseIf UCase(Mid(sField, i, 1)) = "T" Then
         sCurVowel = 0
         If LCase(Mid(sField, i+1, 2)) = Chr(242) & "h" Then
           sNewField = sNewField & "&#x09A0;"
           i = i + 2
         ElseIf Mid(sField, i+1, 1) = Chr(242) Then
           sNewField = sNewField & "&#x099F;"
           i = i + 1
         ElseIf Mid(sField, i+1, 1) = Chr(243) Then
           sNewField = sNewField & "&#x099F;&#x09BC;"
           i = i + 1
         ElseIf Mid(sField, i+1, 1) = Chr(246) Then
           sCurVowel = 2 'Special character, never followed by a vowel
           sNewField = sNewField & "&#x09CE;" 
           i = i + 1
         ElseIf LCase(Mid(sField, i+1, 1)) = "h" Then
           sNewField = sNewField & "&#x09A5;"
           i = i + 1
         Else
           sNewField = sNewField & "&#x09A4;"
         End If
       ElseIf UCase(Mid(sField, i, 1)) = "D" Then
         sCurVowel = 0
         If LCase(Mid(sField, i+1, 2)) = Chr(242) & "h" Then
           sNewField = sNewField & "&#x09A2;"
           i = i + 2
         ElseIf Mid(sField, i+1, 1) = Chr(242) Then
           sNewField = sNewField & "&#x09A1;"
           i = i + 1
         ElseIf LCase(Mid(sField, i+1, 1)) = "h" Then
           sNewField = sNewField & "&#x09A7;"
           i = i + 1
         Else
           sNewField = sNewField & "&#x09A6;"
         End If

       ElseIf UCase(Mid(sField, i, 1)) = "P" Then
         sCurVowel = 0
         If LCase(Mid(sField, i+1, 1)) = "h" Then
           sNewField = sNewField & "&#x09AB;"
           i = i + 1
         Else
           sNewField = sNewField & "&#x09AA;"
         End If
       ElseIf UCase(Mid(sField, i, 1)) = "F" Then
         sCurVowel = 0
         sNewField = sNewField & "&#x09AB;&#x09BC;"
       ElseIf UCase(Mid(sField, i, 1)) = "B" Then
         sCurVowel = 0
         If LCase(Mid(sField, i+1, 1)) = "h" Then
           sNewField = sNewField & "&#x09AD;"
           i = i + 1
         ElseIf LCase(Mid(sField, i+1, 1)) = "b" and CharacterSet = 0 Then
           sNewField = sNewField & "&#x09AC;&#x09AC;"
           i = i + 1
         Else
           sNewField = sNewField & "&#x09AC;"
         End If

       ElseIf UCase(Mid(sField, i, 1)) = "Y" Then
         sCurVowel = 0
         If Mid(sField, i+1, 1) = Chr(231) Then
           sNewField = sNewField & "&#x09DF;"
           i = i + 1
         Else
           sNewField = sNewField & "&#x09AF;"
         End If
       ElseIf UCase(Mid(sField, i, 1)) = "V" and CharacterSet = 0 Then
         sCurVowel = 0
         sNewField = sNewField & "&#x09AC;" '"&#x09B5;"
       ElseIf UCase(Mid(sField, i, 1)) = "W" and CharacterSet = 1 Then
         sCurVowel = 0
         sNewField = sNewField & "&#x09F1;"
         
       ElseIf UCase(Mid(sField, i, 1)) = "S" Then
         sCurVowel = 0
         If Mid(sField, i+1, 1) = Chr(226) Then
           sNewField = sNewField & "&#x09B6;"
           i = i + 1
         ElseIf Mid(sField, i+1, 1) = Chr(243) Then
           sNewField = sNewField & "&#x09B8;&#x09BC;"
           i = i + 1
         ElseIf LCase(Mid(sField, i+1, 1)) = "h" Then
           sNewField = sNewField & "&#x09B7;"
           i = i + 1
         Else
           sNewField = sNewField & "&#x09B8;"
         End If

       ElseIf UCase(Mid(sField, i, 1)) = "H" Then
         sCurVowel = 0
         If Mid(sField, i+1, 1) = Chr(242) Then
           sCurVowel = 2
           sNewField = sNewField & "&#x0983;"
           i = i + 1
         ElseIf Mid(sField, i+1, 1) = Chr(243) Then
           sNewField = sNewField & "&#x09B9;&#x09BC;"
           i = i + 1
         Else
           sNewField = sNewField & "&#x09B9;"
         End If

       ElseIf UCase(Mid(sField, i, 1)) = "R" Then
         If Mid(sField, i+1, 2) = Chr(244) & Chr(229) Or Mid(sField, i+1, 2) = Chr(229) & Chr(244) Then
           sCurVowel = 1
           If i = 6 Or Not (Right(sNewField, 2) Like "[0-9A-F];") Then
             sNewField = sNewField & "&#x09E0;"
           Else
             sNewField = sNewField & "&#x09C4;"
           End If
           i = i + 2
         ElseIf Mid(sField, i+1, 1) = Chr(244) Then
           sCurVowel = 1
           If i = 6 Or Not (Right(sNewField, 2) Like "[0-9A-F];") Then
             sNewField = sNewField & "&#x098B;"
           Else
             sNewField = sNewField & "&#x09C3;"
           End If
           i = i + 1
         ElseIf LCase(Mid(sField, i+1, 2)) = Chr(242) & "h" Then
           sCurVowel = 0
           sNewField = sNewField & "&#x09A2;&#x09BC;"
           i = i + 2
         ElseIf Mid(sField, i+1, 1) = Chr(242) Then
           sCurVowel = 0
           sNewField = sNewField & "&#x09A1;&#x09BC;"
           i = i + 1
         Else
           sCurVowel = 0
           If CharacterSet = 1 Then
             sNewField = sNewField & "&#x09F0;"
           Else 'CharacterSet = 0
             sNewField = sNewField & "&#x09B0;"
           End If
         End If
       ElseIf UCase(Mid(sField, i, 1)) = "L" Then
         If Mid(sField, i+1, 1) = Chr(244) Then
           sCurVowel = 1
           If i = 6 Or Not (Right(sNewField, 2) Like "[0-9A-F];") Then
             sNewField = sNewField & "&#x098C;"
           Else
             sNewField = sNewField & "&#x09E2;"
           End If
           i = i + 1
         Else
           sCurVowel = 0
           sNewField = sNewField & "&#x09B2;"
         End If       

       ElseIf UCase(Mid(sField, i, 1)) = "M" Then
         sCurVowel = 0
         If Mid(sField, i+1, 1) = Chr(242) Then
           sNewField = sNewField & "&#x0982;"
           i = i + 1
         ElseIf Mid(sField, i+1, 1) = Chr(239) Then
           sNewField = sNewField & "&#x0981;"
           i = i + 1
         Else
           'If InStr( "[pfbm 0123456789!@#$%^&*()[]{};:.,/?\=+-]", LCase(Mid(sField, i+1, 1)) ) Then
           '  sNewField = sNewField & "&#x0982;"
           'Else
             sNewField = sNewField & "&#x09AE;"
           'End If
         End If
         If Right(sNewField, 8) = "&#x0982;" Or Right(sNewField, 8) = "&#x0981;" Then sCurVowel = 2 Else sCurVowel = 0
       ElseIf UCase(Mid(sField, i, 1)) = "N" Then
         If Mid(sField, i+1, 1) = Chr(242) Then
           If LCase(Mid(sField, i+2, 2)) = "d" & Chr(242) Or LCase(Mid(sField, i+2, 2)) = "n" & Chr(242) Or LCase(Mid(sField, i+2, 2)) = "r" & Chr(242) Or LCase(Mid(sField, i+2, 2)) = "t" & Chr(242) Then
             sNewField = sNewField & "&#x0982;"
           Else
             sNewField = sNewField & "&#x09A3;"
           End If
           i = i + 1
         ElseIf Mid(sField, i+1, 1) = Chr(228) Then
           sNewField = sNewField & "&#x099E;"
           i = i + 1
         ElseIf Mid(sField, i+1, 1) = Chr(231) Then
           'If Mid(sField, i+2, 1) Like "[gkq]" Or LCase(Mid(sField, i+2, 2)) = "n" & Chr(231) Then
           '  sNewField = sNewField & "&#x0982;"
           'Else
             sNewField = sNewField & "&#x0999;"
           'End If
           i = i + 1
         ElseIf Mid(sField, i+1, 1) = Chr(229) Then
           sNewField = sNewField & "&#x0982;"
           i = i + 1
         ElseIf Mid(sField, i+1, 1) = Chr(239) Then
           sNewField = sNewField & "&#x0981;"
           i = i + 1
         Else
           'If Mid(sField, i+1, 1) Like "[tdn]" Then
           '  sNewField = sNewField & "&#x0982;"
           'Else
             sNewField = sNewField & "&#x09A8;"
           'End If
         End If
         If Right(sNewField, 8) = "&#x0982;" Or Right(sNewField, 8) = "&#x0981;" Then sCurVowel = 2 Else sCurVowel = 0

       Else
         sNewField = sNewField & "&#x220E;"
       End If
       i = i + 1
    End If
    
    If sCurVowel = 0 And Not ( Right(sNewField, 1) Like "[0-9a-z ]" Or Mid(sField, i, 1) Like "[0-9AEIOUaeiou]" Or LCase(Mid(sField, i, 2)) = "r" & Chr(244) Or LCase(Mid(sField, i, 2)) = "l" & Chr(244) ) Then
      sNewField = sNewField & "&#x09CD;"
    End If

  Loop While i <= Len(sField)
  
  TransBengali = sNewField
End Function

'################################################################################