|
@@ -223,6 +223,61 @@ Don't auto jack in by default for not rude."
|
|
|
(cdr pair)))
|
|
|
(org-babel--get-vars params)))
|
|
|
|
|
|
+;;; Support header arguments :results graphics :file "image.png" by inject Clojure code.
|
|
|
+(defun ob-clojure-literate-inject-code (args)
|
|
|
+ "Inject Clojure code into `BODY' in `ARGS'.
|
|
|
+It is used to change Clojure currently working directory in a FAKE way.
|
|
|
+And generate inline graphics image file link result.
|
|
|
+Use header argument like this:
|
|
|
+
|
|
|
+:results graphics :file \"incanter-plot.png\"
|
|
|
+
|
|
|
+Then you need to assign image variable to this :file value like:
|
|
|
+(def incanter-plot (histogram (sample-normal 1000)))
|
|
|
+
|
|
|
+*NOTE*: Currently only support Incanter's `save' function.
|
|
|
+"
|
|
|
+ (let* ((body (nth 0 args))
|
|
|
+ (params (nth 1 args))
|
|
|
+ (dir (cdr (assq :dir params)))
|
|
|
+ (default-directory (and (buffer-file-name) (file-name-directory (buffer-file-name))))
|
|
|
+ (directory (and dir (file-name-as-directory (expand-file-name dir))))
|
|
|
+ (result-type (cdr (assq :results params)))
|
|
|
+ (file (cdr (assq :file params)))
|
|
|
+ (file-name (file-name-base file))
|
|
|
+ ;; TODO: future support `:graphics-file' to avoid collision.
|
|
|
+ (graphics-result (member "graphics" (cdr (assq :result-params params))))
|
|
|
+ ;; (graphics-file (cdr (assq :graphics-file params)))
|
|
|
+ ;; (graphics-name (file-name-base graphics-file))
|
|
|
+ (prepend-to-body (lambda (code)
|
|
|
+ (setq body (concat code "\n" body))))
|
|
|
+ (append-to-body (lambda (code)
|
|
|
+ (setq body (concat body "\n" code "\n"))))
|
|
|
+ )
|
|
|
+ (when directory
|
|
|
+ (unless (file-directory-p (expand-file-name directory))
|
|
|
+ (warn (format "Target directory %s does not exist, please create it." dir))))
|
|
|
+ (when file
|
|
|
+ (funcall append-to-body
|
|
|
+ (format "(save %s \"%s\")" file-name (concat directory file)))
|
|
|
+ )
|
|
|
+ (list body params) ; return modified argument list
|
|
|
+ ))
|
|
|
+
|
|
|
+(advice-add 'org-babel-expand-body:clojure :filter-args #'ob-clojure-literate-inject-code)
|
|
|
+
|
|
|
+;;; support :results graphics :dir "data/image" :file "incanter-plot.png"
|
|
|
+(defun ob-clojure-literate-support-graphics-result (result)
|
|
|
+ "Support :results graphics :dir \"data/images\" :file \"incanter-plot.png\"
|
|
|
+reset `RESULT' to `nil'."
|
|
|
+ (let* ((params (nth 2 info))
|
|
|
+ (graphics-result (member "graphics" (cdr (assq :result-params params)))))
|
|
|
+ (if graphics-result
|
|
|
+ (setq result nil))
|
|
|
+ result))
|
|
|
+
|
|
|
+(advice-add 'org-babel-execute:clojure :filter-return #'ob-clojure-literate-support-graphics-result)
|
|
|
+
|
|
|
|
|
|
(defvar ob-clojure-literate-mode-map
|
|
|
(let ((map (make-sparse-keymap)))
|