Last active
February 24, 2022 10:44
-
-
Save benjamin-asdf/a15cfd8ac93bafc5affe18f9dc3662af to your computer and use it in GitHub Desktop.
Clojure pprint table markdown compatible, left aligned.
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
; Copyright (c) Rich Hickey. All rights reserved. | |
; The use and distribution terms for this software are covered by the | |
; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) | |
; which can be found in the file epl-v10.html at the root of this distribution. | |
; By using this software in any fashion, you are agreeing to be bound by | |
; the terms of this license. | |
; You must not remove this notice, or any other, from this software. | |
; this is the same as clojure.pprint/print-table | |
; but with some options I liked to have | |
(defn print-table-2 | |
"Prints a collection of maps in a textual table. Prints table headings | |
ks, and then a line of output for each row, corresponding to the keys | |
in ks. If ks are not specified, use the keys of the first item in rows. | |
opts: | |
`:left-aligned?` if truthy, align the columns left instead of right. | |
`:markdown?` if truthy, change the format slightly to make this a markdown table. " | |
{:added "1.3"} | |
([ks rows {:keys [left-aligned? markdown?]}] | |
(when (seq rows) | |
(let [widths (map | |
(fn [k] | |
(apply max (count (str k)) (map #(count (str (get % k))) rows))) | |
ks) | |
spacers (map #(apply str (repeat % "-")) widths) | |
fmts (map #(str "%" (when left-aligned? "-") % "s") widths) | |
fmt-row (fn [leader divider trailer row] | |
(str leader | |
(apply str (interpose divider | |
(for [[col fmt] (map vector (map #(get row %) ks) fmts)] | |
(format fmt (str col))))) | |
trailer))] | |
(println) | |
(println (fmt-row "| " " | " " |" (zipmap ks ks))) | |
(println (fmt-row "|-" (if markdown? "-|-" "-+-") "-|" (zipmap ks spacers))) | |
(doseq [row rows] | |
(println (fmt-row "| " " | " " |" row)))))) | |
([rows opts] (print-table-2 (keys (first rows)) rows opts))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment