lib/japanese_conv.ex

defmodule JapaneseConv do
  @moduledoc """
  Documentation for `JapaneseConv`.
  """

  @doc """
  カナを全角
  数字、アルファベットを半角に変換

  ## Examples

      iex> JapaneseConv.standardConv("アイウエオ0Ab")
    
  """
  def standardConv(str) do
    charList = String.graphemes(str)
    for (char <- charList) do
            c = Map.get(standardCharSet(), char)
            if is_nil(c) do char else c end
        end
    |> List.to_string()
  end


  @doc """
  カナ、数字、アルファベットの全角を半角に変換

  ## Examples

      iex> JapaneseConv.full2Half("アイウエオ0Ab")
    
  """
  def full2Half(str) do
    charList = String.graphemes(str)
    for (char <- charList) do
            c = charSet()[char]
            if is_nil(c) do char else c end
        end
    |> List.to_string()
  end

  @doc """
  数字の全角を半角に変換

  ## Examples

      iex> JapaneseConv.full2Half("0123")
      

  """
  def full2HalfNum(str) do
    charList = String.graphemes(str)
    for (char <- charList) do
            c = numberSet()[char]
            if is_nil(c) do char else c end
        end
    |> List.to_string()
  end

  @doc """
  カナ、数字、アルファベットの半角角を全角に変換

  ## Examples

      iex> JapaneseConv.full2Half("アイウエオ0Ab")
      

  """
  def half2Full(str) do
    charList = String.graphemes(str)
    for (char <- charList) do
      c = revCharSet()[char]
      if is_nil(c) do char else c end
    end
    |> List.to_string()
  end


  defp standardCharSet() do
    Map.new()
    |> Map.merge(revKanaSet())
    |> Map.merge(alphaSet())
    |> Map.merge(numberSet())
  end

  defp charSet() do
    Map.new()
    |> Map.merge(kanaSet())
    |> Map.merge(alphaSet())
    |> Map.merge(numberSet())
  end

  defp kanaSet() do
    %{"ァ" => "ァ",
      "ア" => "ア",
      "ィ" => "ィ",
      "イ" => "イ",
      "ゥ" => "ゥ",
      "ウ" => "ウ",
      "ェ" => "ェ",
      "エ" => "エ",
      "ォ" => "ォ",
      "オ" => "オ",
      "カ" => "カ",
      "ガ" => "ガ",
      "キ" => "キ",
      "ギ" => "ギ",
      "ク" => "ク",
      "グ" => "グ",
      "ケ" => "ケ",
      "ゲ" => "ゲ",
      "コ" => "コ",
      "ゴ" => "ゴ",
      "サ" => "サ",
      "ザ" => "ザ",
      "シ" => "シ",
      "ジ" => "ジ",
      "ス" => "ス",
      "ズ" => "ズ",
      "セ" => "セ",
      "ゼ" => "ゼ",
      "ソ" => "ソ",
      "ゾ" => "ゾ",
      "タ" => "タ",
      "ダ" => "ダ",
      "チ" => "チ",
      "ヂ" => "ヂ",
      "ッ" => "ッ",
      "ツ" => "ツ",
      "ヅ" => "ヅ",
      "テ" => "テ",
      "デ" => "デ",
      "ト" => "ト",
      "ド" => "ド",
      "ナ" => "ナ",
      "ニ" => "ニ",
      "ヌ" => "ヌ",
      "ネ" => "ネ",
      "ノ" => "ノ",
      "ハ" => "ハ",
      "バ" => "バ",
      "パ" => "パ",
      "ヒ" => "ヒ",
      "ビ" => "ビ",
      "ピ" => "ピ",
      "フ" => "フ",
      "ブ" => "ブ",
      "プ" => "プ",
      "ヘ" => "ヘ",
      "ベ" => "ベ",
      "ペ" => "ペ",
      "ホ" => "ホ",
      "ボ" => "ボ",
      "ポ" => "ポ",
      "マ" => "マ",
      "ミ" => "ミ",
      "ム" => "ム",
      "メ" => "メ",
      "モ" => "モ",
      "ャ" => "ャ",
      "ヤ" => "ヤ",
      "ュ" => "ュ",
      "ユ" => "ユ",
      "ョ" => "ョ",
      "ヨ" => "ヨ",
      "ラ" => "ラ",
      "リ" => "リ",
      "ル" => "ル",
      "レ" => "レ",
      "ロ" => "ロ",
      "ワ" => "ワ",
      "ヲ" => "ヲ",
      "ン" => "ン",
      "ー" => "ー"
      }
  end
  defp alphaSet() do 
    %{"A" => "A",
      "B" => "B",
      "C" => "C",
      "D" => "D",
      "E" => "E",
      "F" => "F",
      "G" => "G",
      "H" => "H",
      "I" => "I",
      "J" => "J",
      "K" => "K",
      "L" => "L",
      "M" => "M",
      "N" => "N",
      "O" => "O",
      "P" => "P",
      "Q" => "Q",
      "R" => "R",
      "S" => "S",
      "T" => "T",
      "U" => "U",
      "V" => "V",
      "W" => "W",
      "X" => "X",
      "Y" => "Y",
      "Z" => "Z",
      "a" => "a",
      "b" => "b",
      "c" => "c",
      "d" => "d",
      "e" => "e",
      "f" => "f",
      "g" => "g",
      "h" => "h",
      "i" => "i",
      "j" => "j",
      "k" => "k",
      "l" => "l",
      "m" => "m",
      "n" => "n",
      "o" => "o",
      "p" => "p",
      "q" => "q",
      "r" => "r",
      "s" => "s",
      "t" => "t",
      "u" => "u",
      "v" => "v",
      "w" => "w",
      "x" => "x",
      "y" => "y",
      "z" => "z",
      "0" => "0",
      "1" => "1",
      "2" => "2",
      "3" => "3",
      "4" => "4",
      "5" => "5",
      "6" => "6",
      "7" => "7",
      "8" => "8",
      "9" => "9"}
  end 

  defp numberSet() do 
    %{"0" => "0",
      "1" => "1",
      "2" => "2",
      "3" => "3",
      "4" => "4",
      "5" => "5",
      "6" => "6",
      "7" => "7",
      "8" => "8",
      "9" => "9"}
  end 

  defp revCharSet() do
    for {k, v} <- charSet() do
      {v,k}
    end
    |> Enum.into(%{})
  end

  defp revKanaSet() do
    for {k, v} <- kanaSet() do
      {v,k}
    end
    |> Enum.into(%{})
  end 
end