Packages

ex_cldr

2.2.6
2.47.5 2.47.4 2.47.3 2.47.2 2.47.1 2.47.0 2.46.0 2.45.2 2.45.1 2.45.0 2.44.1 2.44.0 2.43.2 2.43.1 2.43.0 2.42.0 2.41.1 2.41.0 2.40.4 2.40.3 2.40.2 2.40.1 2.40.0 2.39.2 2.39.1 2.39.0 2.38.1 2.38.0 2.37.5 2.37.4 2.37.3 retired 2.37.2 2.37.1 2.37.0 2.36.0 2.35.1 2.35.0 retired 2.34.2 2.34.1 2.34.0 2.33.2 2.33.1 2.33.1-rc.0 2.33.0 2.32.1 2.32.0 2.31.0 2.30.0 2.29.0 2.28.0 2.27.1 2.27.0 retired 2.26.3 2.26.2 2.26.1 2.26.0 2.25.0 2.24.2 2.24.1 2.24.0 2.24.0-rc.6 2.24.0-rc.5 2.24.0-rc.4 2.24.0-rc.3 2.24.0-rc.2 2.24.0-rc.1 2.24.0-rc.0 2.23.2 2.23.1 2.23.0 2.22.1 2.22.0 2.21.0 2.20.0 2.20.0-rc.3 2.20.0-rc.2 2.20.0-rc.1 2.20.0-rc.0 2.19.1 2.19.0 2.18.2 2.18.1 2.18.0 2.18.0-rc.0 2.17.2 2.17.1 2.17.0 2.16.2 2.16.1 2.16.1-rc.0 2.16.0 2.15.0 2.14.1 2.14.0 2.14.0-rc.0 2.13.0 2.12.1 2.12.0 2.11.1 2.11.0 2.10.2 2.10.1 2.10.0 retired 2.9.0 2.8.1 2.8.0 2.7.2 2.7.1 2.7.0 2.6.2 2.6.1 2.6.0 2.5.0 2.4.3 2.4.2 2.4.1 2.4.0 2.3.2 2.3.1 2.3.0 2.2.7 2.2.6 2.2.5 2.2.4 2.2.3 2.2.2 2.2.1 2.2.0 2.1.0 2.0.4 2.0.3 2.0.2 2.0.1 2.0.0 2.0.0-rc.3 retired 2.0.0-rc.2 retired 2.0.0-rc.1 retired 2.0.0-rc.0 retired 1.8.2 1.8.1 1.8.0 1.7.1 1.7.0 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.2 1.5.1 1.5.0 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 retired 1.4.0-rc.3 retired 1.4.0-rc.2 retired 1.4.0-rc.1 retired 1.4.0-rc.0 retired 1.3.2 1.3.1 1.3.0 1.2.0 1.1.0 1.0.0 1.0.0-rc.3 retired 1.0.0-rc.2 retired 1.0.0-rc.1 retired 1.0.0-rc.0 retired 0.13.1 0.13.0 0.12.2 retired 0.12.1 retired 0.12.0 retired 0.11.0 retired 0.10.0 retired 0.9.0 retired 0.8.3 retired 0.8.2 retired 0.8.1 retired 0.8.0 retired 0.7.0 retired 0.6.2 retired 0.6.1 retired 0.6.0 retired 0.5.2 retired 0.5.1 retired 0.5.0 retired 0.4.2 retired 0.4.1 retired 0.4.0 retired 0.3.0 retired 0.2.1 retired 0.2.0 retired 0.1.3 retired 0.1.2 retired 0.1.1 retired 0.1.0 retired 0.0.20 retired 0.0.19 retired 0.0.18 retired 0.0.17 retired 0.0.16 retired 0.0.15 retired 0.0.14 retired 0.0.13 retired 0.0.12 retired 0.0.11 retired 0.0.10 retired 0.0.8 retired 0.0.7 retired 0.0.6 retired 0.0.5 retired 0.0.4 retired 0.0.3 retired

Common Locale Data Repository (CLDR) functions for Elixir to localize and format numbers, dates, lists, messages, languages, territories and units with support for over 700 locales for internationalized (i18n) and localized (L10N) applications.

Current section

Files

Jump to
ex_cldr lib cldr plural_rules transformer.ex
Raw

lib/cldr/plural_rules/transformer.ex

defmodule Cldr.Number.PluralRule.Transformer do
@moduledoc false
# Tranformations on the parse tree returned from parsing plural rules.
#
# The transformations is primarily to convert the parse tree into an AST
# representing a `cond` statement that implements the rule.
@doc """
Converts a map representing a set of plural rules and converts it
to an `cond` statement.
`rules` is a map of the locale specific branch of the plurals.json
file from CLDR. It is then tokenized, parsed and the resulting ast
converted to a `cond` statement.
"""
def rules_to_condition_statement(rules, module) do
branches =
Enum.map(rules, fn {category, definition} ->
{new_ast, _} = set_operand_module(definition[:rule], module)
rule_to_cond_branch(new_ast, category)
end)
{:cond, [], [[do: move_true_branch_to_end(branches)]]}
end
# We can't assume the order of branches and we need the
# `true` branch at the end since it will always match
# and hence potentially shadow other branches
defp move_true_branch_to_end(branches) do
Enum.sort(branches, fn {:->, [], [[ast], _category]}, _other_branch ->
not (ast == true)
end)
end
# Walk the AST and replace the variable context to that of the calling
# module
defp set_operand_module(ast, _module) do
Macro.prewalk(ast, [], fn expr, acc ->
new_expr =
case expr do
{var, [], Elixir} ->
{var, [], Cldr.Number.PluralRule}
# {var, [], module}
{:mod, _context, [operand, value]} ->
{:mod, [context: Elixir, import: Elixir.Cldr.Math], [operand, value]}
{:within, _context, [operand, range]} ->
{:within, [context: Elixir, import: Elixir.Cldr.Math], [operand, range]}
_ ->
expr
end
{new_expr, acc}
end)
end
# Transform the rule AST into a branch of a `cond` statement
defp rule_to_cond_branch(nil, category) do
{:->, [], [[true], category]}
end
defp rule_to_cond_branch(rule_ast, category) do
{:->, [], [[rule_ast], category]}
end
end