浏览代码

element: Fix table.el tables parsing

* lisp/org-element.el (org-element--current-element): Fix regexp
matching a non-data-line.  Use rx.

Reported-by: Nick Dokos <ndokos@gmail.com>
<http://lists.gnu.org/r/emacs-orgmode/2020-12/msg00561.html>
Nicolas Goaziou 4 年之前
父节点
当前提交
118da7d280
共有 1 个文件被更改,包括 15 次插入4 次删除
  1. 15 4
      lisp/org-element.el

+ 15 - 4
lisp/org-element.el

@@ -3950,13 +3950,24 @@ element it has to parse."
 	     ((or (looking-at "[ \t]*|")
 		  ;; There is no strict definition of a table.el
 		  ;; table.  Try to prevent false positive while being
-		  ;; quick.
-		  (let ((rule-regexp "[ \t]*\\+\\(-+\\+\\)+[ \t]*$")
+		  ;; quick.  Hence, we consider a table.el table is at
+		  ;; least one rule, any number of data lines
+		  ;; (starting with a vertical bar), and another rule.
+		  (let ((rule-regexp
+			 (rx (zero-or-more (any " \t"))
+			     "+"
+			     (one-or-more (one-or-more "-") "+")
+			     (zero-or-more (any " \t"))
+			     eol))
+			(non-table.el-data-line
+			 (rx bol
+			     (zero-or-more (any " \t"))
+			     (or eol (not (any "| \t")))))
 			(next (line-beginning-position 2)))
 		    (and (looking-at rule-regexp)
 			 (save-excursion
-			   (forward-line)
-			   (re-search-forward "^[ \t]*\\($\\|[^|]\\)" limit t)
+			   (end-of-line)
+			   (re-search-forward non-table.el-data-line limit t)
 			   (and (> (line-beginning-position) next)
 				(org-match-line rule-regexp))))))
 	      (org-element-table-parser limit affiliated))