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.
This commit is contained in:
Nicolas Goaziou 2012-09-01 12:59:57 +02:00
parent 06bffa9120
commit 61ad50d758
2 changed files with 40 additions and 6 deletions

View File

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

View File

@ -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 () (ert-deftest test-org-export/parse-option-keyword ()
"Test reading all standard #+OPTIONS: items." "Test reading all standard #+OPTIONS: items."