Skip to content

Instantly share code, notes, and snippets.

@k0f1sh
Last active September 9, 2020 14:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save k0f1sh/cbb4212cec7054d759b86a60891e0216 to your computer and use it in GitHub Desktop.
Save k0f1sh/cbb4212cec7054d759b86a60891e0216 to your computer and use it in GitHub Desktop.
generate table
;; generate-table
(require 's)
(require 'seq)
(require 'subr-x)
(defun gentbl-get-table-header (table-list)
(car table-list))
(defun gentbl-swap (tl)
"行と列をいれかえ"
(let ((header-length (length (gentbl-get-table-header tl))))
(seq-map (lambda (i)
(seq-map (lambda (rows) (nth i rows)) tl))
(number-sequence 0 (1- header-length)))))
(defun gentbl-get-length-rows (tl)
"列毎の最大文字数を求める"
(seq-map (lambda (l)
(seq-max (seq-map (lambda (s) (length s)) l)))
(gentbl-swap tl)))
(defun gentbl-gen-row-border (length-rows)
(let ((borders (seq-map (lambda (n) (s-repeat (+ 2 n) "-"))
length-rows)))
(format "+%s+" (s-join "+" borders))))
(defun check-correct-align-type (align-type)
(cond
((eq align-type 'center) t)
((eq align-type 'left) t)
((eq align-type 'right) t)
(t (error "align-type must be 'center or 'left or 'right"))))
(defun gentbl-gen-line (length-rows table-line align-type)
(check-correct-align-type align-type)
(thread-last
(seq-map-indexed
(lambda (len idx)
(let* ((head-len (length (nth idx table-line)))
(left-pad (cond
((eq align-type 'center) (/ (- len head-len) 2))
((eq align-type 'left) 0)
((eq align-type 'right) (- len head-len))
(t (error "wrong align-type"))))
(right-pad (- len left-pad head-len)))
(format " %s%s%s " (s-repeat left-pad " ") (or (nth idx table-line) "") (s-repeat right-pad " "))))
length-rows)
(s-join "|")
(format "|%s|")))
(defun gentbl-gen-text-table (tl align-type)
(check-correct-align-type align-type)
(with-temp-buffer
(let ((length-rows (gentbl-get-length-rows tl)))
(insert (gentbl-gen-row-border length-rows))
(newline)
(insert (gentbl-gen-line length-rows (gentbl-get-table-header tl) align-type))
(newline)
(insert (gentbl-gen-row-border length-rows))
(newline)
(seq-map (lambda (line)
(insert (gentbl-gen-line length-rows line align-type))
(newline))
(cdr tl))
(insert (gentbl-gen-row-border length-rows)))
(buffer-string)))
;; (setq tl '(("name" "language" "text editor")
;; ("Taro" "Common Lisp" "Emacs")
;; ("Jiro" "TypeScript" "Visual Studio Code")
;; ("Saburo" "PHP" "PhpStorm")))
;; (insert (gentbl-gen-text-table tl 'right))
;; +--------+-------------+--------------------+
;; | name | language | text editor |
;; +--------+-------------+--------------------+
;; | Taro | Common Lisp | Emacs |
;; | Jiro | TypeScript | Visual Studio Code |
;; | Saburo | PHP | PhpStorm |
;; +--------+-------------+--------------------+
;; (insert (gentbl-gen-text-table tl 'left))
;; +--------+-------------+--------------------+
;; | name | language | text editor |
;; +--------+-------------+--------------------+
;; | Taro | Common Lisp | Emacs |
;; | Jiro | TypeScript | Visual Studio Code |
;; | Saburo | PHP | PhpStorm |
;; +--------+-------------+--------------------+
;; (insert (gentbl-gen-text-table tl 'center))
;; +--------+-------------+--------------------+
;; | name | language | text editor |
;; +--------+-------------+--------------------+
;; | Taro | Common Lisp | Emacs |
;; | Jiro | TypeScript | Visual Studio Code |
;; | Saburo | PHP | PhpStorm |
;; +--------+-------------+--------------------+
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment