emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Add preamble support to ob-plantuml.el
@ 2016-12-02  5:09 Thibault Marin
  2016-12-05 21:28 ` Nicolas Goaziou
  0 siblings, 1 reply; 11+ messages in thread
From: Thibault Marin @ 2016-12-02  5:09 UTC (permalink / raw)
  To: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 357 bytes --]


Hi list,

I am attaching a patch adding support for preamble commands to
ob-plantuml.el.  The string content of the `org-plantuml-preamble'
variable is added at the beginning of each source block before execution
(after the "@startuml" string).

Does this look like this could be merged?  Please let me know if the
patch needs changes.

Thanks,

thibault


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ob-plantuml.el-Add-preamble-to-PlantUML-source-block.patch --]
[-- Type: text/x-diff, Size: 1543 bytes --]

From 157181893c212fea29986c8b072d4f087e4ace24 Mon Sep 17 00:00:00 2001
From: thibault <thibault.marin@gmx.com>
Date: Thu, 1 Dec 2016 22:50:32 -0600
Subject: [PATCH] ob-plantuml.el: Add preamble to PlantUML source block

* lisp/ob-plantuml.el (org-babel-execute:plantuml) Include preamble
  given by the new `org-plantuml-preamble' customization variable.

TINYCHANGE
---
 lisp/ob-plantuml.el | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/lisp/ob-plantuml.el b/lisp/ob-plantuml.el
index 9ce65a9..6463585 100644
--- a/lisp/ob-plantuml.el
+++ b/lisp/ob-plantuml.el
@@ -46,6 +46,12 @@
   :version "24.1"
   :type 'string)
 
+(defcustom org-plantuml-preamble ""
+  "Preamble added at the top of every plantuml source block."
+  :group 'org-babel
+  :version "24.1"
+  :type 'string)
+
 (defun org-babel-execute:plantuml (body params)
   "Execute a block of plantuml code with org-babel.
 This function is called by `org-babel-execute-src-block'."
@@ -85,7 +91,8 @@ This function is called by `org-babel-execute-src-block'."
 			(org-babel-process-file-name out-file)))))
     (unless (file-exists-p org-plantuml-jar-path)
       (error "Could not find plantuml.jar at %s" org-plantuml-jar-path))
-    (with-temp-file in-file (insert (concat "@startuml\n" body "\n@enduml")))
+    (with-temp-file in-file (insert (concat "@startuml\n" org-plantuml-preamble
+					    "\n" body "\n@enduml")))
     (message "%s" cmd) (org-babel-eval cmd "")
     nil)) ;; signal that output has already been written to file
 
-- 
2.9.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: Add preamble support to ob-plantuml.el
  2016-12-02  5:09 Add preamble support to ob-plantuml.el Thibault Marin
@ 2016-12-05 21:28 ` Nicolas Goaziou
  2016-12-06  3:52   ` Thibault Marin
  0 siblings, 1 reply; 11+ messages in thread
From: Nicolas Goaziou @ 2016-12-05 21:28 UTC (permalink / raw)
  To: Thibault Marin; +Cc: emacs-orgmode

Hello,

Thibault Marin <thibault.marin@gmx.com> writes:

> I am attaching a patch adding support for preamble commands to
> ob-plantuml.el.  The string content of the `org-plantuml-preamble'
> variable is added at the beginning of each source block before execution
> (after the "@startuml" string).

Thank you. Some comments follow.

> TINYCHANGE

You don't need to use the TINYCHANGE string since you signed FSF papers
already.

> ---
>  lisp/ob-plantuml.el | 9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/lisp/ob-plantuml.el b/lisp/ob-plantuml.el
> index 9ce65a9..6463585 100644
> --- a/lisp/ob-plantuml.el
> +++ b/lisp/ob-plantuml.el
> @@ -46,6 +46,12 @@
>    :version "24.1"
>    :type 'string)
>  
> +(defcustom org-plantuml-preamble ""
> +  "Preamble added at the top of every plantuml source block."
> +  :group 'org-babel
> +  :version "24.1"
> +  :type 'string)

The :version keyword is inaccurate. It should be :version "25.2". It is
also missing :package-version and :safe #'stringp.

OOC, what is your use case?

Regards,

-- 
Nicolas Goaziou

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Add preamble support to ob-plantuml.el
  2016-12-05 21:28 ` Nicolas Goaziou
@ 2016-12-06  3:52   ` Thibault Marin
  2016-12-06 11:42     ` Nicolas Goaziou
  0 siblings, 1 reply; 11+ messages in thread
From: Thibault Marin @ 2016-12-06  3:52 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 482 bytes --]


Hi, thanks for the feedback.

> You don't need to use the TINYCHANGE string since you signed FSF papers
> already.
Fixed.

> The :version keyword is inaccurate. It should be :version "25.2". It is
> also missing :package-version and :safe #'stringp.
Fixed (I hope).

> OOC, what is your use case?
I use it to define common skin options (http://plantuml.com/skinparam)
for all the plantuml blocks in an org file.  I don't know if there is a
better way to that.

Thanks,

thibault



[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ob-plantuml.el-Add-preamble-to-PlantUML-source-block.patch --]
[-- Type: text/x-diff, Size: 1589 bytes --]

From 55edfde3636a9e558fe6ca1099477611a2f3ed0f Mon Sep 17 00:00:00 2001
From: thibault <thibault.marin@gmx.com>
Date: Mon, 5 Dec 2016 15:46:46 -0600
Subject: [PATCH] ob-plantuml.el: Add preamble to PlantUML source block

* lisp/ob-plantuml.el (org-babel-execute:plantuml) Include preamble
  given by the new `org-plantuml-preamble' customization variable.
---
 lisp/ob-plantuml.el | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/lisp/ob-plantuml.el b/lisp/ob-plantuml.el
index 9ce65a9..d73a04b 100644
--- a/lisp/ob-plantuml.el
+++ b/lisp/ob-plantuml.el
@@ -46,6 +46,14 @@
   :version "24.1"
   :type 'string)
 
+(defcustom org-plantuml-preamble ""
+  "Preamble added at the top of every plantuml source block."
+  :group 'org-babel
+  :version "25.2"
+  :package-version '(Org . "9.1")
+  :safe #'stringp
+  :type 'string)
+
 (defun org-babel-execute:plantuml (body params)
   "Execute a block of plantuml code with org-babel.
 This function is called by `org-babel-execute-src-block'."
@@ -85,7 +93,8 @@ This function is called by `org-babel-execute-src-block'."
 			(org-babel-process-file-name out-file)))))
     (unless (file-exists-p org-plantuml-jar-path)
       (error "Could not find plantuml.jar at %s" org-plantuml-jar-path))
-    (with-temp-file in-file (insert (concat "@startuml\n" body "\n@enduml")))
+    (with-temp-file in-file (insert (concat "@startuml\n" org-plantuml-preamble
+					    "\n" body "\n@enduml")))
     (message "%s" cmd) (org-babel-eval cmd "")
     nil)) ;; signal that output has already been written to file
 
-- 
2.9.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: Add preamble support to ob-plantuml.el
  2016-12-06  3:52   ` Thibault Marin
@ 2016-12-06 11:42     ` Nicolas Goaziou
  2016-12-06 12:14       ` Rainer M Krug
  0 siblings, 1 reply; 11+ messages in thread
From: Nicolas Goaziou @ 2016-12-06 11:42 UTC (permalink / raw)
  To: Thibault Marin; +Cc: emacs-orgmode

Thibault Marin <thibault.marin@gmx.com> writes:

> I use it to define common skin options (http://plantuml.com/skinparam)
> for all the plantuml blocks in an org file.  I don't know if there is a
> better way to that.

What about using noweb syntax then?

Regards,

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Add preamble support to ob-plantuml.el
  2016-12-06 11:42     ` Nicolas Goaziou
@ 2016-12-06 12:14       ` Rainer M Krug
  2016-12-07  1:39         ` Thibault Marin
  0 siblings, 1 reply; 11+ messages in thread
From: Rainer M Krug @ 2016-12-06 12:14 UTC (permalink / raw)
  To: Thibault Marin; +Cc: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 1103 bytes --]

Nicolas Goaziou <mail@nicolasgoaziou.fr> writes:

> Thibault Marin <thibault.marin@gmx.com> writes:
>
>> I use it to define common skin options (http://plantuml.com/skinparam)
>> for all the plantuml blocks in an org file.  I don't know if there is a
>> better way to that.
>
> What about using noweb syntax then?

Or prologue?

,----
| 14.8.2.28 ‘:prologue’
| .....................
| 
| The value of the ‘prologue’ header argument will be prepended to the
| code block body before execution.  For example, ‘:prologue "reset"’ may
| be used to reset a gnuplot session before execution of a particular code
| block, or the following configuration may be used to do this for all
| gnuplot code blocks.  Also see *note epilogue::.
`----

But apart from this: I think it would be in general a good idea to add
version infos of emacs and org to source code blocks - possibly even of
the executable? This would be one more step towards easy
reproducability.

Cheers,

Rainer

>
> Regards,
>

-- 
Rainer M. Krug
email: Rainer<at>krugs<dot>de
PGP: 0x0F52F982

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 454 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Add preamble support to ob-plantuml.el
  2016-12-06 12:14       ` Rainer M Krug
@ 2016-12-07  1:39         ` Thibault Marin
  2016-12-09 20:55           ` Nicolas Goaziou
  0 siblings, 1 reply; 11+ messages in thread
From: Thibault Marin @ 2016-12-07  1:39 UTC (permalink / raw)
  To: Rainer M Krug, Nicolas Goaziou; +Cc: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 1737 bytes --]


Thanks for the feedback.


>> What about using noweb syntax then?
>
> Or prologue?

I didn't know about the prologue header.  This is exactly what I need
(it seems to be more convenient than the noweb approach).

However, ob-plantuml does not seem to support the prologue option.  So I
am modifying my patch to add support for the :prologue and :epilogue
header arguments instead of using a new customization variable.  In the
process, I have added support for header variables which are passed to
the PlantUML file via the !define macro.  I am also adding a test file
which checks that the temporary file passed to the plantuml program is
properly generated (it does not run or check the output of plantuml).

Please let me know you have any comment on the patch.  Thanks in
advance.

I have a slightly tangential question about handling of list variables.

Considering the following org content:

#+BEGIN_SRC org
,#+name: variable_values
| CLASSNAME | test_class |
| PROPERTY  | test_prop  |

,#+header: :file tmp.puml
,#+header: :var x=variable_values
,#+begin_src plantuml
class CLASSNAME {
+PROPERTY
}
,#+end_src"
#+END_SRC

would it make sense to resolve to the following output:

#+BEGIN_SRC plantuml
@startuml
!define CLASSNAME test_class
!define PROPERTY test_prop
class CLASSNAME {
+PROPERTY
}
@enduml
#+END_SRC
?

On the first hand, this doesn't make much sense because the =x= variable is
never actually defined in the source block, but for languages that don't handle
array variables, that would allow the user to define multiple variables at once
(I first thought about this when looking at ob-css, where I wanted to (1) use
header variables and (2) group them in a single org-table).  What do you think?

Best,
thibault


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ob-plantuml.el-Add-support-for-prologue-and-header-v.patch --]
[-- Type: text/x-diff, Size: 5437 bytes --]

From 40e27d7e36806694c47fe4331b24db48c19f31f4 Mon Sep 17 00:00:00 2001
From: thibault <thibault.marin@gmx.com>
Date: Tue, 6 Dec 2016 17:29:55 -0600
Subject: [PATCH] ob-plantuml.el: Add support for prologue and header variables

* lisp/ob-plantuml.el (org-babel-execute:plantuml) Include prologue and
  header variables to temporary file body.
(org-babel-plantuml-make-body): New function.  Form content of temporary
file used as input to PlantUML program.
(org-babel-plantuml-var-to-plantuml): New function.  Convert header
variable to PlantUML variable.  This reduces to removing quotes from
string.
(org-babel-variable-assignments:plantuml): New function.  Build list of
variable assignments for source block.

* testing/lisp/test-ob-plantuml.el: New file.  Test body text produced
  by `org-babel-plantuml-make-body'.
---
 lisp/ob-plantuml.el              | 24 ++++++++++++-
 testing/lisp/test-ob-plantuml.el | 73 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 96 insertions(+), 1 deletion(-)
 create mode 100644 testing/lisp/test-ob-plantuml.el

diff --git a/lisp/ob-plantuml.el b/lisp/ob-plantuml.el
index 9ce65a9..5b7ae20 100644
--- a/lisp/ob-plantuml.el
+++ b/lisp/ob-plantuml.el
@@ -46,6 +46,27 @@
   :version "24.1"
   :type 'string)
 
+(defun org-babel-plantuml-var-to-plantuml (var)
+  "Cleanup plantuml variable (remove quotes)."
+     (replace-regexp-in-string "\"" "" var))
+
+(defun org-babel-variable-assignments:plantuml (params)
+  "Return a list of PlantUML statements assigning the block's variables."
+  (mapcar
+   (lambda (pair)
+       (format "!define %s %s"
+	       (car pair)
+	       (org-babel-plantuml-var-to-plantuml (cdr pair))))
+   (org-babel--get-vars params)))
+
+(defun org-babel-plantuml-make-body (body params)
+  "Form PlantUML input string."
+  (concat
+   "@startuml\n"
+   (org-babel-expand-body:generic
+    body params (org-babel-variable-assignments:plantuml params))
+   "\n@enduml"))
+
 (defun org-babel-execute:plantuml (body params)
   "Execute a block of plantuml code with org-babel.
 This function is called by `org-babel-execute-src-block'."
@@ -54,6 +75,7 @@ This function is called by `org-babel-execute-src-block'."
 	 (cmdline (cdr (assq :cmdline params)))
 	 (in-file (org-babel-temp-file "plantuml-"))
 	 (java (or (cdr (assq :java params)) ""))
+	 (full-body (org-babel-plantuml-make-body body params))
 	 (cmd (if (string= "" org-plantuml-jar-path)
 		  (error "`org-plantuml-jar-path' is not set")
 		(concat "java " java " -jar "
@@ -85,7 +107,7 @@ This function is called by `org-babel-execute-src-block'."
 			(org-babel-process-file-name out-file)))))
     (unless (file-exists-p org-plantuml-jar-path)
       (error "Could not find plantuml.jar at %s" org-plantuml-jar-path))
-    (with-temp-file in-file (insert (concat "@startuml\n" body "\n@enduml")))
+    (with-temp-file in-file (insert full-body))
     (message "%s" cmd) (org-babel-eval cmd "")
     nil)) ;; signal that output has already been written to file
 
diff --git a/testing/lisp/test-ob-plantuml.el b/testing/lisp/test-ob-plantuml.el
new file mode 100644
index 0000000..794d313
--- /dev/null
+++ b/testing/lisp/test-ob-plantuml.el
@@ -0,0 +1,73 @@
+;;; test-ob-plantuml.el --- tests for ob-plantuml.el
+
+;; Copyright (c) 2016 Thibault Marin
+;; Authors: Thibault Marin
+
+;; This file is not part of GNU Emacs.
+
+;; 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 of the License, 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Code:
+(unless (featurep 'ob-plantuml)
+  (signal 'missing-test-dependency "Support for PlantUML code blocks"))
+
+(ert-deftest test-ob-plantuml/single-var ()
+  "Test file output with input variable."
+  (should
+   (string=
+    "@startuml
+!define CLASSNAME test_class
+class CLASSNAME
+@enduml"
+    (let ((org-plantuml-jar-path nil))
+      (org-test-with-temp-text
+	  "#+name: variable_value
+: test_class
+
+#+header: :file tmp.puml
+#+header: :var CLASSNAME=variable_value
+#+begin_src plantuml
+class CLASSNAME
+#+end_src"
+        (org-babel-next-src-block)
+	(let ((src-block-info (cdr (org-babel-get-src-block-info))))
+	  (org-babel-plantuml-make-body
+	   (car src-block-info)
+	   (car (cdr src-block-info)))))))))
+
+
+(ert-deftest test-ob-plantuml/prologue ()
+  "Test file output with prologue."
+  (should
+   (string=
+    "@startuml
+skinparam classBackgroundColor #FF0000
+class test_class
+@enduml"
+    (let ((org-plantuml-jar-path nil))
+      (org-test-with-temp-text
+	  "#+header: :file tmp.puml
+#+header: :prologue skinparam classBackgroundColor #FF0000
+#+begin_src plantuml
+class test_class
+#+end_src"
+        (org-babel-next-src-block)
+	(let ((src-block-info (cdr (org-babel-get-src-block-info))))
+	  (org-babel-plantuml-make-body
+	   (car src-block-info)
+	   (car (cdr src-block-info)))))))))
+
+(provide 'test-ob-plantuml)
+
+;;; test-ob-plantuml.el ends here
-- 
2.9.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: Add preamble support to ob-plantuml.el
  2016-12-07  1:39         ` Thibault Marin
@ 2016-12-09 20:55           ` Nicolas Goaziou
  2016-12-10  4:48             ` Thibault Marin
  0 siblings, 1 reply; 11+ messages in thread
From: Nicolas Goaziou @ 2016-12-09 20:55 UTC (permalink / raw)
  To: Thibault Marin; +Cc: emacs-orgmode

Hello,

Thibault Marin <thibault.marin@gmx.com> writes:

> However, ob-plantuml does not seem to support the prologue option.  So I
> am modifying my patch to add support for the :prologue and :epilogue
> header arguments instead of using a new customization variable.  In the
> process, I have added support for header variables which are passed to
> the PlantUML file via the !define macro.  I am also adding a test file
> which checks that the temporary file passed to the plantuml program is
> properly generated (it does not run or check the output of plantuml).

Thank you.

> Please let me know you have any comment on the patch.  Thanks in
> advance.

Comments follow.

> +(defun org-babel-plantuml-var-to-plantuml (var)
> +  "Cleanup plantuml variable (remove quotes)."
> +     (replace-regexp-in-string "\"" "" var))

Since this function is used only once in the code, I suggest to not
implement it and use `replace-regexp-in-string' at the appropriate
place.

> +(defun org-babel-variable-assignments:plantuml (params)
> +  "Return a list of PlantUML statements assigning the block's variables."

Could you document what is PARAMS?

> +  (mapcar
> +   (lambda (pair)
> +       (format "!define %s %s"
> +	       (car pair)
> +	       (org-babel-plantuml-var-to-plantuml (cdr pair))))
> +   (org-babel--get-vars params)))
> +
> +(defun org-babel-plantuml-make-body (body params)
> +  "Form PlantUML input string."

Do you mean "Return PlantUML" input string? Also you need to specify
what are body and params.

Besides, the same applies to `org-babel-plantuml-var-to-plantuml' above.
Is this function really needed, as it is a mere `format'.


Regards,

-- 
Nicolas Goaziou

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Add preamble support to ob-plantuml.el
  2016-12-09 20:55           ` Nicolas Goaziou
@ 2016-12-10  4:48             ` Thibault Marin
  2016-12-10 11:08               ` Nicolas Goaziou
  0 siblings, 1 reply; 11+ messages in thread
From: Thibault Marin @ 2016-12-10  4:48 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 1916 bytes --]


Hi,

Nicolas Goaziou writes:
> Comments follow.
>
>> +(defun org-babel-plantuml-var-to-plantuml (var)
>> +  "Cleanup plantuml variable (remove quotes)."
>> +     (replace-regexp-in-string "\"" "" var))
>
> Since this function is used only once in the code, I suggest to not
> implement it and use `replace-regexp-in-string' at the appropriate
> place.
I was trying to match what other ob-*s do.  If the table assignment idea
was to be implemented (for instance), using a separate function may be
cleaner.  But the function is indeed currently not needed, so I removed
it.

>> +(defun org-babel-variable-assignments:plantuml (params)
>> +  "Return a list of PlantUML statements assigning the block's variables."
>
> Could you document what is PARAMS?
I have added more complete docstrings, please let me know if changes are
required.

>> +(defun org-babel-plantuml-make-body (body params)
>> +  "Form PlantUML input string."
>
> Do you mean "Return PlantUML" input string? Also you need to specify
> what are body and params.
Tentatively done.

> Besides, the same applies to `org-babel-plantuml-var-to-plantuml' above.
> Is this function really needed, as it is a mere `format'.
I use this function in the test as well to compare the full text output
so it is convenient to have a separate function.  Alternatively I guess
I could directly test the call to `org-babel-expand-body:generic' but
that seems less interesting as a test (should I remove the test
altogether then?).

The attached patch removes the useless definition of
`org-babel-plantuml-var-to-plantuml' (the regexp is moved to the
`org-babel-variable-assignments:plantuml' function) but keeps the
`org-babel-plantuml-make-body' function, useful for testing.  If you
would like me to remove the `org-babel-plantuml-make-body' function as
well, I will do that (how would you like the test to look like in this
case?)

Thanks for the guidance.

thibault

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ob-plantuml.el-Add-support-for-prologue-and-header-v.patch --]
[-- Type: text/x-diff, Size: 5646 bytes --]

From 9e8addc14e628dc7c9c25d96d0cfd630ad15134e Mon Sep 17 00:00:00 2001
From: thibault <thibault.marin@gmx.com>
Date: Fri, 9 Dec 2016 22:43:32 -0600
Subject: [PATCH] ob-plantuml.el: Add support for prologue and header variables

* lisp/ob-plantuml.el (org-babel-execute:plantuml) Include prologue and
  header variables to temporary file body.
(org-babel-plantuml-make-body): New function.  Return content of
temporary file used as input to PlantUML program.
(org-babel-variable-assignments:plantuml): New function.  Build list of
variable assignments for source block.

* testing/lisp/test-ob-plantuml.el: New file.  Test body text produced
  by `org-babel-plantuml-make-body'.
---
 lisp/ob-plantuml.el              | 28 ++++++++++++++-
 testing/lisp/test-ob-plantuml.el | 73 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 100 insertions(+), 1 deletion(-)
 create mode 100644 testing/lisp/test-ob-plantuml.el

diff --git a/lisp/ob-plantuml.el b/lisp/ob-plantuml.el
index 9ce65a9..01739c8 100644
--- a/lisp/ob-plantuml.el
+++ b/lisp/ob-plantuml.el
@@ -46,6 +46,31 @@
   :version "24.1"
   :type 'string)
 
+(defun org-babel-variable-assignments:plantuml (params)
+  "Return a list of PlantUML statements assigning the block's variables.
+PARAMS is a property list of source block parameters, which may
+contain multiple entries for the key `:var'.  `:var' entries in PARAMS
+are expected to be scalar variables."
+  (mapcar
+   (lambda (pair)
+       (format "!define %s %s"
+	       (car pair)
+	       (replace-regexp-in-string "\"" "" (cdr pair))))
+   (org-babel--get-vars params)))
+
+(defun org-babel-plantuml-make-body (body params)
+  "Return PlantUML input string.
+BODY is the content of the source block and PARAMS is a property list
+of source block parameters.  This function relies on the
+`org-babel-expand-body:generic' function to extract `:var' entries
+from PARAMS and on the `org-babel-variable-assignments:plantuml'
+function to convert variables to PlantUML assignments."
+  (concat
+   "@startuml\n"
+   (org-babel-expand-body:generic
+    body params (org-babel-variable-assignments:plantuml params))
+   "\n@enduml"))
+
 (defun org-babel-execute:plantuml (body params)
   "Execute a block of plantuml code with org-babel.
 This function is called by `org-babel-execute-src-block'."
@@ -54,6 +79,7 @@ This function is called by `org-babel-execute-src-block'."
 	 (cmdline (cdr (assq :cmdline params)))
 	 (in-file (org-babel-temp-file "plantuml-"))
 	 (java (or (cdr (assq :java params)) ""))
+	 (full-body (org-babel-plantuml-make-body body params))
 	 (cmd (if (string= "" org-plantuml-jar-path)
 		  (error "`org-plantuml-jar-path' is not set")
 		(concat "java " java " -jar "
@@ -85,7 +111,7 @@ This function is called by `org-babel-execute-src-block'."
 			(org-babel-process-file-name out-file)))))
     (unless (file-exists-p org-plantuml-jar-path)
       (error "Could not find plantuml.jar at %s" org-plantuml-jar-path))
-    (with-temp-file in-file (insert (concat "@startuml\n" body "\n@enduml")))
+    (with-temp-file in-file (insert full-body))
     (message "%s" cmd) (org-babel-eval cmd "")
     nil)) ;; signal that output has already been written to file
 
diff --git a/testing/lisp/test-ob-plantuml.el b/testing/lisp/test-ob-plantuml.el
new file mode 100644
index 0000000..794d313
--- /dev/null
+++ b/testing/lisp/test-ob-plantuml.el
@@ -0,0 +1,73 @@
+;;; test-ob-plantuml.el --- tests for ob-plantuml.el
+
+;; Copyright (c) 2016 Thibault Marin
+;; Authors: Thibault Marin
+
+;; This file is not part of GNU Emacs.
+
+;; 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 of the License, 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Code:
+(unless (featurep 'ob-plantuml)
+  (signal 'missing-test-dependency "Support for PlantUML code blocks"))
+
+(ert-deftest test-ob-plantuml/single-var ()
+  "Test file output with input variable."
+  (should
+   (string=
+    "@startuml
+!define CLASSNAME test_class
+class CLASSNAME
+@enduml"
+    (let ((org-plantuml-jar-path nil))
+      (org-test-with-temp-text
+	  "#+name: variable_value
+: test_class
+
+#+header: :file tmp.puml
+#+header: :var CLASSNAME=variable_value
+#+begin_src plantuml
+class CLASSNAME
+#+end_src"
+        (org-babel-next-src-block)
+	(let ((src-block-info (cdr (org-babel-get-src-block-info))))
+	  (org-babel-plantuml-make-body
+	   (car src-block-info)
+	   (car (cdr src-block-info)))))))))
+
+
+(ert-deftest test-ob-plantuml/prologue ()
+  "Test file output with prologue."
+  (should
+   (string=
+    "@startuml
+skinparam classBackgroundColor #FF0000
+class test_class
+@enduml"
+    (let ((org-plantuml-jar-path nil))
+      (org-test-with-temp-text
+	  "#+header: :file tmp.puml
+#+header: :prologue skinparam classBackgroundColor #FF0000
+#+begin_src plantuml
+class test_class
+#+end_src"
+        (org-babel-next-src-block)
+	(let ((src-block-info (cdr (org-babel-get-src-block-info))))
+	  (org-babel-plantuml-make-body
+	   (car src-block-info)
+	   (car (cdr src-block-info)))))))))
+
+(provide 'test-ob-plantuml)
+
+;;; test-ob-plantuml.el ends here
-- 
2.9.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: Add preamble support to ob-plantuml.el
  2016-12-10  4:48             ` Thibault Marin
@ 2016-12-10 11:08               ` Nicolas Goaziou
  2016-12-10 14:35                 ` Thibault Marin
  0 siblings, 1 reply; 11+ messages in thread
From: Nicolas Goaziou @ 2016-12-10 11:08 UTC (permalink / raw)
  To: Thibault Marin; +Cc: emacs-orgmode

Hello,

Thibault Marin <thibault.marin@gmx.com> writes:

> The attached patch removes the useless definition of
> `org-babel-plantuml-var-to-plantuml' (the regexp is moved to the
> `org-babel-variable-assignments:plantuml' function) but keeps the
> `org-babel-plantuml-make-body' function, useful for testing.

Fair enough. I applied your patch.

Would you mind providing an ORG-NEWS entry for the added feature?

> Thanks for the guidance.

Thank you for the work.

Regards,

-- 
Nicolas Goaziou

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Add preamble support to ob-plantuml.el
  2016-12-10 11:08               ` Nicolas Goaziou
@ 2016-12-10 14:35                 ` Thibault Marin
  2016-12-10 16:05                   ` Nicolas Goaziou
  0 siblings, 1 reply; 11+ messages in thread
From: Thibault Marin @ 2016-12-10 14:35 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 72 bytes --]

Hi,

Please find attached a patch updating ORG-NEWS.

Thanks,
thibault


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-etc-ORG-NEWS-Header-arguments-support-for-PlantUML-s.patch --]
[-- Type: text/x-diff, Size: 989 bytes --]

From 3d335b093d4e95b14cc71317d2aef024f1c64fd5 Mon Sep 17 00:00:00 2001
From: thibault <thibault.marin@gmx.com>
Date: Sat, 10 Dec 2016 08:27:48 -0600
Subject: [PATCH] * etc/ORG-NEWS: Header arguments support for PlantUML source
 blocks

---
 etc/ORG-NEWS | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index b6b3123..c115cf9 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -82,6 +82,11 @@ Where clue > 0
 ,#+END_SRC
 #+end_example
 
+**** PlantUML: add support for header arguments
+
+[[http://plantuml.com/][Plantuml]] source blocks now support the [[http://orgmode.org/manual/prologue.html#prologue][~:prologue~]], [[http://orgmode.org/manual/epilogue.html#epilogue][~:epilogue~]] and
+[[http://orgmode.org/manual/var.html#var][~:var~]] header arguments.
+
 *** New variable : ~org-bibtex-headline-format-function~
 This allow to use a different title than entry title.
 *** Horizontal rules are no longer ignored in LaTeX table math mode
-- 
2.9.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: Add preamble support to ob-plantuml.el
  2016-12-10 14:35                 ` Thibault Marin
@ 2016-12-10 16:05                   ` Nicolas Goaziou
  0 siblings, 0 replies; 11+ messages in thread
From: Nicolas Goaziou @ 2016-12-10 16:05 UTC (permalink / raw)
  To: Thibault Marin; +Cc: emacs-orgmode

Thibault Marin <thibault.marin@gmx.com> writes:

> Please find attached a patch updating ORG-NEWS.

Perfect. Applied. Thank you.

Regards,

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2016-12-10 16:05 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-12-02  5:09 Add preamble support to ob-plantuml.el Thibault Marin
2016-12-05 21:28 ` Nicolas Goaziou
2016-12-06  3:52   ` Thibault Marin
2016-12-06 11:42     ` Nicolas Goaziou
2016-12-06 12:14       ` Rainer M Krug
2016-12-07  1:39         ` Thibault Marin
2016-12-09 20:55           ` Nicolas Goaziou
2016-12-10  4:48             ` Thibault Marin
2016-12-10 11:08               ` Nicolas Goaziou
2016-12-10 14:35                 ` Thibault Marin
2016-12-10 16:05                   ` Nicolas Goaziou

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).