From 1fa88054255e66922ea9e2cd61310461901ac6ee Mon Sep 17 00:00:00 2001 From: Rasmus Date: Thu, 18 Dec 2014 16:48:49 +0100 Subject: [PATCH 2/2] ox.el: Guess the :minlevel for INCLUDE-keywords * ox.el (org-export-expand-include-keyword): Guess :minlevel for included Org documents if missing. * test-ox.el (org-export-expand-include-keyword): Tests for automatic :minlevel. --- lisp/ox.el | 14 ++++++++++---- testing/lisp/test-ox.el | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/lisp/ox.el b/lisp/ox.el index 11b9a29..11426fb 100644 --- a/lisp/ox.el +++ b/lisp/ox.el @@ -3063,10 +3063,17 @@ storing and resolving footnotes. It is created automatically." (let ((case-fold-search t) (file-prefix (make-hash-table :test #'equal)) (current-prefix 0) - (footnotes (or footnotes (make-hash-table :test #'equal)))) + (footnotes (or footnotes (make-hash-table :test #'equal))) + (include-re "^[ \t]*#\\+INCLUDE:")) + ;; Add :minlevel to all include words that no explicitly have one. (goto-char (point-min)) + (while (re-search-forward include-re nil t) + (add-text-properties (line-beginning-position) (line-end-position) + `(org-include-induced-level + ,(1+ (org-reduced-level (or (org-current-level) 0)))))) ;; Expand INCLUDE keywords. - (while (re-search-forward "^[ \t]*#\\+INCLUDE:" nil t) + (goto-char (point-min)) + (while (re-search-forward include-re nil t) (let ((element (save-match-data (org-element-at-point)))) (when (eq (org-element-type element) 'keyword) (beginning-of-line) @@ -3111,8 +3118,7 @@ storing and resolving footnotes. It is created automatically." (if (string-match ":minlevel +\\([0-9]+\\)" value) (prog1 (string-to-number (match-string 1 value)) (setq value (replace-match "" nil nil value))) - (let ((cur (org-current-level))) - (if cur (1+ (org-reduced-level cur)) 1))))) + (get-text-property (point) 'org-include-induced-level)))) (src-args (and (eq env 'literal) (match-string 1 value))) (block (and (string-match "\\<\\(\\S-+\\)\\>" value) diff --git a/testing/lisp/test-ox.el b/testing/lisp/test-ox.el index 37e2e23..91f9eab 100644 --- a/testing/lisp/test-ox.el +++ b/testing/lisp/test-ox.el @@ -1003,7 +1003,44 @@ Footnotes[fn:2], foot[fn:test], digit only[3], and [fn:inline:anonymous footnote (org-test-with-temp-text (format "#+INCLUDE: \"%s/examples/include.org::#dh\" :only-contents t" org-test-dir) (org-export-expand-include-keyword) - (buffer-string))))) + (buffer-string)))) + ;; Adjacent INCLUDE-keywords should have the same :minlevel if unspecified. + (should + (org-every (lambda (level) (zerop (1- level))) + (org-test-with-temp-text + (concat + (format "#+INCLUDE: \"%s/examples/include.org::#ah\"\n" org-test-dir) + (format "#+INCLUDE: \"%s/examples/include.org::*Heading\"" org-test-dir)) + (org-export-expand-include-keyword) + (org-element-map (org-element-parse-buffer) 'headline + (lambda (head) (org-element-property :level head)))))) + ;; INCLUDE does not insert induced :minlevel for src-blocks. + (should-not + (equal + (org-test-with-temp-text + (format "#+INCLUDE: \"%s/examples/include2.org\" src emacs-lisp" org-test-dir) + (org-export-expand-include-keyword) + (buffer-string)) + (org-test-with-temp-text + (format "#+INCLUDE: \"%s/examples/include2.org\" src emacs-lisp :minlevel 1" org-test-dir) + (org-export-expand-include-keyword) + (buffer-string)))) + ;; INCLUDE assigns the relative :minlevel conditional on narrowing. + (should + (org-test-with-temp-text + (format "* h1\n#+INCLUDE: \"%s/examples/include.org::#ah\"" org-test-dir) + (org-narrow-to-element) + (org-export-expand-include-keyword) + (goto-char (point-min)) + (eq 1 (org-element-property :level (org-element-at-point))))) + ;; If :minlevel is present do not alter it. + (should + (org-test-with-temp-text + (format "* h1\n#+INCLUDE: \"%s/examples/include.org::#ah\" :minlevel 3" org-test-dir) + (org-narrow-to-element) + (org-export-expand-include-keyword) + (goto-char (point-min)) + (eq 3 (org-element-property :level (org-element-at-point)))))) (ert-deftest test-org-export/expand-macro () "Test macro expansion in an Org buffer." -- 2.2.1