- 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
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
No packages published
Uh oh!
There was an error while loading.Please reload this page.
Contributors4
Uh oh!
There was an error while loading.Please reload this page.