summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <n.goaziou@gmail.com>2012-11-02 14:06:50 +0100
committerNicolas Goaziou <n.goaziou@gmail.com>2012-11-02 14:06:50 +0100
commit5d4243bcccd8a3193099129c76985d7b867112e5 (patch)
treeaf8009eebb6a589c5185c7d5a68f49e2d7f1245d
parent22ac03bee5ac7bc6662f5f0be3b3b3d8e7a6a2fd (diff)
downloadorg-mode-5d4243bcccd8a3193099129c76985d7b867112e5.tar.gz
org-export: Run a hook just before expanding include keywords and macros
* contrib/lisp/org-export.el (org-export-before-processing-hook): New variable. (org-export-as): Run a hook just before expanding include keywords and macros, and evaluating Babel blocks. * testing/lisp/test-org-export.el: Add test.
-rw-r--r--contrib/lisp/org-export.el32
-rw-r--r--testing/lisp/test-org-export.el35
2 files changed, 50 insertions, 17 deletions
diff --git a/contrib/lisp/org-export.el b/contrib/lisp/org-export.el
index e035baa..f1965e7 100644
--- a/contrib/lisp/org-export.el
+++ b/contrib/lisp/org-export.el
@@ -2083,19 +2083,32 @@ Any element in `:ignore-list' will be skipped when using
;; Filters properties are installed in communication channel with
;; `org-export-install-filters' function.
;;
-;; Eventually, a hook (`org-export-before-parsing-hook') is run just
-;; before parsing to allow for heavy structure modifications.
+;; Eventually, two hooks (`org-export-before-processing-hook' and
+;; `org-export-before-parsing-hook') are run at the beginning of the
+;; export process and just before parsing to allow for heavy structure
+;; modifications.
-;;;; Before Parsing Hook
+;;;; Hooks
+
+(defvar org-export-before-processing-hook nil
+ "Hook run at the beginning of the export process.
+
+This is run before include keywords and macros are expanded and
+Babel code blocks executed, on a copy of the original buffer
+being exported. Visibility and narrowing are preserved. Point
+is at the beginning of the buffer.
+
+Every function in this hook will be called with one argument: the
+back-end currently used, as a symbol.")
(defvar org-export-before-parsing-hook nil
"Hook run before parsing an export buffer.
-This is run after include keywords have been expanded and Babel
-code executed, on a copy of original buffer's area being
-exported. Visibility is the same as in the original one. Point
-is left at the beginning of the new one.
+This is run after include keywords and macros have been expanded
+and Babel code blocks executed, on a copy of the original buffer
+being exported. Visibility and narrowing are preserved. Point
+is at the beginning of the buffer.
Every function in this hook will be called with one argument: the
back-end currently used, as a symbol.")
@@ -2580,6 +2593,8 @@ Return code as a string."
;; attributes, unavailable in its copy.
(let ((info (org-export--get-buffer-attributes)) tree)
(org-export-with-current-buffer-copy
+ ;; Run first hook with current back-end as argument.
+ (run-hook-with-args 'org-export-before-processing-hook backend)
;; Update communication channel and get parse tree. Buffer
;; isn't parsed directly. Instead, a temporary copy is
;; created, where include keywords, macros are expanded and
@@ -2600,8 +2615,7 @@ Return code as a string."
;; Update radio targets since keyword inclusion might have
;; added some more.
(org-update-radio-target-regexp)
- ;; Run hook `org-export-before-parsing-hook'. with current
- ;; back-end as argument.
+ ;; Run last hook with current back-end as argument.
(goto-char (point-min))
(run-hook-with-args 'org-export-before-parsing-hook backend)
;; Update communication channel with environment. Also
diff --git a/testing/lisp/test-org-export.el b/testing/lisp/test-org-export.el
index 735fe1c..132b590 100644
--- a/testing/lisp/test-org-export.el
+++ b/testing/lisp/test-org-export.el
@@ -492,16 +492,35 @@ body\n")))
(org-test-with-temp-text "* Head1\n* Head2 (note)\n"
(should (equal (org-export-as 'test) "* Head1\n")))))))
+(ert-deftest test-org-export/before-processing-hook ()
+ "Test `org-export-before-processing-hook'."
+ (should
+ (equal
+ "#+MACRO: mac val\nTest\n"
+ (org-test-with-backend test
+ (org-test-with-temp-text "#+MACRO: mac val\n{{{mac}}} Test"
+ (let ((org-export-before-processing-hook
+ '((lambda (backend)
+ (while (re-search-forward "{{{" nil t)
+ (let ((object (org-element-context)))
+ (when (eq (org-element-type object) 'macro)
+ (delete-region
+ (org-element-property :begin object)
+ (org-element-property :end object)))))))))
+ (org-export-as 'test)))))))
+
(ert-deftest test-org-export/before-parsing-hook ()
"Test `org-export-before-parsing-hook'."
- (org-test-with-backend test
- (org-test-with-temp-text "* Headline 1\nBody 1\n* Headline 2\nBody 2"
- (let ((org-export-before-parsing-hook
- '((lambda (backend)
- (org-map-entries
- (lambda ()
- (delete-region (point) (progn (forward-line) (point)))))))))
- (should (equal (org-export-as 'test) "Body 1\nBody 2\n"))))))
+ (should
+ (equal "Body 1\nBody 2\n"
+ (org-test-with-backend test
+ (org-test-with-temp-text "* Headline 1\nBody 1\n* Headline 2\nBody 2"
+ (let ((org-export-before-parsing-hook
+ '((lambda (backend)
+ (org-map-entries
+ (lambda ()
+ (delete-region (point) (progn (forward-line) (point)))))))))
+ (org-export-as 'test)))))))