babel: ensure positional invariance of the `info' list

* contrib/babel/lisp/org-babel.el (org-babel-get-src-block-info):
  ensure that info always has the same number of arguments in the same
  order
This commit is contained in:
Eric Schulte 2010-06-10 15:46:16 -07:00
parent 9311325030
commit cc1c446791
1 changed files with 24 additions and 20 deletions

View File

@ -398,7 +398,7 @@ the current subtree."
(defun org-babel-get-src-block-info (&optional header-vars-only)
"Get information of the current source block.
Returns a list
(language body header-arguments-alist switches name function-args).
(language body header-arguments-alist switches name function-args indent).
Unless HEADER-VARS-ONLY is non-nil, any variable
references provided in 'function call style' (i.e. in a
parenthesised argument list following the src block name) are
@ -411,25 +411,29 @@ added to the header-arguments-alist."
(setq indent (car (last info)))
(setq info (butlast info))
(forward-line -1)
(when (looking-at
(concat org-babel-source-name-regexp
"\\([^ ()\f\t\n\r\v]+\\)\\(\(\\(.*\\)\)\\|\\)"))
(setq info (append info (list (org-babel-clean-text-properties
(match-string 2)))))
;; Note that e.g. "name()" and "name( )" result in ((:var . "")).
;; We maintain that behaviour, and the resulting non-nil sixth
;; element is relied upon in org-babel-exp-code to detect
;; a functional-style block in those cases. However,
;; "name" without any parentheses would result in the same
;; thing, so we explicitly avoid that.
(if (setq args (match-string 4))
(setq info
(append info (list
(mapcar (lambda (ref) (cons :var ref))
(org-babel-ref-split-args args))))))
(unless header-vars-only
(setf (third info)
(org-babel-merge-params (sixth info) (third info)))))
(if (looking-at
(concat org-babel-source-name-regexp
"\\([^ ()\f\t\n\r\v]+\\)\\(\(\\(.*\\)\)\\|\\)"))
(progn
(setq info (append info (list (org-babel-clean-text-properties
(match-string 2)))))
;; Note that e.g. "name()" and "name( )" result in
;; ((:var . "")). We maintain that behaviour, and the
;; resulting non-nil sixth element is relied upon in
;; org-babel-exp-code to detect a functional-style
;; block in those cases. However, "name" without any
;; parentheses would result in the same thing, so we
;; explicitly avoid that.
(if (setq args (match-string 4))
(setq info
(append info (list
(mapcar
(lambda (ref) (cons :var ref))
(org-babel-ref-split-args args))))))
(unless header-vars-only
(setf (third info)
(org-babel-merge-params (sixth info) (third info)))))
(setq info (append info (list nil nil))))
(append info (list indent)))
(if (save-excursion ;; inline source block
(re-search-backward "[ \f\t\n\r\v]" nil t)