- Notifications
You must be signed in to change notification settings - Fork5
Declarative API for drawing unicode/ascii character tables in crystal lang
License
NotificationsYou must be signed in to change notification settings
epoch/tallboy
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Generate prettyUnicode,ASCII orMarkdown tables on the terminal for your command line programs.
tallboy is a DSL for quickly creating text based tables inCrystal.
table=Tallboy.tabledo header ["name","hex"] row ["mistyrose","#ffe4e1"] row ["darkolivegreen","#556b2f"] row ["papayawhip","#ffefd5"]endputs table
┌────────────────┬─────────┐│ name │ hex │├────────────────┼─────────┤│ mistyrose │ #ffe4e1 ││ darkolivegreen │ #556b2f ││ papayawhip │ #ffefd5 │└────────────────┴─────────┘
# full APItable=Tallboy.tabledo# define 3 columns. set first column width to 12 & align right columnsdo add"size",width:12,align::right add"http method" add"path"end# add header with multiple lines header"good\nfood\nhunting",align::right# add header with column span on one cell headerdo cell"" cell"routes",span:2end# add header inferred from column definitions# [size, http method, path] header rows [ ["207 B","post","/dishes"], ["1.3 kB","get","/dishes"], ["910 B","patch","/dishes/:id"], ["10.2 kB","delete","/dishes/:id"], ]endputs table
┌────────────────────────────────────────┐│ good ││ food ││ hunting │├────────────┬───────────────────────────┤│ │ routes │├────────────┼─────────────┬─────────────┤│ size │ http method │ path │├────────────┼─────────────┼─────────────┤│ 207 B │ post │ /dishes ││ 1.3 kB │ get │ /dishes ││ 910 B │ patch │ /dishes/:id ││ 10.2 kB │ delete │ /dishes/:id │└────────────┴─────────────┴─────────────┘# draw border joints correctly even with different span sizes :)
- spanning cells across muliple columns and entire rows
- simple, readable and flexible API
- text alignment (left, right, center)
- set width and alignment for entire columns with column definitions
- static type checking for almost all DSL options
- support multi-line cells with the newline character
- full custom styling or choose from multiple border styles including ascii, unicode and markdown
- render directly into IO for better performance
- Add the dependency to your
shard.yml
:
dependencies:tallboy:github:epoch/tallboy
- Run
shards install
- create a table with
Tallboy.table
table=Tallboy.tabledoend
- define columns. here we will define a 4 column table with
columns
.
table=Tallboy.tabledo columnsdo add"id" add"name" add"description" add"price endend
- add rows. you can add single row with
row
or nested arrays withrows
. values can beany object that has ato_s
method.
table=Tallboy.tabledo columnsdo add"id" add"name" add"description" add"price"end rows [ [1,"cake","goes well with pudding",3.4], [2,"pudding","so good with cake!",12.5], [3,"burger","from the reburgulator",22.9], [4,"chips","wait you mean fries?",5], ]end
- add header. we can manually add header with
header
with arguments or pass no arguments to inferred from column definitions. header is just a row with a border below.
table=Tallboy.tabledo columnsdo add"id" add"name" add"description" add"price"end header rows [ [1,"cake","goes well with pudding",3.4], [2,"pudding","so good with cake!",12.5], [3,"burger","from the reburgulator",22.9], [4,"chips","wait you mean fries?",5], ]end
- add footer. we can add footer with
footer
. footer is a row with border on top. If we pass a string instead of an array it will auto span all 4 columns based on the other rows defined in this table. nice! :)
table=Tallboy.tabledo columnsdo add"id" add"name" add"description" add"price"end header rows [ [1,"cake","goes well with pudding",3.4], [2,"pudding","so good with cake!",12.5], [3,"burger","from the reburgulator",22.9], [4,"chips","wait you mean fries?",5], ] footer"43.8"end
- set column span, widths and aligments.
header
,row
andfooter
also take blocks. here we can set column span on a cell within the footer.
table=Tallboy.tabledo columnsdo add"id" add"name" add"description" add"price"end header rows [ [1,"cake","goes well with pudding",3.4], [2,"pudding","so good with cake!",12.5], [3,"burger","from the reburgulator",22.9], [4,"chips","wait you mean fries?",5], ] footerdo cell"total",span:3 cell"43.8"endend
- render with different border styles.
puts table.render# defaults to unicodeputs table.render(:ascii)# classic look# markdown does not support column spans and outer edge borders# turning off top and bottom border with border set to `:none`table=Tallboy.table(border::none)do header ["name","hex"] row ["mistyrose","#ffe4e1"] row ["darkolivegreen","#556b2f"] row ["papayawhip","#ffefd5"]endputs table.render(:markdown)
| name | hex ||----------------|---------|| mistyrose | #ffe4e1 || darkolivegreen | #556b2f || papayawhip | #ffefd5 |
- tallboy supports rendering into custom IO
table.render(IO::Memory.new)puts(Tallboy.tabledo row [1,2,3]end)
Most components in tallboy can be invoked separately. The design philosophy is inspired by how web browsers renders HTML.
┌───────────────────────────────────────────────────────────┐│ web browser vs tallboy │├───────────────────────────────────────────────────────────┤│ HTML ──> Document Object Model ──> render tree ──> pixels ││ DSL ──> Table Object Model ──> render tree ──> text │└───────────────────────────────────────────────────────────┘
data= [ [1,2,3], [4,5,6]]# TableBuilder is the DSL that returns an object modeltable_object_model=Tallboy::TableBuilder.newdo rows(data)end# ComputedTableBuilder takes the object model and calculate widths for each cellcomputed_table=Tallboy::ComputedTableBuilder.new(table_object_model).build# RenderTreeBuilder work out borders, spans and organize into nodes to renderingrender_tree=Tallboy::RenderTreeBuilder.new(computed_table).build# render into output with unicode border styleio=Tallboy::Renderer.new(render_tree).render
for more examples checkouttallboy_spec.cr
Issues and pull requests are welcome on GitHub at (https://github.com/epoch/tallboy)
- Daniel Tsui - creator and maintainer
About
Declarative API for drawing unicode/ascii character tables in crystal lang
Topics
Resources
License
Stars
Watchers
Forks
Packages0
No packages published