Skip to content

Instantly share code, notes, and snippets.

@benjamin-asdf
Last active February 24, 2022 10:44
Show Gist options
  • Save benjamin-asdf/a15cfd8ac93bafc5affe18f9dc3662af to your computer and use it in GitHub Desktop.
Save benjamin-asdf/a15cfd8ac93bafc5affe18f9dc3662af to your computer and use it in GitHub Desktop.
Clojure pprint table markdown compatible, left aligned.
; 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