Last active
September 9, 2020 14:05
-
-
Save k0f1sh/cbb4212cec7054d759b86a60891e0216 to your computer and use it in GitHub Desktop.
generate table
This file contains hidden or 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
;; 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