Packages
io_ansi_table
0.4.32
1.0.40
1.0.39
1.0.38
1.0.37
1.0.36
1.0.34
1.0.33
1.0.32
1.0.31
1.0.30
1.0.29
1.0.28
1.0.27
1.0.26
1.0.25
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.4.32
0.4.31
0.4.30
0.4.29
0.4.28
0.4.27
0.4.26
0.4.25
0.4.24
0.4.23
0.4.22
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Writes data to "stdio" in a table with borders and colors. Can choose a table style to change the look of the table.
Current section
Files
Jump to
Current section
Files
lib/io/ansi/table/formatter.ex
defmodule IO.ANSI.Table.Formatter do
use PersistConfig
alias IO.ANSI.Plus, as: ANSI
alias IO.ANSI.Table.{Line, LineType, Spec, Style}
@rule_types get_env(:rule_types)
@spec print_table(Spec.t(), [Access.container()], Keyword.t()) :: :ok
def print_table(spec, maps, options \\ []) do
spec
|> Spec.apply(options)
|> Spec.deploy(maps)
|> write_table()
end
## Private functions
@spec top_margin(Spec.t()) :: String.t()
defp top_margin(spec) do
case spec.margins[:top] do
# Move the cursor up N lines: \e[<N>A...
n when is_integer(n) and n <= -1 ->
ANSI.cursor_up(-n)
n when is_integer(n) and n >= 1 ->
String.duplicate("\n", n)
_ ->
""
end
end
@spec bottom_margin(Spec.t()) :: String.t()
defp bottom_margin(spec) do
case spec.margins[:bottom] do
n when is_integer(n) and n >= 0 ->
String.duplicate("\n", spec.margins[:bottom])
_ ->
""
end
end
@spec write_table(Spec.t()) :: :ok
defp write_table(%{} = spec) do
spec |> top_margin() |> IO.write()
Style.line_types(spec.style) |> Enum.each(&write_lines_of_type(&1, spec))
spec |> bottom_margin() |> IO.write()
IO.write(if spec.bell, do: "\a", else: "")
end
@spec write_lines_of_type(LineType.t(), Spec.t()) :: :ok
defp write_lines_of_type(type, %{} = spec) when type in @rule_types do
dash = Style.dash(spec.style, type)
spec.column_widths
|> Enum.map(&String.duplicate(dash, &1))
|> write_line(type, spec)
end
defp write_lines_of_type(:header = type, %{} = spec) do
write_line(spec.headings, type, spec)
end
defp write_lines_of_type(type, %{} = spec) when is_list(type) do
spec.rows
|> Enum.zip(Stream.cycle(type))
|> Enum.each(fn {row, type} -> write_line(row, type, spec) end)
end
@spec write_line([Line.elem()], LineType.t(), Spec.t()) :: :ok
defp write_line(elems, type, %{} = spec) do
IO.write(spec.left_margin)
items = Line.items(elems, Style.borders(spec.style, type))
item_attrs = Line.item_attrs(type, spec)
item_widths = Line.item_widths(elems, type, spec)
format = Line.format(item_widths, item_attrs)
:io.format(format, items)
end
end