Current section
Files
Jump to
Current section
Files
src/grapheme_util.erl
-module(grapheme_util).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([is_lower_ascii/1, is_upper_ascii/1, is_digit/1, is_whitespace/1, is_alphanumeric/1, is_alphanumeric_or_dash_or_underscore/1, is_alphanumeric_or_dash_or_underscore_or_period/1, get_chars_matching_func/3, get_whitespace/1, get_name_ignore_ws/1, is_not_double_quote/1, is_not_single_quote/1, is_not_whitespace/1, is_not_gt/1]).
-spec is_lower_ascii(binary()) -> boolean().
is_lower_ascii(Grapheme) ->
case Grapheme of
<<"a"/utf8>> ->
true;
<<"b"/utf8>> ->
true;
<<"c"/utf8>> ->
true;
<<"d"/utf8>> ->
true;
<<"e"/utf8>> ->
true;
<<"f"/utf8>> ->
true;
<<"g"/utf8>> ->
true;
<<"h"/utf8>> ->
true;
<<"i"/utf8>> ->
true;
<<"j"/utf8>> ->
true;
<<"k"/utf8>> ->
true;
<<"l"/utf8>> ->
true;
<<"m"/utf8>> ->
true;
<<"n"/utf8>> ->
true;
<<"o"/utf8>> ->
true;
<<"p"/utf8>> ->
true;
<<"q"/utf8>> ->
true;
<<"r"/utf8>> ->
true;
<<"s"/utf8>> ->
true;
<<"t"/utf8>> ->
true;
<<"u"/utf8>> ->
true;
<<"v"/utf8>> ->
true;
<<"w"/utf8>> ->
true;
<<"x"/utf8>> ->
true;
<<"y"/utf8>> ->
true;
<<"z"/utf8>> ->
true;
_ ->
false
end.
-spec is_upper_ascii(binary()) -> boolean().
is_upper_ascii(Grapheme) ->
case Grapheme of
<<"A"/utf8>> ->
true;
<<"B"/utf8>> ->
true;
<<"C"/utf8>> ->
true;
<<"D"/utf8>> ->
true;
<<"E"/utf8>> ->
true;
<<"F"/utf8>> ->
true;
<<"G"/utf8>> ->
true;
<<"H"/utf8>> ->
true;
<<"I"/utf8>> ->
true;
<<"J"/utf8>> ->
true;
<<"K"/utf8>> ->
true;
<<"L"/utf8>> ->
true;
<<"M"/utf8>> ->
true;
<<"N"/utf8>> ->
true;
<<"O"/utf8>> ->
true;
<<"P"/utf8>> ->
true;
<<"Q"/utf8>> ->
true;
<<"R"/utf8>> ->
true;
<<"S"/utf8>> ->
true;
<<"T"/utf8>> ->
true;
<<"U"/utf8>> ->
true;
<<"V"/utf8>> ->
true;
<<"W"/utf8>> ->
true;
<<"X"/utf8>> ->
true;
<<"Y"/utf8>> ->
true;
<<"Z"/utf8>> ->
true;
_ ->
false
end.
-spec is_digit(binary()) -> boolean().
is_digit(Grapheme) ->
case Grapheme of
<<"0"/utf8>> ->
true;
<<"1"/utf8>> ->
true;
<<"2"/utf8>> ->
true;
<<"3"/utf8>> ->
true;
<<"4"/utf8>> ->
true;
<<"5"/utf8>> ->
true;
<<"6"/utf8>> ->
true;
<<"7"/utf8>> ->
true;
<<"8"/utf8>> ->
true;
<<"9"/utf8>> ->
true;
_ ->
false
end.
-spec is_whitespace(binary()) -> boolean().
is_whitespace(Grapheme) ->
case Grapheme of
<<" "/utf8>> ->
true;
<<"\t"/utf8>> ->
true;
<<"\r"/utf8>> ->
true;
<<"\n"/utf8>> ->
true;
_ ->
false
end.
-spec is_alphanumeric(binary()) -> boolean().
is_alphanumeric(Grapheme) ->
case (is_lower_ascii(Grapheme) orelse is_upper_ascii(Grapheme)) orelse is_digit(
Grapheme
) of
true ->
true;
_ ->
false
end.
-spec is_alphanumeric_or_dash_or_underscore(binary()) -> boolean().
is_alphanumeric_or_dash_or_underscore(Grapheme) ->
case (is_alphanumeric(Grapheme) orelse (Grapheme =:= <<"_"/utf8>>)) orelse (Grapheme
=:= <<"-"/utf8>>) of
true ->
true;
_ ->
false
end.
-spec is_alphanumeric_or_dash_or_underscore_or_period(binary()) -> boolean().
is_alphanumeric_or_dash_or_underscore_or_period(Grapheme) ->
case is_alphanumeric_or_dash_or_underscore(Grapheme) orelse (Grapheme =:= <<"."/utf8>>) of
true ->
true;
_ ->
false
end.
-spec get_chars_matching_func(binary(), binary(), fun((binary()) -> boolean())) -> {binary(),
binary()}.
get_chars_matching_func(S, Acc, Match_func) ->
case gleam@string:pop_grapheme(S) of
{ok, {Grapheme, Rest}} ->
case Match_func(Grapheme) of
true ->
get_chars_matching_func(
Rest,
<<Acc/binary, Grapheme/binary>>,
Match_func
);
false ->
{Acc, S}
end;
{error, _} ->
{Acc, S}
end.
-spec get_whitespace(binary()) -> {binary(), binary()}.
get_whitespace(S) ->
get_chars_matching_func(S, <<""/utf8>>, fun is_whitespace/1).
-spec get_name_ignore_ws(binary()) -> {binary(), binary(), integer()}.
get_name_ignore_ws(S) ->
I = 0,
{Whitespace_chars, Rest} = get_whitespace(S),
I@1 = I + gleam@string:length(Whitespace_chars),
{Name_graphemes, Rest@1} = get_chars_matching_func(
Rest,
<<""/utf8>>,
fun is_alphanumeric_or_dash_or_underscore/1
),
I@2 = I@1 + gleam@string:length(Name_graphemes),
{Whitespace_chars@1, Rest@2} = get_whitespace(Rest@1),
I@3 = I@2 + gleam@string:length(Whitespace_chars@1),
{Name_graphemes, Rest@2, I@3}.
-spec is_not_double_quote(binary()) -> boolean().
is_not_double_quote(Grapheme) ->
case Grapheme of
<<"\""/utf8>> ->
false;
_ ->
true
end.
-spec is_not_single_quote(binary()) -> boolean().
is_not_single_quote(Grapheme) ->
case Grapheme of
<<"'"/utf8>> ->
false;
_ ->
true
end.
-spec is_not_whitespace(binary()) -> boolean().
is_not_whitespace(Grapheme) ->
case is_whitespace(Grapheme) of
true ->
false;
_ ->
true
end.
-spec is_not_gt(binary()) -> boolean().
is_not_gt(Grapheme) ->
case Grapheme of
<<">"/utf8>> ->
false;
_ ->
true
end.