Browse Source

ob-tangle: continued code blocks now implemented with the :noweb-ref header arg

  Now *all* code blocks which either are named `ref-name' or have the
  :noweb-ref header argument value `ref-name' will have their bodies
  concatenated when resolving the noweb reference <<ref-name>>.

* lisp/ob.el (org-babel-expand-noweb-references): Concatenating all
  bodies with the appropriate name or :noweb-ref header argument.
Eric Schulte 14 years ago
parent
commit
8c37281cb6
1 changed files with 33 additions and 28 deletions
  1. 33 28
      lisp/ob.el

+ 33 - 28
lisp/ob.el

@@ -1842,13 +1842,21 @@ 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)))))
-         (new-body "") index source-name evaluate prefix)
+         (new-body "") index source-name evaluate prefix blocks-in-buffer)
     (flet ((nb-add (text) (setq new-body (concat new-body text)))
 	   (c-wrap (text)
 		   (with-temp-buffer
 		     (funcall (intern (concat lang "-mode")))
 		     (comment-region (point) (progn (insert text) (point)))
-		     (org-babel-trim (buffer-string)))))
+		     (org-babel-trim (buffer-string))))
+	   (blocks () ;; return the info lists of all blocks in this buffer
+		   (let (infos)
+		     (save-restriction
+		       (widen)
+		       (org-babel-map-src-blocks nil
+			 (setq infos (cons (org-babel-get-src-block-info 'light)
+					   infos))))
+		     (reverse infos))))
       (with-temp-buffer
         (insert body) (goto-char (point-min))
         (setq index (point))
@@ -1873,35 +1881,32 @@ block but are passed literally to the \"example-block\"."
 	       (if evaluate
 		   (let ((raw (org-babel-ref-resolve source-name)))
 		     (if (stringp raw) raw (format "%S" raw)))
-		 (or (nth 2 (assoc (intern source-name)
-				   org-babel-library-of-babel))
-		     (save-restriction
-		       (widen)
-		       (let ((point (org-babel-find-named-block
-				     source-name)))
-			 (if point
-			     (save-excursion
-			       (goto-char point)
-			       ;; possibly wrap body in comments
-			       (let* ((i (org-babel-get-src-block-info 'light))
-				      (body (org-babel-trim
-					     (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))
-				   body)))
-			   ;; optionally raise an error if named
-			   ;; source-block doesn't exist
-			   (if (member lang org-babel-noweb-error-langs)
-			       (error "%s"
-				      (concat
+		 (or
+		  ;; retrieve from the library of babel
+		  (nth 2 (assoc (intern source-name)
+				org-babel-library-of-babel))
+		  ;; find the expansion of reference in this buffer
+		  (or (mapconcat
+		       (lambda (i)
+			 (when (string= source-name
+					(or (cdr (assoc :noweb-ref (nth 2 i)))
+					    (nth 4 i)))
+			   (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))
+			       body))))
+		       (or blocks-in-buffer
+			   (setq blocks-in-buffer (blocks)))
+		       "")
+		      ;; possibly raise an error if named block doesn't exist
+		      (if (member lang org-babel-noweb-error-langs)
+			  (error "%s" (concat
 				       "<<" source-name ">> "
 				       "could not be resolved (see "
 				       "`org-babel-noweb-error-langs')"))
-			     ""))))))
+			""))))
 	       "[\n\r]") (concat "\n" prefix)))))
         (nb-add (buffer-substring index (point-max)))))
     new-body))