浏览代码

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.
Eric Schulte 13 年之前
父节点
当前提交
a2cf4b43f2
共有 1 个文件被更改,包括 34 次插入16 次删除
  1. 34 16
      lisp/ob-ref.el

+ 34 - 16
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))