forked from mirrors/org-mode
* lisp/ob-exp.el (org-babel-exp-inline-code-template): New customizable variable to export inline source code (similar to `org-babel-exp-code-template'). (org-babel-exp-code): New `type' argument to differentiate between inline and standard code blocks. * lisp/ob-core.el (org-babel-inline-src-block-regexp): Allow empty set of switches and header arguments as in "src_sh[]{echo foo;}". Also permit spaces before them. * testint/lisp/test-org-element.el (test-org-element/inline-src-block-parser): Test extended syntax for inline source code. * testing/lisp/test-ob-exp.el (ob-exp/exports-inline-code): New function for testing inline source code handling. Also add three new failing tests exhibiting unexpected results with ":results code" switches. * testing/lisp/test-ob.el (test-org-babel/org-babel-get-inline-src-block-matches): Test for inline source blocks with empty header arguments. * testing/examples/babel.org: New sections for testing (i) exported inline source code (used by `ob-exp/exports-inline-code'); (ii) parsing inline source blocks with empty header arguments (used by `test-org-babel/org-babel-get-inline-src-block-matches'). Until now pieces of inline source code were handled as standard code blocks during export. These changes enable them to be exported.
517 lines
12 KiB
Org Mode
517 lines
12 KiB
Org Mode
#+Title: a collection of examples for Babel tests
|
|
#+OPTIONS: ^:nil
|
|
|
|
* =:noweb= header argument expansion
|
|
:PROPERTIES:
|
|
:ID: eb1f6498-5bd9-45e0-9c56-50717053e7b7
|
|
:END:
|
|
|
|
#+name: noweb-example
|
|
#+begin_src emacs-lisp :results silent :exports code
|
|
(message "expanded1")
|
|
#+end_src
|
|
|
|
#+name: noweb-example2
|
|
#+begin_src emacs-lisp :results silent
|
|
(message "expanded2")
|
|
#+end_src
|
|
|
|
#+begin_src emacs-lisp :noweb yes :results silent
|
|
;; noweb-1-yes-start
|
|
<<noweb-example>>
|
|
#+end_src
|
|
|
|
#+begin_src emacs-lisp :noweb no :results silent
|
|
;; noweb-no-start
|
|
<<noweb-example1>>
|
|
#+end_src
|
|
|
|
#+begin_src emacs-lisp :noweb yes :results silent
|
|
;; noweb-2-yes-start
|
|
<<noweb-example2>>
|
|
#+end_src
|
|
|
|
#+begin_src emacs-lisp :noweb tangle :results silent
|
|
;; noweb-tangle-start
|
|
<<noweb-example1>>
|
|
<<noweb-example2>>
|
|
#+end_src
|
|
|
|
* =:noweb= header argument expansion using :exports results
|
|
:PROPERTIES:
|
|
:ID: 8701beb4-13d9-468c-997a-8e63e8b66f8d
|
|
:END:
|
|
|
|
#+name: noweb-example
|
|
#+begin_src emacs-lisp :exports results
|
|
(message "expanded1")
|
|
#+end_src
|
|
|
|
#+name: noweb-example2
|
|
#+begin_src emacs-lisp :exports results
|
|
(message "expanded2")
|
|
#+end_src
|
|
|
|
#+begin_src emacs-lisp :noweb yes :exports results
|
|
;; noweb-1-yes-start
|
|
<<noweb-example>>
|
|
#+end_src
|
|
|
|
#+begin_src emacs-lisp :noweb no :exports code
|
|
;; noweb-no-start
|
|
<<noweb-example1>>
|
|
#+end_src
|
|
|
|
#+begin_src emacs-lisp :noweb yes :exports results
|
|
;; noweb-2-yes-start
|
|
<<noweb-example2>>
|
|
#+end_src
|
|
|
|
#+begin_src emacs-lisp :noweb tangle :exports code
|
|
<<noweb-example1>>
|
|
<<noweb-example2>>
|
|
#+end_src
|
|
|
|
* excessive id links on tangling
|
|
:PROPERTIES:
|
|
:ID: ef06fd7f-012b-4fde-87a2-2ae91504ea7e
|
|
:END:
|
|
|
|
** no, don't give me an ID
|
|
#+begin_src emacs-lisp :tangle no
|
|
(message "not to be tangled")
|
|
#+end_src
|
|
|
|
** yes, I'd love an ID
|
|
:PROPERTIES:
|
|
:ID: ae7b55ca-9ef2-4d30-bd48-da30e35fd0f3
|
|
:END:
|
|
#+begin_src emacs-lisp :tangle no
|
|
(message "for tangling")
|
|
#+end_src
|
|
* simple named code block
|
|
:PROPERTIES:
|
|
:ID: 0d82b52d-1bb9-4916-816b-2c67c8108dbb
|
|
:END:
|
|
|
|
#+name: i-have-a-name
|
|
#+begin_src emacs-lisp
|
|
42
|
|
#+end_src
|
|
|
|
#+name:
|
|
: 42
|
|
|
|
#+name: i-have-a-name
|
|
: 42
|
|
|
|
* Pascal's Triangle -- exports both test
|
|
:PROPERTIES:
|
|
:ID: 92518f2a-a46a-4205-a3ab-bcce1008a4bb
|
|
:END:
|
|
|
|
#+name: pascals-triangle
|
|
#+begin_src emacs-lisp :var n=5 :exports both
|
|
(require 'cl)
|
|
(defalias 'my-map (if (org-version-check "24.2.50" "cl" :predicate)
|
|
'cl-map
|
|
'map))
|
|
(defun pascals-triangle (n)
|
|
(if (= n 0)
|
|
(list (list 1))
|
|
(let* ((prev-triangle (pascals-triangle (- n 1)))
|
|
(prev-row (car (reverse prev-triangle))))
|
|
(append prev-triangle
|
|
(list (my-map 'list #'+
|
|
(append prev-row '(0))
|
|
(append '(0) prev-row)))))))
|
|
|
|
(pascals-triangle n)
|
|
#+end_src
|
|
|
|
* calling code blocks from inside table
|
|
:PROPERTIES:
|
|
:ID: 6d2ff4ce-4489-4e2a-9c65-e3f71f77d975
|
|
:END:
|
|
|
|
#+name: take-sqrt
|
|
#+begin_src emacs-lisp :var n=9
|
|
(sqrt n)
|
|
#+end_src
|
|
|
|
* executing an lob call line
|
|
:PROPERTIES:
|
|
:results: silent
|
|
:ID: fab7e291-fde6-45fc-bf6e-a485b8bca2f0
|
|
:END:
|
|
|
|
#+call: echo(input="testing")
|
|
#+call: echo(input="testing") :results vector
|
|
#+call: echo[:var input="testing"]()
|
|
#+call: echo[:var input="testing"]() :results vector
|
|
#+call: echo("testing")
|
|
#+call: echo("testing") :results vector
|
|
This is an inline call call_echo(input="testing") embedded in prose.
|
|
This is an inline call call_echo(input="testing")[:results vector] embedded in prose.
|
|
#+call: lob-minus(8, 4)
|
|
call_echo("testing")
|
|
call_concat(1,2,3)
|
|
|
|
#+name: concat
|
|
#+begin_src emacs-lisp :var a=0 :var b=0 :var c=0
|
|
(format "%S%S%S" a b c)
|
|
#+end_src
|
|
|
|
* exporting an lob call line
|
|
:PROPERTIES:
|
|
:ID: 72ddeed3-2d17-4c7f-8192-a575d535d3fc
|
|
:END:
|
|
|
|
#+name: double
|
|
#+begin_src emacs-lisp :var it=0
|
|
(* 2 it)
|
|
#+end_src
|
|
|
|
The following exports as a normal call line
|
|
#+call: double(it=0)
|
|
|
|
Now here is an inline call call_double(it=1) stuck in the middle of
|
|
some prose.
|
|
|
|
This one should not be exported =call_double(it=2)= because it is
|
|
quoted.
|
|
|
|
Finally this next one should export, even though it starts a line
|
|
call_double(it=3) because sometimes inline blocks fold with a
|
|
paragraph.
|
|
|
|
And, a call with raw results call_double(4)[:results raw] should not
|
|
have quoted results.
|
|
|
|
The following 2*5=call_double(5) should export even when prefixed by
|
|
an = sign.
|
|
|
|
* inline source block
|
|
:PROPERTIES:
|
|
:results: silent
|
|
:ID: 54cb8dc3-298c-4883-a933-029b3c9d4b18
|
|
:END:
|
|
Here is one in the middle src_sh{echo 1} of a line.
|
|
Here is one at the end of a line. src_sh{echo 2}
|
|
src_sh{echo 3} Here is one at the beginning of a line.
|
|
|
|
* exported inline source block
|
|
:PROPERTIES:
|
|
:ID: cd54fc88-1b6b-45b6-8511-4d8fa7fc8076
|
|
:results: silent
|
|
:exports: code
|
|
:END:
|
|
Here is one in the middle src_sh{echo 1} of a line.
|
|
Here is one at the end of a line. src_sh{echo 2}
|
|
src_sh{echo 3} Here is one at the beginning of a line.
|
|
Here is one that is also evaluated: src_sh[:exports both]{echo 4}
|
|
|
|
* mixed blocks with exports both
|
|
:PROPERTIES:
|
|
:ID: 5daa4d03-e3ea-46b7-b093-62c1b7632df3
|
|
:END:
|
|
|
|
#+name: a-list
|
|
- a
|
|
- b
|
|
- c
|
|
|
|
#+begin_src emacs-lisp :exports both
|
|
"code block results"
|
|
#+end_src
|
|
|
|
#+begin_src emacs-lisp :var lst=a-list :results list :exports both
|
|
(reverse lst)
|
|
#+end_src
|
|
|
|
* using the =:noweb-ref= header argument
|
|
:PROPERTIES:
|
|
:ID: 54d68d4b-1544-4745-85ab-4f03b3cbd8a0
|
|
:noweb-sep: ""
|
|
:END:
|
|
|
|
#+begin_src sh :tangle yes :noweb yes :shebang "#!/bin/sh"
|
|
<<fullest-disk>>
|
|
#+end_src
|
|
|
|
** query all mounted disks
|
|
#+begin_src sh :noweb-ref fullest-disk
|
|
df
|
|
#+end_src
|
|
|
|
** strip the header row
|
|
#+begin_src sh :noweb-ref fullest-disk
|
|
|sed '1d'
|
|
#+end_src
|
|
|
|
** sort by the percent full
|
|
#+begin_src sh :noweb-ref fullest-disk
|
|
|awk '{print $5 " " $6}'|sort -n |tail -1
|
|
#+end_src
|
|
|
|
** extract the mount point
|
|
#+begin_src sh :noweb-ref fullest-disk
|
|
|awk '{print $2}'
|
|
#+end_src
|
|
* resolving sub-trees as references
|
|
:PROPERTIES:
|
|
:ID: 2409e8ba-7b5f-4678-8888-e48aa02d8cb4
|
|
:results: silent
|
|
:END:
|
|
|
|
#+begin_src emacs-lisp :var text=d4faa7b3-072b-4dcf-813c-dd7141c633f3
|
|
(length text)
|
|
#+end_src
|
|
|
|
#+begin_src org :noweb yes
|
|
<<simple-subtree>>
|
|
<<d4faa7b3-072b-4dcf-813c-dd7141c633f3>>
|
|
#+end_src
|
|
|
|
** simple subtree with custom ID
|
|
:PROPERTIES:
|
|
:CUSTOM_ID: simple-subtree
|
|
:END:
|
|
this is simple
|
|
|
|
** simple subtree with global ID
|
|
:PROPERTIES:
|
|
:ID: d4faa7b3-072b-4dcf-813c-dd7141c633f3
|
|
:END:
|
|
has length 14
|
|
|
|
* org-babel-get-inline-src-block-matches
|
|
:PROPERTIES:
|
|
:results: silent
|
|
:ID: 0D0983D4-DE33-400A-8A05-A225A567BC74
|
|
:END:
|
|
src_sh{echo "One"} block at start of line
|
|
One spaced block in src_sh{ echo "middle" } of line
|
|
src_sh{echo 2} blocks on the src_emacs-lisp{"same"} line
|
|
Inline block with src_sh[:results silent]{ echo "parameters" }.
|
|
|
|
* org-babel-get-inline-src-block-matches (with empty args)
|
|
:PROPERTIES:
|
|
:results: silent
|
|
:ID: d55dada7-de0e-4340-8061-787cccbedee5
|
|
:END:
|
|
src_sh[]{echo "One"} block at start of line
|
|
One spaced block in src_sh[]{ echo "middle" } of line
|
|
src_sh[]{echo 2} blocks on the src_emacs-lisp[]{"same"} line
|
|
Inline block with src_sh[:results silent]{ echo "parameters" }.
|
|
|
|
* exporting a code block with a name
|
|
:PROPERTIES:
|
|
:ID: b02ddd8a-eeb8-42ab-8664-8a759e6f43d9
|
|
:END:
|
|
|
|
exporting a code block with a name
|
|
#+name: qux
|
|
#+begin_src sh :foo "baz"
|
|
echo bar
|
|
#+end_src
|
|
* noweb no-export and exports both
|
|
:PROPERTIES:
|
|
:ID: 8a820f6c-7980-43db-8a24-0710d33729c9
|
|
:END:
|
|
Weird interaction.
|
|
|
|
here is one block
|
|
|
|
#+name: noweb-no-export-and-exports-both-1
|
|
#+BEGIN_SRC sh :exports none
|
|
echo 1
|
|
#+END_SRC
|
|
|
|
and another
|
|
|
|
#+BEGIN_SRC sh :noweb no-export :exports both
|
|
# I am inside the code block
|
|
<<noweb-no-export-and-exports-both-1>>
|
|
#+END_SRC
|
|
|
|
* in order evaluation on export
|
|
:PROPERTIES:
|
|
:exports: results
|
|
:ID: 96cc7073-97ec-4556-87cf-1f9bffafd317
|
|
:END:
|
|
|
|
First.
|
|
#+name: foo-for-order-of-evaluation
|
|
#+begin_src emacs-lisp :var it=1
|
|
(push it *evaluation-collector*)
|
|
#+end_src
|
|
|
|
Second
|
|
#+begin_src emacs-lisp
|
|
(push 2 *evaluation-collector*)
|
|
#+end_src
|
|
|
|
Third src_emacs-lisp{(push 3 *evaluation-collector*)}
|
|
|
|
Fourth
|
|
#+call: foo-for-order-of-evaluation(4)
|
|
|
|
Fifth
|
|
#+begin_src emacs-lisp
|
|
(push 5 *evaluation-collector*)
|
|
#+end_src
|
|
* exporting more than just results from a call line
|
|
:PROPERTIES:
|
|
:ID: bec63a04-491e-4caa-97f5-108f3020365c
|
|
:END:
|
|
Here is a call line with more than just the results exported.
|
|
#+call: double(8)
|
|
* strip noweb references on export
|
|
:PROPERTIES:
|
|
:ID: 8e7bd234-99b2-4b14-8cd6-53945e409775
|
|
:END:
|
|
|
|
#+name: strip-export-1
|
|
#+BEGIN_SRC sh :exports none
|
|
i="10"
|
|
#+END_SRC
|
|
|
|
#+BEGIN_SRC sh :noweb strip-export :exports code :results silent
|
|
<<strip-export-1>>
|
|
echo "1$i"
|
|
#+END_SRC
|
|
|
|
* use case of reading entry properties
|
|
:PROPERTIES:
|
|
:ID: cc5fbc20-bca5-437a-a7b8-2b4d7a03f820
|
|
:END:
|
|
|
|
Use case checked and documented with this test: During their
|
|
evaluation the source blocks read values from properties from the
|
|
entry where the call has been made unless the value is overridden with
|
|
the optional argument of the caller.
|
|
|
|
** section
|
|
:PROPERTIES:
|
|
:a: 1
|
|
:c: 3
|
|
:END:
|
|
|
|
Note: Just export of a property can be done with a macro: {{{property(a)}}}.
|
|
|
|
#+NAME: src_block_location_shell sect call
|
|
#+CALL: src_block_location_shell()
|
|
|
|
#+NAME: src_block_location_elisp sect call
|
|
#+CALL: src_block_location_elisp()
|
|
|
|
- sect inline call_src_block_location_shell()
|
|
- sect inline call_src_block_location_elisp()
|
|
|
|
*** subsection
|
|
:PROPERTIES:
|
|
:b: 2
|
|
:c: 4
|
|
:END:
|
|
|
|
#+NAME: src_block_location_shell sub0 call
|
|
#+CALL: src_block_location_shell()
|
|
|
|
#+NAME: src_block_location_elisp sub0 call
|
|
#+CALL: src_block_location_elisp()
|
|
|
|
- sub0 inline call_src_block_location_shell()
|
|
- sub0 inline call_src_block_location_elisp()
|
|
|
|
#+NAME: src_block_location_shell sub1 call
|
|
#+CALL: src_block_location_shell(c=5, e=6)
|
|
|
|
#+NAME: src_block_location_elisp sub1 call
|
|
#+CALL: src_block_location_elisp(c=5, e=6)
|
|
|
|
- sub1 inline call_src_block_location_shell(c=5, e=6)
|
|
- sub1 inline call_src_block_location_elisp(c=5, e=6)
|
|
|
|
**** function definition
|
|
|
|
comments for ":var":
|
|
- The "or" is to deal with a property not present.
|
|
- The t is to get property inheritance.
|
|
#+NAME: src_block_location_shell
|
|
#+HEADER: :var a=(or (org-entry-get org-babel-current-src-block-location "a" t) "0")
|
|
#+HEADER: :var b=(or (org-entry-get org-babel-current-src-block-location "b" t) "0")
|
|
#+HEADER: :var c=(or (org-entry-get org-babel-current-src-block-location "c" t) "0")
|
|
#+HEADER: :var d=(or (org-entry-get org-babel-current-src-block-location "d" t) "0")
|
|
#+HEADER: :var e=(or (org-entry-get org-babel-current-src-block-location "e" t) "0")
|
|
#+BEGIN_SRC sh :shebang #!/bin/sh :exports results :results verbatim
|
|
printf "shell a:$a, b:$b, c:$c, d:$d, e:$e"
|
|
#+END_SRC
|
|
|
|
#+RESULTS: src_block_location_shell
|
|
|
|
#+NAME: src_block_location_elisp
|
|
#+HEADER: :var a='nil
|
|
#+HEADER: :var b='nil
|
|
#+HEADER: :var c='nil
|
|
#+HEADER: :var d='nil
|
|
#+HEADER: :var e='nil
|
|
#+BEGIN_SRC emacs-lisp :exports results
|
|
(setq
|
|
;; - The first `or' together with ":var <var>='nil" is to check for
|
|
;; a value bound from an optional call argument, in the examples
|
|
;; here: c=5, e=6
|
|
;; - The second `or' is to deal with a property not present
|
|
;; - The t is to get property inheritance
|
|
a (or a (string-to-number
|
|
(or (org-entry-get org-babel-current-src-block-location "a" t)
|
|
"0")))
|
|
b (or b (string-to-number
|
|
(or (org-entry-get org-babel-current-src-block-location "b" t)
|
|
"0")))
|
|
c (or c (string-to-number
|
|
(or (org-entry-get org-babel-current-src-block-location "c" t)
|
|
"0")))
|
|
d (or d (string-to-number
|
|
(or (org-entry-get org-babel-current-src-block-location "e" t)
|
|
"0")))
|
|
e (or e (string-to-number
|
|
(or (org-entry-get org-babel-current-src-block-location "d" t)
|
|
"0"))))
|
|
(format "elisp a:%d, b:%d, c:%d, d:%d, e:%d" a b c d e)
|
|
#+END_SRC
|
|
|
|
* =:file-ext= and =:output-dir= header args
|
|
:PROPERTIES:
|
|
:ID: 93573e1d-6486-442e-b6d0-3fedbdc37c9b
|
|
:END:
|
|
#+name: file-ext-basic
|
|
#+BEGIN_SRC emacs-lisp :file-ext txt
|
|
nil
|
|
#+END_SRC
|
|
|
|
#+name: file-ext-dir-relative
|
|
#+BEGIN_SRC emacs-lisp :file-ext txt :output-dir foo
|
|
nil
|
|
#+END_SRC
|
|
|
|
#+name: file-ext-dir-relative-slash
|
|
#+BEGIN_SRC emacs-lisp :file-ext txt :output-dir foo/
|
|
nil
|
|
#+END_SRC
|
|
|
|
#+name: file-ext-dir-absolute
|
|
#+BEGIN_SRC emacs-lisp :file-ext txt :output-dir /tmp
|
|
nil
|
|
#+END_SRC
|
|
|
|
#+name: file-ext-file-wins
|
|
#+BEGIN_SRC emacs-lisp :file-ext txt :file foo.bar
|
|
nil
|
|
#+END_SRC
|
|
|
|
#+name: output-dir-and-file
|
|
#+BEGIN_SRC emacs-lisp :output-dir xxx :file foo.bar
|
|
nil
|
|
#+END_SRC
|