module Text.Han2Zen ( han2zen , han2zenSafe , han2zenSafe' ) where import Data.Maybe -- | テキスト内の半角カタカナを全角にに変える han2zen :: String -> String han2zen x = map hanKanaToZenKana' (chars x) hanKanaToZenKana' :: String -> Char hanKanaToZenKana' x = either (error $ "Syntax Error: " ++ x) id $ hanKanaToZenKana x han2zenSafe :: String -> Either String String han2zenSafe x = mapM hanKanaToZenKana (chars x) han2zenSafe' :: String -> [Either String Char] han2zenSafe' x = map hanKanaToZenKana (chars x) -- | 半角の濁点の有無で文字ごとに分ける chars :: String -> [String] chars [] = [] chars [x] = [[x]] chars txt | isDakuten (txt !! 1) = take 2 txt : chars (drop 2 txt) | otherwise = take 1 txt : chars (drop 1 txt) -- | 濁点または半濁点を判別する isDakuten :: Char -> Bool isDakuten '゙' = True isDakuten '゚' = True isDakuten _ = False -- | 半角を全角文字に hanKanaToZenKana :: String -> Either String Char hanKanaToZenKana "。" = Right '。' hanKanaToZenKana "「" = Right '「' hanKanaToZenKana "」" = Right '」' hanKanaToZenKana "、" = Right '、' hanKanaToZenKana "・" = Right '・' hanKanaToZenKana "ヲ" = Right 'ヲ' hanKanaToZenKana "ァ" = Right 'ァ' hanKanaToZenKana "ィ" = Right 'ィ' hanKanaToZenKana "ゥ" = Right 'ゥ' hanKanaToZenKana "ェ" = Right 'ェ' hanKanaToZenKana "ォ" = Right 'ォ' hanKanaToZenKana "ャ" = Right 'ャ' hanKanaToZenKana "ュ" = Right 'ュ' hanKanaToZenKana "ョ" = Right 'ョ' hanKanaToZenKana "ッ" = Right 'ッ' hanKanaToZenKana "ー" = Right 'ー' hanKanaToZenKana "ア" = Right 'ア' hanKanaToZenKana "イ" = Right 'イ' hanKanaToZenKana "ウ" = Right 'ウ' hanKanaToZenKana "エ" = Right 'エ' hanKanaToZenKana "オ" = Right 'オ' hanKanaToZenKana "カ" = Right 'カ' hanKanaToZenKana "キ" = Right 'キ' hanKanaToZenKana "ク" = Right 'ク' hanKanaToZenKana "ケ" = Right 'ケ' hanKanaToZenKana "コ" = Right 'コ' hanKanaToZenKana "サ" = Right 'サ' hanKanaToZenKana "シ" = Right 'シ' hanKanaToZenKana "ス" = Right 'ス' hanKanaToZenKana "セ" = Right 'セ' hanKanaToZenKana "ソ" = Right 'ソ' hanKanaToZenKana "タ" = Right 'タ' hanKanaToZenKana "チ" = Right 'チ' hanKanaToZenKana "ツ" = Right 'ツ' hanKanaToZenKana "テ" = Right 'テ' hanKanaToZenKana "ト" = Right 'ト' hanKanaToZenKana "ナ" = Right 'ナ' hanKanaToZenKana "ニ" = Right 'ニ' hanKanaToZenKana "ヌ" = Right 'ヌ' hanKanaToZenKana "ネ" = Right 'ネ' hanKanaToZenKana "ノ" = Right 'ノ' hanKanaToZenKana "ハ" = Right 'ハ' hanKanaToZenKana "ヒ" = Right 'ヒ' hanKanaToZenKana "フ" = Right 'フ' hanKanaToZenKana "ヘ" = Right 'ヘ' hanKanaToZenKana "ホ" = Right 'ホ' hanKanaToZenKana "マ" = Right 'マ' hanKanaToZenKana "ミ" = Right 'ミ' hanKanaToZenKana "ム" = Right 'ム' hanKanaToZenKana "メ" = Right 'メ' hanKanaToZenKana "モ" = Right 'モ' hanKanaToZenKana "ヤ" = Right 'ヤ' hanKanaToZenKana "ユ" = Right 'ユ' hanKanaToZenKana "ヨ" = Right 'ヨ' hanKanaToZenKana "ラ" = Right 'ラ' hanKanaToZenKana "リ" = Right 'リ' hanKanaToZenKana "ル" = Right 'ル' hanKanaToZenKana "レ" = Right 'レ' hanKanaToZenKana "ロ" = Right 'ロ' hanKanaToZenKana "ワ" = Right 'ワ' hanKanaToZenKana "ン" = Right 'ン' hanKanaToZenKana "゙" = Right '゛' -- これいる? hanKanaToZenKana "゚" = Right '゜' -- これいる? hanKanaToZenKana "ガ" = Right 'ガ' hanKanaToZenKana "ギ" = Right 'ギ' hanKanaToZenKana "グ" = Right 'グ' hanKanaToZenKana "ゲ" = Right 'ゲ' hanKanaToZenKana "ゴ" = Right 'ゴ' hanKanaToZenKana "ザ" = Right 'ザ' hanKanaToZenKana "ジ" = Right 'ジ' hanKanaToZenKana "ズ" = Right 'ズ' hanKanaToZenKana "ゼ" = Right 'ゼ' hanKanaToZenKana "ゾ" = Right 'ゾ' hanKanaToZenKana "ダ" = Right 'ダ' hanKanaToZenKana "ヂ" = Right 'ヂ' hanKanaToZenKana "ヅ" = Right 'ヅ' hanKanaToZenKana "デ" = Right 'デ' hanKanaToZenKana "ド" = Right 'ド' hanKanaToZenKana "バ" = Right 'バ' hanKanaToZenKana "ビ" = Right 'ビ' hanKanaToZenKana "ブ" = Right 'ブ' hanKanaToZenKana "ベ" = Right 'ベ' hanKanaToZenKana "ボ" = Right 'ボ' hanKanaToZenKana "パ" = Right 'パ' hanKanaToZenKana "ピ" = Right 'ピ' hanKanaToZenKana "プ" = Right 'プ' hanKanaToZenKana "ペ" = Right 'ペ' hanKanaToZenKana "ポ" = Right 'ポ' hanKanaToZenKana "ヴ" = Right 'ヴ' hanKanaToZenKana [c] = Right c hanKanaToZenKana xs = Left xs hanKana :: String hanKana = "。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚" zenKana :: String zenKana = "。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜" daku :: String daku = "カキクケコサシスセソタチツテトハヒフヘホ" dakuzen :: String dakuzen = "ガギグゲゴザジズゼゾダヂヅデドバビブベボ" handaku :: String handaku = "ハヒフヘホ" handakuzen :: String handakuzen = "パピプペポ"