44 lines
1.3 KiB
Plaintext
44 lines
1.3 KiB
Plaintext
#lang transd
|
|
|
|
MainModule : {
|
|
txt:
|
|
"Given$a$text$file$of$many$lines,$where$fields$within$a$line$
|
|
are$delineated$by$a$single$'dollar'$character,$write$a$program
|
|
that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$
|
|
column$are$separated$by$at$least$one$space.
|
|
Further,$allow$for$each$word$in$a$column$to$be$either$left$
|
|
justified,$right$justified,$or$center$justified$within$its$column.",
|
|
tabl: Table(),
|
|
n: 0,
|
|
colWidths: Vector<Int>(),
|
|
|
|
print: (λ centered Bool(false)
|
|
(for n in Seq(0 (num-rows tabl)) do
|
|
(with row (get-row tabl n)
|
|
(for m in Seq(0 (num-cols tabl)) do
|
|
(with wid (+ 1.0 (get colWidths @idx))
|
|
word (get row m) wl 0.0 lef 0
|
|
(if centered (= wl (size String(word))) (= lef (/ (- wid wl) 2.0))
|
|
(textout width: lef "" width: wl word width: (- wid (+ wl lef)) "")
|
|
else
|
|
(textout width: wid (get row m)))))
|
|
(lout ""))
|
|
)
|
|
),
|
|
|
|
_start: (λ
|
|
(load-table tabl txt fieldSep: "$" :emptyEls)
|
|
|
|
(for i in Seq(0 (num-cols tabl)) do (= n 0)
|
|
(tsd-query tabl
|
|
reduce: [i]
|
|
as: [[String()]]
|
|
using: (λ (set n (max (size (get @row 0)) n))))
|
|
(append colWidths n)
|
|
)
|
|
(textout :right "") (print)
|
|
(lout :left "") (print)
|
|
(lout "") (print true)
|
|
)
|
|
}
|