Created
September 18, 2019 14:12
-
-
Save rebolek/c898b6f115e5ba963bae50e376aee3ce to your computer and use it in GitHub Desktop.
Print table in console
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Red[] | |
test-table: [ | |
["Name" "Mass" "Orbit"] | |
["Mercury" 0.055 0.4] | |
["Venus" 0.815 0.7] | |
["Earth" 1.0 1.0] | |
["Mars" 0.107 1.5] | |
] | |
make-divider: func [ | |
stops [block!] "Where to put + chars" | |
/local | |
result | |
][ | |
result: copy "+" | |
last: 0 | |
forall stops [ | |
append result append/dup clear "" #"-" stops/1 | |
append result #"+" | |
] | |
result | |
] | |
align-string: func [ | |
"(modifies)" | |
string [string!] | |
width [integer!] | |
alignment [word!] "'center, 'left, 'right" | |
][ | |
pad: max 0 width - length? string | |
switch/default alignment [ | |
left [append/dup string #" " pad] | |
right [insert/dup string #" " pad] | |
][ | |
append/dup string #" " pad / 2 | |
insert/dup string #" " pad / 2 | |
unless equal? width length? string [append string #" "] | |
] | |
string | |
] | |
get-widths: func [ | |
table [block!] "Block of blocks" | |
/local widths index length | |
][ | |
widths: append/dup [] 0 length? table/1 | |
foreach line table [ | |
forall line [ | |
index: index? line | |
if (length: length? form line/1) > widths/:index [ | |
widths/:index: length | |
] | |
] | |
] | |
widths | |
] | |
make-line: func [ | |
line [block!] | |
widths [block!] | |
/padding | |
pads [block!] "Left and right paddings (pair!)" | |
; TODO: alignments | |
/local result index | |
][ | |
result: copy "+" | |
forall line [ | |
index: index? line | |
if pads [append/dup result #" " pads/:index/x] | |
append result align-string form line/1 widths/:index 'center | |
if pads [append/dup result #" " pads/:index/y] | |
append result #"+" | |
] | |
result | |
] | |
make-table: func [ | |
table [block!] | |
/header "Put ---- after first line" | |
][ | |
result: copy "" | |
widths: get-widths table | |
paddings: append/dup clear [] 2x2 length? widths | |
; first line | |
append result make-line/padding table/1 widths paddings | |
append result newline | |
if header [ | |
header-widths: copy widths | |
forall header-widths [ | |
index: index? header-widths | |
header-widths/1: header-widths/1 + paddings/:index/x + paddings/:index/y | |
] | |
append result make-divider header-widths | |
append result newline | |
] | |
; rest of data | |
foreach line next table [ | |
append result make-line/padding line widths paddings | |
append result newline | |
] | |
result | |
] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment