mirror of
https://git.savannah.gnu.org/git/emacs/org-mode.git
synced 2024-11-27 07:37:25 +00:00
org-e-odt.el: Handle conversion from odt to other formats.
Specifically take care of org-e-odt-convert and org-e-odt-preferred-output-format. Also other miscellaneous fixes.
This commit is contained in:
parent
4899b81483
commit
51e7e5dc41
@ -34,7 +34,6 @@
|
|||||||
:version "24.1")
|
:version "24.1")
|
||||||
|
|
||||||
;; FIXMES
|
;; FIXMES
|
||||||
;; org-export-preprocess-after-blockquote-hook
|
|
||||||
;; org-e-odt-preprocess-latex-fragments
|
;; org-e-odt-preprocess-latex-fragments
|
||||||
;; org-export-as-e-odt-and-open
|
;; org-export-as-e-odt-and-open
|
||||||
;; org-export-as-e-odt-batch
|
;; org-export-as-e-odt-batch
|
||||||
@ -50,7 +49,6 @@
|
|||||||
(error "Cannot determine style name for entity %s of type %s"
|
(error "Cannot determine style name for entity %s of type %s"
|
||||||
entity category))))
|
entity category))))
|
||||||
|
|
||||||
|
|
||||||
;; Following variable is let bound when `org-do-lparse' is in
|
;; Following variable is let bound when `org-do-lparse' is in
|
||||||
;; progress. See org-html.el.
|
;; progress. See org-html.el.
|
||||||
|
|
||||||
@ -101,7 +99,7 @@
|
|||||||
(concat
|
(concat
|
||||||
(org-e-odt-format-stylized-paragraph
|
(org-e-odt-format-stylized-paragraph
|
||||||
'subtitle
|
'subtitle
|
||||||
(org-odt-format-tags
|
(org-e-odt-format-tags
|
||||||
'("<text:date style:data-style-name=\"%s\" text:date-value=\"%s\">"
|
'("<text:date style:data-style-name=\"%s\" text:date-value=\"%s\">"
|
||||||
. "</text:date>")
|
. "</text:date>")
|
||||||
date "N75" iso-date))
|
date "N75" iso-date))
|
||||||
@ -553,10 +551,7 @@ styles congruent with the ODF-1.2 specification."
|
|||||||
(org-e-odt-format-link headline (concat "#" href))))
|
(org-e-odt-format-link headline (concat "#" href))))
|
||||||
|
|
||||||
(defun org-e-odt-format-toc-item (toc-entry level org-last-level)
|
(defun org-e-odt-format-toc-item (toc-entry level org-last-level)
|
||||||
(let ((style (format "Contents_20_%d"
|
(let ((style (format "Contents_20_%d" level)))
|
||||||
(+ level (or ;; (org-lparse-get 'TOPLEVEL-HLEVEL)
|
|
||||||
1
|
|
||||||
1) -1))))
|
|
||||||
(concat "\n" (org-e-odt-format-stylized-paragraph style toc-entry) "\n")))
|
(concat "\n" (org-e-odt-format-stylized-paragraph style toc-entry) "\n")))
|
||||||
|
|
||||||
;; Following variable is let bound during 'ORG-LINK callback. See
|
;; Following variable is let bound during 'ORG-LINK callback. See
|
||||||
@ -1388,58 +1383,13 @@ ATTR is a string of other attributes of the a element."
|
|||||||
(write-region mimetype nil (expand-file-name "mimetype"))
|
(write-region mimetype nil (expand-file-name "mimetype"))
|
||||||
mimetype))
|
mimetype))
|
||||||
|
|
||||||
(defun org-e-odt-finalize-outfile ()
|
|
||||||
(org-e-odt-delete-empty-paragraphs))
|
|
||||||
|
|
||||||
(defun org-e-odt-delete-empty-paragraphs ()
|
|
||||||
(goto-char (point-min))
|
|
||||||
(let ((open "<text:p[^>]*>")
|
|
||||||
(close "</text:p>"))
|
|
||||||
(while (re-search-forward (format "%s[ \r\n\t]*%s" open close) nil t)
|
|
||||||
(replace-match ""))))
|
|
||||||
|
|
||||||
(declare-function org-create-math-formula "org"
|
(declare-function org-create-math-formula "org"
|
||||||
(latex-frag &optional mathml-file))
|
(latex-frag &optional mathml-file))
|
||||||
|
|
||||||
;;;###autoload
|
|
||||||
(defun org-e-odt-convert (&optional in-file out-fmt prefix-arg)
|
|
||||||
"Convert IN-FILE to format OUT-FMT using a command line converter.
|
|
||||||
IN-FILE is the file to be converted. If unspecified, it defaults
|
|
||||||
to variable `buffer-file-name'. OUT-FMT is the desired output
|
|
||||||
format. Use `org-e-odt-convert-process' as the converter.
|
|
||||||
If PREFIX-ARG is non-nil then the newly converted file is opened
|
|
||||||
using `org-open-file'."
|
|
||||||
(interactive
|
|
||||||
(append (org-lparse-convert-read-params) current-prefix-arg))
|
|
||||||
(org-lparse-do-convert in-file out-fmt prefix-arg))
|
|
||||||
|
|
||||||
(defun org-e-odt-get (what &optional opt-plist)
|
(defun org-e-odt-get (what &optional opt-plist)
|
||||||
(case what
|
(case what
|
||||||
(BACKEND 'odt)
|
|
||||||
(EXPORT-DIR (org-export-directory :html opt-plist))
|
(EXPORT-DIR (org-export-directory :html opt-plist))
|
||||||
(FILE-NAME-EXTENSION "odt")
|
|
||||||
(EXPORT-BUFFER-NAME "*Org ODT Export*")
|
|
||||||
(ENTITY-CONTROL org-e-odt-entity-control-callbacks-alist)
|
|
||||||
(ENTITY-FORMAT org-e-odt-entity-format-callbacks-alist)
|
|
||||||
(INIT-METHOD 'org-e-odt-init-outfile)
|
|
||||||
(FINAL-METHOD 'org-e-odt-finalize-outfile)
|
|
||||||
(SAVE-METHOD 'org-e-odt-save-as-outfile)
|
|
||||||
(CONVERT-METHOD
|
|
||||||
(and org-e-odt-convert-process
|
|
||||||
(cadr (assoc-string org-e-odt-convert-process
|
|
||||||
org-e-odt-convert-processes t))))
|
|
||||||
(CONVERT-CAPABILITIES
|
|
||||||
(and org-e-odt-convert-process
|
|
||||||
(cadr (assoc-string org-e-odt-convert-process
|
|
||||||
org-e-odt-convert-processes t))
|
|
||||||
org-e-odt-convert-capabilities))
|
|
||||||
(TOPLEVEL-HLEVEL 1)
|
|
||||||
(SPECIAL-STRING-REGEXPS org-e-odt-special-string-regexps)
|
|
||||||
(INLINE-IMAGES 'maybe)
|
|
||||||
(INLINE-IMAGE-EXTENSIONS '("png" "jpeg" "jpg" "gif" "svg"))
|
|
||||||
(PLAIN-TEXT-MAP '(("&" . "&") ("<" . "<") (">" . ">")))
|
|
||||||
(TABLE-FIRST-COLUMN-AS-LABELS nil)
|
(TABLE-FIRST-COLUMN-AS-LABELS nil)
|
||||||
(FOOTNOTE-SEPARATOR )
|
|
||||||
(CODING-SYSTEM-FOR-WRITE 'utf-8)
|
(CODING-SYSTEM-FOR-WRITE 'utf-8)
|
||||||
(CODING-SYSTEM-FOR-SAVE 'utf-8)
|
(CODING-SYSTEM-FOR-SAVE 'utf-8)
|
||||||
(t (error "Unknown property: %s" what))))
|
(t (error "Unknown property: %s" what))))
|
||||||
@ -1489,20 +1439,6 @@ using `org-open-file'."
|
|||||||
;; (org-propertize (org-e-odt-encode-plain-text (ad-get-arg 0))
|
;; (org-propertize (org-e-odt-encode-plain-text (ad-get-arg 0))
|
||||||
;; 'org-protected t))))
|
;; 'org-protected t))))
|
||||||
|
|
||||||
(defun org-e-odt-preprocess-latex-fragments ()
|
|
||||||
(when (equal org-export-current-backend 'odt)
|
|
||||||
(org-e-odt-do-preprocess-latex-fragments)))
|
|
||||||
|
|
||||||
;; process latex fragments as part of
|
|
||||||
;; `org-export-preprocess-after-blockquote-hook'. Note that this hook
|
|
||||||
;; is the one that is closest and well before the call to
|
|
||||||
;; `org-export-attach-captions-and-attributes' in
|
|
||||||
;; `org-export-preprocess-string'. The above arrangement permits
|
|
||||||
;; captions, labels and attributes to be attached to png images
|
|
||||||
;; generated out of latex equations.
|
|
||||||
(add-hook 'org-export-preprocess-after-blockquote-hook
|
|
||||||
'org-e-odt-preprocess-latex-fragments)
|
|
||||||
|
|
||||||
(defun org-e-odt-zip-extract-one (archive member &optional target)
|
(defun org-e-odt-zip-extract-one (archive member &optional target)
|
||||||
(require 'arc-mode)
|
(require 'arc-mode)
|
||||||
(let* ((target (or target default-directory))
|
(let* ((target (or target default-directory))
|
||||||
@ -1718,9 +1654,6 @@ Use this to infer values of `org-e-odt-styles-dir' and
|
|||||||
Use this to infer values of `org-e-odt-styles-dir' and
|
Use this to infer values of `org-e-odt-styles-dir' and
|
||||||
`org-e-odt-schema-dir'.")
|
`org-e-odt-schema-dir'.")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(defconst org-e-odt-special-string-regexps
|
(defconst org-e-odt-special-string-regexps
|
||||||
'(("\\\\-" . "­\\1") ; shy
|
'(("\\\\-" . "­\\1") ; shy
|
||||||
("---\\([^-]\\)" . "—\\1") ; mdash
|
("---\\([^-]\\)" . "—\\1") ; mdash
|
||||||
@ -3337,8 +3270,8 @@ CONTENTS is nil. INFO is a plist holding contextual information."
|
|||||||
(defun org-e-odt-footnote-def (raw info) ; FIXME
|
(defun org-e-odt-footnote-def (raw info) ; FIXME
|
||||||
(if (equal (org-element-type raw) 'org-data)
|
(if (equal (org-element-type raw) 'org-data)
|
||||||
(org-trim (org-export-data raw 'e-odt info)) ; fix paragraph
|
(org-trim (org-export-data raw 'e-odt info)) ; fix paragraph
|
||||||
; style
|
; style
|
||||||
(org-odt-format-stylized-paragraph
|
(org-e-odt-format-stylized-paragraph
|
||||||
'footnote (org-trim (org-export-secondary-string raw 'e-odt info)))))
|
'footnote (org-trim (org-export-secondary-string raw 'e-odt info)))))
|
||||||
|
|
||||||
(defvar org-e-odt-footnote-separator
|
(defvar org-e-odt-footnote-separator
|
||||||
@ -4388,9 +4321,9 @@ Return output file's name."
|
|||||||
;; 'e-odt outfile subtreep visible-only body-only ext-plist))
|
;; 'e-odt outfile subtreep visible-only body-only ext-plist))
|
||||||
|
|
||||||
(let* ((outbuf (org-e-odt-init-outfile))
|
(let* ((outbuf (org-e-odt-init-outfile))
|
||||||
(target (org-export-output-file-name ".odt" subtreep pub-dir))
|
(target (org-export-output-file-name ".odt" subtreep pub-dir))
|
||||||
(outdir (file-name-directory (buffer-file-name outbuf)))
|
(outdir (file-name-directory (buffer-file-name outbuf)))
|
||||||
(default-directory outdir))
|
(default-directory outdir))
|
||||||
|
|
||||||
;; FIXME: for copying embedded images
|
;; FIXME: for copying embedded images
|
||||||
(setq org-current-export-file
|
(setq org-current-export-file
|
||||||
@ -4402,16 +4335,132 @@ Return output file's name."
|
|||||||
(memq 'subtree optns) (memq 'visible optns) (memq 'body optns))
|
(memq 'subtree optns) (memq 'visible optns) (memq 'body optns))
|
||||||
|
|
||||||
(setq org-lparse-opt-plist nil) ; FIXME
|
(setq org-lparse-opt-plist nil) ; FIXME
|
||||||
(org-e-odt-save-as-outfile target ;; info
|
(org-e-odt-save-as-outfile target ;; info
|
||||||
nil
|
nil
|
||||||
)
|
)
|
||||||
|
|
||||||
;; return outfile
|
;; return outfile
|
||||||
target))
|
(if (not org-e-odt-preferred-output-format) target
|
||||||
|
(or (org-e-odt-convert target org-e-odt-preferred-output-format)
|
||||||
|
target))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(defun org-e-odt-reachable-p (in-fmt out-fmt)
|
||||||
|
"Return non-nil if IN-FMT can be converted to OUT-FMT."
|
||||||
|
(catch 'done
|
||||||
|
(let ((reachable-formats (org-e-odt-do-reachable-formats in-fmt)))
|
||||||
|
(dolist (e reachable-formats)
|
||||||
|
(let ((out-fmt-spec (assoc out-fmt (cdr e))))
|
||||||
|
(when out-fmt-spec
|
||||||
|
(throw 'done (cons (car e) out-fmt-spec))))))))
|
||||||
|
|
||||||
|
(defun org-e-odt-do-convert (in-file out-fmt &optional prefix-arg)
|
||||||
|
"Workhorse routine for `org-e-odt-convert'."
|
||||||
|
(require 'browse-url)
|
||||||
|
(let* ((in-file (expand-file-name (or in-file buffer-file-name)))
|
||||||
|
(dummy (or (file-readable-p in-file)
|
||||||
|
(error "Cannot read %s" in-file)))
|
||||||
|
(in-fmt (file-name-extension in-file))
|
||||||
|
(out-fmt (or out-fmt (error "Output format unspecified")))
|
||||||
|
(how (or (org-e-odt-reachable-p in-fmt out-fmt)
|
||||||
|
(error "Cannot convert from %s format to %s format?"
|
||||||
|
in-fmt out-fmt)))
|
||||||
|
(convert-process (car how))
|
||||||
|
(out-file (concat (file-name-sans-extension in-file) "."
|
||||||
|
(nth 1 (or (cdr how) out-fmt))))
|
||||||
|
(extra-options (or (nth 2 (cdr how)) ""))
|
||||||
|
(out-dir (file-name-directory in-file))
|
||||||
|
(cmd (format-spec convert-process
|
||||||
|
`((?i . ,(shell-quote-argument in-file))
|
||||||
|
(?I . ,(browse-url-file-url in-file))
|
||||||
|
(?f . ,out-fmt)
|
||||||
|
(?o . ,out-file)
|
||||||
|
(?O . ,(browse-url-file-url out-file))
|
||||||
|
(?d . , (shell-quote-argument out-dir))
|
||||||
|
(?D . ,(browse-url-file-url out-dir))
|
||||||
|
(?x . ,extra-options)))))
|
||||||
|
(when (file-exists-p out-file)
|
||||||
|
(delete-file out-file))
|
||||||
|
|
||||||
|
(message "Executing %s" cmd)
|
||||||
|
(let ((cmd-output (shell-command-to-string cmd)))
|
||||||
|
(message "%s" cmd-output))
|
||||||
|
|
||||||
|
(cond
|
||||||
|
((file-exists-p out-file)
|
||||||
|
(message "Exported to %s" out-file)
|
||||||
|
(when prefix-arg
|
||||||
|
(message "Opening %s..." out-file)
|
||||||
|
(org-open-file out-file))
|
||||||
|
out-file)
|
||||||
|
(t
|
||||||
|
(message "Export to %s failed" out-file)
|
||||||
|
nil))))
|
||||||
|
|
||||||
|
(defun org-e-odt-do-reachable-formats (in-fmt)
|
||||||
|
"Return verbose info about formats to which IN-FMT can be converted.
|
||||||
|
Return a list where each element is of the
|
||||||
|
form (CONVERTER-PROCESS . OUTPUT-FMT-ALIST). See
|
||||||
|
`org-e-odt-convert-processes' for CONVERTER-PROCESS and see
|
||||||
|
`org-e-odt-convert-capabilities' for OUTPUT-FMT-ALIST."
|
||||||
|
(let* ((converter
|
||||||
|
(and org-e-odt-convert-process
|
||||||
|
(cadr (assoc-string org-e-odt-convert-process
|
||||||
|
org-e-odt-convert-processes t))))
|
||||||
|
(capabilities
|
||||||
|
(and org-e-odt-convert-process
|
||||||
|
(cadr (assoc-string org-e-odt-convert-process
|
||||||
|
org-e-odt-convert-processes t))
|
||||||
|
org-e-odt-convert-capabilities))
|
||||||
|
reachable-formats)
|
||||||
|
(when converter
|
||||||
|
(dolist (c capabilities)
|
||||||
|
(when (member in-fmt (nth 1 c))
|
||||||
|
(push (cons converter (nth 2 c)) reachable-formats))))
|
||||||
|
reachable-formats))
|
||||||
|
|
||||||
|
(defun org-e-odt-reachable-formats (in-fmt)
|
||||||
|
"Return list of formats to which IN-FMT can be converted.
|
||||||
|
The list of the form (OUTPUT-FMT-1 OUTPUT-FMT-2 ...)."
|
||||||
|
(let (l)
|
||||||
|
(mapc (lambda (e) (add-to-list 'l e))
|
||||||
|
(apply 'append (mapcar
|
||||||
|
(lambda (e) (mapcar 'car (cdr e)))
|
||||||
|
(org-e-odt-do-reachable-formats in-fmt))))
|
||||||
|
l))
|
||||||
|
|
||||||
|
(defun org-e-odt-convert-read-params ()
|
||||||
|
"Return IN-FILE and OUT-FMT params for `org-e-odt-do-convert'.
|
||||||
|
This is a helper routine for interactive use."
|
||||||
|
(let* ((input (if (featurep 'ido) 'ido-completing-read 'completing-read))
|
||||||
|
(in-file (read-file-name "File to be converted: "
|
||||||
|
nil buffer-file-name t))
|
||||||
|
(in-fmt (file-name-extension in-file))
|
||||||
|
(out-fmt-choices (org-e-odt-reachable-formats in-fmt))
|
||||||
|
(out-fmt
|
||||||
|
(or (and out-fmt-choices
|
||||||
|
(funcall input "Output format: "
|
||||||
|
out-fmt-choices nil nil nil))
|
||||||
|
(error
|
||||||
|
"No known converter or no known output formats for %s files"
|
||||||
|
in-fmt))))
|
||||||
|
(list in-file out-fmt)))
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(defun org-e-odt-convert (&optional in-file out-fmt prefix-arg)
|
||||||
|
"Convert IN-FILE to format OUT-FMT using a command line converter.
|
||||||
|
IN-FILE is the file to be converted. If unspecified, it defaults
|
||||||
|
to variable `buffer-file-name'. OUT-FMT is the desired output
|
||||||
|
format. Use `org-e-odt-convert-process' as the converter.
|
||||||
|
If PREFIX-ARG is non-nil then the newly converted file is opened
|
||||||
|
using `org-open-file'."
|
||||||
|
(interactive
|
||||||
|
(append (org-e-odt-convert-read-params) current-prefix-arg))
|
||||||
|
(org-e-odt-do-convert in-file out-fmt prefix-arg))
|
||||||
|
|
||||||
;;; FIXMES, TODOS, FOR REVIEW etc
|
;;; FIXMES, TODOS, FOR REVIEW etc
|
||||||
|
|
||||||
;;;; org-format-table-html
|
;;;; org-format-table-html
|
||||||
@ -4438,7 +4487,6 @@ Return output file's name."
|
|||||||
;;;; (org-export-directory :html opt-plist)
|
;;;; (org-export-directory :html opt-plist)
|
||||||
;;;; (plist-get opt-plist :html-extension)
|
;;;; (plist-get opt-plist :html-extension)
|
||||||
;;;; org-e-odt-toplevel-hlevel
|
;;;; org-e-odt-toplevel-hlevel
|
||||||
;;;; org-e-odt-special-string-regexps
|
|
||||||
;;;; org-e-odt-coding-system
|
;;;; org-e-odt-coding-system
|
||||||
;;;; org-e-odt-coding-system
|
;;;; org-e-odt-coding-system
|
||||||
;;;; org-e-odt-inline-image-extensions
|
;;;; org-e-odt-inline-image-extensions
|
||||||
@ -4461,11 +4509,6 @@ Return output file's name."
|
|||||||
(cons (concat "\\." (car desc) "\\'") 'archive-mode)))
|
(cons (concat "\\." (car desc) "\\'") 'archive-mode)))
|
||||||
org-e-odt-file-extensions)
|
org-e-odt-file-extensions)
|
||||||
|
|
||||||
;; FIXME
|
|
||||||
;; (eval-after-load 'org-exp
|
|
||||||
;; '(add-to-list 'org-export-inbuffer-options-extra
|
|
||||||
;; '("ODT_STYLES_FILE" :odt-styles-file)))
|
|
||||||
|
|
||||||
(provide 'org-e-odt)
|
(provide 'org-e-odt)
|
||||||
|
|
||||||
;;; org-e-odt.el ends here
|
;;; org-e-odt.el ends here
|
||||||
|
Loading…
Reference in New Issue
Block a user