ob-plantuml.el 4.78 KB
Newer Older
Rasmus's avatar
Rasmus committed
1
;;; ob-plantuml.el --- Babel Functions for Plantuml  -*- lexical-binding: t; -*-
2

Paul Eggert's avatar
Paul Eggert committed
3
;; Copyright (C) 2010-2020 Free Software Foundation, Inc.
4 5 6

;; Author: Zhang Weize
;; Keywords: literate programming, reproducible research
Rasmus's avatar
Rasmus committed
7
;; Homepage: https://orgmode.org
8 9 10 11 12 13 14 15 16 17 18 19 20 21

;; This file is part of GNU Emacs.

;; GNU Emacs 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.

;; GNU Emacs 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
22
;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

;;; Commentary:

;; Org-Babel support for evaluating plantuml script.
;;
;; Inspired by Ian Yang's org-export-blocks-format-plantuml
;; http://www.emacswiki.org/emacs/org-export-blocks-format-plantuml.el

;;; Requirements:

;; plantuml     | http://plantuml.sourceforge.net/
;; plantuml.jar | `org-plantuml-jar-path' should point to the jar file

;;; Code:
(require 'ob)

(defvar org-babel-default-header-args:plantuml
  '((:results . "file") (:exports . "results"))
  "Default arguments for evaluating a plantuml source block.")

Bastien Guerry's avatar
Bastien Guerry committed
43
(defcustom org-plantuml-jar-path ""
44 45
  "Path to the plantuml.jar file."
  :group 'org-babel
46
  :version "24.1"
47 48
  :type 'string)

Rasmus's avatar
Rasmus committed
49 50 51 52 53 54 55 56 57 58 59 60 61 62
(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.
Bastien's avatar
Bastien committed
63

Rasmus's avatar
Rasmus committed
64 65 66 67
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'
Bastien's avatar
Bastien committed
68 69 70 71 72 73 74 75
function to convert variables to PlantUML assignments.

If BODY does not contain @startXXX ... @endXXX clauses, @startuml
... @enduml will be added."
  (let ((assignments (org-babel-variable-assignments:plantuml params)))
    (if (string-prefix-p "@start" body t) assignments
      (format "@startuml\n%s\n@enduml"
	      (org-babel-expand-body:generic body params assignments)))))
Rasmus's avatar
Rasmus committed
76

77 78 79
(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'."
Rasmus's avatar
Rasmus committed
80
  (let* ((out-file (or (cdr (assq :file params))
81
		       (error "PlantUML requires a \":file\" header argument")))
Rasmus's avatar
Rasmus committed
82
	 (cmdline (cdr (assq :cmdline params)))
83
	 (in-file (org-babel-temp-file "plantuml-"))
Rasmus's avatar
Rasmus committed
84
	 (java (or (cdr (assq :java params)) ""))
Rasmus's avatar
Rasmus committed
85
	 (full-body (org-babel-plantuml-make-body body params))
Bastien Guerry's avatar
Bastien Guerry committed
86
	 (cmd (if (string= "" org-plantuml-jar-path)
87
		  (error "`org-plantuml-jar-path' is not set")
88
		(concat "java " java " -jar "
89 90
			(shell-quote-argument
			 (expand-file-name org-plantuml-jar-path))
Rasmus's avatar
Rasmus committed
91 92
			(if (string= (file-name-extension out-file) "png")
			    " -tpng" "")
93 94
			(if (string= (file-name-extension out-file) "svg")
			    " -tsvg" "")
95 96
			(if (string= (file-name-extension out-file) "eps")
			    " -teps" "")
Rasmus's avatar
Rasmus committed
97 98
			(if (string= (file-name-extension out-file) "pdf")
			    " -tpdf" "")
Bastien's avatar
Bastien committed
99 100
			(if (string= (file-name-extension out-file) "tex")
			    " -tlatex" "")
Rasmus's avatar
Rasmus committed
101 102 103 104 105 106 107 108 109 110 111 112
			(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" "")
113 114 115 116 117 118
			" -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))
Rasmus's avatar
Rasmus committed
119
    (with-temp-file in-file (insert full-body))
120
    (message "%s" cmd) (org-babel-eval cmd "")
121
    nil)) ;; signal that output has already been written to file
122

Rasmus's avatar
Rasmus committed
123
(defun org-babel-prep-session:plantuml (_session _params)
124 125 126 127 128
  "Return an error because plantuml does not support sessions."
  (error "Plantuml does not support sessions"))

(provide 'ob-plantuml)

129

130 131

;;; ob-plantuml.el ends here