diff --git a/contrib/lisp/org-e-odt.el b/contrib/lisp/org-e-odt.el index 28799e3ee..0ce2e6995 100644 --- a/contrib/lisp/org-e-odt.el +++ b/contrib/lisp/org-e-odt.el @@ -116,6 +116,18 @@ ;;; Internal Variables +(defconst org-e-odt-lib-dir + (file-name-directory load-file-name) + "Location of ODT exporter. +Use this to infer values of `org-e-odt-styles-dir' and +`org-e-odt-schema-dir'.") + +(defvar org-e-odt-data-dir + (expand-file-name "../../etc/" org-e-odt-lib-dir) + "Data directory for ODT exporter. +Use this to infer values of `org-e-odt-styles-dir' and +`org-e-odt-schema-dir'.") + (defconst org-e-odt-special-string-regexps '(("\\\\-" . "­\\1") ; shy ("---\\([^-]\\)" . "—\\1") ; mdash @@ -123,37 +135,69 @@ ("\\.\\.\\." . "…")) ; hellip "Regular expressions for special string conversion.") +(defconst org-e-odt-schema-dir-list + (list + (and org-e-odt-data-dir + (expand-file-name "./schema/" org-e-odt-data-dir)) ; bail out + (eval-when-compile + (and (boundp 'org-e-odt-data-dir) org-e-odt-data-dir ; see make install + (expand-file-name "./schema/" org-e-odt-data-dir)))) + "List of directories to search for OpenDocument schema files. +Use this list to set the default value of +`org-e-odt-schema-dir'. The entries in this list are +populated heuristically based on the values of `org-e-odt-lib-dir' +and `org-e-odt-data-dir'.") + +(defconst org-e-odt-styles-dir-list + (list + (and org-e-odt-data-dir + (expand-file-name "./styles/" org-e-odt-data-dir)) ; bail out + (eval-when-compile + (and (boundp 'org-e-odt-data-dir) org-e-odt-data-dir ; see make install + (expand-file-name "./styles/" org-e-odt-data-dir))) + (expand-file-name "../../etc/styles/" org-e-odt-lib-dir) ; git + (expand-file-name "./etc/styles/" org-e-odt-lib-dir) ; elpa + (expand-file-name "./org/" data-directory) ; system + ) + "List of directories to search for OpenDocument styles files. +See `org-e-odt-styles-dir'. The entries in this list are populated +heuristically based on the values of `org-e-odt-lib-dir' and +`org-e-odt-data-dir'.") + (defconst org-e-odt-styles-dir - (let* ((d (expand-file-name (org-find-library-dir "org-e-odt.el"))) - (styles-dir-list (list - (concat d "etc/styles/") ;; ELPA and Git - (concat d "etc/org/") ;; Org from Emacs - (concat d "../" - (number-to-string emacs-major-version) "." - (number-to-string emacs-minor-version) "/etc/org/") - (concat data-directory "org/"))) ;; Custom install - styles-dir) - (setq styles-dir - (car - (delq nil - (mapcar (lambda (sd) - (when (and (file-readable-p - (expand-file-name - "OrgOdtContentTemplate.xml" sd)) - (file-readable-p - (expand-file-name - "OrgOdtStyles.xml" sd))) - sd)) - styles-dir-list)))) - (or (expand-file-name styles-dir) - (message "Cannot find factory styles files for Org ODT"))) + (let* ((styles-dir + (catch 'styles-dir + (message "Debug (org-e-odt): Searching for OpenDocument styles files...") + (mapc (lambda (styles-dir) + (when styles-dir + (message "Debug (org-e-odt): Trying %s..." styles-dir) + (when (and (file-readable-p + (expand-file-name + "OrgOdtContentTemplate.xml" styles-dir)) + (file-readable-p + (expand-file-name + "OrgOdtStyles.xml" styles-dir))) + (message "Debug (org-e-odt): Using styles under %s" + styles-dir) + (throw 'styles-dir styles-dir)))) + org-e-odt-styles-dir-list) + nil))) + (unless styles-dir + (error "Error (org-e-odt): Cannot find factory styles files, aborting")) + styles-dir) "Directory that holds auxiliary XML files used by the ODT exporter. This directory contains the following XML files - -\"OrgOdtStyles.xml\" and \"OrgOdtContentTemplate.xml\". -These XML files are used as the default values of -`org-export-odt-styles-file' and -`org-export-odt-content-template-file'.") + \"OrgOdtStyles.xml\" and \"OrgOdtContentTemplate.xml\". These + XML files are used as the default values of + `org-e-odt-styles-file' and + `org-e-odt-content-template-file'. + +The default value of this variable varies depending on the +version of org in use and is initialized from +`org-e-odt-styles-dir-list'. Note that the user could be using org +from one of: org's own private git repository, GNU ELPA tar or +standard Emacs.") (defconst org-e-odt-bookmark-prefix "OrgXref.") @@ -330,26 +374,28 @@ visually." ;;;; Document schema (defcustom org-e-odt-schema-dir - (let* ((d (expand-file-name (org-find-library-dir "org-e-odt.el"))) - (schema-dir-list (list (concat d "../etc/schema/"))) ;; ELPA and Git - schema-dir) - (setq schema-dir - (car - (delq nil - (mapcar (lambda (sd) - (when (and (file-readable-p - (expand-file-name - "od-manifest-schema-v1.2-cs01.rnc" sd)) - (file-readable-p - (expand-file-name - "od-schema-v1.2-cs01.rnc" sd)) - (file-readable-p - (expand-file-name - "schemas.xml" sd))) - sd)) - schema-dir-list)))) - (or schema-dir - (message "No OpenDocument schema files installed"))) + (let* ((schema-dir + (catch 'schema-dir + (message "Debug (org-e-odt): Searching for OpenDocument schema files...") + (mapc + (lambda (schema-dir) + (when schema-dir + (message "Debug (org-e-odt): Trying %s..." schema-dir) + (when (and (file-readable-p + (expand-file-name "od-manifest-schema-v1.2-cs01.rnc" + schema-dir)) + (file-readable-p + (expand-file-name "od-schema-v1.2-cs01.rnc" + schema-dir)) + (file-readable-p + (expand-file-name "schemas.xml" schema-dir))) + (message "Debug (org-e-odt): Using schema files under %s" + schema-dir) + (throw 'schema-dir schema-dir)))) + org-e-odt-schema-dir-list) + (message "Debug (org-e-odt): No OpenDocument schema files installed") + nil))) + schema-dir) "Directory that contains OpenDocument schema files. This directory contains: @@ -362,13 +408,15 @@ that `rng-schema-locating-files' is updated and auto-validation of OpenDocument XML takes place based on the value `rng-nxml-auto-validate-flag'. -The OASIS schema files are available only in the Org's private -git repository. It is *not* bundled with GNU ELPA tar or -standard Emacs distribution." +The default value of this variable varies depending on the +version of org in use and is initialized from +`org-e-odt-schema-dir-list'. The OASIS schema files are available +only in the org's private git repository. It is *not* bundled +with GNU ELPA tar or standard Emacs distribution." :type '(choice (const :tag "Not set" nil) (directory :tag "Schema directory")) - :group 'org-e-odt + :group 'org-export-e-odt :version "24.1" :set (lambda (var value) @@ -384,12 +432,17 @@ Also add it to `rng-schema-locating-files'." (file-readable-p (expand-file-name "schemas.xml" schema-dir))) schema-dir - (when value (message "No OpenDocument schema files"))))) + (when value + (message "Error (org-e-odt): %s has no OpenDocument schema files" + value)) + nil))) (when org-e-odt-schema-dir (eval-after-load 'rng-loc '(add-to-list 'rng-schema-locating-files (expand-file-name "schemas.xml" org-e-odt-schema-dir)))))) + + ;;;; Document styles (defcustom org-e-odt-content-template-file nil @@ -1788,6 +1841,7 @@ CONTENTS is nil. INFO is a plist holding contextual information." ;;;; Latex Environment + (eval-after-load 'org-odt '(ad-deactivate 'org-format-latex-as-mathml)) diff --git a/lisp/org-odt.el b/lisp/org-odt.el index 117c824c8..7e7e5e1b0 100644 --- a/lisp/org-odt.el +++ b/lisp/org-odt.el @@ -84,27 +84,52 @@ ("\\.\\.\\." . "…")) ; hellip "Regular expressions for special string conversion.") +(defconst org-odt-lib-dir (file-name-directory load-file-name) + "Location of ODT exporter. +Use this to infer values of `org-odt-styles-dir' and +`org-export-odt-schema-dir'.") + +(defvar org-odt-data-dir nil + "Data directory for ODT exporter. +Use this to infer values of `org-odt-styles-dir' and +`org-export-odt-schema-dir'.") + +(defconst org-odt-schema-dir-list + (list + (and org-odt-data-dir + (expand-file-name "./schema/" org-odt-data-dir)) ; bail out + (eval-when-compile + (and (boundp 'org-odt-data-dir) org-odt-data-dir ; see make install + (expand-file-name "./schema/" org-odt-data-dir)))) + "List of directories to search for OpenDocument schema files. +Use this list to set the default value of +`org-export-odt-schema-dir'. The entries in this list are +populated heuristically based on the values of `org-odt-lib-dir' +and `org-odt-data-dir'.") + (defcustom org-export-odt-schema-dir - (let* ((d (expand-file-name "../" (org-find-library-dir "org-odt.el"))) - (schema-dir-list (list (concat d "etc/schema/"))) ;; ELPA and Git - schema-dir) - (setq schema-dir - (car - (delq nil - (mapcar (lambda (sd) - (when (and (file-readable-p - (expand-file-name - "od-manifest-schema-v1.2-cs01.rnc" sd)) - (file-readable-p - (expand-file-name - "od-schema-v1.2-cs01.rnc" sd)) - (file-readable-p - (expand-file-name - "schemas.xml" sd))) - sd)) - schema-dir-list)))) - (or schema-dir - (message "No OpenDocument schema files installed"))) + (let* ((schema-dir + (catch 'schema-dir + (message "Debug (org-odt): Searching for OpenDocument schema files...") + (mapc + (lambda (schema-dir) + (when schema-dir + (message "Debug (org-odt): Trying %s..." schema-dir) + (when (and (file-readable-p + (expand-file-name "od-manifest-schema-v1.2-cs01.rnc" + schema-dir)) + (file-readable-p + (expand-file-name "od-schema-v1.2-cs01.rnc" + schema-dir)) + (file-readable-p + (expand-file-name "schemas.xml" schema-dir))) + (message "Debug (org-odt): Using schema files under %s" + schema-dir) + (throw 'schema-dir schema-dir)))) + org-odt-schema-dir-list) + (message "Debug (org-odt): No OpenDocument schema files installed") + nil))) + schema-dir) "Directory that contains OpenDocument schema files. This directory contains: @@ -117,9 +142,11 @@ that `rng-schema-locating-files' is updated and auto-validation of OpenDocument XML takes place based on the value `rng-nxml-auto-validate-flag'. -The OASIS schema files are available only in the Org's private -git repository. It is *not* bundled with GNU ELPA tar or -standard Emacs distribution." +The default value of this variable varies depending on the +version of org in use and is initialized from +`org-odt-schema-dir-list'. The OASIS schema files are available +only in the org's private git repository. It is *not* bundled +with GNU ELPA tar or standard Emacs distribution." :type '(choice (const :tag "Not set" nil) (directory :tag "Schema directory")) @@ -139,44 +166,66 @@ Also add it to `rng-schema-locating-files'." (file-readable-p (expand-file-name "schemas.xml" schema-dir))) schema-dir - (when value (message "No OpenDocument schema files"))))) + (when value + (message "Error (org-odt): %s has no OpenDocument schema files" + value)) + nil))) (when org-export-odt-schema-dir (eval-after-load 'rng-loc '(add-to-list 'rng-schema-locating-files (expand-file-name "schemas.xml" org-export-odt-schema-dir)))))) +(defconst org-odt-styles-dir-list + (list + (and org-odt-data-dir + (expand-file-name "./styles/" org-odt-data-dir)) ; bail out + (eval-when-compile + (and (boundp 'org-odt-data-dir) org-odt-data-dir ; see make install + (expand-file-name "./styles/" org-odt-data-dir))) + (expand-file-name "../etc/styles/" org-odt-lib-dir) ; git + (expand-file-name "./etc/styles/" org-odt-lib-dir) ; elpa + (expand-file-name "./org/" data-directory) ; system + ) + "List of directories to search for OpenDocument styles files. +See `org-odt-styles-dir'. The entries in this list are populated +heuristically based on the values of `org-odt-lib-dir' and +`org-odt-data-dir'.") + (defconst org-odt-styles-dir - (let* ((d (expand-file-name "../" (org-find-library-dir "org-odt.el"))) - (styles-dir-list (list - (concat d "etc/styles/") ;; ELPA and Git - (concat d "etc/org/") ;; Org from Emacs - (concat d "../" - (number-to-string emacs-major-version) "." - (number-to-string emacs-minor-version) "/etc/org/") - (concat data-directory "org/"))) ;; Custom install - styles-dir) - (setq styles-dir - (car - (delq nil - (mapcar (lambda (sd) - (when (and (file-readable-p - (expand-file-name - "OrgOdtContentTemplate.xml" sd)) - (file-readable-p - (expand-file-name - "OrgOdtStyles.xml" sd))) - sd)) - styles-dir-list)))) - (or (expand-file-name styles-dir) - (message "Cannot find factory styles files for Org ODT, aborting"))) + (let* ((styles-dir + (catch 'styles-dir + (message "Debug (org-odt): Searching for OpenDocument styles files...") + (mapc (lambda (styles-dir) + (when styles-dir + (message "Debug (org-odt): Trying %s..." styles-dir) + (when (and (file-readable-p + (expand-file-name + "OrgOdtContentTemplate.xml" styles-dir)) + (file-readable-p + (expand-file-name + "OrgOdtStyles.xml" styles-dir))) + (message "Debug (org-odt): Using styles under %s" + styles-dir) + (throw 'styles-dir styles-dir)))) + org-odt-styles-dir-list) + nil))) + (unless styles-dir + (error "Error (org-odt): Cannot find factory styles files, aborting")) + styles-dir) "Directory that holds auxiliary XML files used by the ODT exporter. This directory contains the following XML files - -\"OrgOdtStyles.xml\" and \"OrgOdtContentTemplate.xml\". -These XML files are used as the default values of -`org-export-odt-styles-file' and -`org-export-odt-content-template-file'.") + \"OrgOdtStyles.xml\" and \"OrgOdtContentTemplate.xml\". These + XML files are used as the default values of + `org-export-odt-styles-file' and + `org-export-odt-content-template-file'. + +The default value of this variable varies depending on the +version of org in use and is initialized from +`org-odt-styles-dir-list'. Note that the user could be using org +from one of: org's own private git repository, GNU ELPA tar or +standard Emacs.") (defvar org-odt-file-extensions '(("odt" . "OpenDocument Text") diff --git a/mk/default.mk b/mk/default.mk index b3befad62..dcd29476a 100644 --- a/mk/default.mk +++ b/mk/default.mk @@ -91,7 +91,7 @@ MAKE_ORG_INSTALL = $(BATCHL) \ MAKE_ORG_VERSION = $(BATCHL) \ --eval '(load "org-compat.el")' \ --eval '(load "../mk/org-fixup.el")' \ - --eval '(org-make-org-version "$(ORGVERSION)" "$(GITVERSION)")' + --eval '(org-make-org-version "$(ORGVERSION)" "$(GITVERSION)" "$(datadir)")' # How to byte-compile the whole source directory ELCDIR = $(BATCHL) \ diff --git a/mk/org-fixup.el b/mk/org-fixup.el index 2e2d48aa2..7b59efb88 100644 --- a/mk/org-fixup.el +++ b/mk/org-fixup.el @@ -27,7 +27,7 @@ (require 'autoload) (require 'org-compat "org-compat.el") -(defun org-make-org-version (org-release org-git-version) +(defun org-make-org-version (org-release org-git-version odt-dir) "Make the file org-version.el in the current directory. This function is internally used by the build system and should be used by foreign build systems or installers to produce this @@ -51,6 +51,9 @@ the Git work tree)." Inserted by installing org-mode or when a release is made.\" (let ((org-git-version \"" org-git-version "\")) org-git-version)) +;;;\#\#\#autoload +\(defvar org-odt-data-dir \"" odt-dir "\" + \"The location of ODT styles.\") \f\n\(provide 'org-version\) \f\n;; Local Variables:\n;; version-control: never ;; no-byte-compile: t @@ -84,12 +87,15 @@ force re-compilation. This function is provided for easier manual install when the build system can't be used." (let* ((origin default-directory) (dirlisp (org-find-library-dir "org")) - (dirorg (concat dirlisp "../" ))) + (dirorg (concat dirlisp "../" )) + (dirodt (if (boundp 'org-odt-data-dir) + org-odt-data-dir + (concat dirorg "etc/")))) (unwind-protect (progn (cd dirlisp) (org-fixup) - (org-make-org-version (org-release) (org-git-version)) + (org-make-org-version (org-release) (org-git-version) dirodt) (org-make-org-loaddefs) (when compile (byte-recompile-directory dirlisp 0 force))) (cd origin))))