module Text.Zenhan
(z2h
,h2z
, toString
, Mode(..)
) where
import Data.Tuple (swap)
import qualified Data.Text as T
import qualified Data.Map as M
data Mode = Kana | Digit | Ascii deriving(Eq, Show)
z2h ::
[Mode]
-> T.Text
-> T.Text
-> T.Text
z2h mode ignore text = T.concat $ map (zhTrans mode (convAry ignore)) (convAry text)
h2z ::
[Mode]
-> T.Text
-> T.Text
-> T.Text
h2z mode ignore text = T.concat $ map (hzTrans mode (hconvAry ignore)) (hconvAry text)
toString :: T.Text -> String
toString = T.unpack
zhTrans :: [Mode] -> [T.Text] -> T.Text -> T.Text
zhTrans mode ign t = case M.lookup t (z2hMap mode) of
Just v -> choice (elem t ign) t v
Nothing -> t
hzTrans :: [Mode] -> [T.Text] -> T.Text -> T.Text
hzTrans mode ign t = case M.lookup t (h2zMap mode) of
Just v -> choice (elem t ign) t v
Nothing -> t
choice :: Bool -> a -> a -> a
choice True t _ = t
choice False _ v = v
z2hMap :: [Mode] -> M.Map T.Text T.Text
z2hMap [] = M.empty
z2hMap (x:xs) = M.unions ([zhMap x, z2hMap xs])
zhMap :: Mode -> M.Map T.Text T.Text
zhMap Kana = zh_kana
zhMap Digit = zh_digit
zhMap Ascii = zh_ascii
h2zMap :: [Mode] -> M.Map T.Text T.Text
h2zMap [] = M.empty
h2zMap (x:xs) = M.unions ([hzMap x, h2zMap xs])
hzMap :: Mode -> M.Map T.Text T.Text
hzMap Kana = hz_kana
hzMap Digit = hz_digit
hzMap Ascii = hz_ascii
convAry :: T.Text -> [T.Text]
convAry xs = T.transpose [xs]
hconvAry :: T.Text -> [T.Text]
hconvAry = mergeWord . convAry
mergeWord :: [T.Text] -> [T.Text]
mergeWord (x:y:xs) = choice (elem (T.concat [x, y]) (h_kana_d ++ h_kana_p))
(T.concat [x, y] : mergeWord xs) (x : mergeWord (y:xs))
mergeWord (x:xs) = x : mergeWord xs
mergeWord [] = []
zh_ascii :: M.Map T.Text T.Text
zh_ascii = M.fromList $ zip z_ascii h_ascii
hz_ascii :: M.Map T.Text T.Text
hz_ascii = transposeMap zh_ascii
zh_digit :: M.Map T.Text T.Text
zh_digit = M.fromList $ zip z_digit h_digit
hz_digit :: M.Map T.Text T.Text
hz_digit = transposeMap zh_digit
zh_kana :: M.Map T.Text T.Text
zh_kana = M.fromList $ zip z_kana h_kana
hz_kana :: M.Map T.Text T.Text
hz_kana = transposeMap zh_kana
transposeMap :: M.Map T.Text T.Text -> M.Map T.Text T.Text
transposeMap = M.fromList . map swap . M.toList
z_ascii :: [T.Text]
z_ascii = [ "a", "b", "c", "d", "e", "f", "g", "h", "i",
"j", "k", "l", "m", "n", "o", "p", "q", "r",
"s", "t", "u", "v", "w", "x", "y", "z",
"A", "B", "C", "D", "E", "F", "G", "H", "I",
"J", "K", "L", "M", "N", "O", "P", "Q", "R",
"S", "T", "U", "V", "W", "X", "Y", "Z",
"!", "”", "#", "$", "%", "&", "’", "(", ")",
"*", "+", ",", "−", ".", "/", ":", ";", "<",
"=", ">", "?", "@", "[", "¥", "]", "^", "_",
"‘", "{", "|", "}", "〜", " " ]
z_digit :: [T.Text]
z_digit = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ]
z_kana :: [T.Text]
z_kana = [ "ア", "イ", "ウ", "エ", "オ",
"カ", "キ", "ク", "ケ", "コ",
"サ", "シ", "ス", "セ", "ソ",
"タ", "チ", "ツ", "テ", "ト",
"ナ", "ニ", "ヌ", "ネ", "ノ",
"ハ", "ヒ", "フ", "ヘ", "ホ",
"マ", "ミ", "ム", "メ", "モ",
"ヤ", "ユ", "ヨ",
"ラ", "リ", "ル", "レ", "ロ",
"ワ", "ヲ", "ン",
"ァ", "ィ", "ゥ", "ェ", "ォ",
"ッ", "ャ", "ュ", "ョ",
"ヴ",
"ガ", "ギ", "グ", "ゲ", "ゴ",
"ザ", "ジ", "ズ", "ゼ", "ゾ",
"ダ", "ヂ", "ヅ", "デ", "ド",
"バ", "ビ", "ブ", "ベ", "ボ",
"パ", "ピ", "プ", "ペ", "ポ",
"。", "、", "・", "゛", "゜", "「", "」", "ー" ]
h_ascii :: [T.Text]
h_ascii = [ "a", "b", "c", "d", "e", "f", "g", "h", "i",
"j", "k", "l", "m", "n", "o", "p", "q", "r",
"s", "t", "u", "v", "w", "x", "y", "z",
"A", "B", "C", "D", "E", "F", "G", "H", "I",
"J", "K", "L", "M", "N", "O", "P", "Q", "R",
"S", "T", "U", "V", "W", "X", "Y", "Z",
"!", "\"", "#", "$", "%", "&", "'", "(", ")",
"*", "+", ",", "-", ".", "/", ":", ";", "<",
"=", ">", "?", "@", "[", "\\", "]", "^", "_",
"`", "{", "|", "}", "~", " " ]
h_digit :: [T.Text]
h_digit = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ]
h_kana :: [T.Text]
h_kana = [ "ア", "イ", "ウ", "エ", "オ",
"カ", "キ", "ク", "ケ", "コ",
"サ", "シ", "ス", "セ", "ソ",
"タ", "チ", "ツ", "テ", "ト",
"ナ", "ニ", "ヌ", "ネ", "ノ",
"ハ", "ヒ", "フ", "ヘ", "ホ",
"マ", "ミ", "ム", "メ", "モ",
"ヤ", "ユ", "ヨ",
"ラ", "リ", "ル", "レ", "ロ",
"ワ", "ヲ", "ン",
"ァ", "ィ", "ゥ", "ェ", "ォ",
"ッ", "ャ", "ュ", "ョ" ] ++
h_kana_d ++
h_kana_p ++
[ "。", "、", "・", "゙", "゚", "「", "」", "ー" ]
h_kana_d :: [T.Text]
h_kana_d = [ "ヴ",
"ガ", "ギ", "グ", "ゲ", "ゴ",
"ザ", "ジ", "ズ", "ゼ", "ゾ",
"ダ", "ヂ", "ヅ", "デ", "ド",
"バ", "ビ", "ブ", "ベ", "ボ" ]
h_kana_p :: [T.Text]
h_kana_p = [ "パ", "ピ", "プ", "ペ", "ポ" ]