Files
2026-06-02 01:48:05 -07:00

200 lines
7.9 KiB
Erlang

% ANSI screen drawing macros in erlang
%
% Author: Peter Harpending <peterharpending@qpq.swiss>
% Date: 2026-04-10
%
% Copyright (C) 2026, QPQ AG
% Not exhaustive, just what I need for the moment
% ref: https://gist.github.com/ConnerWill/d4b6c776b509add763e17f9f113fd25b
-define(ANSI_ESC, [27]).
-define(ANSI_CRLF, "\r\n").
-define(ANSI_FF, [12]).
-define(ANSI_CLEAR, [12]).
-define(ANSI_LINE(X), [X, ?ANSI_CRLF]).
% MARKDOWN TIER TEXT FORMATTING
% resets all formatting
-define(ANSI_RESET, [?ANSI_ESC, "[0m"]).
-define(ANSI_BOLD, [?ANSI_ESC, "[1m"]).
-define(ANSI_DIM, [?ANSI_ESC, "[2m"]).
-define(ANSI_ITALIC, [?ANSI_ESC, "[3m"]).
-define(ANSI_ULINE, [?ANSI_ESC, "[4m"]).
-define(ANSI_BLINK, [?ANSI_ESC, "[5m"]).
-define(ANSI_INVERT, [?ANSI_ESC, "[7m"]).
-define(ANSI_INVIS, [?ANSI_ESC, "[8m"]).
-define(ANSI_STRIKE, [?ANSI_ESC, "[9m"]).
% > Note: Both dim and bold modes are reset with the ESC[22m sequence. The
% > ESC[21m sequence is a non-specified sequence for double underline mode and
% > only work in some terminals and is reset with ESC[24m.
-define(ANSI_UNBOLD, [?ANSI_ESC, "[22m"]).
-define(ANSI_UNDIM, [?ANSI_ESC, "[22m"]).
-define(ANSI_UNITALIC, [?ANSI_ESC, "[23m"]).
-define(ANSI_UNULINE, [?ANSI_ESC, "[24m"]).
-define(ANSI_UNBLINK, [?ANSI_ESC, "[25m"]).
-define(ANSI_UNINVERT, [?ANSI_ESC, "[27m"]).
-define(ANSI_UNINVIS, [?ANSI_ESC, "[28m"]).
-define(ANSI_UNSTRIKE, [?ANSI_ESC, "[29m"]).
-define(ANSI_BOLD(X), [?ANSI_BOLD, X, ?ANSI_UNBOLD]).
-define(ANSI_DIM(X), [?ANSI_DIM, X, ?ANSI_UNDIM]).
-define(ANSI_ITALIC(X), [?ANSI_ITALIC, X, ?ANSI_UNITALIC]).
-define(ANSI_ULINE(X), [?ANSI_ULINE, X, ?ANSI_UNULINE]).
-define(ANSI_BLINK(X), [?ANSI_BLINK, X, ?ANSI_UNBLINK]).
-define(ANSI_INVERT(X), [?ANSI_INVERT, X, ?ANSI_UNINVERT]).
-define(ANSI_INVIS(X), [?ANSI_INVIS, X, ?ANSI_UNINVIS]).
-define(ANSI_STRIKE(X), [?ANSI_STRIKE, X, ?ANSI_UNSTRIKE]).
% COLORS
%
% COLOR SetFG SetBG
% -----------------------------
% Black 30 40
% Red 31 41
% Green 32 42
% Yellow 33 43
% Blue 34 44
% Magenta 35 45
% Cyan 36 46
% White 37 47
% Default 39 49
-define(ANSI_FG_RESET, [?ANSI_ESC, "[39m"]).
-define(ANSI_BG_RESET, [?ANSI_ESC, "[49m"]).
-define(ANSI_FG_BLACK, [?ANSI_ESC, "[30m"]).
-define(ANSI_FG_RED, [?ANSI_ESC, "[31m"]).
-define(ANSI_FG_GREEN, [?ANSI_ESC, "[32m"]).
-define(ANSI_FG_YELLOW, [?ANSI_ESC, "[33m"]).
-define(ANSI_FG_BLUE, [?ANSI_ESC, "[34m"]).
-define(ANSI_FG_MAGENTA, [?ANSI_ESC, "[35m"]).
-define(ANSI_FG_CYAN, [?ANSI_ESC, "[36m"]).
-define(ANSI_FG_WHITE, [?ANSI_ESC, "[37m"]).
-define(ANSI_BG_BLACK, [?ANSI_ESC, "[40m"]).
-define(ANSI_BG_RED, [?ANSI_ESC, "[41m"]).
-define(ANSI_BG_GREEN, [?ANSI_ESC, "[42m"]).
-define(ANSI_BG_YELLOW, [?ANSI_ESC, "[43m"]).
-define(ANSI_BG_BLUE, [?ANSI_ESC, "[44m"]).
-define(ANSI_BG_MAGENTA, [?ANSI_ESC, "[45m"]).
-define(ANSI_BG_CYAN, [?ANSI_ESC, "[46m"]).
-define(ANSI_BG_WHITE, [?ANSI_ESC, "[47m"]).
-define(ANSI_FG_BLACK(X), [?ANSI_FG_BLACK, X, ?ANSI_FG_RESET]).
-define(ANSI_FG_RED(X), [?ANSI_FG_RED, X, ?ANSI_FG_RESET]).
-define(ANSI_FG_GREEN(X), [?ANSI_FG_GREEN, X, ?ANSI_FG_RESET]).
-define(ANSI_FG_YELLOW(X), [?ANSI_FG_YELLOW, X, ?ANSI_FG_RESET]).
-define(ANSI_FG_BLUE(X), [?ANSI_FG_BLUE, X, ?ANSI_FG_RESET]).
-define(ANSI_FG_MAGENTA(X), [?ANSI_FG_MAGENTA, X, ?ANSI_FG_RESET]).
-define(ANSI_FG_CYAN(X), [?ANSI_FG_CYAN, X, ?ANSI_FG_RESET]).
-define(ANSI_FG_WHITE(X), [?ANSI_FG_WHITE, X, ?ANSI_FG_RESET]).
-define(ANSI_BG_BLACK(X), [?ANSI_BG_BLACK, X, ?ANSI_BG_RESET]).
-define(ANSI_BG_RED(X), [?ANSI_BG_RED, X, ?ANSI_BG_RESET]).
-define(ANSI_BG_GREEN(X), [?ANSI_BG_GREEN, X, ?ANSI_BG_RESET]).
-define(ANSI_BG_YELLOW(X), [?ANSI_BG_YELLOW, X, ?ANSI_BG_RESET]).
-define(ANSI_BG_BLUE(X), [?ANSI_BG_BLUE, X, ?ANSI_BG_RESET]).
-define(ANSI_BG_MAGENTA(X), [?ANSI_BG_MAGENTA, X, ?ANSI_BG_RESET]).
-define(ANSI_BG_CYAN(X), [?ANSI_BG_CYAN, X, ?ANSI_BG_RESET]).
-define(ANSI_BG_WHITE(X), [?ANSI_BG_WHITE, X, ?ANSI_BG_RESET]).
% bright colors
-define(ANSI_FG_BBLACK, [?ANSI_ESC, "[90m"]).
-define(ANSI_FG_BRED, [?ANSI_ESC, "[91m"]).
-define(ANSI_FG_BGREEN, [?ANSI_ESC, "[92m"]).
-define(ANSI_FG_BYELLOW, [?ANSI_ESC, "[93m"]).
-define(ANSI_FG_BBLUE, [?ANSI_ESC, "[94m"]).
-define(ANSI_FG_BMAGENTA, [?ANSI_ESC, "[95m"]).
-define(ANSI_FG_BCYAN, [?ANSI_ESC, "[96m"]).
-define(ANSI_FG_BWHITE, [?ANSI_ESC, "[97m"]).
-define(ANSI_BG_BBLACK, [?ANSI_ESC, "[100m"]).
-define(ANSI_BG_BRED, [?ANSI_ESC, "[101m"]).
-define(ANSI_BG_BGREEN, [?ANSI_ESC, "[102m"]).
-define(ANSI_BG_BYELLOW, [?ANSI_ESC, "[103m"]).
-define(ANSI_BG_BBLUE, [?ANSI_ESC, "[104m"]).
-define(ANSI_BG_BMAGENTA, [?ANSI_ESC, "[105m"]).
-define(ANSI_BG_BCYAN, [?ANSI_ESC, "[106m"]).
-define(ANSI_BG_BWHITE, [?ANSI_ESC, "[107m"]).
-define(ANSI_FG_BBLACK(X), [?ANSI_FG_BBLACK, X, ?ANSI_FG_RESET]).
-define(ANSI_FG_BRED(X), [?ANSI_FG_BRED, X, ?ANSI_FG_RESET]).
-define(ANSI_FG_BGREEN(X), [?ANSI_FG_BGREEN, X, ?ANSI_FG_RESET]).
-define(ANSI_FG_BYELLOW(X), [?ANSI_FG_BYELLOW, X, ?ANSI_FG_RESET]).
-define(ANSI_FG_BBLUE(X), [?ANSI_FG_BBLUE, X, ?ANSI_FG_RESET]).
-define(ANSI_FG_BMAGENTA(X), [?ANSI_FG_BMAGENTA, X, ?ANSI_FG_RESET]).
-define(ANSI_FG_BCYAN(X), [?ANSI_FG_BCYAN, X, ?ANSI_FG_RESET]).
-define(ANSI_FG_BWHITE(X), [?ANSI_FG_BWHITE, X, ?ANSI_FG_RESET]).
-define(ANSI_BG_BBLACK(X), [?ANSI_BG_BBLACK, X, ?ANSI_BG_RESET]).
-define(ANSI_BG_BRED(X), [?ANSI_BG_BRED, X, ?ANSI_BG_RESET]).
-define(ANSI_BG_BGREEN(X), [?ANSI_BG_BGREEN, X, ?ANSI_BG_RESET]).
-define(ANSI_BG_BYELLOW(X), [?ANSI_BG_BYELLOW, X, ?ANSI_BG_RESET]).
-define(ANSI_BG_BBLUE(X), [?ANSI_BG_BBLUE, X, ?ANSI_BG_RESET]).
-define(ANSI_BG_BMAGENTA(X), [?ANSI_BG_BMAGENTA, X, ?ANSI_BG_RESET]).
-define(ANSI_BG_BCYAN(X), [?ANSI_BG_BCYAN, X, ?ANSI_BG_RESET]).
-define(ANSI_BG_BWHITE(X), [?ANSI_BG_BWHITE, X, ?ANSI_BG_RESET]).
-define(ANSI_FG_RGB(R,G,B),
[?ANSI_ESC,
"[38;2;",
integer_to_list(R),";",
integer_to_list(G),";",
integer_to_list(B),"m"]
).
-define(ANSI_BG_RGB(R,G,B),
[?ANSI_ESC,
"[48;2;",
integer_to_list(R),";",
integer_to_list(G),";",
integer_to_list(B),"m"]
).
-define(ANSI_FG_RGB(R,G,B,Chars), [?ANSI_FG_RGB(R,G,B), Chars, ?ANSI_FG_RESET]).
-define(ANSI_BG_RGB(R,G,B,Chars), [?ANSI_BG_RGB(R,G,B), Chars, ?ANSI_BG_RESET]).
% cursor controls
-define(ANSI_CUR_HOME, [?ANSI_ESC, "[H"]).
-define(ANSI_CUR_XY(X, Y), [?ANSI_ESC, "[", integer_to_list(Y), ";", integer_to_list(X), "H"]).
-define(ANSI_CUR_UP(N), [?ANSI_ESC, "[", integer_to_list(N), "A"]).
-define(ANSI_CUR_DOWN(N), [?ANSI_ESC, "[", integer_to_list(N), "B"]).
-define(ANSI_CUR_RIGHT(N), [?ANSI_ESC, "[", integer_to_list(N), "C"]).
-define(ANSI_CUR_LEFT(N), [?ANSI_ESC, "[", integer_to_list(N), "D"]).
-define(ANSI_CUR_SAVE, [?ANSI_ESC, "7"]).
-define(ANSI_CUR_RESTORE, [?ANSI_ESC, "8"]).
-define(ANSI_CUR_QUERY, [?ANSI_ESC, "[6n"]).
-define(ANSI_CUR_UP, ?ANSI_CUR_UP(1)).
-define(ANSI_CUR_DOWN, ?ANSI_CUR_DOWN(1)).
-define(ANSI_CUR_RIGHT, ?ANSI_CUR_RIGHT(1)).
-define(ANSI_CUR_LEFT, ?ANSI_CUR_LEFT(1)).
% relative movement "forward" +X=right, +Y=down
-define(ANSI_CUR_VECT(X, Y),
if X =< 0, Y =< 0 -> [?ANSI_CUR_LEFT(-1*X), ?ANSI_CUR_UP(-1*Y)];
X =< 0, 0 < Y -> [?ANSI_CUR_LEFT(-1*X), ?ANSI_CUR_DOWN(Y)];
0 < X, Y =< 0 -> [?ANSI_CUR_RIGHT(X), ?ANSI_CUR_UP(-1*Y)];
0 < X, 0 < Y -> [?ANSI_CUR_RIGHT(X), ?ANSI_CUR_DOWN(Y)]
end
).
-define(ANSI_ALTBUF, [?ANSI_ESC, "[?1049h"]).
-define(ANSI_UNALTBUF, [?ANSI_ESC, "[?1049l"]).
-define(ANSI_CUR_INVIS, [?ANSI_ESC, "[?25l"]).
-define(ANSI_CUR_VIS, [?ANSI_ESC, "[?25h"]).
-define(ANSI_WRAP, [?ANSI_ESC, "[=7h"]).
-define(ANSI_NOWRAP, [?ANSI_ESC, "[=7l"]).