Packages

Beautiful, expressive and composable color and text formatting for CLI in Gleam.

Current section

Files

Jump to
chromatic src chromatic.erl
Raw

src/chromatic.erl

-module(chromatic).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([decorate_ansi_raw/2, offset_rainbow/2, rainbow/1, decorate_ansi/2, black/1, red/1, green/1, yellow/1, blue/1, magenta/1, cyan/1, white/1, gray/1, bright_red/1, bright_green/1, bright_yellow/1, bright_blue/1, bright_magenta/1, bright_cyan/1, bright_white/1, bg_black/1, bg_red/1, bg_green/1, bg_yellow/1, bg_blue/1, bg_magenta/1, bg_cyan/1, bg_white/1, bg_gray/1, bg_bright_red/1, bg_bright_green/1, bg_bright_yellow/1, bg_bright_blue/1, bg_bright_magenta/1, bg_bright_cyan/1, bg_bright_white/1, bold/1, italic/1, underline/1, bleed/1, clear_str/0, clear/1]).
-spec decorate_ansi_raw(binary(), binary()) -> binary().
decorate_ansi_raw(String, Code) ->
<<<<<<"\x{001b}["/utf8, Code/binary>>/binary, "m"/utf8>>/binary,
String/binary>>.
-spec offset_rainbow(binary(), integer()) -> binary().
offset_rainbow(String, Offset) ->
{Str@1, _, _} = begin
_pipe = gleam@string:to_graphemes(String),
gleam@list:fold(
_pipe,
{<<""/utf8>>, false, Offset},
fun(Acc, Char) ->
{Str, In, Color} = Acc,
New_in = case In of
true ->
Char /= <<"m"/utf8>>;
false ->
Char =:= <<"\x{001b}"/utf8>>
end,
Maybe_color = case In orelse New_in of
true ->
{<<Str/binary, Char/binary>>, New_in, Color};
false ->
Colored = case Color rem 6 of
0 ->
decorate_ansi_raw(Char, <<"31"/utf8>>);
1 ->
decorate_ansi_raw(Char, <<"33"/utf8>>);
2 ->
decorate_ansi_raw(Char, <<"32"/utf8>>);
3 ->
decorate_ansi_raw(Char, <<"36"/utf8>>);
4 ->
decorate_ansi_raw(Char, <<"34"/utf8>>);
5 ->
decorate_ansi_raw(Char, <<"35"/utf8>>);
_ ->
<<""/utf8>>
end,
{<<Str/binary, Colored/binary>>, New_in, Color + 1}
end,
Maybe_color
end
)
end,
Str@1.
-spec rainbow(binary()) -> binary().
rainbow(String) ->
offset_rainbow(String, 0).
-spec auto_clear(binary()) -> binary().
auto_clear(String) ->
Result = case gleam@string:ends_with(String, <<"\x{001b}[0m"/utf8>>) of
true ->
String;
false ->
<<String/binary, "\x{001b}[0m"/utf8>>
end,
Result.
-spec decorate_ansi(binary(), binary()) -> binary().
decorate_ansi(String, Code) ->
_pipe = decorate_ansi_raw(String, Code),
auto_clear(_pipe).
-spec black(binary()) -> binary().
black(String) ->
decorate_ansi(String, <<"30"/utf8>>).
-spec red(binary()) -> binary().
red(String) ->
decorate_ansi(String, <<"31"/utf8>>).
-spec green(binary()) -> binary().
green(String) ->
decorate_ansi(String, <<"32"/utf8>>).
-spec yellow(binary()) -> binary().
yellow(String) ->
decorate_ansi(String, <<"33"/utf8>>).
-spec blue(binary()) -> binary().
blue(String) ->
decorate_ansi(String, <<"34"/utf8>>).
-spec magenta(binary()) -> binary().
magenta(String) ->
decorate_ansi(String, <<"35"/utf8>>).
-spec cyan(binary()) -> binary().
cyan(String) ->
decorate_ansi(String, <<"36"/utf8>>).
-spec white(binary()) -> binary().
white(String) ->
decorate_ansi(String, <<"37"/utf8>>).
-spec gray(binary()) -> binary().
gray(String) ->
decorate_ansi(String, <<"90"/utf8>>).
-spec bright_red(binary()) -> binary().
bright_red(String) ->
decorate_ansi(String, <<"91"/utf8>>).
-spec bright_green(binary()) -> binary().
bright_green(String) ->
decorate_ansi(String, <<"92"/utf8>>).
-spec bright_yellow(binary()) -> binary().
bright_yellow(String) ->
decorate_ansi(String, <<"93"/utf8>>).
-spec bright_blue(binary()) -> binary().
bright_blue(String) ->
decorate_ansi(String, <<"94"/utf8>>).
-spec bright_magenta(binary()) -> binary().
bright_magenta(String) ->
decorate_ansi(String, <<"95"/utf8>>).
-spec bright_cyan(binary()) -> binary().
bright_cyan(String) ->
decorate_ansi(String, <<"96"/utf8>>).
-spec bright_white(binary()) -> binary().
bright_white(String) ->
decorate_ansi(String, <<"97"/utf8>>).
-spec bg_black(binary()) -> binary().
bg_black(String) ->
decorate_ansi(String, <<"40"/utf8>>).
-spec bg_red(binary()) -> binary().
bg_red(String) ->
decorate_ansi(String, <<"41"/utf8>>).
-spec bg_green(binary()) -> binary().
bg_green(String) ->
decorate_ansi(String, <<"42"/utf8>>).
-spec bg_yellow(binary()) -> binary().
bg_yellow(String) ->
decorate_ansi(String, <<"43"/utf8>>).
-spec bg_blue(binary()) -> binary().
bg_blue(String) ->
decorate_ansi(String, <<"44"/utf8>>).
-spec bg_magenta(binary()) -> binary().
bg_magenta(String) ->
decorate_ansi(String, <<"45"/utf8>>).
-spec bg_cyan(binary()) -> binary().
bg_cyan(String) ->
decorate_ansi(String, <<"46"/utf8>>).
-spec bg_white(binary()) -> binary().
bg_white(String) ->
decorate_ansi(String, <<"47"/utf8>>).
-spec bg_gray(binary()) -> binary().
bg_gray(String) ->
decorate_ansi(String, <<"100"/utf8>>).
-spec bg_bright_red(binary()) -> binary().
bg_bright_red(String) ->
decorate_ansi(String, <<"101"/utf8>>).
-spec bg_bright_green(binary()) -> binary().
bg_bright_green(String) ->
decorate_ansi(String, <<"102"/utf8>>).
-spec bg_bright_yellow(binary()) -> binary().
bg_bright_yellow(String) ->
decorate_ansi(String, <<"103"/utf8>>).
-spec bg_bright_blue(binary()) -> binary().
bg_bright_blue(String) ->
decorate_ansi(String, <<"104"/utf8>>).
-spec bg_bright_magenta(binary()) -> binary().
bg_bright_magenta(String) ->
decorate_ansi(String, <<"105"/utf8>>).
-spec bg_bright_cyan(binary()) -> binary().
bg_bright_cyan(String) ->
decorate_ansi(String, <<"106"/utf8>>).
-spec bg_bright_white(binary()) -> binary().
bg_bright_white(String) ->
decorate_ansi(String, <<"107"/utf8>>).
-spec bold(binary()) -> binary().
bold(String) ->
decorate_ansi(String, <<"1"/utf8>>).
-spec italic(binary()) -> binary().
italic(String) ->
decorate_ansi(String, <<"3"/utf8>>).
-spec underline(binary()) -> binary().
underline(String) ->
decorate_ansi(String, <<"4"/utf8>>).
-spec bleed(binary()) -> binary().
bleed(String) ->
Result = case gleam@string:ends_with(String, <<"\x{001b}[0m"/utf8>>) of
true ->
gleam@string:drop_right(
String,
gleam@string:length(<<"\x{001b}[0m"/utf8>>)
);
false ->
String
end,
Result.
-spec clear_str() -> binary().
clear_str() ->
<<"\x{001b}[0m"/utf8>>.
-spec clear(binary()) -> binary().
clear(String) ->
<<"\x{001b}[0m"/utf8, String/binary>>.