[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/valign d18aea8 183/198: Improve error handling
From: |
Stefan Monnier |
Subject: |
[elpa] externals/valign d18aea8 183/198: Improve error handling |
Date: |
Tue, 1 Dec 2020 18:19:44 -0500 (EST) |
branch: externals/valign
commit d18aea81f711f7fb0da1de3cef34d30b2809e4dd
Author: Yuan Fu <casouri@gmail.com>
Commit: Yuan Fu <casouri@gmail.com>
Improve error handling
* valign.el (valign-bad-cell): Remove signal.
(valign-parse-error): New signal.
(valign--cell-alignment): Report new signal.
(valign--cell-content-config): Add signal report.
(valign---check-dimension): New function.
(valign--calculate-cell-width, valign--calculate-alignment): Add
error report.
(valign-table-maybe): Replace bad-cell with parse-error, remove
search-failed. Report errors.
(valign-table-1): Add error report.
---
valign.el | 46 ++++++++++++++++++++++++++++++++++++----------
1 file changed, 36 insertions(+), 10 deletions(-)
diff --git a/valign.el b/valign.el
index 1700a73..2bc0898 100644
--- a/valign.el
+++ b/valign.el
@@ -78,9 +78,9 @@
;;; Backstage
-(define-error 'valign-bad-cell "Valign encountered a invalid table cell")
(define-error 'valign-not-gui "Valign only works in GUI environment")
(define-error 'valign-not-on-table "Valign is asked to align a table, but the
point is not on one")
+(define-error 'valign-parse-error "Valign cannot parse the table")
;;;; Table.el tables
@@ -140,7 +140,7 @@ Doesn’t check if we are in a cell."
(if (looking-at " [^ ]")
'left
(if (not (search-forward "|" nil t))
- (signal 'valign-bad-cell nil)
+ (signal 'valign-parse-error '("Missing the right bar (|)"))
(if (looking-back
"[^ ] |" (max (- (point) 3) (point-min)))
'right
@@ -170,9 +170,12 @@ right bar."
(save-excursion
(let* ((bar-char (or bar-char "|"))
(cell-beg (point))
- (cell-end (save-excursion
- (search-forward bar-char (line-end-position))
- (match-beginning 0)))
+ (cell-end
+ (save-excursion
+ (unless (search-forward bar-char (line-end-position) t)
+ (signal 'valign-parse-error
+ '("Missing the right bar (|)")))
+ (match-beginning 0)))
;; `content-beg-strict' is the beginning of the content
;; excluding any white space. Same for `content-end-strict'.
content-beg-strict content-end-strict)
@@ -189,6 +192,9 @@ right bar."
(goto-char cell-end)
(skip-chars-backward " ")
(setq content-end-strict (point))
+ (when (and (= content-beg-strict cell-beg)
+ (= content-end-strict cell-end))
+ (signal 'valign-parse-error `("The cell should contain at least one
space" ,(buffer-substring-no-properties (1- cell-beg) (1+ cell-end)))))
;; Calculate delimiters. Basically, we try to preserve a white
;; space on the either side of the content, i.e., include them
;; in (BEG . END). Because if you are typing in a cell and
@@ -334,6 +340,16 @@ column (0-based)."
(cl-loop for row in matrix
collect (nth col-idx row))))
+(defun valign---check-dimension (matrix)
+ "Check that the dimension of MATRIX is correct.
+Correct dimension means each row has the same number of columns.
+Return t if the dimension is correct, nil if not."
+ (let ((first-row-column-count (length (car matrix))))
+ (cl-loop for row in (cdr matrix)
+ if (not (eq first-row-column-count (length row)))
+ return nil
+ finally return t)))
+
(defun valign--separator-line-p (&optional charset)
"Return t if this line is a separator line.
If the table is a table.el table, you need to specify CHARSET.
@@ -343,7 +359,8 @@ Assumes the point is at the beginning of the line."
(rx-to-string `(or ,(valign-box-char 1 charset)
,(valign-box-char 4 charset)
,(valign-box-char 7 charset)
- ,(valign-box-char 'v charset))))
+ ,(valign-box-char 'v charset)))
+ (line-end-position) t)
(valign--separator-p))))
(defun valign--calculate-cell-width (limit &optional charset)
@@ -363,6 +380,9 @@ need to specify CHARSET."
;; Point is after the left “|”.
(push (valign--cell-nonempty-width bar-char) row))
(push (reverse row) matrix))))
+ ;; Sanity check.
+ (unless (valign---check-dimension matrix)
+ (signal 'valign-parse-error '("Missing rows or columns")))
(setq matrix (valign--transpose (reverse matrix)))
(mapcar (lambda (col) (apply #'max col)) matrix)))
@@ -379,6 +399,9 @@ TYPE must be 'markdown. Start at point, stop at LIMIT."
(valign--do-column column-idx "|"
(push (valign--alignment-from-seperator) row))
(push (reverse row) matrix))))
+ ;; Sanity check.
+ (unless (valign---check-dimension matrix)
+ (signal 'valign-parse-error '("Missing rows or columns")))
(setq matrix (valign--transpose (reverse matrix)))
(or matrix
(dotimes (_ column-idx matrix)
@@ -400,6 +423,9 @@ TYPE must be 'org. Start at point, stop at LIMIT."
(valign--do-column column-idx "|"
(push (valign--cell-alignment) row))
(push (reverse row) matrix)))
+ ;; Sanity check.
+ (unless (valign---check-dimension matrix)
+ (signal 'valign-parse-error '("Missing rows or columns")))
(setq matrix (valign--transpose (reverse matrix)))
;; For each column, we take the majority.
(mapcar (lambda (col)
@@ -617,12 +643,11 @@ If FORCE non-nil, force align."
(if (valign--guess-charset)
(valign--table-2)
(valign-table-1))))
- ((valign-bad-cell search-failed error)
+ ((valign-parse-error error)
(valign--clean-text-property
(save-excursion (valign--beginning-of-table) (point))
(save-excursion (valign--end-of-table) (point)))
- (when (eq (car err) 'error)
- (error (error-message-string err))))))
+ (message "%s" (error-message-string err)))))
(defun valign-table-1 ()
"Visually align the table at point."
@@ -641,7 +666,8 @@ If FORCE non-nil, force align."
;; Align each row.
(valign--do-row row-idx table-end
- (re-search-forward "|" (line-end-position))
+ (unless (search-forward "|" (line-end-position) t)
+ (signal 'valign-parse-error '("Missing the right bar (|)")))
(if (valign--separator-p)
;; Separator row.
(valign--align-separator-row column-width-list)
- [elpa] externals/valign 06d9e1a 192/198: Prepare for ELPA, (continued)
- [elpa] externals/valign 06d9e1a 192/198: Prepare for ELPA, Stefan Monnier, 2020/12/01
- [elpa] externals/valign 5729733 178/198: * valign.el: Move user land code down below (re-layout)., Stefan Monnier, 2020/12/01
- [elpa] externals/valign b189102 194/198: ; * test.org: New test., Stefan Monnier, 2020/12/01
- [elpa] externals/valign 44c747b 136/198: * valign.el (valign-table): Clean up table if error occurs., Stefan Monnier, 2020/12/01
- [elpa] externals/valign 80cf682 121/198: Remove some internal variables, Stefan Monnier, 2020/12/01
- [elpa] externals/valign 9daeab8 071/198: * valign.el (valign-table-quite): Really ignore errors., Stefan Monnier, 2020/12/01
- [elpa] externals/valign 09e89aa 105/198: * valign.el (valign--at-table-p): Don’t align org blocks., Stefan Monnier, 2020/12/01
- [elpa] externals/valign e91abf2 112/198: Extract out boilerplate from valign-table, Stefan Monnier, 2020/12/01
- [elpa] externals/valign d799e31 181/198: ; * valign.el (valign--cell-content-config): Fix typo., Stefan Monnier, 2020/12/01
- [elpa] externals/valign 9fc0c11 149/198: Use new function to calculate space and bar width, Stefan Monnier, 2020/12/01
- [elpa] externals/valign d18aea8 183/198: Improve error handling,
Stefan Monnier <=
- [elpa] externals/valign 62766e7 184/198: Add custom group, Stefan Monnier, 2020/12/01
- [elpa] externals/valign bf68d39 171/198: Remove single-column style, Stefan Monnier, 2020/12/01
- [elpa] externals/valign ce1a53c 188/198: ; * test.org: Update., Stefan Monnier, 2020/12/01
- [elpa] externals/valign 82be45d 198/198: Bug fix, Stefan Monnier, 2020/12/01
- [elpa] externals/valign cf3a794 099/198: Fix: cursor disappears on bars when fancy-bar is t, Stefan Monnier, 2020/12/01
- [elpa] externals/valign 0e77a02 164/198: Add some commands that suppresses auto alignment, Stefan Monnier, 2020/12/01
- [elpa] externals/valign 7afe578 182/198: Improve documentation, Stefan Monnier, 2020/12/01
- [elpa] externals/valign e0362c0 156/198: * valign.el (valign-region): Report to jit-lock the actual end of fontified region., Stefan Monnier, 2020/12/01
- [elpa] externals/valign 841925f 189/198: Remove all advice when they are not needed, Stefan Monnier, 2020/12/01
- [elpa] externals/valign e438083 103/198: Change text property to overlay, Stefan Monnier, 2020/12/01