Current section

Files

Jump to
commonmark src commonmark@internal@parser@helpers.erl
Raw

src/commonmark@internal@parser@helpers.erl

-module(commonmark@internal@parser@helpers).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([ol_marker/1, ul_marker/1, trim_indent/2, determine_indent/1, indent_pattern/1]).
-spec ol_marker(binary()) -> commonmark@ast:ordered_list_marker().
ol_marker(Marker) ->
case Marker of
<<"."/utf8>> ->
period_list_marker;
<<")"/utf8>> ->
bracket_list_marker;
_ ->
erlang:error(#{gleam_error => panic,
message => (<<"Invalid ordered list marker: "/utf8,
Marker/binary>>),
module => <<"commonmark/internal/parser/helpers"/utf8>>,
function => <<"ol_marker"/utf8>>,
line => 12})
end.
-spec ul_marker(binary()) -> commonmark@ast:unordered_list_marker().
ul_marker(Marker) ->
case Marker of
<<"*"/utf8>> ->
asterisk_list_marker;
<<"-"/utf8>> ->
dash_list_marker;
<<"+"/utf8>> ->
plus_list_marker;
_ ->
erlang:error(#{gleam_error => panic,
message => (<<"Invalid unordered list marker: "/utf8,
Marker/binary>>),
module => <<"commonmark/internal/parser/helpers"/utf8>>,
function => <<"ul_marker"/utf8>>,
line => 21})
end.
-spec do_trim_indent(binary(), integer(), integer()) -> binary().
do_trim_indent(Line, N, Removed) ->
Remaining = N - Removed,
Next_tab_stop = 4 - (Removed rem 4),
case Line of
_ when Remaining =< 0 ->
Line;
<<"\t"/utf8, Rest/binary>> when Remaining < Next_tab_stop ->
<<(gleam@string:repeat(<<" "/utf8>>, Next_tab_stop - Remaining))/binary,
Rest/binary>>;
<<" "/utf8, Rest@1/binary>> ->
do_trim_indent(Rest@1, N, Removed + 1);
<<"\t"/utf8, Rest@2/binary>> ->
do_trim_indent(Rest@2, N, Removed + Next_tab_stop);
_ ->
Line
end.
-spec trim_indent(binary(), integer()) -> binary().
trim_indent(Line, N) ->
do_trim_indent(Line, N, 0).
-spec determine_indent(gleam@option:option(binary())) -> integer().
determine_indent(Indent) ->
case Indent of
none ->
0;
{some, S} ->
gleam@string:length(S)
end.
-spec indent_pattern(integer()) -> binary().
indent_pattern(Indent) ->
case Indent of
0 ->
<<""/utf8>>;
I when I >= 4 ->
<<"(?: {0,3}\t| )"/utf8, (indent_pattern(I - 4))/binary>>;
I@1 ->
<<<<"(?: {"/utf8, (gleam@int:to_string(I@1))/binary>>/binary,
"}|\t)"/utf8>>
end.