|
|
@@ -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
|