From 6b955077dc86ee7d5084c49a9aa31d57579d7fab Mon Sep 17 00:00:00 2001 From: Jambunathan K Date: Tue, 6 Sep 2011 17:46:11 +0530 Subject: [PATCH] org-odt.el: Rework embedding of images * contrib/lisp/org-odt.el (org-odt-embedded-images-count): New variable. (org-odt-copy-image-file): Use the above variable to name the embedded image files. Remove some cruft as well. (org-export-odt-file-list, org-export-odt-save-list): Removed. (org-odt-init-outfile, org-odt-save-as-outfile): Related changes. --- contrib/lisp/org-odt.el | 71 ++++++++++++++++++------------------------------- 1 file changed, 26 insertions(+), 45 deletions(-) diff --git a/contrib/lisp/org-odt.el b/contrib/lisp/org-odt.el index 37d33d4a1..2ac7b6679 100644 --- a/contrib/lisp/org-odt.el +++ b/contrib/lisp/org-odt.el @@ -1268,38 +1268,28 @@ MAY-INLINE-P allows inlining it as an image." ;; (when par-open (org-odt-open-par)) )))))) -;; xml files generated on-the-fly -(defconst org-export-odt-save-list - '("mimetype" "META-INF/manifest.xml" "content.xml" "meta.xml" "styles.xml")) - -;; xml files that contribute to the final odt file -(defvar org-export-odt-file-list nil) - -(defun org-odt-copy-image-file (path &optional target-file) +(defvar org-odt-embedded-images-count 0) +(defun org-odt-copy-image-file (path) "Returns the internal name of the file" (let* ((image-type (file-name-extension path)) (media-type (format "image/%s" image-type)) (src-file (expand-file-name path (file-name-directory org-current-export-file))) - (target-file (or target-file (org-odt-get-image-name src-file))) - ;; FIXME - (body-only nil)) - + (target-dir "Images/") + (target-file + (format "%s%04d.%s" target-dir + (incf org-odt-embedded-images-count) image-type))) (when (not org-lparse-to-buffer) (message "Embedding %s as %s ..." (substring-no-properties path) target-file) - ;; create Pictures dir if needed - (let ((pictures-dir (file-name-directory target-file))) - (unless (file-directory-p pictures-dir) - (make-directory pictures-dir) - (org-odt-create-manifest-file-entry "" pictures-dir))) + (when (= 1 org-odt-embedded-images-count) + (make-directory target-dir) + (org-odt-create-manifest-file-entry "" target-dir)) - ;; copy image file - (unless (file-readable-p target-file) - (copy-file src-file target-file 'overwrite) - (org-odt-create-manifest-file-entry media-type target-file) - (push target-file org-export-odt-file-list))) target-file)) + (copy-file src-file target-file 'overwrite) + (org-odt-create-manifest-file-entry media-type target-file)) + target-file)) (defun org-odt-image-attrs-from-size (&optional width height) (concat @@ -1393,28 +1383,17 @@ MAY-INLINE-P allows inlining it as an image." (defun org-odt-init-outfile (filename) (unless (executable-find "zip") ;; Not at all OSes ship with zip by default - (error "Executable \"zip\" needed for creating OpenDocument files. Aborting.")) + (error "Executable \"zip\" needed for creating OpenDocument files")) (let* ((outdir (make-temp-file org-export-odt-tmpdir-prefix t)) - (mimetype-file (expand-file-name "mimetype" outdir)) - (content-file (expand-file-name "content.xml" outdir)) - (manifest-file (expand-file-name "META-INF/manifest.xml" outdir)) - (meta-file (expand-file-name "meta.xml" outdir)) - (styles-file (expand-file-name "styles.xml" outdir)) - (pictures-dir (expand-file-name "Pictures" outdir)) - (body-only nil)) - - ;; content file - (with-current-buffer (find-file-noselect content-file t) - (erase-buffer)) - - ;; FIXME: How to factor in body-only here - (unless body-only - ;; initialize list of files that contribute to the odt file - (setq org-export-odt-file-list org-export-odt-save-list)) - - ;; no manifest file entries for now - (setq org-odt-manifest-file-entries nil) + (content-file (expand-file-name "content.xml" outdir))) + + ;; init conten.xml + (with-current-buffer (find-file-noselect content-file t)) + + ;; reset variables + (setq org-odt-manifest-file-entries nil + org-odt-embedded-images-count 0) content-file)) @@ -1474,7 +1453,9 @@ visually." ;; write out the manifest entries before zipping (org-odt-write-manifest-file) - (let ((zipdir default-directory)) + (let ((xml-files '("mimetype" "META-INF/manifest.xml" "content.xml" + "meta.xml" "styles.xml")) + (zipdir default-directory)) (message "Switching to directory %s" (expand-file-name zipdir)) ;; save all xml files @@ -1485,7 +1466,7 @@ visually." (when org-export-odt-prettify-xml (indent-region (point-min) (point-max))) (save-buffer 0))) - org-export-odt-save-list) + xml-files) (let* ((target-name (file-name-nondirectory target)) (target-dir (file-name-directory target)) @@ -1513,7 +1494,7 @@ visually." (mapc (lambda (file) (kill-buffer (find-file-noselect (expand-file-name file zipdir) t))) - org-export-odt-save-list) + xml-files) (delete-directory zipdir))) -- 2.11.4.GIT