Resolve :noweb-ref when set at the property level during noweb expansion
authorEric Schulte <eric.schulte@gmx.com>
Thu, 29 Dec 2011 19:46:42 +0000 (12:46 -0700)
committerBastien Guerry <bzg@altern.org>
Tue, 3 Jan 2012 08:17:03 +0000 (09:17 +0100)
* lisp/ob.el (org-babel-expand-noweb-references): Rather than using a
  pure regexp solution to resolve noweb references, actually check the
  information of every code block in the buffer.  This will cause a
  slowdown in noweb reference expansion, but is necessary for correct
  behavior.

lisp/ob.el

index 9919416..a392c23 100644 (file)
@@ -2014,8 +2014,6 @@ block but are passed literally to the \"example-block\"."
          (lang (nth 0 info))
          (body (nth 1 info))
         (comment (string= "noweb" (cdr (assoc :comments (nth 2 info)))))
-        (rx-prefix (concat "\\(" org-babel-src-name-regexp "\\|"
-                           ":noweb-ref[ \t]+" "\\)"))
          (new-body "") index source-name evaluate prefix blocks-in-buffer)
     (flet ((nb-add (text) (setq new-body (concat new-body text)))
           (c-wrap (text)
@@ -2056,19 +2054,21 @@ block but are passed literally to the \"example-block\"."
                    (when (org-babel-ref-goto-headline-id source-name)
                      (org-babel-ref-headline-body)))
                  ;; find the expansion of reference in this buffer
-                 (let ((rx (concat rx-prefix source-name))
-                       expansion)
+                 (let (expansion)
                    (save-excursion
                      (goto-char (point-min))
-                     (while (re-search-forward rx nil t)
-                       (let* ((i (org-babel-get-src-block-info 'light))
-                              (body (org-babel-expand-noweb-references i)))
-                         (if comment
-                             ((lambda (cs)
-                                (concat (c-wrap (car cs)) "\n"
-                                        body "\n" (c-wrap (cadr cs))))
-                              (org-babel-tangle-comment-links i))
-                           (setq expansion (concat expansion body))))))
+                     (org-babel-map-src-blocks nil
+                       (let ((i (org-babel-get-src-block-info 'light)))
+                         (when (equal (or (cdr (assoc :noweb-ref (nth 2 i)))
+                                          (nth 4 i))
+                                      source-name)
+                           (let ((body (org-babel-expand-noweb-references i)))
+                             (if comment
+                                 ((lambda (cs)
+                                    (concat (c-wrap (car cs)) "\n"
+                                            body "\n" (c-wrap (cadr cs))))
+                                  (org-babel-tangle-comment-links i))
+                               (setq expansion (concat expansion body))))))))
                    expansion)
                  ;; possibly raise an error if named block doesn't exist
                  (if (member lang org-babel-noweb-error-langs)