org-babel: Add new "strip-tangle" :noweb argument value

* lisp/ob-tangle.el (org-babel-tangle-single-block): Strip noweb tags
from block if :noweb has been set to "strip-tangle".
* lisp/ob-core.el (org-babel-common-header-args-w-values): Add
"strip-tangle" as new allowed value.
* lisp/ob-core.el (org-babel-noweb-p): Add "strip-tangle" at the
appropriate positions.
* testing/lisp/test-ob-tangle.el (ob-tangle/strip-tangle): Add new test
case for "strip-tangle".
* doc/org-manual.org (Noweb Reference Syntax): Adjust documentation for
the noweb header argument.
* etc/ORG-NEWS: Add entry for new header argument value.

This patch adds the "strip-tangle" option for the :noweb header
argument.  This strips the noweb tags before tangling the block.  This can
be useful for e.g. testing purposes where one wants to use a block as
test case that can be both run inline as well as tangled into a file for
automated testing.

TINYCHANGE
This commit is contained in:
Daniel Ziltener 2022-11-06 21:08:06 +01:00 committed by Ihor Radchenko
parent 26a2811b06
commit 5e0c5c186d
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
5 changed files with 44 additions and 5 deletions

View File

@ -18998,6 +18998,12 @@ tangled, or exported.
Expansion of noweb syntax references in the body of the code block
when tangling. No expansion when evaluating or exporting.
- =strip-tangle= ::
Expansion of noweb syntax references in the body of the code block
when evaluating or exporting. Removes noweb syntax references
when exporting.
- =no-export= ::
Expansion of noweb syntax references in the body of the code block

View File

@ -228,6 +228,11 @@ commands.
=:noweb-prefix= can be set to =no= to prevent the prefix characters
from being repeated when expanding a multiline noweb reference.
*** New =:noweb= babel header argument value =strip-tangle=
=:noweb= can be set to =strip-tangle= to strip the noweb syntax references
before tangling.
*** New LaTeX source block backend using =engraved-faces-latex=
When ~org-latex-src-block-backend~ is set to ~engraved~,

View File

@ -415,7 +415,7 @@ then run `org-babel-switch-to-session'."
(mkdirp . ((yes no)))
(no-expand)
(noeval)
(noweb . ((yes no tangle no-export strip-export)))
(noweb . ((yes no tangle strip-tangle no-export strip-export)))
(noweb-ref . :any)
(noweb-sep . :any)
(noweb-prefix . ((no yes)))
@ -2885,9 +2885,9 @@ parameters when merging lists."
"Check if PARAMS require expansion in CONTEXT.
CONTEXT may be one of :tangle, :export or :eval."
(let ((allowed-values (cl-case context
(:tangle '("yes" "tangle" "no-export" "strip-export"))
(:eval '("yes" "no-export" "strip-export" "eval"))
(:export '("yes")))))
(:tangle '("yes" "tangle" "no-export" "strip-export" "strip-tangle"))
(:eval '("yes" "no-export" "strip-export" "eval" "strip-tangle"))
(:export '("yes" "strip-tangle")))))
(cl-some (lambda (v) (member v allowed-values))
(split-string (or (cdr (assq :noweb params)) "")))))

View File

@ -536,7 +536,9 @@ non-nil, return the full association list to be used by
(body
;; Run the tangle-body-hook.
(let ((body (if (org-babel-noweb-p params :tangle)
(org-babel-expand-noweb-references info)
(if (string= "strip-tangle" (cdr (assq :noweb (nth 2 info))))
(replace-regexp-in-string (org-babel-noweb-wrap) "" (nth 1 info))
(org-babel-expand-noweb-references info))
(nth 1 info))))
(with-temp-buffer
(insert

View File

@ -510,6 +510,32 @@ another block
(org-split-string (buffer-string))))
(delete-file file))))))
(ert-deftest ob-tangle/strip-tangle ()
"Test if strip-tangle works correctly when tangling noweb code blocks."
(should
(equal '("1")
(let ((file (make-temp-file "org-tangle-")))
(unwind-protect
(progn
(org-test-with-temp-text-in-file
(format "
#+name: block1
#+begin_src elisp
2
#+end_src
#+begin_src elisp :noweb strip-tangle :tangle %s
1<<block1>>
#+end_src
" file)
(let ((org-babel-noweb-error-all-langs nil)
(org-babel-noweb-error-langs nil))
(org-babel-tangle)))
(with-temp-buffer
(insert-file-contents file)
(org-split-string (buffer-string))))
(delete-file file))))))
(ert-deftest ob-tangle/detangle-false-positive ()
"Test handling of false positive link during detangle."
(let (buffer)