Packages
localize
0.33.0
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.41.3
0.41.2
0.41.1
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.1
0.30.0
retired
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
0.1.0-alpha.1
Localization (parsing, formatting) of numbers, dates/time/calendar, units of measure, messages and lists. Includes localized collation.
Current section
Files
Jump to
Current section
Files
lib/localize/collation/variable.ex
defmodule Localize.Collation.Variable do
@moduledoc """
Variable weight handling for the collation algorithm.
In the UCA, "variable" collation elements are those for spaces, punctuation,
and optionally symbols and currency signs. The `alternate` setting controls
how these are handled:
* `:non_ignorable` - Variable CEs keep all their weights (default for CLDR).
* `:shifted` - Variable CEs have L1/L2/L3 zeroed, original L1 moves to L4.
"""
alias Localize.Collation.Element
@doc """
Process a list of collation elements according to the variable weight rules.
### Arguments
* `elements` - a list of collation element tuples.
* `alternate` - the variable handling mode: `:non_ignorable` or `:shifted`.
* `max_variable_primary` - the maximum primary weight for variable elements.
### Returns
A list of `{element, quaternary_weight}` tuples.
### Examples
iex> elems = [{0x23EC, 0x0020, 0x0002, false}]
iex> [{elem, q}] = Localize.Collation.Variable.process(elems, :non_ignorable, 0x0B61)
iex> {Localize.Collation.Element.primary(elem), q}
{0x23EC, 0}
"""
@spec process([Element.t()], :non_ignorable | :shifted, non_neg_integer()) ::
[{Element.t(), non_neg_integer()}]
def process(elements, :non_ignorable, _max_variable_primary) do
Enum.map(elements, fn elem -> {elem, 0} end)
end
def process(elements, :shifted, max_variable_primary) do
{result, _after_variable} =
Enum.reduce(elements, {[], false}, fn elem, {acc, after_variable} ->
cond do
Element.variable?(elem, max_variable_primary) ->
shifted = Element.new(0, 0, 0)
{[{shifted, Element.primary(elem)} | acc], true}
after_variable and Element.primary_ignorable?(elem) ->
zeroed = Element.new(0, 0, 0)
{[{zeroed, 0} | acc], true}
true ->
l4 = if Element.primary(elem) > 0, do: 0xFFFF, else: 0
{[{elem, l4} | acc], false}
end
end)
Enum.reverse(result)
end
end