Pārlūkot izejas kodu

org-export: Fix #+BIND: keywords evaluation

* contrib/lisp/org-export.el (org-export--install-letbind-maybe): If
  a variable is bound two times in the buffer, be sure to set its
  value to the last bound. Use correct function to confirm binding.
  Allow keyword to start on any column.
* testing/lisp/test-org-export.el: Add tests.
Nicolas Goaziou 12 gadi atpakaļ
vecāks
revīzija
61ad50d758
2 mainītis faili ar 40 papildinājumiem un 6 dzēšanām
  1. 8 5
      contrib/lisp/org-export.el
  2. 32 1
      testing/lisp/test-org-export.el

+ 8 - 5
contrib/lisp/org-export.el

@@ -1548,11 +1548,14 @@ retrieved."
   (let (letbind pair)
     (org-with-wide-buffer
      (goto-char (point-min))
-     (while (re-search-forward (org-make-options-regexp '("BIND")) nil t)
-       (when (org-export-confirm-letbind)
-	 (push (read (concat "(" (org-match-string-no-properties 2) ")"))
-	       letbind))))
-    (while (setq pair (pop letbind))
+     (while (re-search-forward "^[ \t]*#\\+BIND:" nil t)
+       (let* ((element (org-element-at-point))
+	      (value (org-element-property :value element)))
+	 (when (and (eq (org-element-type element) 'keyword)
+		    (not (equal value  ""))
+		    (org-export--confirm-letbind))
+	   (push (read (format "(%s)" value)) letbind)))))
+    (dolist (pair (nreverse letbind))
       (org-set-local (car pair) (nth 1 pair)))))
 
 

+ 32 - 1
testing/lisp/test-org-export.el

@@ -57,7 +57,38 @@ already filled in `info'."
 
 
 
-;;; Tests
+;;; Internal Tests
+
+(ert-deftest test-org-export/bind-keyword ()
+  "Test reading #+BIND: keywords."
+  ;; Test with `org-export-all-BIND' set to t.
+  (should
+   (org-test-with-temp-text "#+BIND: variable value"
+     (let ((org-export-allow-BIND t))
+       (org-export--install-letbind-maybe)
+       (eq variable 'value))))
+  ;; Test with `org-export-all-BIND' set to nil.
+  (should-not
+   (org-test-with-temp-text "#+BIND: variable value"
+     (let ((org-export-allow-BIND nil))
+       (org-export--install-letbind-maybe)
+       (boundp 'variable))))
+  ;; Test with `org-export-all-BIND' set to 'confirm and
+  ;; `org-export--allow-BIND-local' to t .
+  (should
+   (org-test-with-temp-text "#+BIND: variable value"
+     (let ((org-export-allow-BIND 'confirm))
+       (org-set-local 'org-export--allow-BIND-local t)
+       (org-export--install-letbind-maybe)
+       (eq variable 'value))))
+  ;; Test with `org-export-all-BIND' set to 'confirm and
+  ;; `org-export--allow-BIND-local' to nil.
+  (should-not
+   (org-test-with-temp-text "#+BIND: variable value"
+     (let ((org-export-allow-BIND 'confirm))
+       (org-set-local 'org-export--allow-BIND-local nil)
+       (org-export--install-letbind-maybe)
+       (boundp 'variable)))))
 
 (ert-deftest test-org-export/parse-option-keyword ()
   "Test reading all standard #+OPTIONS: items."