emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
blob 8ce52b6723aa2e263cf4ae2797b4cda20e7e1848 7960 bytes (raw)
name: contrib/babel/lisp/org-babel-exp.el 	 # note: path name is non-authoritative(*)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
 
;;; org-babel-exp.el --- Exportation of org-babel source blocks

;; Copyright (C) 2009 Eric Schulte, Dan Davison

;; Author: Eric Schulte, Dan Davison
;; Keywords: literate programming, reproducible research
;; Homepage: http://orgmode.org
;; Version: 0.01

;;; License:

;; This program 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, or (at your option)
;; any later version.
;;
;; This program 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; see the file COPYING.  If not, write to the
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.

;;; Commentary:

;; for more information see the comments in org-babel.el

;;; Code:
(require 'org-babel)
(require 'org-exp-blocks)
(org-export-blocks-add-block '(src org-babel-exp-src-blocks nil))
(add-to-list 'org-export-interblocks '(src org-babel-exp-inline-src-blocks))
(add-to-list 'org-export-interblocks '(lob org-babel-exp-lob-one-liners))

(defvar org-babel-function-def-export-keyword "function"
  "When exporting a source block function, this keyword will
appear in the exported version in the place of source name
line. A source block is considered to be a source block function
if the source name is present and is followed by a parenthesized
argument list. The parentheses may be empty or contain
whitespace. An example is the following which generates n random
(uniform) numbers.

#+source: rand(n)
#+begin_src R
  runif(n)
#+end_src
")

(defvar org-babel-function-def-export-indent 4
  "When exporting a source block function, the block contents
will be indented by this many characters. See
`org-babel-function-def-export-name' for the definition of a
source block function.")

(defvar obe-marker nil)

(defun org-babel-exp-src-blocks (body &rest headers)
  "Process src block for export.  Depending on the 'export'
headers argument in replace the source code block with...

both ---- display the code and the results

code ---- the default, display the code inside the block but do
          not process

results - just like none only the block is run on export ensuring
          that it's results are present in the org-mode buffer

none ----- do not display either code or results upon export"
  (interactive)
  (message "org-babel-exp processing...")
  (flet ((cond-progress-marker () (when (and progress-marker (< progress-marker (point)))
                                   progress-marker)))
    (or (and (re-search-backward org-babel-src-block-regexp (cond-progress-marker) t)
             (setq progress-marker (match-end 0))
             (org-babel-exp-do-export (org-babel-get-src-block-info) 'block))
        (save-excursion
          (forward-line 0)
          (and (org-babel-where-is-src-block-head)
               (goto-char (org-babel-where-is-src-block-head))
               (org-babel-exp-do-export (org-babel-get-src-block-info) 'block)))
        (and (re-search-backward org-block-regexp (cond-progress-marker) t)
             (setq progress-marker (match-end 0))
             (match-string 0))
        (error "Unmatched block [bug in `org-babel-exp-src-blocks']."))))

(defun org-babel-exp-inline-src-blocks (start end)
  "Process inline src blocks between START and END for export.
See `org-babel-exp-src-blocks' for export options, currently the
options and are taken from `org-babel-defualt-inline-header-args'."
  (interactive)
  (save-excursion
    (goto-char start)
    (while (and (< (point) end)
                (re-search-forward org-babel-inline-src-block-regexp end t))
      (let* ((info (save-match-data (org-babel-parse-inline-src-block-match)))
             (replacement (save-match-data
                            (org-babel-exp-do-export info 'inline))))
        (setq end (+ end (- (length replacement) (length (match-string 1)))))
        (replace-match replacement t t nil 1)))))

(defun org-babel-exp-lob-one-liners (start end)
  "Process #+lob (Library of Babel) calls between START and END for export.
See `org-babel-exp-src-blocks' for export options. Currently the
options are taken from `org-babel-default-header-args'."
  (interactive)
  (let (replacement)
    (save-excursion
      (goto-char start)
      (while (and (< (point) end)
		  (re-search-forward org-babel-lob-one-liner-regexp nil t))
	(setq replacement
	      (save-match-data
		(org-babel-exp-do-export
		 (list "emacs-lisp" "results"
		       (org-babel-merge-params
			org-babel-default-header-args
			(org-babel-parse-header-arguments
			 (org-babel-clean-text-properties
			  (concat ":var results="
				  (mapconcat #'identity (org-babel-lob-get-info) " "))))))
		 'lob)))
	(setq end (+ end (- (length replacement) (length (match-string 0)))))
	(replace-match replacement t t)))))

(defun org-babel-exp-do-export (info type)
  (case (intern (or (cdr (assoc :exports (third info))) "code"))
    ('none "")
    ('code (org-babel-exp-code info type))
    ('results (org-babel-exp-results info type))
    ('both (concat (org-babel-exp-code info type)
                   "\n\n"
                   (org-babel-exp-results info type)))))

(defun org-babel-exp-code (info type)
  (let ((lang (first info))
	(body (second info))
	(switches (fourth info))
	(name (fifth info))
	(args (sixth info))
	(function-def-line ""))
    (case type
      ('inline (format "=%s=" (second info)))
      ('block
          (let ((str (format "#+BEGIN_SRC %s %s\n%s%s#+END_SRC\n" lang switches body
                        (if (string-match "\n$" body) "" "\n"))))
            (add-text-properties 0 (length str) (list 'org-caption name) str)
            str))
      ('lob (save-excursion
	      (re-search-backward org-babel-lob-one-liner-regexp)
	      (format "#+BEGIN_SRC org-babel-lob\n%s\n#+END_SRC"
                      (first (org-babel-lob-get-info))))))))

(defun org-babel-exp-results (info type)
  (let ((lang (first info))
	(body (second info))
	(params
         ;; lets ensure that we lookup references in the original file
         (mapcar (lambda (pair)
                   (if (and org-current-export-file
                            (eq (car pair) :var)
                            (string-match org-babel-ref-split-regexp (cdr pair)))
                       `(:var . ,(concat (match-string 1 (cdr pair))
                                         "=" org-current-export-file
                                         ":" (match-string 2 (cdr pair))))
                     pair))
		 (third info))))
    (case type
      ('inline
        (let ((raw (org-babel-execute-src-block
                    nil info '((:results . "silent"))))
              (result-params (split-string (cdr (assoc :results params)))))
          (cond ;; respect the value of the :results header argument
           ((member "file" result-params)
            (org-babel-result-to-file raw))
           ((or (member "raw" result-params) (member "org" result-params))
            raw)
           ((member "code" result-params)
            (format "src_%s{%s}" lang raw))
           (t
            (if (stringp raw)
		(if (= 0 (length raw)) "=(no results)="
		  (format "=%s=" raw))
	      (format "=%S=" raw))))))
      ('block
          (org-babel-execute-src-block
           nil nil (org-babel-merge-params params '((:results . "replace"))))
        "")
      ('lob
          (save-excursion
            (re-search-backward org-babel-lob-one-liner-regexp nil t)
            (org-babel-execute-src-block
             nil (list lang body (org-babel-merge-params params '((:results . "replace"))))) "")))))

(provide 'org-babel-exp)
;;; org-babel-exp.el ends here

debug log:

solving 8ce52b6 ...
found 8ce52b6 in https://git.savannah.gnu.org/cgit/emacs/org-mode.git

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).