From a2cf4b43f250b98794907169355102cc874ae941 Mon Sep 17 00:00:00 2001 From: Eric Schulte Date: Tue, 28 Jun 2011 11:24:26 -0700 Subject: [PATCH] ob-ref: resolve variable references to headline contents * lisp/ob-ref.el (org-babel-ref-resolve): Now resolves references to headlines by either global or custom id, in which case the contents of the headline are returned literally. --- lisp/ob-ref.el | 50 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/lisp/ob-ref.el b/lisp/ob-ref.el index c606bf00a..367df2463 100644 --- a/lisp/ob-ref.el +++ b/lisp/ob-ref.el @@ -88,7 +88,7 @@ the variable." (save-excursion (let ((case-fold-search t) type args new-refere new-header-args new-referent result - lob-info split-file split-ref index index-row index-col) + lob-info split-file split-ref index index-row index-col id) ;; if ref is indexed grab the indices -- beware nested indices (when (and (string-match "\\[\\([^\\[]+\\)\\]$" ref) (let ((str (substring ref 0 (match-beginning 0)))) @@ -106,8 +106,8 @@ the variable." (setq args (mapcar (lambda (ref) (cons :var ref)) (org-babel-ref-split-args new-referent)))) (when (> (length new-header-args) 0) - (setq args (append (org-babel-parse-header-arguments new-header-args) - args))) + (setq args (append (org-babel-parse-header-arguments + new-header-args) args))) (setq ref new-refere))) (when (string-match "^\\(.+\\):\\(.+\\)$" ref) (setq split-file (match-string 1 ref)) @@ -126,6 +126,13 @@ the variable." (re-search-backward res-rx nil t))) (re-search-forward src-rx nil t) (re-search-backward src-rx nil t) + ;; check for local or global headlines by id + (setq id + (or + (re-search-forward (concat "^[ \t]*:CUSTOM_ID:[ \t]+" + rx "[ \t]*$") nil t) + (condition-case nil (progn (org-id-goto ref) t) + (error nil)))) ;; check the Library of Babel (setq lob-info (cdr (assoc (intern ref) org-babel-library-of-babel))))) @@ -136,22 +143,33 @@ the variable." ;; loc (marker-position id-loc)) ;; (move-marker id-loc nil) (error "reference '%s' not found in this buffer" ref)) - (if lob-info - (setq type 'lob) - (while (not (setq type (org-babel-ref-at-ref-p))) - (forward-line 1) - (beginning-of-line) - (if (or (= (point) (point-min)) (= (point) (point-max))) - (error "reference not found")))) + (cond + (lob-info (setq type 'lob)) + (id (setq type 'id)) + (t (while (not (setq type (org-babel-ref-at-ref-p))) + (forward-line 1) + (beginning-of-line) + (if (or (= (point) (point-min)) (= (point) (point-max))) + (error "reference not found"))))) (let ((params (append args '((:results . "silent"))))) (setq result (case type - ('results-line (org-babel-read-result)) - ('table (org-babel-read-table)) - ('list (org-babel-read-list)) - ('file (org-babel-read-link)) - ('source-block (org-babel-execute-src-block nil nil params)) - ('lob (org-babel-execute-src-block nil lob-info params))))) + (results-line (org-babel-read-result)) + (table (org-babel-read-table)) + (list (org-babel-read-list)) + (file (org-babel-read-link)) + (source-block (org-babel-execute-src-block nil nil params)) + (lob (org-babel-execute-src-block nil lob-info params)) + (id (save-restriction + (org-narrow-to-subtree) + (buffer-substring + (save-excursion (goto-char (point-min)) + (forward-line 1) + (when (looking-at "[ \t]*:PROPERTIES:") + (re-search-forward ":END:" nil) + (forward-char)) + (point)) + (point-max))))))) (if (symbolp result) (format "%S" result) (if (and index (listp result)) -- 2.11.4.GIT