;;; convert-to-table --- Convert a selected region to an `org-mode' table. ;;; Commentary: ;;; Code: (defun leo/remove-excess-line-breaks (input) "Remove excess line breaks from INPUT." (let ((mylist (split-string input "\n"))) ;; (setq mylist (remove-duplicates mylist :test 'string=)) ;; (delete "" mylist) (string-join mylist "\n") )) (defun set-nth (list n val) "Update LIST at position N with value VAL." (if (> n 0) (cons (car list) (set-nth (cdr list) (1- n) val)) (cons val (cdr list)))) (defun leo/build-divider (cols) "Build an `org-mode' table divider with COLS columns." (let ((index 0) (output '())) (while (> cols index) (push "---" output) (setq index (+ index 1))) (concat "|" (string-join output "|") "|"))) (defun leo/convert-to-table (beg end) "Convert delimited region (BEG and END) into `org-mode' table." (interactive (if (use-region-p) (list (region-beginning) (region-end)) (list nil nil))) (let ( (input (leo/remove-excess-line-breaks (buffer-substring-no-properties beg end))) (cols (read-number "How many columns: ")) ) (if (and input cols) (let ( (lines (split-string input "\n")) (length (length (split-string input "\n"))) (times 1) (output "") ) (setq output (mapcar (lambda (in) (concat " | " in)) lines)) ;; (message "%s" output) (while (>= length (* times cols)) (setq output (set-nth output (- (* times cols) 1) (concat (nth (- (* times cols) 1) output) " |\n"))) (setq times (+ times 1)) ) (kill-region beg end) (let ( (rows (split-string (string-join output "") "\n")) (first "") ) (setq first (pop rows)) (push (leo/build-divider cols) rows) (push first rows) (insert (string-join rows "\n")) )) (message "Nothing selected!")))) (provide 'convert-to-table) ;;; convert-to-table.el ends here