-module(gg_cn@internal@parse).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/gg_cn/internal/parse.gleam").
-export([parse_class_name/1]).
-export_type([parsed/0, scan/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-type parsed() :: {parsed,
list(binary()),
boolean(),
binary(),
gleam@option:option(integer())}.
-type scan() :: {scan,
integer(),
integer(),
integer(),
integer(),
list(binary()),
gleam@option:option(integer())}.
-file("src/gg_cn/internal/parse.gleam", 113).
?DOC(false).
-spec resolve_important(binary()) -> {binary(), boolean()}.
resolve_important(Base_with_important) ->
case gleam_stdlib:string_ends_with(Base_with_important, <<"!"/utf8>>) of
true ->
{gleam@string:drop_end(Base_with_important, 1), true};
false ->
case gleam_stdlib:string_starts_with(
Base_with_important,
<<"!"/utf8>>
) of
true ->
{gleam@string:drop_start(Base_with_important, 1), true};
false ->
{Base_with_important, false}
end
end.
-file("src/gg_cn/internal/parse.gleam", 85).
?DOC(false).
-spec step(binary(), scan(), binary()) -> scan().
step(Class_name, State, Char) ->
Index = erlang:element(2, State),
Top_level = (erlang:element(3, State) =:= 0) andalso (erlang:element(
4,
State
)
=:= 0),
case {Top_level, Char} of
{true, <<":"/utf8>>} ->
{scan,
Index + 1,
erlang:element(3, State),
erlang:element(4, State),
Index + 1,
[gleam@string:slice(
Class_name,
erlang:element(5, State),
Index - erlang:element(5, State)
) |
erlang:element(6, State)],
erlang:element(7, State)};
{true, <<"/"/utf8>>} ->
{scan,
Index + 1,
erlang:element(3, State),
erlang:element(4, State),
erlang:element(5, State),
erlang:element(6, State),
{some, Index}};
{_, <<"["/utf8>>} ->
{scan,
Index + 1,
erlang:element(3, State) + 1,
erlang:element(4, State),
erlang:element(5, State),
erlang:element(6, State),
erlang:element(7, State)};
{_, <<"]"/utf8>>} ->
{scan,
Index + 1,
erlang:element(3, State) - 1,
erlang:element(4, State),
erlang:element(5, State),
erlang:element(6, State),
erlang:element(7, State)};
{_, <<"("/utf8>>} ->
{scan,
Index + 1,
erlang:element(3, State),
erlang:element(4, State) + 1,
erlang:element(5, State),
erlang:element(6, State),
erlang:element(7, State)};
{_, <<")"/utf8>>} ->
{scan,
Index + 1,
erlang:element(3, State),
erlang:element(4, State) - 1,
erlang:element(5, State),
erlang:element(6, State),
erlang:element(7, State)};
{_, _} ->
{scan,
Index + 1,
erlang:element(3, State),
erlang:element(4, State),
erlang:element(5, State),
erlang:element(6, State),
erlang:element(7, State)}
end.
-file("src/gg_cn/internal/parse.gleam", 36).
?DOC(false).
-spec parse_class_name(binary()) -> parsed().
parse_class_name(Class_name) ->
Chars = gleam@string:to_graphemes(Class_name),
Final = gleam@list:fold(
Chars,
{scan, 0, 0, 0, 0, [], none},
fun(State, Char) -> step(Class_name, State, Char) end
),
Total = erlang:length(Chars),
Modifiers = lists:reverse(erlang:element(6, Final)),
Base_with_important = case Modifiers of
[] ->
Class_name;
_ ->
gleam@string:slice(
Class_name,
erlang:element(5, Final),
Total - erlang:element(5, Final)
)
end,
{Base_class_name, Has_important_modifier} = resolve_important(
Base_with_important
),
Maybe_postfix = case erlang:element(7, Final) of
{some, Position} ->
case Position > erlang:element(5, Final) of
true ->
{some, Position - erlang:element(5, Final)};
false ->
none
end;
none ->
none
end,
{parsed, Modifiers, Has_important_modifier, Base_class_name, Maybe_postfix}.