summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <n.goaziou@gmail.com>2012-08-30 14:26:34 +0200
committerNicolas Goaziou <n.goaziou@gmail.com>2012-09-12 17:01:44 +0200
commit3c6a715bce9a7391773f6d6e60c6dc54ffdcdaee (patch)
treeafdaeeba3e8971206110dd3807b365d16fbecd88
parent14c3c20b06d0eb4ddb7aadeb6a8a794b93668a58 (diff)
downloadorg-mode-3c6a715bce9a7391773f6d6e60c6dc54ffdcdaee.tar.gz
ob-exp: Improve `org-export-blocks-preprocess'
* lisp/ob-exp.el (org-export-blocks-preprocess): Improve blank lines handling in function. Add comments. Remove `org-export-blocks-postblock-hook' since it's defined nowhere now (and doesn't need to, there's `org-export-before-parsing-hook' already).
-rw-r--r--lisp/ob-exp.el53
1 files changed, 29 insertions, 24 deletions
diff --git a/lisp/ob-exp.el b/lisp/ob-exp.el
index e63f7ed..3d99f4b 100644
--- a/lisp/ob-exp.el
+++ b/lisp/ob-exp.el
@@ -224,14 +224,14 @@ this template."
(interactive)
(save-window-excursion
(let ((case-fold-search t)
- (start (point-min)))
+ (start (point-min)))
(goto-char start)
(while (re-search-forward "^[ \t]*#\\+BEGIN_SRC" nil t)
(let ((element (save-match-data (org-element-at-point))))
(when (eq (org-element-type element) 'src-block)
(let* ((block-start (copy-marker (match-beginning 0)))
(match-start (copy-marker
- (org-element-property :begin element)))
+ (org-element-property :begin element)))
;; Make sure we don't remove any blank lines after
;; the block when replacing it.
(match-end (save-excursion
@@ -250,31 +250,36 @@ this template."
;; Execute all non-block elements between START and
;; MATCH-START.
(org-babel-exp-non-block-elements start match-start)
- (let ((replacement
- (progn (goto-char block-start)
- (org-babel-exp-src-block headers))))
- (when replacement
- (goto-char match-start)
- (delete-region (point) match-end)
- (insert replacement)
- (if preserve-indent
- ;; Indent only the code block markers.
- (save-excursion
- (skip-chars-backward " \r\t\n")
- (indent-line-to indentation)
- (goto-char match-start)
- (indent-line-to indentation))
- ;; Indent everything.
- (indent-code-rigidly match-start (point) indentation))))
+ ;; Take care of matched block: compute replacement
+ ;; string. In particular, a nil REPLACEMENT means the
+ ;; block should be left as-is while an empty string
+ ;; should remove the block.
+ (let ((replacement (progn (goto-char block-start)
+ (org-babel-exp-src-block headers))))
+ (cond ((not replacement) (goto-char match-end))
+ ((equal replacement "")
+ (delete-region (org-element-property :begin element)
+ (org-element-property :end element)))
+ (t
+ (goto-char match-start)
+ (delete-region (point) match-end)
+ (insert replacement)
+ (if preserve-indent
+ ;; Indent only the code block markers.
+ (save-excursion (skip-chars-backward " \r\t\n")
+ (indent-line-to indentation)
+ (goto-char match-start)
+ (indent-line-to indentation))
+ ;; Indent everything.
+ (indent-code-rigidly match-start (point) indentation)))))
+ (setq start (point))
;; Cleanup markers.
(set-marker block-start nil)
(set-marker match-start nil)
- (set-marker match-end nil))))
- (setq start (point)))
- ;; Execute all non-block Babel elements between last src-block
- ;; and end of buffer.
- (org-babel-exp-non-block-elements start (point-max))
- (run-hooks 'org-export-blocks-postblock-hook))))
+ (set-marker match-end nil)))))
+ ;; Eventually execute all non-block Babel elements between last
+ ;; src-block and end of buffer.
+ (org-babel-exp-non-block-elements start (point-max)))))
(defun org-babel-in-example-or-verbatim ()
"Return true if point is in example or verbatim code.