Packages
io_ansi_table
0.4.21
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 Application.get_env(@app, :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_line_type(&1, spec))
spec |> bottom_margin() |> IO.write()
IO.write(if spec.bell, do: "\a", else: "")
end
@spec write_line_type(LineType.t(), Spec.t()) :: :ok
defp write_line_type(type, %{} = spec) when type in @rule_types do
spec.column_widths
|> Enum.map(&(Style.dash(spec.style, type) |> String.duplicate(&1)))
|> write_line(type, spec)
end
defp write_line_type(:header = type, %{} = spec) do
write_line(spec.headings, type, spec)
end
defp write_line_type(type, %{} = spec) when is_list(type) do
spec.rows
|> Stream.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