Current section

Files

Jump to
io_ansi_plus lib io ansi plus ie.ex
Raw

lib/io/ansi/plus/ie.ex

defmodule IO.ANSI.Plus.IE do
alias IO.ANSI.Plus, as: ANSI
def color_samples do
:io_ansi_plus
|> Application.get_env(:colors)
|> Enum.map(fn %{code: code, hex: hex, names: names} ->
"#" <> hex_val = hex
name_list =
if Enum.empty?(names) do
"`:color#{code}` "
else
Enum.reduce(names, "", fn name, acc ->
acc <> "`#{inspect(name)}` "
end)
end
"- ![#{hex}](https://placehold.it/15/#{hex_val}/000000?text=+)" <>
"#{name_list}(#{code})"
end)
end
def print_color_samples do
color_samples() |> Enum.each(&IO.puts/1)
end
@spec fave_names :: %{(name :: atom) => code :: 0..255}
def fave_names do
:io_ansi_plus
|> Application.get_env(:colors)
|> Enum.reduce(%{}, fn
%{code: _code, names: []}, acc -> acc
%{code: code, names: [name | _]}, acc -> Map.put(acc, name, code)
end)
end
@spec fave_name_codes :: %{(code :: 0..255) => name :: atom}
def fave_name_codes do
fave_names() |> Map.new(fn {name, code} -> {code, name} end)
end
@spec keyword :: keyword(code :: 16..255)
def keyword do
codes = fave_name_codes()
for i <- 16..255 do
if codes[i], do: {codes[i], i}, else: {:"color#{i}", i}
end
end
@spec keywords :: [keyword(code :: 16..255)]
def keywords do
keyword() |> Enum.chunk_every(6)
end
def black_foreground_codes do
[7, 10, 11, 14, 15] ++
Enum.to_list(34..51) ++
Enum.to_list(70..87) ++
Enum.to_list(106..123) ++
Enum.to_list(142..159) ++
Enum.to_list(178..195) ++ Enum.to_list(214..231) ++ Enum.to_list(244..255)
end
@spec print_xterm_colors(10..30) :: :ok
def print_xterm_colors(column_width \\ 17) when column_width in 10..30 do
for keyword <- keywords() do
Enum.each(keyword, fn {name, code} ->
[
:"#{name}_background",
:light_white,
if(code in black_foreground_codes(), do: :black, else: :light_white),
text(name, code, column_width)
]
|> ANSI.write()
end)
IO.write("\n")
end
IO.write("\n")
end
def adjust_text(text, column_width) do
if String.length(text) > column_width - 1 do
String.slice(text, 0..(column_width - 3)) <> "…"
else
text
end
|> String.pad_trailing(column_width)
end
def text(name, column_width) do
"#{inspect(name)}" |> adjust_text(column_width)
end
def text(name, code, column_width) do
text = "#{inspect(name)} (#{code})"
if String.length(text) > column_width - 1 do
"#{inspect(name)}"
else
text
end
|> adjust_text(column_width)
end
def print_standard_colors(column_width \\ 15) do
[:black, :red, :green, :yellow, :blue, :magenta, :cyan, :white]
|> Enum.each(fn name ->
[
:"#{name}_background",
if(name == :white, do: :black, else: :light_white),
text(name, column_width)
]
|> ANSI.write()
end)
IO.write("\n")
end
def print_light_colors(column_width \\ 15) do
[:black, :red, :green, :yellow, :blue, :magenta, :cyan, :white]
|> Enum.each(fn name ->
name = :"light_#{name}"
[
:"#{name}_background",
if(name in [:light_white, :light_yellow, :light_green, :light_cyan],
do: :black,
else: :light_white
),
text(name, column_width)
]
|> ANSI.write()
end)
IO.write("\n\n")
end
def print_system_colors(column_width \\ 15) do
codes = fave_name_codes()
keywords =
for i <- 0..15 do
if codes[i], do: {codes[i], i}, else: {:"color#{i}", i}
end
|> Enum.chunk_every(8)
for keyword <- keywords do
Enum.each(keyword, fn {name, code} ->
[
:"#{name}_background",
if(code in black_foreground_codes(), do: :black, else: :light_white),
text(name, code, column_width)
]
|> ANSI.write()
end)
IO.write("\n")
end
IO.write("\n")
end
def print_chart do
IO.write("\n")
print_standard_colors(12)
print_light_colors(12)
print_system_colors(12)
print_xterm_colors(18)
end
end