|
|
- ;;; 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 <RET> 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
|