Current section
Files
Jump to
Current section
Files
src/scrapbook@internal@html.erl
-module(scrapbook@internal@html).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([find_key_value/2]).
-export_type([index_search/0, index_search_error/0, find_value_error/0, find_key_value_result/0, find_key_value_error/0]).
-type index_search() :: {index_search,
integer(),
binary(),
integer(),
boolean()}.
-type index_search_error() :: {no_index_found, integer()}.
-type find_value_error() :: no_value |
no_graphemes |
invalid_start_character |
{no_value_end_found, index_search_error()}.
-type find_key_value_result() :: {find_key_value_result, binary(), binary()}.
-type find_key_value_error() :: {no_prefix, binary()} |
{find_value_error, find_value_error()}.
-file("/home/norbert/projects/scrapbook/src/scrapbook/internal/html.gleam", 38).
-spec do_find_value_end_index(
list(binary()),
binary(),
binary(),
index_search()
) -> {ok, integer()} | {error, index_search_error()}.
do_find_value_end_index(Graphemes, Start, End, Index_search) ->
case Graphemes of
[] ->
{error, {no_index_found, erlang:element(2, Index_search)}};
[First | Rest] when (erlang:element(3, Index_search) =/= <<"\\"/utf8>>) andalso (First =:= <<"\""/utf8>>) ->
do_find_value_end_index(
Rest,
Start,
End,
{index_search,
erlang:element(2, Index_search) + 1,
First,
erlang:element(4, Index_search),
not erlang:element(5, Index_search)}
);
[First@1 | Rest@1] when (First@1 =:= End) andalso (erlang:element(
5,
Index_search
) =:= false) ->
case erlang:element(4, Index_search) =:= 1 of
true ->
{ok, erlang:element(2, Index_search)};
false ->
do_find_value_end_index(
Rest@1,
Start,
End,
{index_search,
erlang:element(2, Index_search) + 1,
First@1,
erlang:element(4, Index_search) - 1,
erlang:element(5, Index_search)}
)
end;
[First@2 | Rest@2] when (First@2 =:= Start) andalso (erlang:element(
5,
Index_search
) =:= false) ->
do_find_value_end_index(
Rest@2,
Start,
End,
{index_search,
erlang:element(2, Index_search) + 1,
First@2,
erlang:element(4, Index_search) + 1,
erlang:element(5, Index_search)}
);
[First@3 | Rest@3] ->
do_find_value_end_index(
Rest@3,
Start,
End,
{index_search,
erlang:element(2, Index_search) + 1,
First@3,
erlang:element(4, Index_search),
erlang:element(5, Index_search)}
)
end.
-file("/home/norbert/projects/scrapbook/src/scrapbook/internal/html.gleam", 101).
-spec find_value_end_index(list(binary()), binary(), binary()) -> {ok,
integer()} |
{error, index_search_error()}.
find_value_end_index(Graphemes, Start, End) ->
do_find_value_end_index(
Graphemes,
Start,
End,
{index_search, 0, <<""/utf8>>, 0, false}
).
-file("/home/norbert/projects/scrapbook/src/scrapbook/internal/html.gleam", 119).
-spec find_value(binary()) -> {ok, binary()} | {error, find_value_error()}.
find_value(Html) ->
gleam@bool:guard(
begin
_pipe = Html,
gleam@string:starts_with(_pipe, <<"null"/utf8>>)
end,
{error, no_value},
fun() ->
Graphemes = begin
_pipe@1 = Html,
gleam@string:to_graphemes(_pipe@1)
end,
gleam@result:'try'(
gleam@result:replace_error(
begin
_pipe@2 = Graphemes,
gleam@list:first(_pipe@2)
end,
no_graphemes
),
fun(Start_character) ->
gleam@bool:guard(
(Start_character /= <<"{"/utf8>>) andalso (Start_character
/= <<"["/utf8>>),
{error, invalid_start_character},
fun() ->
End_character = case Start_character of
<<"{"/utf8>> ->
<<"}"/utf8>>;
_ ->
<<"]"/utf8>>
end,
gleam@result:'try'(
case find_value_end_index(
Graphemes,
Start_character,
End_character
) of
{ok, Value} ->
{ok, Value};
{error, Err} ->
{error, {no_value_end_found, Err}}
end,
fun(End_index) ->
{ok,
begin
_pipe@3 = Html,
gleam@string:slice(
_pipe@3,
0,
End_index + 1
)
end}
end
)
end
)
end
)
end
).
-file("/home/norbert/projects/scrapbook/src/scrapbook/internal/html.gleam", 155).
-spec find_key_value(binary(), binary()) -> {ok, find_key_value_result()} |
{error, find_key_value_error()}.
find_key_value(Html, Key) ->
Prefix = <<<<"\""/utf8, Key/binary>>/binary, "\":"/utf8>>,
gleam@result:'try'(
gleam@result:replace_error(
begin
_pipe = Html,
gleam@string:split_once(_pipe, Prefix)
end,
{no_prefix, Key}
),
fun(_use0) ->
{_, Html@1} = _use0,
case find_value(Html@1) of
{ok, Value} ->
{ok, {find_key_value_result, Html@1, Value}};
{error, Err} ->
{error, {find_value_error, Err}}
end
end
).