]> code.delx.au - gnu-emacs/blobdiff - lisp/org/ob-lob.el
Obsolete longlines.el.
[gnu-emacs] / lisp / org / ob-lob.el
index f806668e2e8167fcf519100fb7ca190f0eb2986b..8b5f14d0252093060ca117d4048628ddcfa5e369 100644 (file)
@@ -1,11 +1,11 @@
 ;;; ob-lob.el --- functions supporting the Library of Babel
 
-;; Copyright (C) 2009, 2010  Free Software Foundation, Inc.
+;; Copyright (C) 2009-2012  Free Software Foundation, Inc.
 
-;; Author: Eric Schulte, Dan Davison
+;; Authors: Eric Schulte
+;;      Dan Davison
 ;; Keywords: literate programming, reproducible research
 ;; Homepage: http://orgmode.org
-;; Version: 7.01
 
 ;; This file is part of GNU Emacs.
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
-;;; Commentary:
-
-;; See the online documentation for more information
-;; 
-;;   http://orgmode.org/worg/org-contrib/babel/
-
 ;;; Code:
+(eval-when-compile
+  (require 'cl))
 (require 'ob)
 (require 'ob-table)
 
+(declare-function org-babel-in-example-or-verbatim "ob-exp" nil)
+
 (defvar org-babel-library-of-babel nil
   "Library of source-code blocks.
 This is an association list.  Populate the library by adding
@@ -41,32 +39,49 @@ files to `org-babel-lob-files'.")
   "Files used to populate the `org-babel-library-of-babel'.
 To add files to this list use the `org-babel-lob-ingest' command."
   :group 'org-babel
+  :version "24.1"
   :type 'list)
 
-;;;###autoload
+(defvar org-babel-default-lob-header-args '((:exports . "results"))
+  "Default header arguments to use when exporting #+lob/call lines.")
+
 (defun org-babel-lob-ingest (&optional file)
-  "Add all source-blocks defined in FILE to `org-babel-library-of-babel'."
-  (interactive "f")
-  (org-babel-map-src-blocks file
-    (let* ((info (org-babel-get-src-block-info))
-          (source-name (intern (nth 4 info))))
-      (when source-name
-        (setq org-babel-library-of-babel
-              (cons (cons source-name info)
-                    (assq-delete-all source-name org-babel-library-of-babel)))))))
-
-(defconst org-babel-lob-call-aliases '("lob" "call")
-  "Aliases to call a source block function.
-If you change the value of this variable then your files may
-  become unusable by other org-babel users, and vice versa.")
+  "Add all named source-blocks defined in FILE to
+`org-babel-library-of-babel'."
+  (interactive "fFile: ")
+  (let ((lob-ingest-count 0))
+    (org-babel-map-src-blocks file
+      (let* ((info (org-babel-get-src-block-info 'light))
+            (source-name (nth 4 info)))
+       (when source-name
+         (setq source-name (intern source-name)
+               org-babel-library-of-babel
+               (cons (cons source-name info)
+                     (assq-delete-all source-name org-babel-library-of-babel))
+               lob-ingest-count (1+ lob-ingest-count)))))
+    (message "%d src block%s added to Library of Babel"
+            lob-ingest-count (if (> lob-ingest-count 1) "s" ""))
+    lob-ingest-count))
+
+(defconst org-babel-block-lob-one-liner-regexp
+  (concat
+   "^\\([ \t]*?\\)#\\+call:[ \t]+\\([^\(\)\n]+?\\)\\(\\[\\(.*\\)\\]\\|\\(\\)\\)"
+   "\(\\([^\n]*?\\)\)\\(\\[.+\\]\\|\\)[ \t]*\\(\\([^\n]*\\)\\)?")
+  "Regexp to match non-inline calls to predefined source block functions.")
+
+(defconst org-babel-inline-lob-one-liner-regexp
+  (concat
+   "\\([^\n]*?\\)call_\\([^\(\)\n]+?\\)\\(\\[\\(.*?\\)\\]\\|\\(\\)\\)"
+   "\(\\([^\n]*?\\)\)\\(\\[\\(.*?\\)\\]\\)?")
+  "Regexp to match inline calls to predefined source block functions.")
 
 (defconst org-babel-lob-one-liner-regexp
-  (concat "^\\([ \t]*\\)#\\+\\(?:"
-         (mapconcat #'regexp-quote org-babel-lob-call-aliases "\\|")
-         "\\):[ \t]+\\([^\(\)\n]+\\)\(\\([^\n]*\\)\)[ \t]*\\([^\n]*\\)")
+  (concat "\\(" org-babel-block-lob-one-liner-regexp
+         "\\|" org-babel-inline-lob-one-liner-regexp "\\)")
   "Regexp to match calls to predefined source block functions.")
 
 ;; functions for executing lob one-liners
+
 ;;;###autoload
 (defun org-babel-lob-execute-maybe ()
   "Execute a Library of Babel source block, if appropriate.
@@ -74,43 +89,61 @@ Detect if this is context for a Library Of Babel source block and
 if so then run the appropriate source block from the Library."
   (interactive)
   (let ((info (org-babel-lob-get-info)))
-    (if (nth 0 info) (progn (org-babel-lob-execute info) t) nil)))
-
-(add-hook 'org-ctrl-c-ctrl-c-hook 'org-babel-lob-execute-maybe)
+    (if (and (nth 0 info) (not (org-babel-in-example-or-verbatim)))
+       (progn (org-babel-lob-execute info) t)
+      nil)))
 
 ;;;###autoload
 (defun org-babel-lob-get-info ()
-  "Return a Library of Babel function call as a string.
-
-This function is analogous to org-babel-get-src-block-name. For
-both functions, after they are called, (match-string 1) matches
-the function name, and (match-string 2) matches the function
-arguments inside the parentheses. I think perhaps these functions
-should be renamed to bring out this similarity, perhaps involving
-the word 'call'."
-  (let ((case-fold-search t))
+  "Return a Library of Babel function call as a string."
+  (let ((case-fold-search t)
+       (nonempty (lambda (a b)
+                   (let ((it (match-string a)))
+                     (if (= (length it) 0) (match-string b) it)))))
     (save-excursion
       (beginning-of-line 1)
-      (if (looking-at org-babel-lob-one-liner-regexp)
-          (append (mapcar #'org-babel-clean-text-properties 
-                         (list (format "%s(%s)" (match-string 2) (match-string 3))
-                               (match-string 4)))
-                 (list (length (match-string 1))))))))
-  
+      (when (looking-at org-babel-lob-one-liner-regexp)
+       (append
+        (mapcar #'org-no-properties
+                (list
+                 (format "%s%s(%s)%s"
+                         (funcall nonempty 3 12)
+                         (if (not (= 0 (length (funcall nonempty 5 14))))
+                             (concat "[" (funcall nonempty 5 14) "]") "")
+                         (or (funcall nonempty 7 16) "")
+                         (or (funcall nonempty 8 19) ""))
+                 (funcall nonempty 9 18)))
+        (list (length (if (= (length (match-string 12)) 0)
+                          (match-string 2) (match-string 11)))))))))
+
 (defun org-babel-lob-execute (info)
   "Execute the lob call specified by INFO."
-  (let ((params (org-babel-merge-params
-                org-babel-default-header-args
-                (org-babel-params-from-buffer)
-                 (org-babel-params-from-properties)
-                (org-babel-parse-header-arguments
-                 (org-babel-clean-text-properties
-                  (concat ":var results=" (mapconcat #'identity (butlast info) " ")))))))
-    (org-babel-execute-src-block
-     nil (list "emacs-lisp" "results" params nil nil (nth 2 info)))))
+  (let* ((mkinfo (lambda (p) (list "emacs-lisp" "results" p nil nil (nth 2 info))))
+        (pre-params (org-babel-merge-params
+                     org-babel-default-header-args
+                     (org-babel-params-from-properties)
+                     (org-babel-parse-header-arguments
+                      (org-no-properties
+                       (concat ":var results="
+                               (mapconcat #'identity (butlast info) " "))))))
+        (pre-info (funcall mkinfo pre-params))
+        (cache? (and (cdr (assoc :cache pre-params))
+                     (string= "yes" (cdr (assoc :cache pre-params)))))
+        (new-hash (when cache? (org-babel-sha1-hash pre-info)))
+        (old-hash (when cache? (org-babel-current-result-hash))))
+    (if (and cache? (equal new-hash old-hash))
+       (save-excursion (goto-char (org-babel-where-is-src-block-result))
+                       (forward-line 1)
+                       (message "%S" (org-babel-read-result)))
+      (prog1 (org-babel-execute-src-block
+             nil (funcall mkinfo (org-babel-process-params pre-params)))
+       ;; update the hash
+       (when new-hash (org-babel-set-current-result-hash new-hash))))))
 
 (provide 'ob-lob)
 
-;; arch-tag: ce0712c9-2147-4019-ba3f-42341b8b474b
+;; Local variables:
+;; generated-autoload-file: "org-loaddefs.el"
+;; End:
 
 ;;; ob-lob.el ends here