diff options
author | Nicolas Goaziou <n.goaziou@gmail.com> | 2012-08-30 14:26:34 +0200 |
---|---|---|
committer | Nicolas Goaziou <n.goaziou@gmail.com> | 2012-09-12 17:01:44 +0200 |
commit | 3c6a715bce9a7391773f6d6e60c6dc54ffdcdaee (patch) | |
tree | afdaeeba3e8971206110dd3807b365d16fbecd88 | |
parent | 14c3c20b06d0eb4ddb7aadeb6a8a794b93668a58 (diff) | |
download | org-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.el | 53 |
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. |