Browse Source

ox: Do not choke on incomplete OPTIONS items

* lisp/ox.el (org-export--parse-option-keyword): Prevent "End of
file during parsing" error when an OPTIONS item is incomplete.
* lisp/org-lint.el (org-lint-unknown-options-item): Check for
incomplete options items.
* testing/lisp/test-org-lint.el (test-org-lint/unknown-options-item):
Add test.
Nicolas Goaziou 3 years ago
parent
commit
7116914427
3 changed files with 10 additions and 3 deletions
  1. 6 2
      lisp/org-lint.el
  2. 1 1
      lisp/ox.el
  3. 3 0
      testing/lisp/test-org-lint.el

+ 6 - 2
lisp/org-lint.el

@@ -671,7 +671,7 @@ Use \"export %s\" instead"
 	(when (string= (org-element-property :key k) "OPTIONS")
 	  (let ((value (org-element-property :value k))
 		(start 0))
-	    (while (string-match "\\(.+?\\):\\((.*?)\\|\\S-*\\)[ \t]*"
+	    (while (string-match "\\(.+?\\):\\((.*?)\\|\\S-+\\)?[ \t]*"
 				 value
 				 start)
 	      (setf start (match-end 0))
@@ -679,7 +679,11 @@ Use \"export %s\" instead"
 		(unless (member item allowed)
 		  (push (list (org-element-property :post-affiliated k)
 			      (format "Unknown OPTIONS item \"%s\"" item))
-			reports))))))))
+			reports))
+                (unless (match-string 2 value)
+                  (push (list (org-element-property :post-affiliated k)
+                              (format "Missing value for option item %S" item))
+                        reports))))))))
     reports))
 
 (defun org-lint-invalid-macro-argument-and-template (ast)

+ 1 - 1
lisp/ox.el

@@ -1386,7 +1386,7 @@ e.g., `org-export-create-backend'.  It specifies which back-end
 specific items to read, if any."
   (let ((line
 	 (let ((s 0) alist)
-	   (while (string-match "\\(.+?\\):\\((.*?)\\|\\S-*\\)[ \t]*" options s)
+	   (while (string-match "\\(.+?\\):\\((.*?)\\|\\S-+\\)[ \t]*" options s)
 	     (setq s (match-end 0))
 	     (push (cons (match-string 1 options)
 			 (read (match-string 2 options)))

+ 3 - 0
testing/lisp/test-org-lint.el

@@ -313,6 +313,9 @@ This is not a node property
   "Test `org-lint-unknown-options-item' checker."
   (should
    (org-test-with-temp-text "#+options: foobarbaz:t"
+     (org-lint '(unknown-options-item))))
+  (should
+   (org-test-with-temp-text "#+options: H:"
      (org-lint '(unknown-options-item)))))
 
 (ert-deftest test-org-lint/invalid-macro-argument-and-template ()