'MacroName:Devangari2Latin 'MacroDescription:Automatically transliterate Devangari (Hindi, Marathi, Sanskrit) characters into Latin characters 'Macro written by: Joel Hahn, Niles Public Library District 'Macro last modified: 5 April 2011 Declare Function TransHindi(sChar As String, sNextChar As String, nPos As Variant) As String Declare Function TransMarathi(sChar As String, sNextChar As String, nPos As Variant) As String Declare Function TransSanskrit(sChar As String, sNextChar As String, nPos As Variant) As String 'Declare Function GetWord(nPos, nStart, nStop) As String Declare Function IsDevaChar(sNCR) As Integer Global arrChars() Option Explicit Sub Main Dim CharacterSet As Integer Dim bool as Integer Dim sField As String Dim nHasDeva as integer Dim NewField As String Dim i, a Dim sHex As String Dim nHex As Long Dim TempChar As String Dim place3 as Integer Dim place As Integer Dim sBCR As String 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 ReDim arrChars(0) 'nCurRow = CS.CursorRow ' Select Case CS.ItemType ' Case 0, 1, 2, 3, 4, 14, 17, 18, 19, 20, 35 ' 'Viewing a MARC record; proceed ' Case Else ' MsgBox "Not viewing a MARC record. Exiting..." ' Exit Sub ' End Select 'CS.CursorRow = nCurRow bool = CS.GetFixedField("Lang", sLang) Select Case sLang Case "hin" CharacterSet = 0 Case "mar" CharacterSet = 1 Case "pra", "san" CharacterSet = 2 Case Else 'Set the default transliteration table selection ' 0 = Hindi ' 1 = Marathi ' 2 = Sanskrit & Prakrit CharacterSet = 0 End Select bool = CS.GetFieldLineUnicode(CS.CursorRow, sField) NewField = Left(sField, 5) sField = Mid(sField, 6) i = 1 : nHasDeva = 0 Do While i <= Len(sField) - 7 a = Mid(sField, i, 8) If IsDevaChar(Mid(sField, i, 6)) Then nHasDeva = 1 Exit Do End If i = i + 1 Loop If nHasDeva = 0 Then MsgBox "Field contains no Devanagari characters. Exiting..." Exit Sub End If 'Break up Devanagari field in to separate characters i = 1 Do While i <= Len(sField) ReDim Preserve arrChars(UBound(arrChars) + 1) If Mid(sField, i, 3) = "&#x" Then place = InStr(i, sField, ";") sBCR = Mid(sField, i, (place - i) + 1) arrChars(UBound(arrChars)) = sBCR i = place Else arrChars(UBound(arrChars)) = Mid(sField, i, 1) End If i = i + 1 Loop i = 1 Do While i <= UBound(arrChars) If InStr(arrChars(i), "&#x") Then sHex = Mid(arrChars(i), 4, Len(arrChars(i)) - 2) nHex = Val("&H" & sHex) Select Case nHex Case &H01C2 NewField = NewField & Chr(223) 'delimiter Case &H0901 To &H0970 Select Case CharacterSet Case 0 'Hindi If i < UBound(arrChars) Then TempChar = TransHindi(arrChars(i), arrChars(i+1), i) If arrChars(i+1) = "़" Then i = i + 1 Else TempChar = TransHindi(arrChars(i), "&H0000;", i) End If Case 1 'Marathi If i < UBound(arrChars) Then TempChar = TransMarathi(arrChars(i), arrChars(i+1), i) Else TempChar = TransMarathi(arrChars(i), "&H0000;", i) End If Case 2 'Sanskrit& Prakrit If i < UBound(arrChars) Then TempChar = TransSanskrit(arrChars(i), arrChars(i+1), i) Else TempChar = TransSanskrit(arrChars(i), "&H0000;", i) End If End Select NewField = NewField + TempChar Case Else NewField = NewField & Chr(252) 'non-Devanagari Unicode character End Select Else NewField = NewField & arrChars(i) End If i = i + 1 Loop If Mid(NewField, 6, 1) Like "[A-Za-z]" Then Mid(NewField, 6, 1) = UCase(Mid(NewField, 6, 1)) Else i = 6 If Mid(NewField, i, 1) = Chr(223) Then i = 8 Do While ((Mid(NewField, i, 1) Like "[!a-z]") And i <= Len(NewField)) i = i + 1 Loop If (Mid(NewField, i-1, 1) <> "#") And (Mid(NewField, i-1, 1) Like "[!A-Z]") And Not (Mid(NewField, i-2, 2) Like "[0-9]-") Then Mid(NewField, i, 1) = UCase(Mid(NewField, i, 1)) End If place3 = 5 Do While InStr(place3, NewField, Chr(223) ) 'ǂ") 'place3 = InStr(place3, NewField, "ǂ") + 9 place3 = InStr(place3, NewField, Chr(223) ) + 2 Do Until ((Mid(NewField, place3, 1) Like "[A-WY-Za-z]") Or place3 > Len(NewField)) place3 = place3 + 1 Loop If place3 <= Len(NewField) Then If (Mid(NewField, place3, 1) Like "[a-z]") Then If Mid(NewField, place3-1, 1) <> "#" Then Mid(NewField, place3, 1) = UCase(Mid(NewField, place3, 1)) End If End If place3 = place3 + 1 Loop bool = CS.AddFieldLine(CS.CursorRow + 1, NewField) CS.CursorRow = CS.CursorRow -1 CS.SendKeys "%ekl", -1 End Sub '############################################################################## Function TransHindi(sChar As String, sNextChar As String, nPos As Variant) As String Dim sHex As String Dim nHex As Integer Dim TempTranslit As String Dim sNextHex As String Dim nNextHex As Long Dim IsConsonant As Integer IsConsonant = 0 sHex = Mid(sChar, 4, Len(sChar) - 2) nHex = Val("&H" & sHex) sNextHex = Mid(sNextChar, 4, Len(sNextChar) - 1) nNextHex = Val("&H" & sNextHex) Select Case nHex 'Vowels Case &H0905 TempTranslit = "a" Case &H0906, &H093E TempTranslit = "a" & Chr(229) 'A-macron Case &H0907, &H093F TempTranslit = "i" Case &H0908, &H0940 TempTranslit = "i" & Chr(229) 'I-macron Case &H0909, &H0941 TempTranslit = "u" Case &H090A, &H0942 TempTranslit = "u" & Chr(229) 'U-macron Case &H090B, &H0943 TempTranslit = "r" & Chr(244) 'R-circle-below Case &H0960, &H0944 TempTranslit = "r" & Chr(229) & Chr(244) 'R-macron-circle-below Case &H090C, &H0962 TempTranslit = "l" & Chr(244) 'L-circle-below Case &H090E, &H0946 TempTranslit = "e" & Chr(230) 'E-breve Case &H090F, &H0947 TempTranslit = "e" Case &H090D, &H0945 TempTranslit = "e" & Chr(227) 'E-circumflex Case &H0910, &H0948 TempTranslit = "ai" Case &H0912, &H094A TempTranslit = "o" & Chr(230) 'O-breve Case &H0913, &H094B TempTranslit = "o" Case &H0911, &H0949 TempTranslit = "o" & Chr(227) 'O-circumflex Case &H0914, &H094C TempTranslit = "au" 'Case ???? Note: Not a valid Unicode character ' TempTranslit = "a" & Chr(230) & "i" 'A-breve i Case &H0975, &H094F 'Note: not in ALA Unicode MS; used for Kashmiri TempTranslit = "a" & Chr(230) & "u" 'A-breve u 'Consonants 'Gutturals Case &H0915 TempTranslit = "k" If nNextHex = &H093C Then TempTranslit = "q" IsConsonant = 1 Case &H0916 TempTranslit = "kh" If nNextHex = &H093C Then TempTranslit = "k" & Chr(246) & "h" & Chr(246) 'KH-underscore IsConsonant = 1 Case &H0917 TempTranslit = "g" If nNextHex = &H093C Then TempTranslit = "g" & Chr(246) & "h" & Chr(246) 'GH-underscore IsConsonant = 1 Case &H0918 TempTranslit = "gh" If nNextHex = &H093C Then TempTranslit = "g" & Chr(245) & "h" & Chr(245) 'GH-double-underscore IsConsonant = 1 Case &H0919 TempTranslit = "n" & Chr(231) 'n-superior-dot IsConsonant = 1 'Preconstructed consonants + Nukta dot Case &H0958 'Ka+Nukta TempTranslit = "q" IsConsonant = 1 Case &H0959 'Kha+Nukta TempTranslit = "k" & Chr(246) & "h" & Chr(246) 'KH-underscore IsConsonant = 1 Case &H095A 'Ga+Nukta TempTranslit = "g" & Chr(246) & "h" & Chr(246) 'GH-underscore IsConsonant = 1 'Palatals Case &H091A TempTranslit = "c" IsConsonant = 1 Case &H091B TempTranslit = "ch" IsConsonant = 1 Case &H091C TempTranslit = "j" If nNextHex = &H093C Then TempTranslit = "z" IsConsonant = 1 Case &H091D TempTranslit = "jh" IsConsonant = 1 Case &H091E TempTranslit = "n" & Chr(228) 'N-tilde IsConsonant = 1 'Preconstructed consonants + Nukta dot Case &H095B 'Ja+Nukta TempTranslit = "z" IsConsonant = 1 'Cerebrals Case &H091F TempTranslit = "t" & Chr(242) 'T-dot-below If nNextHex = &H093C Then TempTranslit = "t" & Chr(243) 'T-double-dot-below IsConsonant = 1 Case &H0920 TempTranslit = "t" & Chr(242) & "h" 'T-dot-below h IsConsonant = 1 Case &H0921 TempTranslit = "d" & Chr(242) 'D-dot-below If nNextHex = &H093C Then TempTranslit = "r" & Chr(242) 'R-dot-below IsConsonant = 1 Case &H0922 TempTranslit = "d" & Chr(242) & "h" 'D-dot-below h If nNextHex = &H093C Then TempTranslit = "r" & Chr(242) & "h" 'R-dot-below h IsConsonant = 1 Case &H0923 TempTranslit = "n" & Chr(242) 'N-dot-below IsConsonant = 1 'Preconstructed consonants + Nukta dot Case &H095C 'D-dot-below-a+Nukta TempTranslit = "r" & Chr(242) 'R-dot-below IsConsonant = 1 Case &H095D 'D-dot-below-ha+Nukta TempTranslit = "r" & Chr(242) & "h" 'R-dot-below h IsConsonant = 1 'Dentals Case &H0924 TempTranslit = "t" IsConsonant = 1 Case &H0925 TempTranslit = "th" IsConsonant = 1 Case &H0926 TempTranslit = "d" IsConsonant = 1 Case &H0927 TempTranslit = "dh" IsConsonant = 1 Case &H0928 TempTranslit = "n" IsConsonant = 1 'Labials Case &H092A TempTranslit = "p" IsConsonant = 1 Case &H092B TempTranslit = "ph" If nNextHex = &H093C Then TempTranslit = "f" IsConsonant = 1 Case &H092C TempTranslit = "b" IsConsonant = 1 Case &H092D TempTranslit = "bh" IsConsonant = 1 Case &H092E TempTranslit = "m" IsConsonant = 1 'Preconstructed consonants + Nukta dot Case &H095E 'Pha+Nukta TempTranslit = "f" IsConsonant = 1 'Semivowels Case &H092F TempTranslit = "y" IsConsonant = 1 Case &H0930 TempTranslit = "r" IsConsonant = 1 Case &H0932 TempTranslit = "l" IsConsonant = 1 Case &H0935 TempTranslit = "v" IsConsonant = 1 'Sibilants Case &H0936 TempTranslit = "s" & Chr(226) 'S-acute IsConsonant = 1 Case &H0937 TempTranslit = "sh" IsConsonant = 1 Case &H0938 TempTranslit = "s" If nNextHex = &H093C Then TempTranslit = "s" & Chr(243) 'S-double-dot-below IsConsonant = 1 'Preconstructed consonants + Nukta dot Case &H0958 'Sa+Nukta TempTranslit = "s" & CHr(243) 'S-double-dot-below IsConsonant = 1 'Aspirate Case &H0939 TempTranslit = "h" If nNextHex = &H093C Then TempTranslit = "h" & Chr(243) 'H-double-dot-below IsConsonant = 1 'Anusvaara Case &H0902 Select Case nNextHex Case &H0915 To &H0919, &H0958 To &H095A 'Gutturals TempTranslit = "n" & Chr(231) 'N-superior-dot Case &H091A To &H091E, &H095B 'Palatals TempTranslit = "n" & Chr(229) 'N-macron Case &H091F To &H0923, &H095C To &H095D 'Cerebrals TempTranslit = "n" & Chr(242) 'N-dot-below Case &H0924 To &H0928 'Dentals TempTranslit = "n" Case &H092A To &H092E, &H095E 'Labials TempTranslit = "m" Case Else TempTranslit = "m" & Chr(242) 'M-dot-below End Select 'Anunaasika Case &H0901 Select Case nNextHex Case &H0915 To &H0919, &H0958 To &H095A, &H091A To &H091E, &H095B, &H091F To &H0923, &H095C To &H095D, &H0924 To &H0928 TempTranslit = "n" & Chr(239) 'N-candrabindu Case Else TempTranslit = "m" & Chr(239) 'M-candrabindu End Select 'Visarga Case &H0903 TempTranslit = "h" & Chr(242) 'H-dot-below 'Punctuation & Numbers Case &H093D 'Avagraha TempTranslit = "'" Case &H0964 'Danda TempTranslit = "," Case &H0965 'Double danda TempTranslit = "." Case &H0966 TempTranslit = "0" Case &H0967 TempTranslit = "1" Case &H0968 TempTranslit = "2" Case &H0969 TempTranslit = "3" Case &H096A TempTranslit = "4" Case &H096B TempTranslit = "5" Case &H096C TempTranslit = "6" Case &H096D TempTranslit = "7" Case &H096E TempTranslit = "8" Case &H096F TempTranslit = "9" Case Else 'Unknown/non-Hindi character TempTranslit= Chr(252) ' Select Case nNextHex ' Case &H1112 ' TempTranslit = "lkʻ" ' arrChars(nPos + 1) = "�" ' End Select End Select If IsConsonant = 1 Then If nNextHex = &H093C And UBound(arrChars) > nPos + 1 Then sNextHex = Mid(arrChars(nPos+2), 4, Len(arrChars(nPos+2)) - 1) nNextHex = Val("&H" & sNextHex) End If Select Case nNextHex Case &H093E To &H094C, &H0962 'Do nothing; vowel follows Case &H094D 'Do nothing; consonant ligature follows Case Else 'Add the implicit "a" TempTranslit = TempTranslit & "a" End Select End If TransHindi = TempTranslit End Function '############################################################################## Function TransMarathi(sChar As String, sNextChar As String, nPos As Variant) As String Dim sHex As String Dim nHex As Integer Dim TempTranslit As String Dim sNextHex As String Dim nNextHex As Long Dim IsConsonant As Integer IsConsonant = 0 sHex = Mid(sChar, 4, Len(sChar) - 2) nHex = Val("&H" & sHex) sNextHex = Mid(sNextChar, 4, Len(sNextChar) - 1) nNextHex = Val("&H" & sNextHex) Select Case nHex 'Vowels Case &H0905 TempTranslit = "a" Case &H0906, &H093E TempTranslit = "a" & Chr(229) 'A-macron Case &H0907, &H093F TempTranslit = "i" Case &H0908, &H0940 TempTranslit = "i" & Chr(229) 'I-macron Case &H0909, &H0941 TempTranslit = "u" Case &H090A, &H0942 TempTranslit = "u" & Chr(229) 'U-macron Case &H090B, &H0943 TempTranslit = "r" & Chr(244) 'R-circle-below Case &H0960, &H0944 TempTranslit = "r" & Chr(229) & Chr(244) 'R-macron-circle-below Case &H090C, &H0962 TempTranslit = "l" & Chr(244) 'L-circle-below 'Case &H090E, &H0946 ' TempTranslit = "e" & Chr(230) 'E-breve Case &H090F, &H0947 TempTranslit = "e" Case &H090D, &H0945 TempTranslit = "e" & Chr(227) 'E-circumflex Case &H0910, &H0948 TempTranslit = "ai" 'Case &H0912, &H094A ' TempTranslit = "o" & Chr(230) 'O-breve Case &H0913, &H094B TempTranslit = "o" Case &H0911, &H0949 TempTranslit = "o" & Chr(227) 'O-circumflex Case &H0914, &H094C TempTranslit = "au" 'Case &H0975, &H094F 'Note: not in ALA Unicode MS; used for Kashmiri ' TempTranslit = "a" & Chr(230) & "u" 'A-breve u 'Consonants 'Gutturals Case &H0915 TempTranslit = "k" 'If nNextHex = &H093C Then TempTranslit = "q" IsConsonant = 1 Case &H0916 TempTranslit = "kh" 'If nNextHex = &H093C Then TempTranslit = "k" & Chr(246) & "h" & Chr(246) 'KH-underscore IsConsonant = 1 Case &H0917 TempTranslit = "g" 'If nNextHex = &H093C Then TempTranslit = "g" & Chr(246) & "h" & Chr(246) 'GH-underscore IsConsonant = 1 Case &H0918 TempTranslit = "gh" 'If nNextHex = &H093C Then TempTranslit = "g" & Chr(245) & "h" & Chr(245) 'GH-double-underscore IsConsonant = 1 Case &H0919 TempTranslit = "n" & Chr(231) 'n-superior-dot IsConsonant = 1 'Preconstructed consonants + Nukta dot 'Case &H0958 'Ka+Nukta ' TempTranslit = "q" ' IsConsonant = 1 'Case &H0959 'Kha+Nukta ' TempTranslit = "k" & Chr(246) & "h" & Chr(246) 'KH-underscore ' IsConsonant = 1 'Case &H095A 'Ga+Nukta ' TempTranslit = "g" & Chr(246) & "h" & Chr(246) 'GH-underscore ' IsConsonant = 1 'Palatals Case &H091A TempTranslit = "c" IsConsonant = 1 Case &H091B TempTranslit = "ch" IsConsonant = 1 Case &H091C TempTranslit = "j" 'If nNextHex = &H093C Then TempTranslit = "z" IsConsonant = 1 Case &H091D TempTranslit = "jh" IsConsonant = 1 Case &H091E TempTranslit = "n" & Chr(228) 'N-tilde IsConsonant = 1 'Preconstructed consonants + Nukta dot 'Case &H095B 'Ja+Nukta ' TempTranslit = "z" ' IsConsonant = 1 'Cerebrals Case &H091F TempTranslit = "t" & Chr(242) 'T-dot-below 'If nNextHex = &H093C Then TempTranslit = "t" & Chr(243) 'T-double-dot-below IsConsonant = 1 Case &H0920 TempTranslit = "t" & Chr(242) & "h" 'T-dot-below h IsConsonant = 1 Case &H0921 TempTranslit = "d" & Chr(242) 'D-dot-below 'If nNextHex = &H093C Then TempTranslit = "r" & Chr(242) 'R-dot-below IsConsonant = 1 Case &H0922 TempTranslit = "d" & Chr(242) & "h" 'D-dot-below h 'If nNextHex = &H093C Then TempTranslit = "r" & Chr(242) & "h" 'R-dot-below h IsConsonant = 1 Case &H0923 TempTranslit = "n" & Chr(242) 'N-dot-below IsConsonant = 1 'Preconstructed consonants + Nukta dot 'Case &H095C 'D-dot-below-a+Nukta ' TempTranslit = "r" & Chr(242) 'R-dot-below ' IsConsonant = 1 'Case &H095D 'D-dot-below-ha+Nukta ' TempTranslit = "r" & Chr(242) & "h" 'R-dot-below h ' IsConsonant = 1 'Dentals Case &H0924 TempTranslit = "t" IsConsonant = 1 Case &H0925 TempTranslit = "th" IsConsonant = 1 Case &H0926 TempTranslit = "d" IsConsonant = 1 Case &H0927 TempTranslit = "dh" IsConsonant = 1 Case &H0928 TempTranslit = "n" IsConsonant = 1 'Labials Case &H092A TempTranslit = "p" IsConsonant = 1 Case &H092B TempTranslit = "ph" 'If nNextHex = &H093C Then TempTranslit = "f" IsConsonant = 1 Case &H092C TempTranslit = "b" IsConsonant = 1 Case &H092D TempTranslit = "bh" IsConsonant = 1 Case &H092E TempTranslit = "m" IsConsonant = 1 'Preconstructed consonants + Nukta dot 'Case &H095E 'Pha+Nukta ' TempTranslit = "f" ' IsConsonant = 1 'Semivowels Case &H092F TempTranslit = "y" IsConsonant = 1 Case &H0930 TempTranslit = "r" IsConsonant = 1 Case &H0932 TempTranslit = "l" IsConsonant = 1 Case &H0933 TempTranslit = "l" & Chr(242) 'L-dot below IsConsonant = 1 Case &H0935 TempTranslit = "v" IsConsonant = 1 'Sibilants Case &H0936 TempTranslit = "s" & Chr(226) 'S-acute IsConsonant = 1 Case &H0937 TempTranslit = "sh" IsConsonant = 1 Case &H0938 TempTranslit = "s" 'If nNextHex = &H093C Then TempTranslit = "s" & Chr(243) 'S-double-dot-below IsConsonant = 1 'Preconstructed consonants + Nukta dot 'Case &H0958 'Sa+Nukta ' TempTranslit = "s" & CHr(243) 'S-double-dot-below ' IsConsonant = 1 'Aspirate Case &H0939 TempTranslit = "h" If nNextHex = &H093C Then TempTranslit = "h" & Chr(243) 'H-double-dot-below IsConsonant = 1 'Anusvaara Case &H0902 Select Case nNextHex Case &H0915 To &H0919, &H0958 To &H095A 'Gutturals TempTranslit = "n" & Chr(231) 'N-superior-dot Case &H091A To &H091E, &H095B 'Palatals TempTranslit = "n" & Chr(229) 'N-macron Case &H091F To &H0923, &H095C To &H095D 'Cerebrals TempTranslit = "n" & Chr(242) 'N-dot-below Case &H0924 To &H0928 'Dentals TempTranslit = "n" Case &H092A To &H092E, &H095E 'Labials TempTranslit = "m" Case Else TempTranslit = Chr(228) 'Tilde End Select 'Anunaasika 'Case &H0901 ' Select Case nNextHex ' Case &H0915 To &H0919, &H0958 To &H095A, &H091A To &H091E, &H095B, &H091F To &H0923, &H095C To &H095D, &H0924 To &H0928 ' TempTranslit = "n" & Chr(239) 'N-candrabindu ' Case Else ' TempTranslit = "m" & Chr(239) 'M-candrabindu ' End Select 'Visarga Case &H0901 TempTranslit = "h" & Chr(242) 'H-dot-below 'Punctuation & Numbers Case &H093D 'Avagraha TempTranslit = "'" Case &H0964 'Danda TempTranslit = "," Case &H0965 'Double danda TempTranslit = "." Case &H0966 TempTranslit = "0" Case &H0967 TempTranslit = "1" Case &H0968 TempTranslit = "2" Case &H0969 TempTranslit = "3" Case &H096A TempTranslit = "4" Case &H096B TempTranslit = "5" Case &H096C TempTranslit = "6" Case &H096D TempTranslit = "7" Case &H096E TempTranslit = "8" Case &H096F TempTranslit = "9" Case Else 'Unknown/non-Marathi character TempTranslit= Chr(252) ' Select Case nNextHex ' Case &H1112 ' TempTranslit = "lkʻ" ' arrChars(nPos + 1) = "�" ' End Select End Select If IsConsonant = 1 Then Select Case nNextHex Case &H093E To &H094C, &H0962 'Do nothing; vowel follows Case &H094D 'Do nothing; consonant ligature follows Case Else 'Add the implicit "a" TempTranslit = TempTranslit & "a" End Select End If TransMarathi = TempTranslit End Function '############################################################################## Function TransSanskrit(sChar As String, sNextChar As String, nPos As Variant) As String Dim sHex As String Dim nHex As Integer Dim TempTranslit As String Dim sNextHex As String Dim nNextHex As Long Dim IsConsonant As Integer IsConsonant = 0 sHex = Mid(sChar, 4, Len(sChar) - 2) nHex = Val("&H" & sHex) sNextHex = Mid(sNextChar, 4, Len(sNextChar) - 1) nNextHex = Val("&H" & sNextHex) Select Case nHex 'Vowels Case &H0905 TempTranslit = "a" Case &H0906, &H093E TempTranslit = "a" & Chr(229) 'A-macron Case &H0907, &H093F TempTranslit = "i" Case &H0908, &H0940 TempTranslit = "i" & Chr(229) 'I-macron Case &H0909, &H0941 TempTranslit = "u" Case &H090A, &H0942 TempTranslit = "u" & Chr(229) 'U-macron Case &H090B, &H0943 TempTranslit = "r" & Chr(244) 'R-circle-below Case &H0960, &H0944 TempTranslit = "r" & Chr(229) & Chr(244) 'R-macron-circle-below Case &H090C, &H0962 TempTranslit = "l" & Chr(244) 'L-circle-below 'Case &H090E, &H0946 ' TempTranslit = "e" & Chr(230) 'E-breve Case &H090F, &H0947 TempTranslit = "e" 'Case &H090D, &H0945 ' TempTranslit = "e" & Chr(227) 'E-circumflex Case &H0910, &H0948 TempTranslit = "ai" 'Case &H0912, &H094A ' TempTranslit = "o" & Chr(230) 'O-breve Case &H0913, &H094B TempTranslit = "o" 'Case &H0911, &H0949 ' TempTranslit = "o" & Chr(227) 'O-circumflex Case &H0914, &H094C TempTranslit = "au" 'Case &H0975, &H094F 'Note: not in ALA Unicode MS; used for Kashmiri ' TempTranslit = "a" & Chr(230) & "u" 'A-breve u 'Consonants 'Gutturals Case &H0915 TempTranslit = "k" 'If nNextHex = &H093C Then TempTranslit = "q" IsConsonant = 1 Case &H0916 TempTranslit = "kh" 'If nNextHex = &H093C Then TempTranslit = "k" & Chr(246) & "h" & Chr(246) 'KH-underscore IsConsonant = 1 Case &H0917 TempTranslit = "g" 'If nNextHex = &H093C Then TempTranslit = "g" & Chr(246) & "h" & Chr(246) 'GH-underscore IsConsonant = 1 Case &H0918 TempTranslit = "gh" 'If nNextHex = &H093C Then TempTranslit = "g" & Chr(245) & "h" & Chr(245) 'GH-double-underscore IsConsonant = 1 Case &H0919 TempTranslit = "n" & Chr(231) 'n-superior-dot IsConsonant = 1 'Preconstructed consonants + Nukta dot 'Case &H0958 'Ka+Nukta ' TempTranslit = "q" ' IsConsonant = 1 'Case &H0959 'Kha+Nukta ' TempTranslit = "k" & Chr(246) & "h" & Chr(246) 'KH-underscore ' IsConsonant = 1 'Case &H095A 'Ga+Nukta ' TempTranslit = "g" & Chr(246) & "h" & Chr(246) 'GH-underscore ' IsConsonant = 1 'Palatals Case &H091A TempTranslit = "c" IsConsonant = 1 Case &H091B TempTranslit = "ch" IsConsonant = 1 Case &H091C TempTranslit = "j" 'If nNextHex = &H093C Then TempTranslit = "z" IsConsonant = 1 Case &H091D TempTranslit = "jh" IsConsonant = 1 Case &H091E TempTranslit = "n" & Chr(228) 'N-tilde IsConsonant = 1 'Preconstructed consonants + Nukta dot 'Case &H095B 'Ja+Nukta ' TempTranslit = "z" ' IsConsonant = 1 'Cerebrals Case &H091F TempTranslit = "t" & Chr(242) 'T-dot-below 'If nNextHex = &H093C Then TempTranslit = "t" & Chr(243) 'T-double-dot-below IsConsonant = 1 Case &H0920 TempTranslit = "t" & Chr(242) & "h" 'T-dot-below h IsConsonant = 1 Case &H0921 TempTranslit = "d" & Chr(242) 'D-dot-below 'If nNextHex = &H093C Then TempTranslit = "r" & Chr(242) 'R-dot-below IsConsonant = 1 Case &H0922 TempTranslit = "d" & Chr(242) & "h" 'D-dot-below h 'If nNextHex = &H093C Then TempTranslit = "r" & Chr(242) & "h" 'R-dot-below h IsConsonant = 1 Case &H0923 TempTranslit = "n" & Chr(242) 'N-dot-below IsConsonant = 1 'Preconstructed consonants + Nukta dot 'Case &H095C 'D-dot-below-a+Nukta ' TempTranslit = "r" & Chr(242) 'R-dot-below ' IsConsonant = 1 'Case &H095D 'D-dot-below-ha+Nukta ' TempTranslit = "r" & Chr(242) & "h" 'R-dot-below h ' IsConsonant = 1 'Dentals Case &H0924 TempTranslit = "t" IsConsonant = 1 Case &H0925 TempTranslit = "th" IsConsonant = 1 Case &H0926 TempTranslit = "d" IsConsonant = 1 Case &H0927 TempTranslit = "dh" IsConsonant = 1 Case &H0928 TempTranslit = "n" IsConsonant = 1 'Labials Case &H092A TempTranslit = "p" IsConsonant = 1 Case &H092B TempTranslit = "ph" 'If nNextHex = &H093C Then TempTranslit = "f" IsConsonant = 1 Case &H092C TempTranslit = "b" IsConsonant = 1 Case &H092D TempTranslit = "bh" IsConsonant = 1 Case &H092E TempTranslit = "m" IsConsonant = 1 'Preconstructed consonants + Nukta dot 'Case &H095E 'Pha+Nukta ' TempTranslit = "f" ' IsConsonant = 1 'Semivowels Case &H092F TempTranslit = "y" IsConsonant = 1 Case &H0930 TempTranslit = "r" IsConsonant = 1 Case &H0932 TempTranslit = "l" IsConsonant = 1 Case &H0933 TempTranslit = "l" & Chr(246) 'L-underscore IsConsonant = 1 Case &H0935 TempTranslit = "v" IsConsonant = 1 'Sibilants Case &H0936 TempTranslit = "s" & Chr(226) 'S-acute IsConsonant = 1 Case &H0937 TempTranslit = "s" & Chr(242) 'S-dot below IsConsonant = 1 Case &H0938 TempTranslit = "s" 'If nNextHex = &H093C Then TempTranslit = "s" & Chr(243) 'S-double-dot-below IsConsonant = 1 'Preconstructed consonants + Nukta dot 'Case &H0958 'Sa+Nukta ' TempTranslit = "s" & CHr(243) 'S-double-dot-below ' IsConsonant = 1 'Aspirate Case &H0939 TempTranslit = "h" If nNextHex = &H093C Then TempTranslit = "h" & Chr(243) 'H-double-dot-below IsConsonant = 1 'Anusvaara Case &H0902 Select Case nNextHex Case &H0915 To &H0919, &H0958 To &H095A 'Gutturals TempTranslit = "n" & Chr(231) 'N-superior-dot Case &H091A To &H091E, &H095B 'Palatals TempTranslit = "n" & Chr(229) 'N-macron Case &H091F To &H0923, &H095C To &H095D 'Cerebrals TempTranslit = "n" & Chr(242) 'N-dot-below Case &H0924 To &H0928 'Dentals TempTranslit = "n" Case &H092A To &H092E, &H095E 'Labials TempTranslit = "m" Case Else TempTranslit = "m" & Chr(242) 'M-dot-below End Select 'Anunaasika Case &H0901 'Select Case nNextHex ' Case &H0915 To &H0919, &H0958 To &H095A, &H091A To &H091E, &H095B, &H091F To &H0923, &H095C To &H095D, &H0924 To &H0928 ' TempTranslit = "n" & Chr(239) 'N-candrabindu ' Case Else TempTranslit = "m" & Chr(239) 'M-candrabindu 'End Select 'Visarga Case &H0901 TempTranslit = "h" & Chr(242) 'H-dot-below 'Jihvamuliya 'Case ???? Not a valid Unicode character ' TempTranslit = "h" & Chr(245) 'U-underscore 'Upadmaniya Case &H1CF2 TempTranslit = "h" & Chr(249) 'U-upadmaniya 'Punctuation & Numbers Case &H093D 'Avagraha TempTranslit = "'" Case &H0964 'Danda TempTranslit = "," Case &H0965 'Double danda TempTranslit = "." Case &H0966 TempTranslit = "0" Case &H0967 TempTranslit = "1" Case &H0968 TempTranslit = "2" Case &H0969 TempTranslit = "3" Case &H096A TempTranslit = "4" Case &H096B TempTranslit = "5" Case &H096C TempTranslit = "6" Case &H096D TempTranslit = "7" Case &H096E TempTranslit = "8" Case &H096F TempTranslit = "9" Case Else 'Unknown/non-Sanskrit or -Prakrit character TempTranslit= Chr(252) ' Select Case nNextHex ' Case &H1112 ' TempTranslit = "lkʻ" ' arrChars(nPos + 1) = "�" ' End Select End Select If IsConsonant = 1 Then Select Case nNextHex Case &H093E To &H094C, &H0962 'Do nothing; vowel follows Case &H094D 'Do nothing; consonant ligature follows Case Else 'Add the implicit "a" TempTranslit = TempTranslit & "a" End Select End If TransSanskrit = TempTranslit End Function '############################################################################## 'Function GetWord(nPos, nStart, nStop) As String ' Dim i ' Dim sTempWord As String ' sTempWord = "" ' i = nStart ' Do While i <= nStop ' sTempWord = sTempWord & arrChars(nPos + i) ' i = i + 1 ' Loop ' GetWord = sTempWord 'End Function '############################################################################## Function IsDevaChar(sNCR) As Integer Dim b b = Mid(sNCR, 1, 6) If Len(sNCR) = 6 And (Mid(sNCR, 1, 6) Like "&[#]x09[0-7]") Then IsDevaChar = 1 Else IsDevaChar = 0 End If End Function