Packages
io_ansi_table
0.3.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
@moduledoc false
use PersistConfig
alias IO.ANSI.Table.{Line, 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 write_table(Spec.t()) :: :ok
defp write_table(%{} = spec) do
String.duplicate("\n", spec.margins[:top] || 0) |> IO.write()
Style.line_types(spec.style) |> Enum.each(&write_line_type(&1, spec))
String.duplicate("\n", spec.margins[:bottom] || 0) |> IO.write()
IO.write((spec.bell && "\a") || "")
end
@spec write_line_type(Style.line_type(), 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()], Style.line_type(), 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