Current section

Files

Jump to
unicode_set lib set property.ex
Raw

lib/set/property.ex

defmodule Unicode.Set.Property do
@moduledoc false
# Of this list, only the following are unknown to Unicode
# * xdigit
# * word
# * blank
# * print
# * alnum
@doc false
def fetch_property(:script_or_category, "alpha") do
{:ok, Unicode.Set.parse!("\\p{Alphabetic}")}
end
def fetch_property(:script_or_category, "lower") do
{:ok, Unicode.Set.parse!("\\p{Lowercase}")}
end
def fetch_property(:script_or_category, "upper") do
{:ok, Unicode.Set.parse!("\\p{Uppercase}")}
end
def fetch_property(:script_or_category, "punct") do
{:ok, Unicode.Set.parse!("[\\p{gc=Punctuation}\\p{gc=Symbol}-\\p{alpha}]")}
end
def fetch_property(:script_or_category, "digit") do
{:ok, Unicode.Set.parse!("\\p{gc=Decimal_Number}")}
end
def fetch_property(:script_or_category, "xdigit") do
{:ok, Unicode.Set.parse!("[\\p{gc=Decimal_Number}\\p{Hex_Digit}]")}
end
def fetch_property(:script_or_category, "alnum") do
{:ok, Unicode.Set.parse!("[\\p{alpha}\\p{digit}]")}
end
def fetch_property(:script_or_category, "space") do
{:ok, Unicode.Set.parse!("\\p{Whitespace}")}
end
def fetch_property(:script_or_category, "blank") do
{:ok, Unicode.Set.parse!("[\\p{gc=Space_Separator}\\t]")}
end
def fetch_property(:script_or_category, "cntrl") do
{:ok, Unicode.Set.parse!("\\p{gc=Control}")}
end
def fetch_property(:script_or_category, "print") do
{:ok, Unicode.Set.parse!("[\\p{graph}\\p{blank}-\\p{cntrl}]")}
end
def fetch_property(:script_or_category, "word") do
{:ok, Unicode.Set.parse!("[\\p{alpha}\\p{gc=Mark}\\p{digit}\\p{gc=Connector_Punctuation}\\p{Join_Control}]")}
end
def fetch_property(:script_or_category, "graph") do
{:ok, Unicode.Set.parse!("[^\\p{Whitespace}\\p{gc=Control}\\p{gc=Surrogate}\\p{gc=Unassigned}]")}
end
def fetch_property(:script_or_category, value) do
range_list =
Unicode.Script.get(value) ||
Unicode.GeneralCategory.get(value) ||
Unicode.Property.get(value)
if range_list do
{:ok, range_list}
else
{:error, "The unicode script, category or property #{inspect(value)} is not known"}
end
end
@doc false
def fetch_property(property, value) do
with {:ok, module} <- Unicode.fetch_property(property),
{:ok, range_list} <- module.fetch(value) do
{:ok, range_list}
else
:error ->
{:error,
"The unicode property #{inspect(property)} with value #{inspect(value)} is not known"}
end
end
def fetch_property!(property, value) do
case fetch_property(property, value) do
{:ok, range_list} -> range_list
{:error, reason} -> raise Regex.CompileError, reason
end
end
end