ob: Rewrite `org-babel-get-src-block-info' using parser
[org-mode.git] / testing / examples / babel.org
blob4560db533f23732f11fb59821eb60d456084467a
1 #+Title: a collection of examples for Babel tests
2 #+OPTIONS: ^:nil
4 * =:noweb= header argument expansion
5   :PROPERTIES:
6   :ID:       eb1f6498-5bd9-45e0-9c56-50717053e7b7
7   :END:
9 #+name: noweb-example
10 #+begin_src emacs-lisp :results silent :exports code
11   (message "expanded1")
12 #+end_src
14 #+name: noweb-example2
15 #+begin_src emacs-lisp :results silent
16   (message "expanded2")
17 #+end_src
19 #+begin_src emacs-lisp :noweb yes :results silent
20 ;; noweb-1-yes-start
21   <<noweb-example>>
22 #+end_src
24 #+begin_src emacs-lisp :noweb no  :results silent
25 ;; noweb-no-start
26   <<noweb-example1>>
27 #+end_src
29 #+begin_src emacs-lisp :noweb yes :results silent
30 ;; noweb-2-yes-start
31   <<noweb-example2>>
32 #+end_src
34 #+begin_src emacs-lisp :noweb tangle :results silent
35   ;; noweb-tangle-start
36   <<noweb-example1>>
37   <<noweb-example2>>
38 #+end_src
40 * =:noweb= header argument expansion using :exports results
41   :PROPERTIES:
42   :ID:       8701beb4-13d9-468c-997a-8e63e8b66f8d
43   :END:
45 #+name: noweb-example
46 #+begin_src emacs-lisp :exports results
47   (message "expanded1")
48 #+end_src
50 #+name: noweb-example2
51 #+begin_src emacs-lisp :exports results
52   (message "expanded2")
53 #+end_src
55 #+begin_src emacs-lisp :noweb yes :exports results
56 ;; noweb-1-yes-start
57   <<noweb-example>>
58 #+end_src
60 #+begin_src emacs-lisp :noweb no :exports code
61 ;; noweb-no-start
62   <<noweb-example1>>
63 #+end_src
65 #+begin_src emacs-lisp :noweb yes :exports results
66 ;; noweb-2-yes-start
67   <<noweb-example2>>
68 #+end_src
70 #+begin_src emacs-lisp :noweb tangle :exports code
71   <<noweb-example1>>
72   <<noweb-example2>>
73 #+end_src
75 * excessive id links on tangling
76   :PROPERTIES:
77   :ID:       ef06fd7f-012b-4fde-87a2-2ae91504ea7e
78   :END:
80 ** no, don't give me an ID
81 #+begin_src emacs-lisp :tangle no
82   (message "not to be tangled")
83 #+end_src
85 ** yes, I'd love an ID
86    :PROPERTIES:
87    :ID:       ae7b55ca-9ef2-4d30-bd48-da30e35fd0f3
88    :END:
89 #+begin_src emacs-lisp :tangle no
90   (message "for tangling")
91 #+end_src
92 * simple named code block
93   :PROPERTIES:
94   :ID:       0d82b52d-1bb9-4916-816b-2c67c8108dbb
95   :END:
97 #+name: i-have-a-name
98 #+begin_src emacs-lisp
99   42
100 #+end_src
102 #+name:
103 : 42
105 #+name: i-have-a-name
106 : 42
108 * Pascal's Triangle -- exports both test
109   :PROPERTIES:
110   :ID:       92518f2a-a46a-4205-a3ab-bcce1008a4bb
111   :END:
113 #+name: pascals-triangle
114 #+begin_src emacs-lisp :var n=5 :exports both
115   (require 'cl)
116   (defalias 'my-map (if (org-version-check "24.2.50" "cl" :predicate)
117                         'cl-map
118                       'map))
119   (defun pascals-triangle (n)
120     (if (= n 0)
121         (list (list 1))
122       (let* ((prev-triangle (pascals-triangle (- n 1)))
123              (prev-row (car (reverse prev-triangle))))
124         (append prev-triangle
125                 (list (my-map 'list #'+
126                               (append prev-row '(0))
127                               (append '(0) prev-row)))))))
128   
129   (pascals-triangle n)
130 #+end_src
132 * calling code blocks from inside table
133   :PROPERTIES:
134   :ID:       6d2ff4ce-4489-4e2a-9c65-e3f71f77d975
135   :END:
137 #+name: take-sqrt
138 #+begin_src emacs-lisp :var n=9
139   (sqrt n)
140 #+end_src
142 * executing an lob call line
143   :PROPERTIES:
144   :results:  silent
145   :ID:       fab7e291-fde6-45fc-bf6e-a485b8bca2f0
146   :END:
148 #+call: echo(input="testing")
149 #+call: echo(input="testing") :results vector
150 #+call: echo[:var input="testing"]()
151 #+call: echo[:var input="testing"]() :results vector
152 #+call: echo("testing")
153 #+call: echo("testing") :results vector
154 This is an inline call call_echo(input="testing") embedded in prose.
155 This is an inline call call_echo(input="testing")[:results vector] embedded in prose.
156 #+call: lob-minus(8, 4)
157 call_echo("testing")
158 call_concat(1,2,3)
160 #+name: concat
161 #+begin_src emacs-lisp :var a=0 :var b=0 :var c=0
162   (format "%S%S%S" a b c)
163 #+end_src
165 * exporting an lob call line
166   :PROPERTIES:
167   :ID:       72ddeed3-2d17-4c7f-8192-a575d535d3fc
168   :END:
170 #+name: double
171 #+begin_src emacs-lisp :var it=0
172   (* 2 it)
173 #+end_src
175 The following exports as a normal call line
176 #+call: double(it=0)
178 Now here is an inline call call_double(it=1) stuck in the middle of
179 some prose.
181 This one should not be exported =call_double(it=2)= because it is
182 quoted.
184 Finally this next one should export, even though it starts a line
185 call_double(it=3) because sometimes inline blocks fold with a
186 paragraph.
188 And, a call with raw results call_double(4)[:results raw] should not
189 have quoted results.
191 The following 2*5=call_double(5) should export even when prefixed by
192 an = sign.
194 * inline source block
195   :PROPERTIES:
196   :ID:       54cb8dc3-298c-4883-a933-029b3c9d4b18
197   :END:
198 Here is one in the middle src_sh{echo 1} of a line.
199 Here is one at the end of a line. src_sh{echo 2}
200 src_sh{echo 3} Here is one at the beginning of a line.
202 * exported inline source block
203 :PROPERTIES:
204 :ID:       cd54fc88-1b6b-45b6-8511-4d8fa7fc8076
205 :exports:  code
206 :END:
207 Here is one in the middle src_sh{echo 1} of a line.
208 Here is one at the end of a line. src_sh{echo 2}
209 src_sh{echo 3} Here is one at the beginning of a line.
210 Here is one that is also evaluated: src_sh[:exports both]{echo 4}
212 * mixed blocks with exports both
213   :PROPERTIES:
214   :ID:       5daa4d03-e3ea-46b7-b093-62c1b7632df3
215   :END:
217 #+name: a-list
218 - a
219 - b
220 - c
222 #+begin_src emacs-lisp :exports both
223     "code block results"
224 #+end_src
226 #+begin_src emacs-lisp :var lst=a-list :results list :exports both
227   (reverse lst)
228 #+end_src
230 * using the =:noweb-ref= header argument
231   :PROPERTIES:
232   :ID:       54d68d4b-1544-4745-85ab-4f03b3cbd8a0
233   :noweb-sep: ""
234   :END:
236 #+begin_src sh :tangle yes :noweb yes :shebang "#!/bin/sh"
237   <<fullest-disk>>
238 #+end_src
240 ** query all mounted disks
241 #+begin_src sh :noweb-ref fullest-disk
242   df
243 #+end_src
245 ** strip the header row
246 #+begin_src sh :noweb-ref fullest-disk
247   |sed '1d'
248 #+end_src
250 ** sort by the percent full
251 #+begin_src sh :noweb-ref fullest-disk
252   |awk '{print $5 " " $6}'|sort -n |tail -1
253 #+end_src
255 ** extract the mount point
256 #+begin_src sh :noweb-ref fullest-disk
257   |awk '{print $2}'
258 #+end_src
259 * resolving sub-trees as references
260   :PROPERTIES:
261   :ID:       2409e8ba-7b5f-4678-8888-e48aa02d8cb4
262   :results:  silent
263   :END:
265 #+begin_src emacs-lisp :var text=d4faa7b3-072b-4dcf-813c-dd7141c633f3
266   (length text)
267 #+end_src
269 #+begin_src org :noweb yes
270   <<simple-subtree>>
271   <<d4faa7b3-072b-4dcf-813c-dd7141c633f3>>
272 #+end_src
274 ** simple subtree with custom ID
275    :PROPERTIES:
276    :CUSTOM_ID: simple-subtree
277    :END:
278 this is simple
280 ** simple subtree with global ID
281    :PROPERTIES:
282    :ID:       d4faa7b3-072b-4dcf-813c-dd7141c633f3
283    :END:
284 has length 14
286 * org-babel-get-inline-src-block-matches
287   :PROPERTIES:
288   :results:  silent
289   :ID:       0D0983D4-DE33-400A-8A05-A225A567BC74
290   :END:
291 src_sh{echo "One"} block at start of line
292  One spaced block in  src_sh{ echo "middle" } of line
293 src_sh{echo 2} blocks on the src_emacs-lisp{"same"} line
294  Inline block with src_sh[:results silent]{ echo "parameters" }.
296 * org-babel-get-inline-src-block-matches (with empty args)
297   :PROPERTIES:
298   :results:  silent
299   :ID:       d55dada7-de0e-4340-8061-787cccbedee5
300   :END:
301 src_sh[]{echo "One"} block at start of line
302  One spaced block in  src_sh[]{ echo "middle" } of line
303 src_sh[]{echo 2} blocks on the src_emacs-lisp[]{"same"} line
304  Inline block with src_sh[:results silent]{ echo "parameters" }.
306 * exporting a code block with a name
307   :PROPERTIES:
308   :ID:       b02ddd8a-eeb8-42ab-8664-8a759e6f43d9
309   :END:
311 exporting a code block with a name
312 #+name: qux
313 #+begin_src sh :foo "baz"
314   echo bar
315 #+end_src
316 * noweb no-export and exports both
317   :PROPERTIES:
318   :ID:       8a820f6c-7980-43db-8a24-0710d33729c9
319   :END:
320 Weird interaction.
322 here is one block
324 #+name: noweb-no-export-and-exports-both-1
325 #+BEGIN_SRC sh :exports none
326   echo 1
327 #+END_SRC
329 and another
331 #+BEGIN_SRC sh :noweb no-export :exports both
332   # I am inside the code block
333   <<noweb-no-export-and-exports-both-1>>
334 #+END_SRC
336 * in order evaluation on export
337   :PROPERTIES:
338   :exports: results
339   :ID:       96cc7073-97ec-4556-87cf-1f9bffafd317
340   :END:
342 First.
343 #+name: foo-for-order-of-evaluation
344 #+begin_src emacs-lisp :var it=1
345   (push it *evaluation-collector*)
346 #+end_src
348 Second
349 #+begin_src emacs-lisp
350   (push 2 *evaluation-collector*)
351 #+end_src
353 Third src_emacs-lisp{(car (push 3 *evaluation-collector*))}
355 Fourth
356 #+call: foo-for-order-of-evaluation(4)
358 Fifth
359 #+begin_src emacs-lisp
360   (push 5 *evaluation-collector*)
361 #+end_src
362 * exporting more than just results from a call line
363   :PROPERTIES:
364   :ID:       bec63a04-491e-4caa-97f5-108f3020365c
365   :END:
366 Here is a call line with more than just the results exported.
367 #+call: double(8)
368 * strip noweb references on export
369   :PROPERTIES:
370   :ID:       8e7bd234-99b2-4b14-8cd6-53945e409775
371   :END:
373 #+name: strip-export-1
374 #+BEGIN_SRC sh :exports none
375   i="10"
376 #+END_SRC
378 #+BEGIN_SRC sh :noweb strip-export :exports code :results silent
379   <<strip-export-1>>
380   echo "1$i"
381 #+END_SRC
383 * use case of reading entry properties
384   :PROPERTIES:
385   :ID:       cc5fbc20-bca5-437a-a7b8-2b4d7a03f820
386   :END:
388 Use case checked and documented with this test: During their
389 evaluation the source blocks read values from properties from the
390 entry where the call has been made unless the value is overridden with
391 the optional argument of the caller.
393 ** section
394    :PROPERTIES:
395    :a:        1
396    :c:        3
397    :END:
399 Note: Just export of a property can be done with a macro: {{{property(a)}}}.
401 #+NAME: src_block_location_shell-sect-call
402 #+CALL: src_block_location_shell()
404 #+NAME: src_block_location_elisp-sect-call
405 #+CALL: src_block_location_elisp()
407 - sect inline call_src_block_location_shell()[:results raw]
408 - sect inline call_src_block_location_elisp()[:results raw]
410 *** subsection
411     :PROPERTIES:
412     :b:        2
413     :c:        4
414     :END:
416 #+NAME: src_block_location_shell-sub0-call
417 #+CALL: src_block_location_shell()
419 #+NAME: src_block_location_elisp-sub0-call
420 #+CALL: src_block_location_elisp()
422 - sub0 inline call_src_block_location_shell()[:results raw]
423 - sub0 inline call_src_block_location_elisp()[:results raw]
425 #+NAME: src_block_location_shell-sub1-call
426 #+CALL: src_block_location_shell(c=5, e=6)
428 #+NAME: src_block_location_elisp-sub1-call
429 #+CALL: src_block_location_elisp(c=5, e=6)
431 - sub1 inline call_src_block_location_shell(c=5, e=6)[:results raw]
432 - sub1 inline call_src_block_location_elisp(c=5, e=6)[:results raw]
434 **** function definition
436 comments for ":var":
437 - The "or" is to deal with a property not present.
438 - The t is to get property inheritance.
439 #+NAME: src_block_location_shell
440 #+HEADER: :var a=(or (org-entry-get org-babel-current-src-block-location "a" t) "0")
441 #+HEADER: :var b=(or (org-entry-get org-babel-current-src-block-location "b" t) "0")
442 #+HEADER: :var c=(or (org-entry-get org-babel-current-src-block-location "c" t) "0")
443 #+HEADER: :var d=(or (org-entry-get org-babel-current-src-block-location "d" t) "0")
444 #+HEADER: :var e=(or (org-entry-get org-babel-current-src-block-location "e" t) "0")
445 #+BEGIN_SRC sh :shebang #!/bin/sh :exports results :results verbatim
446   printf "shell a:$a, b:$b, c:$c, d:$d, e:$e"
447 #+END_SRC
449 #+RESULTS: src_block_location_shell
451 #+NAME: src_block_location_elisp
452 #+HEADER: :var a='nil
453 #+HEADER: :var b='nil
454 #+HEADER: :var c='nil
455 #+HEADER: :var d='nil
456 #+HEADER: :var e='nil
457 #+BEGIN_SRC emacs-lisp :exports results
458   (setq
459    ;; - The first `or' together with ":var <var>='nil" is to check for
460    ;;   a value bound from an optional call argument, in the examples
461    ;;   here: c=5, e=6
462    ;; - The second `or' is to deal with a property not present
463    ;; - The t is to get property inheritance
464    a (or a (string-to-number
465             (or (org-entry-get org-babel-current-src-block-location "a" t)
466                 "0")))
467    b (or b (string-to-number
468             (or (org-entry-get org-babel-current-src-block-location "b" t)
469                 "0")))
470    c (or c (string-to-number
471             (or (org-entry-get org-babel-current-src-block-location "c" t)
472                 "0")))
473    d (or d (string-to-number
474             (or (org-entry-get org-babel-current-src-block-location "e" t)
475                 "0")))
476    e (or e (string-to-number
477             (or (org-entry-get org-babel-current-src-block-location "d" t)
478                 "0"))))
479   (format "elisp a:%d, b:%d, c:%d, d:%d, e:%d" a b c d e)
480 #+END_SRC
482 * =:file-ext= and =:output-dir= header args
483   :PROPERTIES:
484   :ID:       93573e1d-6486-442e-b6d0-3fedbdc37c9b
485   :END:
486 #+name: file-ext-basic
487 #+BEGIN_SRC emacs-lisp :file-ext txt
489 #+END_SRC
491 #+name: file-ext-dir-relative
492 #+BEGIN_SRC emacs-lisp :file-ext txt :output-dir foo
494 #+END_SRC
496 #+name: file-ext-dir-relative-slash
497 #+BEGIN_SRC emacs-lisp :file-ext txt :output-dir foo/
499 #+END_SRC
501 #+name: file-ext-dir-absolute
502 #+BEGIN_SRC emacs-lisp :file-ext txt :output-dir /tmp
504 #+END_SRC
506 #+name: file-ext-file-wins
507 #+BEGIN_SRC emacs-lisp :file-ext txt :file foo.bar
509 #+END_SRC
511 #+name: output-dir-and-file
512 #+BEGIN_SRC emacs-lisp :output-dir xxx :file foo.bar
514 #+END_SRC