- (if org-export-babel-evaluate
- (let ((lang (nth 0 info))
- (body (nth 1 info))
- (params
- ;; lets ensure that we lookup references in the original file
- (mapcar
- (lambda (pair)
- (if (and org-current-export-file
- (eq (car pair) :var)
- (string-match org-babel-ref-split-regexp (cdr pair))
- (equal :ob-must-be-reference
- (org-babel-ref-literal
- (match-string 2 (cdr pair)))))
- `(:var . ,(concat (match-string 1 (cdr pair))
- "=" org-current-export-file
- ":" (match-string 2 (cdr pair))))
- pair))
- (nth 2 info))))
- ;; skip code blocks which we can't evaluate
- (if (fboundp (intern (concat "org-babel-execute:" lang)))
- (case type
- ('inline
- (let ((raw (org-babel-execute-src-block
- nil info '((:results . "silent"))))
- (result-params (split-string
- (cdr (assoc :results params)))))
- (unless silent
- (cond ;; respect the value of the :results header argument
- ((member "file" result-params)
- (org-babel-result-to-file raw))
- ((or (member "raw" result-params)
- (member "org" result-params))
- (format "%s" raw))
- ((member "code" result-params)
- (format "src_%s{%s}" lang raw))
- (t
- (if (stringp raw)
- (if (= 0 (length raw)) "=(no results)="
- (format "%s" raw))
- (format "%S" raw)))))))
- ('block
- (org-babel-execute-src-block
- nil info (org-babel-merge-params
- params
- `((:results . ,(if silent "silent" "replace")))))
- "")
- ('lob
- (save-excursion
- (re-search-backward org-babel-lob-one-liner-regexp nil t)
- (org-babel-execute-src-block
- nil info (org-babel-merge-params
- params
- `((:results . ,(if silent "silent" "replace")))))
- "")))
- ""))
- ""))
+ (when (and org-export-babel-evaluate
+ (not (and hash (equal hash (org-babel-current-result-hash)))))
+ (let ((lang (nth 0 info))
+ (body (nth 1 info)))
+ ;; skip code blocks which we can't evaluate
+ (when (fboundp (intern (concat "org-babel-execute:" lang)))
+ (org-babel-eval-wipe-error-buffer)
+ (prog1 nil
+ (setf (nth 2 info)
+ (org-babel-exp-in-export-file lang
+ (org-babel-process-params
+ (org-babel-merge-params
+ (nth 2 info)
+ `((:results . ,(if silent "silent" "replace")))))))
+ (cond
+ ((or (equal type 'block) (equal type 'inline))
+ (org-babel-execute-src-block nil info))
+ ((equal type 'lob)
+ (save-excursion
+ (re-search-backward org-babel-lob-one-liner-regexp nil t)
+ (org-babel-execute-src-block nil info)))))))))