org-export: Fix expansion of babel calls in included files

* contrib/lisp/org-export.el (org-export-as):
  `org-current-export-file' should refer to current, temporary, buffer
  containing included contents, not to original buffer with include
  keywords.
(org-export-with-current-buffer-copy): Buffer copy must contain the
whole buffer, possibly narrowed to a proper part, not only the
narrowed part.
* testing/lisp/test-org-export.el: Tweak tests.
This commit is contained in:
Nicolas Goaziou 2012-10-18 20:44:24 +02:00
parent a729fae0f7
commit ccc98ebc2d
2 changed files with 37 additions and 40 deletions

View File

@ -2564,31 +2564,29 @@ Return code as a string."
;; Instead, a temporary copy is created, where include
;; keywords and macros are expanded and code blocks
;; are evaluated.
(tree (let ((buf (or (buffer-file-name (buffer-base-buffer))
(current-buffer))))
(org-export-with-current-buffer-copy
(unless noexpand
(org-export-expand-include-keyword)
;; Update radio targets since keyword
;; inclusion might have added some more.
(org-update-radio-target-regexp)
(org-export-expand-macro info)
;; TODO: Setting `org-current-export-file' is
;; required by Org Babel to properly resolve
;; noweb references. Once "org-exp.el" is
;; removed, modify
;; `org-export-blocks-preprocess' so it
;; accepts the value as an argument instead.
(let ((org-current-export-file buf))
(org-export-blocks-preprocess)))
(goto-char (point-min))
;; Run hook
;; `org-export-before-parsing-hook'. with current
;; back-end as argument.
(run-hook-with-args
'org-export-before-parsing-hook backend)
;; Eventually parse buffer.
(org-element-parse-buffer nil visible-only)))))
(tree (org-export-with-current-buffer-copy
(unless noexpand
(org-export-expand-include-keyword)
;; Update radio targets since keyword
;; inclusion might have added some more.
(org-update-radio-target-regexp)
(org-export-expand-macro info)
;; TODO: Setting `org-current-export-file' is
;; required by Org Babel to properly resolve
;; noweb references. Once "org-exp.el" is
;; removed, modify
;; `org-export-blocks-preprocess' so it
;; accepts the value as an argument instead.
(let ((org-current-export-file (current-buffer)))
(org-export-blocks-preprocess)))
(goto-char (point-min))
;; Run hook
;; `org-export-before-parsing-hook'. with current
;; back-end as argument.
(run-hook-with-args
'org-export-before-parsing-hook backend)
;; Eventually parse buffer.
(org-element-parse-buffer nil visible-only))))
;; 3. Call parse-tree filters to get the final tree.
(setq tree
(org-export-filter-apply-functions
@ -2717,28 +2715,25 @@ The copy preserves local variables and visibility of the original
buffer.
Point is at buffer's beginning when BODY is applied."
(org-with-gensyms (original-buffer offset buffer-string overlays)
`(let ((,original-buffer (current-buffer))
(,offset (1- (point-min)))
(,buffer-string (buffer-string))
(,overlays (mapcar
'copy-overlay (overlays-in (point-min) (point-max)))))
(declare (debug (body)))
(org-with-gensyms (original-buffer offset buffer-string overlays region)
`(let* ((,original-buffer (current-buffer))
(,region (list (point-min) (point-max)))
(,buffer-string (org-with-wide-buffer (buffer-string)))
(,overlays (mapcar 'copy-overlay (apply 'overlays-in ,region))))
(with-temp-buffer
(let ((buffer-invisibility-spec nil))
(org-clone-local-variables
,original-buffer
"^\\(org-\\|orgtbl-\\|major-mode$\\|outline-\\(regexp\\|level\\)$\\)")
(insert ,buffer-string)
(apply 'narrow-to-region ,region)
(mapc (lambda (ov)
(move-overlay
ov
(- (overlay-start ov) ,offset)
(- (overlay-end ov) ,offset)
(current-buffer)))
ov (overlay-start ov) (overlay-end ov) (current-buffer)))
,overlays)
(goto-char (point-min))
(progn ,@body))))))
(def-edebug-spec org-export-with-current-buffer-copy (body))
(defun org-export-expand-macro (info)
"Expand every macro in buffer.

View File

@ -368,7 +368,9 @@ text
(goto-char (point-at-eol))
(should (equal (org-export-as 'test) "text\n"))))
;; Subtree with a code block calling another block outside.
(org-test-with-temp-text "
(should
(equal ": 3\n"
(org-test-with-temp-text "
* Head1
#+BEGIN_SRC emacs-lisp :noweb yes :exports results
<<test>>
@ -378,9 +380,9 @@ text
#+BEGIN_SRC emacs-lisp
\(+ 1 2)
#+END_SRC"
(org-test-with-backend test
(forward-line 1)
(should (equal (org-export-as 'test 'subtree) ": 3\n")))))
(org-test-with-backend test
(forward-line 1)
(org-export-as 'test 'subtree))))))
(ert-deftest test-org-export/expand-include ()
"Test file inclusion in an Org buffer."