Current section

Files

Jump to
speechmarkdown lib speech_markdown normalizer.ex
Raw

lib/speech_markdown/normalizer.ex

defmodule SpeechMarkdown.Normalizer do
@moduledoc false
@aliases %{
vol: :volume,
bleep: :expletive,
phone: :telephone,
chars: :characters
}
@alias_keys Map.keys(@aliases)
@attr_defaults %{
rate: "medium",
volume: "medium",
emphasis: "moderate",
pitch: "medium",
excited: "medium",
disappointed: "medium"
}
@doc """
Normalizes a :block AST tag by adding default values to well-known attributes
"""
def normalize_block({:block, [break: break]}) do
{:break, break}
end
def normalize_block({:block, kvs}) do
{:block, normalize_kvs(kvs, [])}
end
defp normalize_kvs([], acc) do
Enum.reverse(acc)
end
for {attr, value} <- @attr_defaults do
defp normalize_kvs([{unquote(attr) = k, nil} | rest], acc) do
normalize_kvs(rest, [{k, unquote(value)} | acc])
end
end
defp normalize_kvs([{k, v} | rest], acc) when k in @alias_keys do
normalize_kvs([{@aliases[k], v} | rest], acc)
end
defp normalize_kvs([kv | rest], acc) do
normalize_kvs(rest, [kv | acc])
end
end