module GF.Text.Transliterations (
  transliterate,
  transliterateWithFile,
  transliteration,
  characterTable,
  transliterationPrintNames
  ) where

import Data.Char
import Numeric
import qualified Data.Map as Map

-- transliterations between ASCII and a Unicode character set

-- current transliterations: devanagari, thai

-- to add a new one: define the Unicode range and the corresponding ASCII strings,
-- which may be one or more characters long

-- conventions to be followed:
--   each character is either [letter] or [letter+nonletters]
--   when using a sparse range of unicodes, mark missing codes as "-" in transliterations
--   characters can be invisible: ignored in translation to unicode

transliterate :: String -> Maybe (String -> String)
transliterate :: String -> Maybe (String -> String)
transliterate String
s = case String
s of
  Char
'f':Char
'r':Char
'o':Char
'm':Char
'_':String
t -> (Transliteration -> String -> String)
-> Maybe Transliteration -> Maybe (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Transliteration -> String -> String
appTransFromUnicode (Maybe Transliteration -> Maybe (String -> String))
-> Maybe Transliteration -> Maybe (String -> String)
forall a b. (a -> b) -> a -> b
$ String -> Maybe Transliteration
transliteration String
t
  Char
't':Char
'o':Char
'_':String
t -> (Transliteration -> String -> String)
-> Maybe Transliteration -> Maybe (String -> String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Transliteration -> String -> String
appTransToUnicode (Maybe Transliteration -> Maybe (String -> String))
-> Maybe Transliteration -> Maybe (String -> String)
forall a b. (a -> b) -> a -> b
$ String -> Maybe Transliteration
transliteration String
t
  String
_ -> Maybe (String -> String)
forall a. Maybe a
Nothing

transliterateWithFile :: String -> String -> Bool -> (String -> String)
transliterateWithFile :: String -> String -> Bool -> String -> String
transliterateWithFile String
name String
src Bool
isFrom =
  (if Bool
isFrom then Transliteration -> String -> String
appTransFromUnicode else Transliteration -> String -> String
appTransToUnicode) (String -> String -> Transliteration
getTransliterationFile String
name String
src)

transliteration :: String -> Maybe Transliteration
transliteration :: String -> Maybe Transliteration
transliteration String
s = String -> Map String Transliteration -> Maybe Transliteration
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup String
s Map String Transliteration
allTransliterations

allTransliterations :: Map String Transliteration
allTransliterations = [(String, Transliteration)] -> Map String Transliteration
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [
  (String
"amharic",Transliteration
transAmharic),
  (String
"ancientgreek", Transliteration
transAncientGreek),
  (String
"arabic", Transliteration
transArabic),
  (String
"arabic_unvocalized", Transliteration
transArabicUnvoc),
  (String
"devanagari", Transliteration
transDevanagari),
  (String
"greek", Transliteration
transGreek),
  (String
"hebrew", Transliteration
transHebrew),
  (String
"persian", Transliteration
transPersian),
  (String
"sanskrit", Transliteration
transSanskrit),
  (String
"sindhi", Transliteration
transSindhi),
  (String
"nepali", Transliteration
transNepali),
  (String
"telugu", Transliteration
transTelugu),
  (String
"thai", Transliteration
transThai),
  (String
"urdu", Transliteration
transUrdu)
 ]

-- used in command options and help
transliterationPrintNames :: [(String, String)]
transliterationPrintNames = [(String
t,Transliteration -> String
printname Transliteration
p) | (String
t,Transliteration
p) <- Map String Transliteration -> [(String, Transliteration)]
forall k a. Map k a -> [(k, a)]
Map.toList Map String Transliteration
allTransliterations]

characterTable :: Transliteration -> String
characterTable :: Transliteration -> String
characterTable = [String] -> String
unlines ([String] -> String)
-> (Transliteration -> [String]) -> Transliteration -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, String) -> String) -> [(Int, String)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (Int, String) -> String
prOne ([(Int, String)] -> [String])
-> (Transliteration -> [(Int, String)])
-> Transliteration
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map Int String -> [(Int, String)]
forall k a. Map k a -> [(k, a)]
Map.assocs (Map Int String -> [(Int, String)])
-> (Transliteration -> Map Int String)
-> Transliteration
-> [(Int, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Transliteration -> Map Int String
trans_from_unicode where
  prOne :: (Int, String) -> String
prOne (Int
i,String
s) = [String] -> String
unwords [String
"|", Int -> String -> String
forall a. (Integral a, Show a) => a -> String -> String
showHex Int
i String
"", String
"|", [Int -> Char
forall a. Enum a => Int -> a
toEnum Int
i], String
"|", String
s, String
"|"]

data Transliteration = Trans {
  Transliteration -> Map String Int
trans_to_unicode   :: Map.Map String Int,
  Transliteration -> Map Int String
trans_from_unicode :: Map.Map Int String,
  Transliteration -> [String]
invisible_chars    :: [String],
  Transliteration -> String
printname          :: String
  }

appTransToUnicode :: Transliteration -> String -> String
appTransToUnicode :: Transliteration -> String -> String
appTransToUnicode Transliteration
trans =
  [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String) -> (String -> [String]) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\String
c -> String -> (Int -> String) -> Maybe Int -> String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe String
c (Char -> String
forall (m :: * -> *) a. Monad m => a -> m a
return (Char -> String) -> (Int -> Char) -> Int -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Char
forall a. Enum a => Int -> a
toEnum) (Maybe Int -> String) -> Maybe Int -> String
forall a b. (a -> b) -> a -> b
$
             String -> Map String Int -> Maybe Int
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup String
c (Transliteration -> Map String Int
trans_to_unicode Transliteration
trans)
      ) ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter ((String -> [String] -> Bool) -> [String] -> String -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem (Transliteration -> [String]
invisible_chars Transliteration
trans)) ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  String -> [String]
unchar

appTransFromUnicode :: Transliteration -> String -> String
appTransFromUnicode :: Transliteration -> String -> String
appTransFromUnicode Transliteration
trans =
  [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String) -> (String -> [String]) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  (Int -> String) -> [Int] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
c -> String -> (String -> String) -> Maybe String -> String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [Int -> Char
forall a. Enum a => Int -> a
toEnum Int
c] String -> String
forall a. a -> a
id (Maybe String -> String) -> Maybe String -> String
forall a b. (a -> b) -> a -> b
$
             Int -> Map Int String -> Maybe String
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Int
c (Transliteration -> Map Int String
trans_from_unicode Transliteration
trans)
      ) ([Int] -> [String]) -> (String -> [Int]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  (Char -> Int) -> String -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map Char -> Int
forall a. Enum a => a -> Int
fromEnum


mkTransliteration :: String -> [String] -> [Int] -> Transliteration
mkTransliteration :: String -> [String] -> [Int] -> Transliteration
mkTransliteration String
name [String]
ts [Int]
us =
 Map String Int
-> Map Int String -> [String] -> String -> Transliteration
Trans ([(String, Int)] -> Map String Int
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([String] -> [Int] -> [(String, Int)]
forall b. [String] -> [b] -> [(String, b)]
tzip [String]
ts [Int]
us)) ([(Int, String)] -> Map Int String
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([Int] -> [String] -> [(Int, String)]
forall a. [a] -> [String] -> [(a, String)]
uzip [Int]
us [String]
ts)) [] String
name
  where
    tzip :: [String] -> [b] -> [(String, b)]
tzip [String]
ts [b]
us = [(String
t,b
u) | (String
t,b
u) <- [String] -> [b] -> [(String, b)]
forall a b. [a] -> [b] -> [(a, b)]
zip [String]
ts [b]
us, String
t String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
"-"]
    uzip :: [a] -> [String] -> [(a, String)]
uzip [a]
us [String]
ts = [(a
u,String
t) | (a
u,String
t) <- [a] -> [String] -> [(a, String)]
forall a b. [a] -> [b] -> [(a, b)]
zip [a]
us [String]
ts, String
t String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
"-"]

getTransliterationFile :: String -> String -> Transliteration
getTransliterationFile :: String -> String -> Transliteration
getTransliterationFile String
name = ([String] -> [Int] -> Transliteration)
-> ([String], [Int]) -> Transliteration
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry (String -> [String] -> [Int] -> Transliteration
mkTransliteration String
name) (([String], [Int]) -> Transliteration)
-> (String -> ([String], [Int])) -> String -> Transliteration
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ([String], [Int])
codes
 where
  codes :: String -> ([String], [Int])
codes = [(String, Int)] -> ([String], [Int])
forall a b. [(a, b)] -> ([a], [b])
unzip ([(String, Int)] -> ([String], [Int]))
-> (String -> [(String, Int)]) -> String -> ([String], [Int])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> (String, Int)) -> [String] -> [(String, Int)]
forall a b. (a -> b) -> [a] -> [b]
map ([String] -> (String, Int)
mkOne ([String] -> (String, Int))
-> (String -> [String]) -> String -> (String, Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words) ([String] -> [(String, Int)])
-> (String -> [String]) -> String -> [(String, Int)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isSpace) ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines
  mkOne :: [String] -> (String, Int)
mkOne [String]
ws = case [String]
ws of
    [Char
c]:String
t:[String]
_ -> (String
t,Char -> Int
forall a. Enum a => a -> Int
fromEnum Char
c)  -- ä a:
    String
u:String
t:[String]
_   -> (String
t,String -> Int
forall a. Read a => String -> a
read String
u)      -- 228 a: OR 0xe4
    [String]
_ -> String -> (String, Int)
forall a. HasCallStack => String -> a
error (String -> (String, Int)) -> String -> (String, Int)
forall a b. (a -> b) -> a -> b
$ String
"not a valid transliteration:" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
unwords [String]
ws

unchar :: String -> [String]
unchar :: String -> [String]
unchar String
s = case String
s of
  Char
c:Char
d:String
cs
   | Char -> Bool
isAlpha Char
d -> [Char
c]    String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String -> [String]
unchar (Char
dChar -> String -> String
forall a. a -> [a] -> [a]
:String
cs)
   | Char -> Bool
isSpace Char
d -> [Char
c]String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[Char
d]String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String -> [String]
unchar String
cs
   | Bool
otherwise -> let (String
ds,String
cs2) = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (\Char
x -> Char -> Bool
isAlpha Char
x Bool -> Bool -> Bool
|| Char -> Bool
isSpace Char
x) String
cs in
                  (Char
cChar -> String -> String
forall a. a -> [a] -> [a]
:Char
dChar -> String -> String
forall a. a -> [a] -> [a]
:String
ds) String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String -> [String]
unchar String
cs2
  [Char
_]          -> [String
s]
  String
_            -> []

transThai :: Transliteration
transThai :: Transliteration
transThai = String -> [String] -> [Int] -> Transliteration
mkTransliteration String
"Thai" [String]
allTrans [Int]
allCodes where
  allTrans :: [String]
allTrans = String -> [String]
words (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
    String
"-  k  k1 -  k2 -  k3 g  c  c1 c2 s' c3 y' d' t' " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"t1 t2 t3 n' d  t  t4 t5 t6 n  b  p  p1 f  p2 f' " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"p3 m  y  r  -  l  -  w  s- s. s  h  l' O  h' -  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"a. a  a: a+ i  i: v  v: u  u: -  -  -  -  -  -  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"e  e' o: a% a& L  R  S  T1 T2 T3 T4 K  -  -  -  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"N0 N1 N2 N3 N4 N5 N6 N7 N8 N9 -  -  -  -  -  -  "
  allCodes :: [Int]
allCodes = [Int
0x0e00 .. Int
0x0e7f]

transDevanagari :: Transliteration
transDevanagari :: Transliteration
transDevanagari =
  (String -> [String] -> [Int] -> Transliteration
mkTransliteration String
"Devanagari"
    [String]
allTransUrduHindi [Int]
allCodes){invisible_chars :: [String]
invisible_chars = [String
"a"]} where
      allCodes :: [Int]
allCodes = [Int
0x0900 .. Int
0x095f] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x0966 .. Int
0x096f]

allTransUrduHindi :: [String]
allTransUrduHindi = String -> [String]
words (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
    String
"-  n~ m. h.  -  A A: I I: U U: r.- l.-  -  -  E: " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"E+ -  -  O: O+ k  k'  g  g'  n- c  c'  j  j'  n* T " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"T' D D' N t  t'  d  d'  n  -  p  p'  b  b'  m  y  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"r  -  l  L  -  v  s*  S  s  h  -  -  X~ -  a:  i  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"i:  u  u:  r.  l.  -  -  e:  e+  -  -  o:  o+  X,  -  -  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"-  -  -  -  -  -  -  -  q  x  g.  z  R R'  f  -  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"N0 N1 N2 N3 N4 N5 N6 N7 N8 N9 "


transUrdu :: Transliteration
transUrdu :: Transliteration
transUrdu =
  (String -> [String] -> [Int] -> Transliteration
mkTransliteration String
"Urdu" [String]
allTrans [Int]
allCodes) where
    allCodes :: [Int]
allCodes = [Int
0x0622 .. Int
0x062f] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x0630 .. Int
0x063a] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x0641,Int
0x0642] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x06A9] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x0644 .. Int
0x0648] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++
               [Int
0x0654,Int
0x0658,Int
0x0679,Int
0x067e,Int
0x0686,Int
0x0688,Int
0x0691,Int
0x0698,Int
0x06af,Int
0x06c1,Int
0x06c3,Int
0x06cc,Int
0x06ba,Int
0x06be,Int
0x06d2] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++
               [Int
0x06f0 .. Int
0x06f9] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x061f,Int
0x06D4]
    allTrans :: [String]
allTrans = String -> [String]
words (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
      String
"A - w^ - y^ a b - t C j H K d " String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0622 - 062f
      String
"Z r z s X S Z- t- z- e G "   String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0630 - 063a
      String
"f q k l m n - w "    String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0641, 0642, 0643 - 0648
      String
"$ n- T p c D R x g h t: y N h' E " String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0654,658,679,67e,686,688,698,6af,6c1,6c3,6cc,6ba,6be,6d2
      String
"N0 N1 N2 N3 N4 N5 N6 N7 N8 N9 " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"? ."

transSindhi :: Transliteration
transSindhi :: Transliteration
transSindhi =
  (String -> [String] -> [Int] -> Transliteration
mkTransliteration String
"Sindhi" [String]
allTrans [Int]
allCodes) where
    allCodes :: [Int]
allCodes = [Int
0x062e] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x0627 .. Int
0x062f] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x0630 .. Int
0x063a] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x0641 .. Int
0x0648] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++
               [Int
0x067a,Int
0x067b,Int
0x067d,Int
0x067e,Int
0x067f] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x0680 .. Int
0x068f] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++
               [Int
0x0699,Int
0x0918,Int
0x06a6,Int
0x061d,Int
0x06a9,Int
0x06af,Int
0x06b3,Int
0x06bb,Int
0x06be,Int
0x06f6,Int
0x064a,Int
0x06b1, Int
0x06aa, Int
0x06fd, Int
0x06fe] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++
               [Int
0x06f0 .. Int
0x06f9] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x061f,Int
0x06D4]
    allTrans :: [String]
allTrans = String -> [String]
words (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
      String
"K a b - t C j H - d " String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0626 - 062f
      String
"Z r z s X S Z- t- z- e G "   String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0630 - 063a
      String
"f q - L m n - W "    String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0641 - 0648
      String
"T! B T p T' " String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 067a,067b,067d,067e,067f
      String
"B' - - Y' J' - c c' - - d! - d' D - D' " String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0680 - 068f
      String
"R - F' - k' g G' t' h' e' y c! k A M " String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0699, 0918, 06a6, 061d, 06a9,06af,06b3,06bb,06be,06f6,06cc,06b1
      String
"N0 N1 N2 N3 N4 N5 N6 N7 N8 N9 " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"? ."



transArabic :: Transliteration
transArabic :: Transliteration
transArabic = String -> [String] -> [Int] -> Transliteration
mkTransliteration String
"Arabic" [String]
allTrans [Int]
allCodes where
  allTrans :: [String]
allTrans = String -> [String]
words (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
    String
"   V  A: A? w? A- y? A  b  t. t  v  g  H  K  d " String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0621 - 062f
    String
"W  r  z  s  C S  D  T  Z  c  G "                 String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0630 - 063a
    String
"   f  q  k  l  m  n  h  w  y. y a. u. i. a  u "  String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0641 - 064f
    String
"i  v2 o  a: V+ V- i: a+ "                        String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0650 - 0657
    String
"A*  q?"                                              -- 0671 (used by AED)
  allCodes :: [Int]
allCodes = [Int
0x0621..Int
0x062f] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x0630..Int
0x063a] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++
             [Int
0x0641..Int
0x064f] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x0650..Int
0x0657] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x0671,Int
0x061f]


transArabicUnvoc :: Transliteration
transArabicUnvoc :: Transliteration
transArabicUnvoc = Transliteration
transArabic{
  invisible_chars :: [String]
invisible_chars = [String
"a",String
"u",String
"i",String
"v2",String
"o",String
"V+",String
"V-",String
"a:"],
  printname :: String
printname = String
"unvocalized Arabic"
  }

transPersian :: Transliteration
transPersian :: Transliteration
transPersian = (String -> [String] -> [Int] -> Transliteration
mkTransliteration String
"Persian/Farsi" [String]
allTrans [Int]
allCodes)
    {invisible_chars :: [String]
invisible_chars = [String
"a",String
"u",String
"i"]} where
  allTrans :: [String]
allTrans = String -> [String]
words (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
    String
"   V  A: A? w? A- y? A  b  t. t  t-  j  H  K  d " String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0621 - 062f
    String
"W  r  z  s  C  S  D  T  Z  c  G "                 String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0630 - 063a
    String
"   f  q  -  l  m  n  h  v  -  y. a. u. i. a  u "   String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 0640 - 064f
    String
"i  v2 o  a: V+ V- i: a+ " String -> String -> String
forall a. [a] -> [a] -> [a]
++                          -- 0650 - 0657
    String
"p  c^ J  k  g  y q? Z0"
  allCodes :: [Int]
allCodes = [Int
0x0621..Int
0x062f] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x0630..Int
0x063a] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++
             [Int
0x0641..Int
0x064f] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x0650..Int
0x0657] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++
             [Int
0x067e,Int
0x0686,Int
0x0698,Int
0x06a9,Int
0x06af,Int
0x06cc,Int
0x061f,Int
0x200c]

transNepali :: Transliteration
transNepali :: Transliteration
transNepali = String -> [String] -> [Int] -> Transliteration
mkTransliteration String
"Nepali" [String]
allTrans [Int]
allCodes where
  allTrans :: [String]
allTrans = String -> [String]
words (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
    String
"z+  z= " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"-  V  M  h: -  H  A  i: I: f  F  Z  -  -  -  e: " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"E: -  -  O  W  k  K  g  G  n: C  c  j  J  Y  q  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"Q  x  X  N  t  T  d  D  n  -  p  P  b  B  m  y  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"r  -  l  L  -  v  S  z  s  h  -  -  ~  `  a  i  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"I  u  U  R  -  -  -  e  E  -  -  o  w  x: -  -  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"O: -  _  -  -  -  -  -  -  -  -  -  -  -  -  -  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"-  -  -  -  .  >  0  1  2  3  4  5  6  7  8  9  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"-  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  "
  allCodes :: [Int]
allCodes = [Int
0x200c,Int
0x200d] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x0900 .. Int
0x097f]


transHebrew :: Transliteration
transHebrew :: Transliteration
transHebrew = String -> [String] -> [Int] -> Transliteration
mkTransliteration String
"unvocalized Hebrew" [String]
allTrans [Int]
allCodes where
  allTrans :: [String]
allTrans = String -> [String]
words (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
    String
"A  b  g  d  h  w  z  H  T  y  K  k  l  M  m  N " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"n  S  O  P  p  Z. Z  q  r  s  t  -  -  -  -  - " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"w2 w3 y2 g1 g2"
  allCodes :: [Int]
allCodes = [Int
0x05d0..Int
0x05f4]

transTelugu :: Transliteration
transTelugu :: Transliteration
transTelugu = String -> [String] -> [Int] -> Transliteration
mkTransliteration String
"Telugu" [String]
allTrans [Int]
allCodes where
  allTrans :: [String]
allTrans = String -> [String]
words (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
    String
"-  c1 c2 c3 -  A  A: I  I: U  U: R_ L_ -  E  E: " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"A' -  O  O: A_ k  k. g  g. n. c  c. j  j. n' T  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"T. d  d. N  t  t. d  d. n  -  p  p. b  b. m  y  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"r  R  l  L  -  v  s' S  s  h  -  -  -  c5 a: i  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"i: u  u: r_ r. -  e  e: a' -  o  o: a_ c6 -  -  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"-  -  -  -  -  c7 c8 z  Z  -  -  -  -  -  -  -  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"R+ L+ l+ l* -  -  n0 n1 n2 n3 n4 n5 n6 n7 n8 n9 "
  allCodes :: [Int]
allCodes = [Int
0x0c00 .. Int
0x0c7f]

transGreek :: Transliteration
transGreek :: Transliteration
transGreek = String -> [String] -> [Int] -> Transliteration
mkTransliteration String
"modern Greek" [String]
allTrans [Int]
allCodes where
  allTrans :: [String]
allTrans = String -> [String]
words (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
    String
"-  -  -  -  -  -  A' -  E' H' I' -  O' -  Y' W' " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"i= A  B  G  D  E  Z  H  V  I  K  L  M  N  X  O  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"P  R  -  S  T  Y  F  C  Q  W  I- Y- a' e' h' i' " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"y= a  b  g  d  e  z  h  v  i  k  l  m  n  x  o  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"p  r  s* s  t  y  f  c  q  w  i- y- o' y' w' -  "
  allCodes :: [Int]
allCodes = [Int
0x0380 .. Int
0x03cf]

transAncientGreek :: Transliteration
transAncientGreek :: Transliteration
transAncientGreek = String -> [String] -> [Int] -> Transliteration
mkTransliteration String
"ancient Greek" [String]
allTrans [Int]
allCodes where
 allTrans :: [String]
allTrans = String -> [String]
words (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
--   "-  -  -  -  -  -  -  c: -  -  -  -  -  -  -  - " ++  -- standard code point for colon: 00B7
   String
"-  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - " String -> String -> String
forall a. [a] -> [a] -> [a]
++
   String
"i= A  B  G  D  E  Z  H  V  I  K  L  M  N  X  O  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
   String
"P  R  -  S  T  Y  F  C  Q  W  I- Y- -  -  -  -  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
   String
"y= a  b  g  d  e  z  h  v  i  k  l  m  n  x  o  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
   String
"p  r  s* s  t  y  f  c  q  w  i- y- -  -  -  -  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
   String
"a)  a(  a)` a(` a)' a(' a)~ a(~ A)  A(  A)` A(` A)' A(' A)~ A(~ " String -> String -> String
forall a. [a] -> [a] -> [a]
++  -- 1f00-1f09,1f0a-1f0f
   String
"e)  e(  e)` e(` e)' e(' -   -   E)  E(  E)` E(` E)' E(' -   -   " String -> String -> String
forall a. [a] -> [a] -> [a]
++
   String
"h)  h(  h)` h(` h)' h(' h)~ h(~ H)  H(  H)` H(` H)' H(' H)~ H(~ " String -> String -> String
forall a. [a] -> [a] -> [a]
++
   String
"i)  i(  i)` i(` i)' i(' i)~ i(~ I)  I(  I)` I(` I)' I(' I)~ I(~ " String -> String -> String
forall a. [a] -> [a] -> [a]
++
   String
"o)  o(  o)` o(` o)' o(' -   -   O)  O(  O)` O(` O)' O(' -   -   " String -> String -> String
forall a. [a] -> [a] -> [a]
++
   String
"y)  y(  y)` y(` y)' y(' y)~ y(~ -   Y(  -   Y(` -   Y(' -   Y(~ " String -> String -> String
forall a. [a] -> [a] -> [a]
++
   String
"w)  w(  w)` w(` w)' w(' w)~ w(~ W)  W(  W)` W(` W)' W(' W)~ W(~ " String -> String -> String
forall a. [a] -> [a] -> [a]
++
   String
"a`  a'  e`  e'  h`  h'  i`  i'  o`  o'  y`  y'  w`  w'  -   -   " String -> String -> String
forall a. [a] -> [a] -> [a]
++
   String
"a|) a|( a|)` a|(` a|)' a|(' a|)~ a|(~ - - - - - - - - " String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- 1f80-
   String
"h|) h|( h|)` h|(` h|)' h|(' h|)~ h|(~ - - - - - - - - " String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- 1f90-
   String
"w|) w|( w|)` w|(` w|)' w|(' w|)~ w|(~ - - - - - - - - " String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- 1fa0-
   String
"a.  a_  a|` a|  a|'  -  a~ a|~ - - - - - - - - " String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- 1fb0-
   String
"-  -  h|` h|  h|'  -  h~ h|~ - - - - - - - - " String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- 1fc0-
   String
"i. i_ i=` i=' -    -  i~ i=~ - - - - - - - - " String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- 1fd0-
   String
"y. y_ y=` y=' r)   r( y~ y=~ - - - - - - - - " String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- 1fe0-
   String
"-  -  w|` w|  w|'  -  w~ w|~ - - - - - - - - " String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- 1ff0-
   -- HL, Private Use Area Code Points (New Athena Unicode, Cardo, ALPHABETUM, Antioch)
   -- see: http://apagreekkeys.org/technicalDetails.html
   --      GreekKeys Support by Donald Mastronarde
   String
"- - - - - - - - - e. o. R) Y) Y)` Y)' Y)~ "    String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- e1a0-e1af
   String
"e~ e)~ e(~ e_ e_' e_` e_) e_( e_)` e_(` e_)' e_(' E)~ E(~ E_ E. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- e1b0-e1bf
   String
"o~ o)~ o(~ o_ o_' o_` o_) o_( o_)` o_(` o_)' o_(' O)~ O(~ O_ O. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- e1c0-e1cf
   String
"a_` - a_~ a_)` a_(` a_)~ a_(~ - a.` a.) a.)` a.(' a.(` - - - "    String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- eaf0-eaff
   String
"a_' - - - a_) a_( - a_)' - a_(' a.' a.( a.)' - - - "              String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- eb00-eb0f
   String
"e_)~ e_(~ - - - - - e_~ - - - - - - - - "                         String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- eb20-eb2f
   String
"- - - - - - i_~ - i_` i_' - - i_) i_)' i_( i_(' "                 String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- eb30-eb3f
   String
"i.' i.) i.)' i.( i.` i.)` - i.(' i.(` - - - - - - - "             String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- eb40-eb4f
   String
"- - - - i_)` i_(` - i_)~ i_(~ - o_~ o_)~ o_(~ - - - "             String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- eb50-eb5f
   String
"y_` " String -> String -> String
forall a. [a] -> [a] -> [a]
++ -- eb6f
   String
"y_~ y_)` - - - y_(` - y_)~ y_(~ - y_' - - y_) y_( y_)' "  String -> String -> String
forall a. [a] -> [a] -> [a]
++         -- eb70-eb7f
   String
"y_(' y.' y.( y.` y.) y.)' - - y.)` y.(' y.(` - - - - - "             -- eb80-eb8f
 allCodes :: [Int]
allCodes =  -- [0x00B0 .. 0x00Bf]
             [Int
0x0380 .. Int
0x03cf] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0x1f00 .. Int
0x1fff]
          [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0xe1a0 .. Int
0xe1af]
          [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0xe1b0 .. Int
0xe1bf]
          [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0xe1c0 .. Int
0xe1cf]
          [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0xeaf0 .. Int
0xeaff]
          [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0xeb00 .. Int
0xeb0f]
          [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0xeb20 .. Int
0xeb2f]
          [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0xeb30 .. Int
0xeb3f]
          [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0xeb40 .. Int
0xeb4f]
          [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0xeb50 .. Int
0xeb5f] [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0xeb6f]
          [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0xeb70 .. Int
0xeb7f]
          [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
++ [Int
0xeb80 .. Int
0xeb8f]

transAmharic :: Transliteration
transAmharic :: Transliteration
transAmharic = String -> [String] -> [Int] -> Transliteration
mkTransliteration String
"Amharic" [String]
allTrans [Int]
allCodes where
  allTrans :: [String]
allTrans = String -> [String]
words (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
    String
" h.  h-  h'  h(  h)  h  h?  h*  l.  l-  l'  l(  l)  l  l?  l*  "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" H.  H-  H'  H(  H)  H  H?  H*  m.  m-  m'  m(  m)  m  m?  m*  "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" s.  s-  s'  s(  s)  s  s?  s*  r.  r-  r'  r(  r)  r  r?  r* "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" -   -   -   -   -  -   -  -   x.  x-  x'  x(  x)  x  x?   x* "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" q.  q-  q'  q(  q)  q  q?  q*  -   -   -   -   -   -  -   - "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" -   -   -   -   -   -  -   -   -   -   -   -   -   -  -   - "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" b.  b-  b'  b(  b)  b  b?  b*  v.  v-  v'  v(  v)  v  v?  v* "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" t.  t-  t'  t(  t)  t  t?  t*  c.  c-  c'  c(  c)  c  c?  c* "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" X.  X-  X'  X(  X)  X  X?  -   -   -   -   X*  -   -  -   - "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" n.  n-  n'  n(  n)  n  n?  n*  N.  N-  N'  N(  N)  N  N?  N* "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" a   u   i   A   E   e  o   e*  k.  k-  k'  k(  k)  k  k?  - "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" -   -   -   k*  -   -  -   -   -   -   -   -   -   -  -   - "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" -   -   -   -   -   -  -   -   w.  w-  w'  w(  w)  w  w?  w* "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" -   -   -   -   -   -  -   -   z.  z-  z'  z(  z)  z  z?  z* "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" Z.  Z-  Z'  Z(  Z)  Z  Z?  Z*  y.  y-  y'  y(  y)  y  y?  y* "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" d.  d-  d'  d(  d)  d  d?  d*  -   -   -   -   -   -  -   - "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" j.  j-  j'  j(  j)  j  j?  j*  g.  g-  g'  g(  g)  g  g?  - "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" -   -   -   g*  -   -  -   -   -   -   -   -   -   -  -   - "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" T.  T-  T'  T(  T)  T  T?  T*  C.  C-  C'  C(  C)  C  C?  C* "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" P.  P-  P'  P(  P)  P  P?  P*  S.  S-  S'  S(  S)  S  S?  S* "String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" -   -   -   -   -   -  -   -   f.  f-  f'  f(  f)  f  f?  f*"String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
" p.  p-  p'  p(  p)  p  p?  p*"
  allCodes :: [Int]
allCodes = [Int
0x1200..Int
0x1357]

-- by Prasad 31/5/2013
transSanskrit :: Transliteration
transSanskrit :: Transliteration
transSanskrit = (String -> [String] -> [Int] -> Transliteration
mkTransliteration String
"Sanskrit" [String]
allTrans [Int]
allCodes) {invisible_chars :: [String]
invisible_chars = [String
"a"]} where
  allTrans :: [String]
allTrans = String -> [String]
words (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
    String
"-  n~ m. h. - A A: I I: U U: R. L. - - E: " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"E+ - O O: O+ k k' g g' n- c c' j j' n* T " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"T' D D' N t t' d d' n - p p' b b' m y " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"r - l L - v s* S s h - - - v- a: i " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"i: u u: r. r.: - e e: e+ - o o: o+ a_ - - " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"o~  -  -  -  -  - - -  q x G  z  R  R'  f  -  " String -> String -> String
forall a. [a] -> [a] -> [a]
++
    String
"R.: L.: l. l.: p, p.  N0 N1 N2 N3 N4 N5 N6 N7 N8 N9 "
  allCodes :: [Int]
allCodes = [Int
0x0900 .. Int
0x097f]