emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
blob 15b3fbe89b4d429bec0676478c916144e713b47f 5251 bytes (raw)
name: lisp/ob-ditaa.el 	 # note: path name is non-authoritative(*)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
 
;;; ob-ditaa.el --- org-babel functions for ditaa evaluation

;; Copyright (C) 2009-2011  Free Software Foundation, Inc.

;; Author: Eric Schulte
;; Keywords: literate programming, reproducible research
;; Homepage: http://orgmode.org

;; 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
;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary:

;; Org-Babel support for evaluating ditaa source code.
;;
;; This differs from most standard languages in that
;;
;; 1) there is no such thing as a "session" in ditaa
;;
;; 2) we are generally only going to return results of type "file"
;;
;; 3) we are adding the "file" and "cmdline" header arguments
;;
;; 4) there are no variables (at least for now)

;;; Code:
(require 'ob)

(defvar org-babel-default-header-args:ditaa
  '((:results . "file") (:exports . "results") (:java . "-Dfile.encoding=UTF-8"))
  "Default arguments for evaluating a ditaa source block.")

;;; Not having delete-if-not from cl package is rather annoying,
;;; but, alright, we'll do it live.
(defun org-ditaa-delete-if-not (pred seq)
  "Destructively remove all elements of SEQ that do not satisfy predicat PRED"
  (dolist (elt seq seq)
    (when (not (apply pred (list elt)))
      (setq seq (delete elt seq)))))

(defun org-ditaa-try-find-file-in (dir filename)
  "Traverse directory tree supplied in DIR and search for FILENAME.
Return full path to FILENAME if found."
  (let ((candidate-file (expand-file-name filename dir)))
    (cond ((file-exists-p candidate-file)
	   candidate-file)
	  ((file-directory-p dir)
	   (do ((path-to-file nil)
		;; List of sub-directories with . , .. and all
		;; items that are not directories filtered out
		(subdir-list
		 (org-ditaa-delete-if-not
		  (lambda (e) (file-directory-p
			  (file-name-as-directory
			   (expand-file-name e dir))))
		  (delete
		   ".."
		   (delete
		    "."
		    ;;  Access to some directories might result in
		    ;;  "Permission denied" file error. Wrap the call
		    ;;  in condition-case to avoid that
		    (condition-case ex
			(directory-files dir)
		      ('file-error)))))
		 (setq subdir-list (cdr subdir-list))))
	       ((or (not subdir-list)
		    path-to-file) path-to-file)
	     (when subdir-list
	       (let ((subdir (file-name-as-directory
			      (expand-file-name (car subdir-list) dir))))
		 (setq path-to-file (when (and subdir
					       (file-directory-p subdir))
				      (org-ditaa-try-find-file-in subdir filename)))))))
	  (t
	   nil))))

;;; When looking for ditaa.jar go through predefined list of most
;;; likely places to have it, then if else fails try to find it
;;; somwhere in /usr/share or /usr/lib
(defvar org-ditaa-jar-path
  (let* ((potential-path-list
	  (list "/usr/share/ditaa/ditaa.jar" ; Ubuntu 10.10 installed via apt-get
		(expand-file-name            ; Bundled with emacs
		 "ditaa.jar"
		 (file-name-as-directory
		  (expand-file-name
		   "scripts"
		   (file-name-as-directory
		    (expand-file-name
		     "../contrib"
		     (file-name-directory (or load-file-name
					      buffer-file-name)))))))))
	 (actual-path (car potential-path-list)))
    (while (and actual-path
		(not (file-exists-p actual-path)))
      (setq potential-path-list (cdr potential-path-list))
      (setq actual-path (car potential-path-list)))
    (when (not actual-path)
      (setq actual-path (or (org-ditaa-try-find-file-in "/usr/share" "ditaa.jar")
			    (org-ditaa-try-find-file-in "/usr/lib" "ditaa.jar"))))
    actual-path))

(defun org-babel-execute:ditaa (body params)
  "Execute a block of Ditaa 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 ((lambda (el)
		      (or el
			  (error
			   "ditaa code block requires :file header argument")))
		    (cdr (assoc :file params))))
	 (cmdline (cdr (assoc :cmdline params)))
	 (java (cdr (assoc :java params)))
	 (in-file (org-babel-temp-file "ditaa-"))
	 (cmd (concat "java " java " -jar "
		      (shell-quote-argument
		       (expand-file-name org-ditaa-jar-path))
		      " " cmdline
		      " " (org-babel-process-file-name in-file)
		      " " (org-babel-process-file-name out-file))))
    (unless (file-exists-p org-ditaa-jar-path)
      (error "Could not find ditaa.jar at %s" org-ditaa-jar-path))
    (with-temp-file in-file (insert body))
    (message cmd) (shell-command cmd)
    nil)) ;; signal that output has already been written to file

(defun org-babel-prep-session:ditaa (session params)
  "Return an error because ditaa does not support sessions."
  (error "Ditaa does not support sessions"))

(provide 'ob-ditaa)



;;; ob-ditaa.el ends here

debug log:

solving 15b3fbe ...
found 15b3fbe in https://list.orgmode.org/orgmode/87sjlij4oo.fsf@gmail.com/
found 0aba9a6 in https://git.savannah.gnu.org/cgit/emacs/org-mode.git
preparing index
index prepared:
100644 0aba9a6e47e216a44a5e040f14fd8370ed0787ee	lisp/ob-ditaa.el

applying [1/1] https://list.orgmode.org/orgmode/87sjlij4oo.fsf@gmail.com/
diff --git a/lisp/ob-ditaa.el b/lisp/ob-ditaa.el
index 0aba9a6..15b3fbe 100644

Checking patch lisp/ob-ditaa.el...
Applied patch lisp/ob-ditaa.el cleanly.

index at:
100644 15b3fbe89b4d429bec0676478c916144e713b47f	lisp/ob-ditaa.el

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

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