| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 | ;;; ob-lob.el --- Functions Supporting the Library of Babel -*- lexical-binding: t; -*-;; Copyright (C) 2009-2016 Free Software Foundation, Inc.;; Authors: Eric Schulte;;	 Dan Davison;; Keywords: literate programming, reproducible research;; Homepage: http://orgmode.org;; This file is part of GNU Emacs.;; GNU Emacs is free software: you can redistribute it and/or modify;; it under the terms of the GNU General Public License as published by;; the Free Software Foundation, either version 3 of the License, or;; (at your option) any later version.;; GNU Emacs is distributed in the hope that it will be useful,;; but WITHOUT ANY WARRANTY; without even the implied warranty of;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the;; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.;;; Code:(require 'cl-lib)(require 'ob-core)(require 'ob-table)(declare-function org-babel-ref-split-args "ob-ref" (arg-string))(declare-function org-element-at-point "org-element" ())(declare-function org-element-context "org-element" (&optional element))(declare-function org-element-property "org-element" (property element))(declare-function org-element-type "org-element" (element))(defvar org-babel-library-of-babel nil  "Library of source-code blocks.This is an association list.  Populate the library by calling`org-babel-lob-ingest' on files containing source blocks.")(defvar org-babel-default-lob-header-args '((:exports . "results"))  "Default header arguments to use when exporting Babel calls.By default, a Babel call inherits its arguments from the sourceblock being called.  Header arguments defined in this variabletake precedence over these.  It is useful for properties thatshould not be inherited from a source block.")(defun org-babel-lob-ingest (&optional file)  "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));; Functions for executing lob one-liners.;;;###autoload(defun org-babel-lob-execute-maybe ()  "Execute a Library of Babel source block, if appropriate.Detect if this is context for a Library Of Babel source block andif so then run the appropriate source block from the Library."  (interactive)  (let ((info (org-babel-lob-get-info)))    (when info      (org-babel-execute-src-block nil info)      t)))(defun org-babel-lob--src-info (name)  "Return internal representation for Babel data named NAME.NAME is a string.  This function looks into the current documentfor a Babel call or source block.  If none is found, it looksafter NAME in the Library of Babel.  Eventually, if that alsofails, it returns nil."  ;; During export, look into the pristine copy of the document being  ;; exported instead of the current one, which could miss some data.  (with-current-buffer (or org-babel-exp-reference-buffer (current-buffer))    (org-with-wide-buffer     (goto-char (point-min))     (catch :found       (let ((case-fold-search t)	     (regexp (org-babel-named-data-regexp-for-name name)))	 (while (re-search-forward regexp nil t)	   (let ((element (org-element-at-point)))	     (when (equal name (org-element-property :name element))	       (throw :found		      (pcase (org-element-type element)			(`src-block (org-babel-get-src-block-info t element))			(`babel-call (org-babel-lob-get-info element))			;; Non-executable data found.  Since names are			;; supposed to be unique throughout a document,			;; bail out.			(_ nil))))))	 ;; No element named NAME in buffer.  Try Library of Babel.	 (cdr (assoc-string name org-babel-library-of-babel)))))));;;###autoload(defun org-babel-lob-get-info (&optional datum)  "Return internal representation for Library of Babel function call.Consider DATUM, when provided, or element at point.  Return nilwhen not on an appropriate location.  Otherwise return a listcompatible with `org-babel-get-src-block-info', which see."  (let* ((context (or datum (org-element-context)))	 (type (org-element-type context)))    (when (memq type '(babel-call inline-babel-call))      (pcase (org-babel-lob--src-info (org-element-property :call context))	(`(,language ,body ,header ,_ ,_ ,_ ,coderef)	 (let ((begin (org-element-property (if (eq type 'inline-babel-call)						:begin					      :post-affiliated)					    context)))	   (list language		 body		 (apply #'org-babel-merge-params			header			org-babel-default-lob-header-args			(append			 (org-with-wide-buffer			  (goto-char begin)			  (org-babel-params-from-properties language))			 (list			  (org-babel-parse-header-arguments			   (org-element-property :inside-header context))			  (let ((args (org-element-property :arguments context)))			    (and args				 (mapcar (lambda (ref) (cons :var ref))					 (org-babel-ref-split-args args))))			  (org-babel-parse-header-arguments			   (org-element-property :end-header context)))))		 nil		 (org-element-property :name context)		 begin		 coderef)))	(_ nil)))))(provide 'ob-lob);; Local variables:;; generated-autoload-file: "org-loaddefs.el";; End:;;; ob-lob.el ends here
 |