88 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
defmodule Mix.Tasks.Expo.Msgfmt do
 | 
						|
  @shortdoc "Generate binary message catalog from textual message description."
 | 
						|
 | 
						|
  @moduledoc """
 | 
						|
  Generate binary message catalog from textual message description.
 | 
						|
 | 
						|
      mix expo.msgfmt [PO_FILE] [OPTIONS]
 | 
						|
 | 
						|
  ## Options
 | 
						|
 | 
						|
  * `--use-fuzzy` - use fuzzy entries in output
 | 
						|
  * `--endianness=BYTEORDER` - write out 32-bit numbers in the given byte
 | 
						|
    order (big or little, default depends on platform)
 | 
						|
  * `--output-file=FILE` - write output to specified file
 | 
						|
  * `--statistics` - print statistics about messages
 | 
						|
 | 
						|
  """
 | 
						|
 | 
						|
  use Mix.Task
 | 
						|
 | 
						|
  alias Expo.MO
 | 
						|
  alias Expo.PO
 | 
						|
 | 
						|
  @switches [
 | 
						|
    use_fuzzy: :boolean,
 | 
						|
    endianness: :string,
 | 
						|
    output_file: :string,
 | 
						|
    statistics: :boolean
 | 
						|
  ]
 | 
						|
  @default_options [use_fuzzy: false, endianness: "little", statistics: false]
 | 
						|
 | 
						|
  @impl Mix.Task
 | 
						|
  def run(args) do
 | 
						|
    Application.ensure_all_started(:expo)
 | 
						|
    {opts, argv} = OptionParser.parse!(args, switches: @switches)
 | 
						|
 | 
						|
    opts = Keyword.merge(@default_options, opts)
 | 
						|
    opts = Keyword.update!(opts, :endianness, &parse_endianness/1)
 | 
						|
    {output_file, mo_compose_opts} = Keyword.pop(opts, :output_file)
 | 
						|
 | 
						|
    source_file =
 | 
						|
      case argv do
 | 
						|
        [] ->
 | 
						|
          Mix.raise("""
 | 
						|
          mix expo.msgfmt failed due to missing po file path argument
 | 
						|
          """)
 | 
						|
 | 
						|
        [_file_one, _file_two | _other_files] ->
 | 
						|
          Mix.raise("""
 | 
						|
          mix expo.msgfmt failed due to multiple po file path arguments
 | 
						|
          Only one is currently supported
 | 
						|
          """)
 | 
						|
 | 
						|
        [file] ->
 | 
						|
          file
 | 
						|
      end
 | 
						|
 | 
						|
    messages = PO.parse_file!(source_file)
 | 
						|
 | 
						|
    output = MO.compose(messages, mo_compose_opts)
 | 
						|
 | 
						|
    case output_file do
 | 
						|
      nil -> IO.binwrite(:standard_io, IO.iodata_to_binary(output))
 | 
						|
      file -> File.write!(file, output)
 | 
						|
    end
 | 
						|
 | 
						|
    if Keyword.fetch!(mo_compose_opts, :statistics) do
 | 
						|
      receive do
 | 
						|
        {MO, :message_count, count} ->
 | 
						|
          # Not using Mix.shell().info/1 since that will print into stdout and not stderr
 | 
						|
          IO.puts(:standard_error, "#{count} translated messages.")
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  defp parse_endianness(endianness)
 | 
						|
  defp parse_endianness("little"), do: :little
 | 
						|
  defp parse_endianness("big"), do: :big
 | 
						|
 | 
						|
  defp parse_endianness(other),
 | 
						|
    do:
 | 
						|
      Mix.raise("""
 | 
						|
      mix expo.msgfmt failed due to invalid endianness option
 | 
						|
      Expected: "little" or "big"
 | 
						|
      Received: #{inspect(other)}
 | 
						|
      """)
 | 
						|
end
 |