ソースを参照

ob-plantuml: Add support for plantuml executable

* lisp/ob-plantuml (org-babel-variable-assignments:plantuml): Support
using plantuml executable instead of jar.

Some systems come with an executable for plantuml instead of a specific
JAR file. This adds support for two different modes:
- jar :: using java together with a JAR (previous behavior)
- plantuml :: using a PlantUML executable

The PlantUML executable can be configured via
`org-plantuml-executable-path` and also the arguments that will be given
via `org-plantuml-executable-args`.
Terje Larsen 5 年 前
コミット
186371eac7
2 ファイル変更67 行追加34 行削除
  1. 7 0
      etc/ORG-NEWS
  2. 60 34
      lisp/ob-plantuml.el

+ 7 - 0
etc/ORG-NEWS

@@ -266,6 +266,13 @@ can now be inserted with this prefix argument.
 Source code block header argument =:file-mode= can set file
 permissions if =:file= argument is provided.
 
+*** =ob-plantuml=: now supports using PlantUML executable to generate diagrams
+
+Set =org-plantuml-exec-mode= to ='plantuml= in order to use the
+executable instead of JAR. When using an executable it is also
+possible to configure executable location as well as arguments via:
+=org-plantuml-executable-path= and =org-plantuml-executable-args=.
+
 ** New commands
 *** ~org-table-header-line-mode~
 

+ 60 - 34
lisp/ob-plantuml.el

@@ -31,7 +31,7 @@
 ;;; Requirements:
 
 ;; plantuml     | http://plantuml.sourceforge.net/
-;; plantuml.jar | `org-plantuml-jar-path' should point to the jar file
+;; plantuml.jar | `org-plantuml-jar-path' should point to the jar file (when exec mode is `jar')
 
 ;;; Code:
 (require 'ob)
@@ -46,6 +46,31 @@
   :version "24.1"
   :type 'string)
 
+(defcustom org-plantuml-exec-mode 'jar
+  "Method to use for PlantUML diagram generation.
+`jar' means to use java together with the JAR.
+The JAR can be configured via `org-plantuml-jar-path'.
+
+`plantuml' means to use the PlantUML executable.
+The executable can be configured via `org-plantuml-executable-path'.
+You can also configure extra arguments via `org-plantuml-executable-args'."
+  :group 'org-babel
+  :package-version '(Org . "9.4")
+  :type 'symbol
+  :options '(jar plantuml))
+
+(defcustom org-plantuml-executable-path "plantuml"
+  "File name of the PlantUML executable."
+  :group 'org-babel
+  :package-version '(Org . "9.4")
+  :type 'string)
+
+(defcustom org-plantuml-executable-args (list "-headless")
+  "The arguments passed to plantuml executable when executing PlantUML."
+  :group 'org-babel
+  :package-version '(Org . "9.4")
+  :type '(repeat 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
@@ -83,40 +108,41 @@ 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)) ""))
+	 (executable (cond ((eq org-plantuml-exec-mode 'plantuml) org-plantuml-executable-path)
+			   (t "java")))
+	 (executable-args (cond ((eq org-plantuml-exec-mode 'plantuml) org-plantuml-executable-args)
+				((string= "" org-plantuml-jar-path)
+				 (error "`org-plantuml-jar-path' is not set"))
+				((not (file-exists-p org-plantuml-jar-path))
+				 (error "Could not find plantuml.jar at %s" org-plantuml-jar-path))
+				(t (list java
+					 "-jar"
+					 (shell-quote-argument (expand-file-name org-plantuml-jar-path))))))
 	 (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 "
-			(shell-quote-argument
-			 (expand-file-name org-plantuml-jar-path))
-			(if (string= (file-name-extension out-file) "png")
-			    " -tpng" "")
-			(if (string= (file-name-extension out-file) "svg")
-			    " -tsvg" "")
-			(if (string= (file-name-extension out-file) "eps")
-			    " -teps" "")
-			(if (string= (file-name-extension out-file) "pdf")
-			    " -tpdf" "")
-			(if (string= (file-name-extension out-file) "tex")
-			    " -tlatex" "")
-			(if (string= (file-name-extension out-file) "vdx")
-			    " -tvdx" "")
-			(if (string= (file-name-extension out-file) "xmi")
-			    " -txmi" "")
-			(if (string= (file-name-extension out-file) "scxml")
-			    " -tscxml" "")
-			(if (string= (file-name-extension out-file) "html")
-			    " -thtml" "")
-			(if (string= (file-name-extension out-file) "txt")
-			    " -ttxt" "")
-			(if (string= (file-name-extension out-file) "utxt")
-			    " -utxt" "")
-			" -p " cmdline " < "
-			(org-babel-process-file-name in-file)
-			" > "
-			(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))
+	 (cmd (mapconcat #'identity
+			 (append
+			  (list executable)
+			  executable-args
+			  (pcase (file-name-extension out-file)
+			    ("png" '("-tpng"))
+			    ("svg" '("-tsvg"))
+			    ("eps" '("-teps"))
+			    ("pdf" '("-tpdf"))
+			    ("tex" '("-tlatex"))
+			    ("vdx" '("-tvdx"))
+			    ("xmi" '("-txmi"))
+			    ("scxml" '("-tscxml"))
+			    ("html" '("-thtml"))
+			    ("txt" '("-ttxt"))
+			    ("utxt" '("-utxt")))
+			  (list
+			   "-p"
+			   cmdline
+			   "<"
+			   (org-babel-process-file-name in-file)
+			   ">"
+			   (org-babel-process-file-name out-file)))
+			 " ")))
     (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