Browse Source

Merge branch 'maint'

Bastien Guerry 5 years ago
parent
commit
2e94271bd1
4 changed files with 216 additions and 107 deletions
  1. 106 52
      contrib/lisp/org-e-odt.el
  2. 100 51
      lisp/org-odt.el
  3. 1 1
      mk/default.mk
  4. 9 3
      mk/org-fixup.el

+ 106 - 52
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))
 

+ 100 - 51
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")

+ 1 - 1
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) \

+ 9 - 3
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))))