cat-bookmarker/deps/expo/lib/mix/tasks/expo.msgmft.ex

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