emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] [org-babel] [PATCH] Improve ditta.jar finding heuristics


From: Eric Schulte
Subject: Re: [O] [org-babel] [PATCH] Improve ditta.jar finding heuristics
Date: Sun, 20 Nov 2011 09:35:14 -0700
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.91 (gnu/linux)

Hi Andrey,

The variable `org-ditaa-jar-path' can be used to specify a non-standard
location for the ditaa jar file.  Org-mode has *many* customization
variables, and for most problems a variable will exist to solve the
problem, the `apropos' command can be very useful for finding these
variables.

Best -- Eric

ps. I agree that it is annoying that Emacs does not allow the cl
    functions to be used by core packages.

Andrey Smirnov <address@hidden> writes:

> Hi everybody,
>
> I've been using org-mode for quite a while but only recently found
> myself in need of using ditaa to draw some simple diagram. As it turns
> out my installation of emacs(Ubuntu 10.10, emacs-snapshot from
> https://launchpad.net/~cassou/+archive/emacs) doesn't come with
> ditta.jar pre-bundled, although I'm not sure if it should. Anyway, despite
> my installation of ditta with help of apt-get, org-babel kept
> unsuccessfully trying to locate
> /usr/share/emacs/24.0.91/lisp/contrib/ditta.jar, leaving me without any
> diagrams produced.
>
> So to alleviate the problem I cloned git repository and wrote a small
> patch implementing very crude algorithm, which is, nonetheless, in my
> opinion, still an improvement on default behavior. For more details see
> commit message. 
>
> Andrey Smirnov
>
>
> From 03b434347e02c2fc95f38a7a4e87850eb5f87f56 Mon Sep 17 00:00:00 2001
> From: Andrey Smirnov <address@hidden>
> Date: Sun, 20 Nov 2011 19:40:32 +0700
> Subject: [PATCH] org-babel: Add simple ditaa.jar searching heuristics
>
> lisp/ob-ditaa.el: Add two functions `org-ditaa-try-find-file-in' and
> `org-ditaa-delete-if-not' and more complicated algorithm for setting
> the value of `org-ditaa-jar-path'.
>
> Prior to this the algorithm used to locate ditaa.jar was to look for
> it in ${ob-ditaa.el path}/../contrib/ but that approach fails if said 'jar'
> doesn't come pre-bundled with user's emacs install and even if it does
> it precludes user from using system-wide installed(via apt-get or any
> such tool) instance of ditaa in favor of pre-bundled one.
>
> New heuristics does the following:
>   1. Looks in the predefined set of locations, right now it is
>          - /usr/share/ditaa/ (Location where it is installed in
>                               Ubuntu)
>          - ${ob-ditaa.el path}/../contrib/
>   2. If previous set yeilds no results it tryies to locate said
>      ditta.jar in either /usr/share/ or /usr/lib/
> ---
>  lisp/ob-ditaa.el |   72 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 71 insertions(+), 1 deletions(-)
>
> diff --git a/lisp/ob-ditaa.el b/lisp/ob-ditaa.el
> index 0aba9a6..15b3fbe 100644
> --- a/lisp/ob-ditaa.el
> +++ b/lisp/ob-ditaa.el
> @@ -42,7 +42,77 @@
>    '((:results . "file") (:exports . "results") (:java . 
> "-Dfile.encoding=UTF-8"))
>    "Default arguments for evaluating a ditaa source block.")
>  
> -(defvar org-ditaa-jar-path)
> +;;; 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'."

-- 
Eric Schulte
http://cs.unm.edu/~eschulte/



reply via email to

[Prev in Thread] Current Thread [Next in Thread]