% ANSI screen drawing macros in erlang % % Author: Peter Harpending % 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"]).