diff --git a/lisp/ob-plantuml.el b/lisp/ob-plantuml.el index c17d444..b4e2b01 100644 --- a/lisp/ob-plantuml.el +++ b/lisp/ob-plantuml.el @@ -37,7 +37,7 @@ (require 'ob) (defvar org-babel-default-header-args:plantuml - '((:results . "file") (:exports . "results")) + '((:exports . "results")) "Default arguments for evaluating a plantuml source block.") (defcustom org-plantuml-jar-path nil @@ -46,33 +46,43 @@ :version "24.1" :type 'string) +(defvar org-babel-plantuml-ext-alist + '(("svg" . "-tsvg") + ("eps" . "-teps") + ("atxt" . "-txt") + ("png" . "")) + "Switch to use for different file name extensions.") + +(defun org-babel-plantuml-switch (filename) + (concat " " + (if filename + (let ((ext (file-name-extension filename))) + (or (cdr (assoc ext org-babel-plantuml-ext-alist)) + (error "Unrecognized file name extension '%s'" ext))) + "-txt"))) + (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'." (let* ((result-params (split-string (or (cdr (assoc :results params)) ""))) - (out-file (or (cdr (assoc :file params)) - (error "PlantUML requires a \":file\" header argument"))) + (out-file (cdr (assoc :file params))) (cmdline (cdr (assoc :cmdline params))) - (in-file (org-babel-temp-file "plantuml-")) (java (or (cdr (assoc :java params)) "")) (cmd (if (not 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) "svg") - " -tsvg" "") - (if (string= (file-name-extension out-file) "eps") - " -teps" "") - " -p " cmdline " < " - (org-babel-process-file-name in-file) - " > " - (org-babel-process-file-name out-file))))) + (org-babel-plantuml-switch out-file) + " -p " cmdline + (if out-file + (concat " > " (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"))) - (message "%s" cmd) (org-babel-eval cmd "") - nil)) ;; signal that output has already been written to file + (message "%s" cmd) + (let ((result (org-babel-eval cmd (concat "@startuml\n" body "\n@enduml")))) + (if (string= result "") nil result)))) (defun org-babel-prep-session:plantuml (session params) "Return an error because plantuml does not support sessions."