table_rex

An Elixir app which generates text-based tables for display

Github星跟蹤圖

Hex.pm
Build Status
Docs on HexDocs
Awesome Elixir

An Elixir app which generates text-based tables for display

Currently supports output:

  • in customisable ASCII format.
  • with your own renderer module.

Features

  • A one-liner for those that just want to render ASCII tables with sane
    defaults.
  • Output of table titles & alignable column headers.
  • Basic sorting of rows in ascending/descending order.
  • Support for column & cell level alignment (center, left, right).
  • Column, header, & cell level
    support.
  • Automatic cell padding but also the option to set padding per
    column1.
  • Frame the table with various vertical & horizontal styles1.
  • Style the table how you wish with custom separators1.
  • Works well with the Agent module to allow for easy sharing of state.
  • Clients can supply their own rendering modules and still take advantage of the
    table manipulation API.

1 The text renderer supports these features, others may not or might
not need to.

Documenation

See the quick start below or check out the
full API docs at HexDocs.

Stability

This software is now post v1 and therefore, as per semver, can be considered
stable and will have no breaking changes without incrementing the major version
number. Any breaking changes, and they will be few and far between, will be
documented in the CHANGELOG.

The project officially supports the last 3 minor versions of Elixir, and the
latest 2 majors for OTP. This does not mean the software fails to work in older
versions, simply that they are not supported and are not tested against.

Supported minimum requirements:

  • Elixir: 1.4.5
  • OTP: 19.3

Installation

The package is available on Hex, therefore:

Add table_rex to your list of dependencies in mix.exs:

def deps do
  [{:table_rex, "~> 2.0.0"}]
end

Then start table_rex by adding it to application/0 in mix.exs:

def application do
  [applications: [:logger, :table_rex]]
end

Quick Start

Use the TableRex.quick_render and TableRex.quick_render! functions; for
those that just want a table quickly.

Given this data:

title = "Drum & Bass Releases"
header = ["Artist", "Track", "Label", "Year"]
rows = [
  ["Konflict", "Cyanide", "Renegade Hardware", 1999],
  ["Marcus Intalex", "Temperance", "Soul:r", 2004],
  ["Kryptic Minds", "The Forgotten", "Defcom Records", 2007]
]

TableRex.quick_render!/1

TableRex.quick_render!(rows), > IO.puts
+----------------, ---------------, -------------------, ------+, Konflict, Cyanide, Renegade Hardware, 1999, Marcus Intalex, Temperance, Soul:r, 2004, Kryptic Minds, The Forgotten, Defcom Records, 2007, +----------------, ---------------, -------------------, ------+

TableRex.quick_render!/2

TableRex.quick_render!(rows, header), > IO.puts
+----------------, ---------------, -------------------, ------+, Artist, Track, Label, Year, +----------------, ---------------, -------------------, ------+, Konflict, Cyanide, Renegade Hardware, 1999, Marcus Intalex, Temperance, Soul:r, 2004, Kryptic Minds, The Forgotten, Defcom Records, 2007, +----------------, ---------------, -------------------, ------+

TableRex.quick_render!/3

TableRex.quick_render!(rows, header, title), > IO.puts
+-----------------------------------------------------------+, Drum & Bass Releases, +----------------, ---------------, -------------------, ------+, Artist, Track, Label, Year, +----------------, ---------------, -------------------, ------+, Konflict, Cyanide, Renegade Hardware, 1999, Marcus Intalex, Temperance, Soul:r, 2004, Kryptic Minds, The Forgotten, Defcom Records, 2007, +----------------, ---------------, -------------------, ------+

Utilising TableRex.Table for deeper customisation

These examples all use: alias TableRex.Table to shorten the namespace.

Set alignment & padding for specific columns or column ranges:

Table.new(rows, header), > Table.put_column_meta(0, align: :right, padding: 5) # `0` is the column index., > Table.put_column_meta(1..2, align: :center) # `1..2` is a range of column indexes. :all also works., > Table.render!, > IO.puts
+------------------------, ---------------, -------------------, ------+, Artist, Track, Label, Year, +------------------------, ---------------, -------------------, ------+, Konflict, Cyanide, Renegade Hardware, 1999, Marcus Intalex, Temperance, Soul:r, 2004, Kryptic Minds, The Forgotten, Defcom Records, 2007, +------------------------, ---------------, -------------------, ------+

Sort the rows of the table using a column's values:

Table.new(rows, header), > Table.sort(3, :desc) # `3` is the column index, order is :desc or :asc for descending/ascending., > Table.render!, > IO.puts
+----------------, ---------------, -------------------, ------+, Artist, Track, Label, Year, +----------------, ---------------, -------------------, ------+, Kryptic Minds, The Forgotten, Defcom Records, 2007, Marcus Intalex, Temperance, Soul:r, 2004, Konflict, Cyanide, Renegade Hardware, 1999, +----------------, ---------------, -------------------, ------+

Change the table styling:

Table.new(rows, header), > Table.put_column_meta(:all, align: :center), > Table.render!(header_separator_symbol: "=", horizontal_style: :all), > IO.puts
+----------------, ---------------, -------------------, ------+, Artist, Track, Label, Year, +================+===============+===================+======+, Konflict, Cyanide, Renegade Hardware, 1999, +----------------, ---------------, -------------------, ------+, Marcus Intalex, Temperance, Soul:r, 2004, +----------------, ---------------, -------------------, ------+, Kryptic Minds, The Forgotten, Defcom Records, 2007, +----------------, ---------------, -------------------, ------+

Available render options:

  • horizontal_style: one of :off, :frame, :header or :all.
  • vertical_style: one of :off, :frame or :all.
  • horizontal_symbol: draws horizontal row separators.
  • vertical_symbol: draws vertical separators.
  • intersection_symbol: draws the symbol where horizontal and vertical
    seperators intersect.
  • top_frame_symbol: draws the frame's top horizontal separator.
  • title_separator_symbol: draws the horizontal separator under the title.
  • header_separator_symbol: draws to draw the horizontal separator under the
    header.
  • bottom_frame_symbol: draws the frame's bottom horizontal separator.

Set cell level meta (including for the header cells):

Table.new(rows, header), > Table.put_header_meta(0..4, align: :center) # row index(es), > Table.put_cell_meta(2, 1, align: :right) # column index, row index., > Table.render!, > IO.puts
+----------------, ---------------, -------------------, ------+, Artist, Track, Label, Year, +----------------, ---------------, -------------------, ------+, Konflict, Cyanide, Renegade Hardware, 1999, Marcus Intalex, Temperance, Soul:r, 2004, Kryptic Minds, The Forgotten, Defcom Records, 2007, +----------------, ---------------, -------------------, ------+

Set color for the column, header, and cell:

Table.new(rows, header), > Table.put_column_meta(0, color: :red) # sets column header to red, too, > Table.put_header_meta(1..4, color: IO.ANSI.color(31)), > Table.put_cell_meta(2, 1, color: [:green_background, :white]), > Table.render!, > IO.puts

Supported color value types:

  • atom: a named ANSI sequence defined in
    IO.ANSI
  • string: an embedded ANSI sequence
  • chardata: a list of atoms and/or strings
  • function: (text, value) -> text
    • where text is the padded value and where the value is a string
    • Note: to render the correct padding, always format and return the text

Conditionally set a color:

Table.new(rows, header), > Table.put_column_meta(3, color: fn(text, value) -> if value in ["1999", "2007"], do: [:blue, text], else: text end), > Table.render!, > IO.puts

Change/pass in your own renderer module:

The default renderer is TableRex.Renderer.Text.

Custom renderer modules must be behaviours of TableRex.Renderer.

Table.new(rows, header), > Table.render!(renderer: YourCustom.Renderer.Module)

Go mad:

Table.new(rows, header), > Table.render!(horizontal_style: :all, top_frame_symbol: "*", header_separator_symbol: "=", horizontal_symbol: "~", vertical_symbol: "!"), > IO.puts
+****************+***************+*******************+******+
! Artist         ! Track         ! Label             ! Year !
+================+===============+===================+======+
! Konflict       ! Cyanide       ! Renegade Hardware ! 1999 !
+~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~+~~~~~~+
! Marcus Intalex ! Temperance    ! Soul:r            ! 2004 !
+~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~+~~~~~~+
! Kryptic Minds  ! The Forgotten ! Defcom Records    ! 2007 !
+----------------, ---------------, -------------------, ------+

Run the tests

We have an extensive test suite which helps showcase project usage. For example:
the
quick render functions,
table manipulation API
or
the text renderer module.

To run the test suite, from the project directory, do:

mix test

Publish to Hex

# Login to hex to retrieve API Key
mix hex.user auth

# Then publish by first setting to docs env to allow building to hexdocs.
MIX_ENV=docs mix hex.publish

Roadmap/Contributing

We use the Github Issues tracker.

If you have found something wrong, please raise an issue.

If you'd like to contribute, check the issues to see where you can help.

Contributions are welcome from anyone at any time but if the piece of work is
significant in size, please raise an issue first to avoid instances of wasted
work.

License

MIT. See the full license.

Thanks

  • Ryanz720, for the
    original T-Rex image.

  • Everyone in #elixir-lang on freenode, for answering the endless questions.

主要指標

概覽
名稱與所有者djm/table_rex
主編程語言Elixir
編程語言Elixir (語言數: 3)
平台
許可證MIT License
所有者活动
創建於2015-12-03 17:06:27
推送於2025-02-16 14:24:36
最后一次提交
發布數13
最新版本名稱v4.1.0 (發布於 2025-02-16 13:50:10)
第一版名稱v0.6.0 (發布於 )
用户参与
星數260
關注者數4
派生數28
提交數135
已啟用問題?
問題數27
打開的問題數3
拉請求數28
打開的拉請求數0
關閉的拉請求數7
项目设置
已啟用Wiki?
已存檔?
是復刻?
已鎖定?
是鏡像?
是私有?