From mboxrd@z Thu Jan 1 00:00:00 1970 From: stardiviner Subject: [PATCH] add "link" :results type for Babel Date: Tue, 10 Apr 2018 18:07:47 +0800 Message-ID: <87vacztlvw.fsf@gmail.com> Reply-To: numbchild@gmail.com Mime-Version: 1.0 Content-Type: multipart/signed; boundary="==-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:32956) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f5qC7-0004dh-HF for emacs-orgmode@gnu.org; Tue, 10 Apr 2018 06:08:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1f5qC1-00041V-2y for emacs-orgmode@gnu.org; Tue, 10 Apr 2018 06:08:07 -0400 Received: from [183.249.132.203] (port=10862 helo=dark.localdomain) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1f5qC0-0003tx-72 for emacs-orgmode@gnu.org; Tue, 10 Apr 2018 06:08:00 -0400 List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: org-mode --==-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: text/plain This patch try to support following way: #+begin_src sh :results link :file "/tmp/test.txt" echo "hello" > /tmp/test.txt echo "test" #+end_src #+RESULTS: [[file:/tmp/test.txt]] Because: - ~org-babel-execute-src-block~ - ~(org-babel-get-src-block-info)~ - (let* ((info .. (apply #'org-babel-merge-params ...)))) - ~org-babel-merge-params~ - [ ] *because* code ~(`(,(or :file :file-ext) . ,value) ...)~ lines logic in function ~org-babel-get-src-block-info~, it merge "file" ~:results~, so override params plist :results value ~link~. - [ ] So I put ~link~ and ~graphics~ "~:results~" type into a separate group in constant ~org-babel-common-header-args-w-values~. If anybody has better way, please improve my code. --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: attachment; filename=0001-ob-core.el-add-results-link-type-result-for-babel.patch Content-Transfer-Encoding: quoted-printable From=20dc3e482b1cad581b74a4303ca79375db6a6ba885 Mon Sep 17 00:00:00 2001 From: stardiviner Date: Sun, 8 Apr 2018 20:56:28 +0800 Subject: [PATCH 1/2] ob-core.el: add :results link type result for babel. * lisp/ob-core.el (org-babel-execute-src-block): handle :results link type. Like :results graphics, don't write result to :file specified file. * etc/ORG-NEWS: declare new :results type "link". * doc/org-manual.org: add document for new type result "link". * testing/lisp/test-ob.el (test-ob/result-file-link-type-header-argument): Add test for new added :results type "link". =2D-- doc/org-manual.org | 12 ++++++++++++ etc/ORG-NEWS | 9 +++++++++ lisp/ob-core.el | 16 ++++++++++------ testing/lisp/test-ob.el | 16 ++++++++++++++++ 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index d787e5da4..3c759d601 100644 =2D-- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -17177,6 +17177,18 @@ default behavior is to automatically determine the= result type. uses the generated file name for both the "link" and "description" parts of the link. =20 +- =3Dlink=3D :: + + #+cindex: @samp{link}, header argument + When this result type used with header argument =3D:file=3D. Generate= a + link to =3D:file=3D specified file. Instead of writing src block + evaluate non-empty result to =3D:file=3D specified file. Like followi= ng + example: + + #+begin_src shell :results link :file "download.tar.gz" + wget -c "http://example.com/download.tar.gz" + #+end_src + *** Format :PROPERTIES: :UNNUMBERED: notoc diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 0edd77115..3833b57b2 100644 =2D-- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -113,6 +113,15 @@ now sort according to the locale=E2=80=99s collation r= ules instead of by code-point. =20 ** New features +*** Add ~:results link~ support for org-babel +This will support only insert file link without writing result to file. +Like this case: +#+begin_src shell :dir "data/tmp" :results link :file "crackzor_1.0.c.gz" +wget -c "http://ben.akrin.com/crackzor/crackzor_1.0.c.gz" +#+end_src + +#+RESULTS: +[[file:data/tmp/crackzor_1.0.c.gz]] *** Add ~:session~ support of ob-js for js-comint #+begin_src js :session "*Javascript REPL*" console.log("stardiviner") diff --git a/lisp/ob-core.el b/lisp/ob-core.el index 129e17f62..e21cbf963 100644 =2D-- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -413,7 +413,11 @@ then run `org-babel-switch-to-session'." (padline . ((yes no))) (post . :any) (prologue . :any) =2D (results . ((file list vector table scalar verbatim) + (results . ( + ;; separate group to avoid been override by "file" + ;; :results in `org-babel-merge-params'. + (link) + (file list vector table scalar verbatim) (raw html latex org code pp drawer) (replace silent none append prepend) (output value))) @@ -706,11 +710,11 @@ block." (let ((file (cdr (assq :file params)))) ;; If non-empty result and :file then write to :file. (when file =2D (let ((graphics? =2D (member "graphics" (cdr (assq :result-params params))))) =2D ;; Handle :results graphics :file case. Don't =2D ;; write result to file if result is graphics. =2D (when (and result (not graphics?)) + (let ((graphics? (member "graphics" (cdr (assq :result-params params))= )) + (file-link? (member "link" (cdr (assq :result-params params))))) + ;; If :results are special types like `link', `graphics' etc. + ;; don't write result to `:file'. Literately only insert link to :fi= le. + (when (and result (not graphics?) (not file-link?)) (with-temp-file file (insert (org-babel-format-result result (cdr (assq :sep params))))))) diff --git a/testing/lisp/test-ob.el b/testing/lisp/test-ob.el index a4a590d6a..e541ad726 100644 =2D-- a/testing/lisp/test-ob.el +++ b/testing/lisp/test-ob.el @@ -996,6 +996,22 @@ trying to find the :END: marker." (should (search-forward "[[file:foo][bar]]" nil t)) (should (search-forward "[[file:foo][foo]]" nil t)))) =20 +(ert-deftest test-ob/result-file-link-type-header-argument () + "Ensure that the result is a link to a file. +The file is just a link to :file value. Inhibit non-empty result write to = :file." + (org-test-with-temp-text "#+begin_src shell :results value link :file \"= /tmp/test.txt\" +echo \"hello\" > /tmp/test.txt +echo \"test\" +#+end_src" + (org-babel-execute-src-block) + (goto-char (point-min)) + (should (search-forward "[[file:/tmp/test.txt]]" nil nil)) + (should (with-temp-buffer + (insert-file-contents "/tmp/test.txt") + (string=3D + "hello\n" + (buffer-substring-no-properties (point-min) (point-max))))))) + (ert-deftest test-ob/inline-src_blk-preceded-punct-preceded-by-point () (let ((test-line ".src_emacs-lisp[ :results verbatim ]{ \"x\" }") (org-babel-inline-result-wrap "=3D%s=3D")) =2D-=20 2.17.0 --=-=-= Content-Type: text/plain The second patch is to add testing and document for merged graphics implementation. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0002-ob-core.el-support-graphics-results-type.patch Content-Transfer-Encoding: quoted-printable From=20e626b929e0c89b9a09f83eb20bffbe5a56a5256f Mon Sep 17 00:00:00 2001 From: stardiviner Date: Tue, 10 Apr 2018 17:44:41 +0800 Subject: [PATCH 2/2] ob-core.el: support graphics :results type. * lisp/ob-core.el (org-babel-common-header-args-w-values): Add "graphics" :results type. * testing/lisp/test-ob.el (test-ob/result-graphics-link-type-header-argumen= t) Add test for "graphics" :results type. * doc/org-manual.org: add manual for "graphics" :results type. =2D-- doc/org-manual.org | 16 ++++++++++++++++ lisp/ob-core.el | 2 +- testing/lisp/test-ob.el | 16 ++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index 3c759d601..4b851e534 100644 =2D-- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -17189,6 +17189,22 @@ default behavior is to automatically determine the= result type. wget -c "http://example.com/download.tar.gz" #+end_src =20 +- =3Dgraphics=3D ::=20 + + #+cindex: @samp{graphics}, header argument + When this result type used with header argument =3D:file=3D, generate= a + link to =3D:file=3D specified file. Instead of writing src block + evaluate non-empty result to =3D:file=3D specified file. This will be + useful for generating Org inline image for src blocks. Like + following example: + + #+begin_src R :results graphics :file "graphics-result.png" + plot(seq(1,10)) + #+end_src + + #+RESULTS: + [[file:graphics-result.png]] + *** Format :PROPERTIES: :UNNUMBERED: notoc diff --git a/lisp/ob-core.el b/lisp/ob-core.el index e21cbf963..9c72bbccb 100644 =2D-- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -416,7 +416,7 @@ then run `org-babel-switch-to-session'." (results . ( ;; separate group to avoid been override by "file" ;; :results in `org-babel-merge-params'. =2D (link) + (link graphics) (file list vector table scalar verbatim) (raw html latex org code pp drawer) (replace silent none append prepend) diff --git a/testing/lisp/test-ob.el b/testing/lisp/test-ob.el index e541ad726..3b7958552 100644 =2D-- a/testing/lisp/test-ob.el +++ b/testing/lisp/test-ob.el @@ -1012,6 +1012,22 @@ echo \"test\" "hello\n" (buffer-substring-no-properties (point-min) (point-max))))))) =20 +(ert-deftest test-ob/result-graphics-link-type-header-argument () + "Ensure that the result is a link to an image. +The file is just a link to :file value. Inhibit non-empty result write to = :file." +(org-test-with-temp-text "#+begin_src shell :results value graphics :file = \"/tmp/test.txt\" +echo \"hello\" > /tmp/test.txt +echo \"test\" +#+end_src" + (org-babel-execute-src-block) + (goto-char (point-min)) + (should (search-forward "[[file:/tmp/test.txt]]" nil nil)) + (should (with-temp-buffer + (insert-file-contents "/tmp/test.txt") + (string=3D + "hello\n" + (buffer-substring-no-properties (point-min) (point-max))))))) + (ert-deftest test-ob/inline-src_blk-preceded-punct-preceded-by-point () (let ((test-line ".src_emacs-lisp[ :results verbatim ]{ \"x\" }") (org-babel-inline-result-wrap "=3D%s=3D")) =2D-=20 2.17.0 --=-=-= Content-Type: text/plain -- [ stardiviner ] don't need to convince with trends. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 --=-=-=-- --==-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE8J9lDX1nSBmJJZFAG13xyVromsMFAlrMjPQACgkQG13xyVro msNA8ggAkzw0MTWqfcAWh2QDbZK8cgJEIVIU5/7BObTYmALsgv3sPlNCoYWPKeU9 nS2m7kSPsKsb35x4l3uDz469lQCNP0FdOgIFcYyAPlXFplBad+ztAydDG3oLZaKT 2yfNRxONY6YU/ClWTMUfSFawIl7+2/iFiI4nNfdiAz8V+6ddJh/17jd9pF8I5jm4 THlF1Tl0ASw/Kbjn9IV+uki6bhWqRqftdpQQxxRrqifKdVywPR8ZUS+P011OfaOo yqSDWr3AjwZ7ntOOUkz858SNq+G5kqxN3BNHEDN8QwFMj6IQdjnhKLwFGTf1wfPN ysZlMeeatxxltM4iglJjZHmkONaFZQ== =sAg8 -----END PGP SIGNATURE----- --==-=-=--