diff --git a/lisp/ox.el b/lisp/ox.el index 24a736e24..4d288d22e 100644 --- a/lisp/ox.el +++ b/lisp/ox.el @@ -1339,21 +1339,24 @@ inferior to file-local settings." Optional argument BACKEND is an export back-end, as returned by, e.g., `org-export-create-backend'. It specifies which back-end specific items to read, if any." - (let ((all - (mapcar - (lambda (o) (cons (nth 2 o) (car o))) - ;; Priority is given to back-end specific options. - (append (and backend (org-export-get-all-options backend)) - org-export-options-alist))) - (start) - plist) - (while (string-match "\\(.+?\\):\\((.*?)\\|\\S-*\\)[ \t\n]*" options start) - (setq start (match-end 0)) - (let ((property (cdr (assoc-string (match-string 1 options) all t)))) - (when property - (setq plist - (plist-put plist property (read (match-string 2 options))))))) - plist)) + (let ((line + (let ((s 0) alist) + (while (string-match "\\(.+?\\):\\((.*?)\\|\\S-*\\)[ \t]*" options s) + (setq s (match-end 0)) + (push (cons (match-string 1 options) + (read (match-string 2 options))) + alist)) + alist)) + ;; Priority is given to back-end specific options. + (all (append (and backend (org-export-get-all-options backend)) + org-export-options-alist)) + (plist)) + (when line + (dolist (entry all plist) + (let ((item (nth 2 entry))) + (when item + (let ((v (assoc-string item line t))) + (when v (setq plist (plist-put plist (car entry) (cdr v))))))))))) (defun org-export--get-subtree-options (&optional backend) "Get export options in subtree at point. diff --git a/testing/lisp/test-ox.el b/testing/lisp/test-ox.el index 378c86c09..a8b120d23 100644 --- a/testing/lisp/test-ox.el +++ b/testing/lisp/test-ox.el @@ -108,34 +108,62 @@ variable, and communication channel under `info'." (ert-deftest test-org-export/parse-option-keyword () "Test reading all standard #+OPTIONS: items." (should - (equal - (org-export--parse-option-keyword - "H:1 num:t \\n:t timestamp:t arch:t author:t creator:t d:t email:t - *:t e:t ::t f:t pri:t -:t ^:t toc:t |:t tags:t tasks:t <:t todo:t inline:nil - stat:t title:t") - '(:headline-levels - 1 :section-numbers t :preserve-breaks t :time-stamp-file t - :with-archived-trees t :with-author t :with-creator t :with-drawers t - :with-email t :with-emphasize t :with-entities t :with-fixed-width t - :with-footnotes t :with-priority t :with-special-strings t - :with-sub-superscript t :with-toc t :with-tables t :with-tags t - :with-tasks t :with-timestamps t :with-todo-keywords t - :with-inlinetasks nil :with-statistics-cookies t :with-title t))) + (let ((options + (org-export--parse-option-keyword + "H:1 num:t \\n:t timestamp:t arch:t author:t creator:t d:t email:t \ +*:t e:t ::t f:t pri:t -:t ^:t toc:t |:t tags:t tasks:t <:t todo:t inline:nil \ +stat:t title:t"))) + (and (eq (plist-get options :headline-levels) 1) + (eq (plist-get options :section-numbers) t) + (eq (plist-get options :preserve-breaks) t) + (eq (plist-get options :time-stamp-file) t) + (eq (plist-get options :with-archived-trees) t) + (eq (plist-get options :with-author) t) + (eq (plist-get options :with-drawers) t) + (eq (plist-get options :with-email) t) + (eq (plist-get options :with-emphasize) t) + (eq (plist-get options :with-entities) t) + (eq (plist-get options :with-fixed-width) t) + (eq (plist-get options :with-footnotes) t) + (eq (plist-get options :with-priority) t) + (eq (plist-get options :with-special-strings) t) + (eq (plist-get options :with-sub-superscript) t) + (eq (plist-get options :with-toc) t) + (eq (plist-get options :with-tables) t) + (eq (plist-get options :with-tags) t) + (eq (plist-get options :with-tasks) t) + (eq (plist-get options :with-timestamps) t) + (eq (plist-get options :with-todo-keywords) t) + (eq (plist-get options :with-inlinetasks) nil) + (eq (plist-get options :with-statistics-cookies) t) + (eq (plist-get options :with-title) t)))) ;; Test some special values. (should - (equal - (org-export--parse-option-keyword - "arch:headline d:(\"TEST\") ^:{} toc:1 tags:not-in-toc tasks:todo num:2 <:active") - '(:with-archived-trees - headline :with-drawers ("TEST") :with-sub-superscript {} :with-toc 1 - :with-tags not-in-toc :with-tasks todo :section-numbers 2 - :with-timestamps active))) + (let ((options + (org-export--parse-option-keyword + "arch:headline d:(\"TEST\") ^:{} toc:1 tags:not-in-toc tasks:todo \ +num:2 <:active"))) + (and (eq (plist-get options :with-archived-trees) 'headline) + (eq (plist-get options :with-sub-superscript) '{}) + (eq (plist-get options :with-toc) 1) + (eq (plist-get options :with-tags) 'not-in-toc) + (eq (plist-get options :with-tasks) 'todo) + (eq (plist-get options :section-numbers) 2) + (eq (plist-get options :with-timestamps) 'active) + (equal (plist-get options :with-drawers) '("TEST"))))) ;; Test back-end specific values. (should (equal (org-export--parse-option-keyword "opt:t" (org-export-create-backend :options '((:option nil "opt")))) - '(:option t)))) + '(:option t))) + ;; More than one property can refer to the same option item. + (should + (equal '(:opt1 t :opt2 t) + (org-export--parse-option-keyword + "opt:t" + (org-export-create-backend + :options '((:opt1 nil "opt") (:opt2 nil "opt"))))))) (ert-deftest test-org-export/get-inbuffer-options () "Test reading all standard export keywords."