From 47810f8e14f8b958af9e8c8fc9cf773b44b68d23 Mon Sep 17 00:00:00 2001 From: Eric Schulte Date: Sat, 13 Jun 2009 17:07:16 -0700 Subject: [PATCH] references to #+resname lines are now working --- lisp/org-babel-ref.el | 54 ++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/lisp/org-babel-ref.el b/lisp/org-babel-ref.el index 2d6cb85b3..50211e936 100644 --- a/lisp/org-babel-ref.el +++ b/lisp/org-babel-ref.el @@ -89,6 +89,7 @@ return nil." (defun org-babel-ref-resolve-reference (ref) "Resolve the reference and return it's value" (save-excursion + (message "processing ref %S from %d" ref (point)) (let ((case-fold-search t) type args new-refere new-referent result) ;; assign any arguments to pass to source block @@ -105,7 +106,7 @@ return nil." (find-file (match-string 1 ref)) (setf ref (match-string 2 ref))) (goto-char (point-min)) - (unless (let ((result_regexp (concat "^#\\+\\(TBL\\|RES\\)NAME:[ \t]*" + (if (let ((result_regexp (concat "^#\\+\\(TBL\\|RES\\)NAME:[ \t]*" (regexp-quote ref) "[ \t]*$")) (regexp (concat "^#\\+SRCNAME:[ \t]*" (regexp-quote ref) "[ \t]*$"))) @@ -113,24 +114,23 @@ return nil." (re-search-forward result_regexp nil t) (re-search-forward regexp nil t) (re-search-backward regexp nil t))) - ;; ;; TODO: allow searching for names in other buffers - ;; (setq id-loc (org-id-find ref 'marker) - ;; buffer (marker-buffer id-loc) - ;; loc (marker-position id-loc)) - ;; (move-marker id-loc nil) - (progn (message (format "reference '%s' not found in this buffer" ref)) - (error (format "reference '%s' not found in this buffer" ref)))) + (goto-char (match-beginning 0)) + ;; ;; TODO: allow searching for names in other buffers + ;; (setq id-loc (org-id-find ref 'marker) + ;; buffer (marker-buffer id-loc) + ;; loc (marker-position id-loc)) + ;; (move-marker id-loc nil) + (progn (message (format "reference '%s' not found in this buffer" ref)) + (error (format "reference '%s' not found in this buffer" ref)))) (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"))) + (message "type=%S point=%d" type (point)) (case type - ('table - (mapcar (lambda (row) - (if (and (symbolp row) (equal row 'hline)) row - (mapcar #'org-babel-read row))) - (org-table-to-lisp))) + ('results-line (org-babel-ref-read-result)) + ('table (org-babel-ref-read-table)) ('source-block (setq result (org-babel-execute-src-block t nil (org-combine-plists args nil))) @@ -141,7 +141,33 @@ return nil." of the supported reference types are found. Supported reference types are tables and source blocks." (cond ((org-at-table-p) 'table) - ((looking-at "^#\\+BEGIN_SRC") 'source-block))) + ((looking-at "^#\\+BEGIN_SRC") 'source-block) + ((looking-at "^#\\+RESNAME:") 'results-line))) + +(defun org-babel-ref-read-result () + "Read the result at `point' into emacs-lisp." + (cond + ((org-at-table-p) (org-babel-ref-read-table)) + ((looking-at ": ") + (let ((result-string + (org-babel-trim + (mapconcat (lambda (line) (if (and (> (length line) 1) + (string= ": " (substring line 0 2))) + (substring line 2) + line)) + (split-string + (buffer-substring (point) (org-babel-result-end)) "[\r\n]+") + "\n")))) + (or (org-babel-number-p result-string) result-string))) + ((looking-at "^#\\+RESNAME:") + (save-excursion (forward-line 1) (org-babel-ref-read-result))))) + +(defun org-babel-ref-read-table () + "Read the table at `point' into emacs-lisp." + (mapcar (lambda (row) + (if (and (symbolp row) (equal row 'hline)) row + (mapcar #'org-babel-read row))) + (org-table-to-lisp))) (provide 'org-babel-ref) ;;; org-babel-ref.el ends here