浏览代码

Improve attachment link export functionality

Make attachment links export just as file links.

* lisp/ox-ascii.el
* lisp/ox-html.el
* lisp/ox-latex.el
* lisp/ox-man.el
* lisp/ox-md.el
* lisp/ox-texinfo.el
* lisp/org-attach.el: Move export functionality for attachment links
  into the respective export backend, for feature parity with file
  links.
Gustav Wikström 6 年之前
父节点
当前提交
d70db54dbc
共有 8 个文件被更改,包括 116 次插入48 次删除
  1. 0 21
      lisp/org-attach.el
  2. 22 11
      lisp/ox-ascii.el
  3. 16 5
      lisp/ox-html.el
  4. 17 1
      lisp/ox-latex.el
  5. 15 2
      lisp/ox-man.el
  6. 16 4
      lisp/ox-md.el
  7. 15 2
      lisp/ox-odt.el
  8. 15 2
      lisp/ox-texinfo.el

+ 0 - 21
lisp/org-attach.el

@@ -637,7 +637,6 @@ Basically, this adds the path to the attachment directory."
 
 
 (org-link-set-parameters "attachment"
 (org-link-set-parameters "attachment"
                          :follow #'org-attach-open-link
                          :follow #'org-attach-open-link
-                         :export #'org-attach-export-link
                          :complete #'org-attach-complete-link)
                          :complete #'org-attach-complete-link)
 
 
 (defun org-attach-open-link (link &optional in-emacs)
 (defun org-attach-open-link (link &optional in-emacs)
@@ -678,26 +677,6 @@ and to use an external application to visit the file."
 	   (t (concat "attachment:" file))))
 	   (t (concat "attachment:" file))))
       (error "No attachment directory exist"))))
       (error "No attachment directory exist"))))
 
 
-(defun org-attach-export-link (link description format)
-  "Translate attachment LINK from Org mode format to exported FORMAT.
-Also includes the DESCRIPTION of the link in the export."
-  (save-excursion
-    (let (path desc)
-      (cond
-       ((string-match "::\\([0-9]+\\)\\'" link)
-        (setq link (substring link 0 (match-beginning 0))))
-       ((string-match "::\\(.+\\)\\'" link)
-        (setq link (substring link 0 (match-beginning 0)))))
-      (setq path (file-relative-name (org-attach-expand link))
-            desc (or description link))
-      (pcase format
-        (`html (format "<a target=\"_blank\" href=\"%s\">%s</a>" path desc))
-        (`latex (format "\\href{%s}{%s}" path desc))
-        (`texinfo (format "@uref{%s,%s}" path desc))
-        (`ascii (format "%s (%s)" desc path))
-        (`md (format "[%s](%s)" desc path))
-        (_ path)))))
-
 (defun org-attach-archive-delete-maybe ()
 (defun org-attach-archive-delete-maybe ()
   "Maybe delete subtree attachments when archiving.
   "Maybe delete subtree attachments when archiving.
 This function is called by `org-archive-hook'.  The option
 This function is called by `org-archive-hook'.  The option

+ 22 - 11
lisp/ox-ascii.el

@@ -31,7 +31,10 @@
 (require 'ox-publish)
 (require 'ox-publish)
 (require 'cl-lib)
 (require 'cl-lib)
 
 
+;;; Function Declarations
+
 (declare-function aa2u "ext:ascii-art-to-unicode" ())
 (declare-function aa2u "ext:ascii-art-to-unicode" ())
+(declare-function org-attach-expand "org-attach" (file))
 
 
 ;;; Define Back-End
 ;;; Define Back-End
 ;;
 ;;
@@ -1567,13 +1570,24 @@ CONTENTS is nil.  INFO is a plist holding contextual
 
 
 DESC is the description part of the link, or the empty string.
 DESC is the description part of the link, or the empty string.
 INFO is a plist holding contextual information."
 INFO is a plist holding contextual information."
-  (let ((type (org-element-property :type link)))
+  (let* ((raw-type (org-element-property :type link))
+	 (type (if (string= raw-type "attachment")
+		   ;; Attachments are simplified representations of
+		   ;; file links.  When exporting, expose attachments
+		   ;; as if they were file links.
+		   "file"
+		 raw-type))
+	 (raw-path (org-element-property :path link))
+	 (path (cond
+		((string= raw-type "attachment")
+		 (setq raw-path (file-relative-name (org-attach-expand raw-path)))
+		 (concat type ":" raw-path))
+		(t (concat type ":" raw-path)))))
     (cond
     (cond
      ((org-export-custom-protocol-maybe link desc 'ascii))
      ((org-export-custom-protocol-maybe link desc 'ascii))
      ((string= type "coderef")
      ((string= type "coderef")
-      (let ((ref (org-element-property :path link)))
-	(format (org-export-get-coderef-format ref desc)
-		(org-export-resolve-coderef ref info))))
+      (format (org-export-get-coderef-format path desc)
+	      (org-export-resolve-coderef path info)))
      ;; Do not apply a special syntax on radio links.  Though, use
      ;; Do not apply a special syntax on radio links.  Though, use
      ;; transcoded target's contents as output.
      ;; transcoded target's contents as output.
      ((string= type "radio") desc)
      ((string= type "radio") desc)
@@ -1605,13 +1619,10 @@ INFO is a plist holding contextual information."
 	  ;; Don't know what to do.  Signal it.
 	  ;; Don't know what to do.  Signal it.
 	  (_ "???"))))
 	  (_ "???"))))
      (t
      (t
-      (let ((raw-link (concat (org-element-property :type link)
-			      ":"
-			      (org-element-property :path link))))
-	(if (not (org-string-nw-p desc)) (format "<%s>" raw-link)
-	  (concat (format "[%s]" desc)
-		  (and (not (plist-get info :ascii-links-to-notes))
-		       (format " (<%s>)" raw-link)))))))))
+      (if (not (org-string-nw-p desc)) (format "<%s>" path)
+	(concat (format "[%s]" desc)
+		(and (not (plist-get info :ascii-links-to-notes))
+		     (format " (<%s>)" path))))))))
 
 
 
 
 ;;;; Node Properties
 ;;;; Node Properties

+ 16 - 5
lisp/ox-html.el

@@ -42,6 +42,7 @@
 (declare-function org-id-find-id-file "org-id" (id))
 (declare-function org-id-find-id-file "org-id" (id))
 (declare-function htmlize-region "ext:htmlize" (beg end))
 (declare-function htmlize-region "ext:htmlize" (beg end))
 (declare-function mm-url-decode-entities "mm-url" ())
 (declare-function mm-url-decode-entities "mm-url" ())
+(declare-function org-attach-expand "org-attach" (file))
 
 
 (defvar htmlize-css-name-prefix)
 (defvar htmlize-css-name-prefix)
 (defvar htmlize-output-type)
 (defvar htmlize-output-type)
@@ -884,10 +885,9 @@ link to the image."
   :type 'boolean)
   :type 'boolean)
 
 
 (defcustom org-html-inline-image-rules
 (defcustom org-html-inline-image-rules
-  '(("file" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\)\\'")
-    ("attachment" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\)\\'")
-    ("http" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\)\\'")
-    ("https" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\)\\'"))
+  `(("file" . ,(regexp-opt '(".jpeg" ".jpg" ".png" ".gif" ".svg")))
+    ("http" . ,(regexp-opt '(".jpeg" ".jpg" ".png" ".gif" ".svg")))
+    ("https" . ,(regexp-opt '(".jpeg" ".jpg" ".png" ".gif" ".svg"))))
   "Rules characterizing image files that can be inlined into HTML.
   "Rules characterizing image files that can be inlined into HTML.
 A rule consists in an association whose key is the type of link
 A rule consists in an association whose key is the type of link
 to consider, and value is a regexp that will be matched against
 to consider, and value is a regexp that will be matched against
@@ -3064,7 +3064,13 @@ INFO is a plist holding contextual information.  See
 	      (concat (file-name-sans-extension raw-path) "."
 	      (concat (file-name-sans-extension raw-path) "."
 		      (plist-get info :html-extension)))
 		      (plist-get info :html-extension)))
 	     (t raw-path))))
 	     (t raw-path))))
-	 (type (org-element-property :type link))
+	 (raw-type (org-element-property :type link))
+	 (type (if (string= raw-type "attachment")
+		   ;; Attachments are simplified representations of
+		   ;; file links.  When exporting, expose attachments
+		   ;; as if they were file links.
+		   "file"
+		 raw-type))
 	 (raw-path (org-element-property :path link))
 	 (raw-path (org-element-property :path link))
 	 ;; Ensure DESC really exists, or set it to nil.
 	 ;; Ensure DESC really exists, or set it to nil.
 	 (desc (org-string-nw-p desc))
 	 (desc (org-string-nw-p desc))
@@ -3073,6 +3079,11 @@ INFO is a plist holding contextual information.  See
 	   ((member type '("http" "https" "ftp" "mailto" "news"))
 	   ((member type '("http" "https" "ftp" "mailto" "news"))
 	    (url-encode-url (concat type ":" raw-path)))
 	    (url-encode-url (concat type ":" raw-path)))
 	   ((string= type "file")
 	   ((string= type "file")
+	    ;; Pre-parse the path from attachment-format to
+	    ;; file-format to make attachment links use all export
+	    ;; functionality from file links with correct pathing.
+	    (when (string= raw-type "attachment")
+	      (setq raw-path (org-attach-expand raw-path)))
 	    ;; During publishing, turn absolute file names belonging
 	    ;; During publishing, turn absolute file names belonging
 	    ;; to base directory into relative file names.  Otherwise,
 	    ;; to base directory into relative file names.  Otherwise,
 	    ;; append "file" protocol to absolute file name.
 	    ;; append "file" protocol to absolute file name.

+ 17 - 1
lisp/ox-latex.el

@@ -30,6 +30,10 @@
 (require 'ox)
 (require 'ox)
 (require 'ox-publish)
 (require 'ox-publish)
 
 
+;;; Function Declarations
+
+(declare-function org-attach-expand "org-attach" (file))
+
 (defvar org-latex-default-packages-alist)
 (defvar org-latex-default-packages-alist)
 (defvar org-latex-packages-alist)
 (defvar org-latex-packages-alist)
 (defvar orgtbl-exp-regexp)
 (defvar orgtbl-exp-regexp)
@@ -737,6 +741,8 @@ environment."
 
 
 (defcustom org-latex-inline-image-rules
 (defcustom org-latex-inline-image-rules
   `(("file" . ,(regexp-opt
   `(("file" . ,(regexp-opt
+		'("pdf" "jpeg" "jpg" "png" "ps" "eps" "tikz" "pgf" "svg")))
+    ("attachment" . ,(regexp-opt
 		'("pdf" "jpeg" "jpg" "png" "ps" "eps" "tikz" "pgf" "svg"))))
 		'("pdf" "jpeg" "jpg" "png" "ps" "eps" "tikz" "pgf" "svg"))))
   "Rules characterizing image files that can be inlined into LaTeX.
   "Rules characterizing image files that can be inlined into LaTeX.
 
 
@@ -2356,6 +2362,8 @@ LINK is the link pointing to the inline image.  INFO is a plist
 used as a communication channel."
 used as a communication channel."
   (let* ((parent (org-export-get-parent-element link))
   (let* ((parent (org-export-get-parent-element link))
 	 (path (let ((raw-path (org-element-property :path link)))
 	 (path (let ((raw-path (org-element-property :path link)))
+		 (when (string= (org-element-property :type link) "attachment")
+		   (setq raw-path (file-relative-name (org-attach-expand raw-path))))
 		 (if (not (file-name-absolute-p raw-path)) raw-path
 		 (if (not (file-name-absolute-p raw-path)) raw-path
 		   (expand-file-name raw-path))))
 		   (expand-file-name raw-path))))
 	 (filetype (file-name-extension path))
 	 (filetype (file-name-extension path))
@@ -2511,7 +2519,13 @@ used as a communication channel."
 DESC is the description part of the link, or the empty string.
 DESC is the description part of the link, or the empty string.
 INFO is a plist holding contextual information.  See
 INFO is a plist holding contextual information.  See
 `org-export-data'."
 `org-export-data'."
-  (let* ((type (org-element-property :type link))
+  (let* ((raw-type (org-element-property :type link))
+	 (type (if (string= raw-type "attachment")
+		   ;; Attachments are simplified representations of
+		   ;; file links.  When exporting, expose attachments
+		   ;; as if they were file links.
+		   "file"
+		 raw-type))
 	 (raw-path (org-element-property :path link))
 	 (raw-path (org-element-property :path link))
 	 ;; Ensure DESC really exists, or set it to nil.
 	 ;; Ensure DESC really exists, or set it to nil.
 	 (desc (and (not (string= desc "")) desc))
 	 (desc (and (not (string= desc "")) desc))
@@ -2521,6 +2535,8 @@ INFO is a plist holding contextual information.  See
 		(cond ((member type '("http" "https" "ftp" "mailto" "doi"))
 		(cond ((member type '("http" "https" "ftp" "mailto" "doi"))
 		       (concat type ":" raw-path))
 		       (concat type ":" raw-path))
 		      ((string= type "file")
 		      ((string= type "file")
+		       (when (string= raw-type "attachment")
+			 (setq raw-path (file-relative-name (org-attach-expand raw-path))))
 		       (org-export-file-uri raw-path))
 		       (org-export-file-uri raw-path))
 		      (t
 		      (t
 		       raw-path)))))
 		       raw-path)))))

+ 15 - 2
lisp/ox-man.el

@@ -40,6 +40,10 @@
 (require 'cl-lib)
 (require 'cl-lib)
 (require 'ox)
 (require 'ox)
 
 
+;;; Function Declarations
+
+(declare-function org-attach-expand "org-attach" (file))
+
 (defvar org-export-man-default-packages-alist)
 (defvar org-export-man-default-packages-alist)
 (defvar org-export-man-packages-alist)
 (defvar org-export-man-packages-alist)
 (defvar orgtbl-exp-regexp)
 (defvar orgtbl-exp-regexp)
@@ -605,14 +609,23 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
 DESC is the description part of the link, or the empty string.
 DESC is the description part of the link, or the empty string.
 INFO is a plist holding contextual information.  See
 INFO is a plist holding contextual information.  See
 `org-export-data'."
 `org-export-data'."
-  (let* ((type (org-element-property :type link))
+  (let* ((raw-type (org-element-property :type link))
+	 (type (if (string= raw-type "attachment")
+		   ;; Attachments are simplified representations of
+		   ;; file links.  When exporting, expose attachments
+		   ;; as if they were file links.
+		   "file"
+		 raw-type))
          (raw-path (org-element-property :path link))
          (raw-path (org-element-property :path link))
          ;; Ensure DESC really exists, or set it to nil.
          ;; Ensure DESC really exists, or set it to nil.
          (desc (and (not (string= desc "")) desc))
          (desc (and (not (string= desc "")) desc))
          (path (cond
          (path (cond
                 ((member type '("http" "https" "ftp" "mailto"))
                 ((member type '("http" "https" "ftp" "mailto"))
                  (concat type ":" raw-path))
                  (concat type ":" raw-path))
-                ((string= type "file") (org-export-file-uri raw-path))
+                ((string= type "file")
+		 (when (string= raw-type "attachment")
+		   (setq raw-path (file-relative-name (org-attach-expand raw-path))))
+		 (org-export-file-uri raw-path))
                 (t raw-path))))
                 (t raw-path))))
     (cond
     (cond
      ;; Link type is handled by a special function.
      ;; Link type is handled by a special function.

+ 16 - 4
lisp/ox-md.el

@@ -33,6 +33,10 @@
 (require 'ox-publish)
 (require 'ox-publish)
 
 
 
 
+;;; Function Declarations
+
+(declare-function org-attach-expand "org-attach" (file))
+
 ;;; User-Configurable Variables
 ;;; User-Configurable Variables
 
 
 (defgroup org-export-md nil
 (defgroup org-export-md nil
@@ -396,12 +400,20 @@ INFO is a plist holding contextual information.  See
 	    (if (string= ".org" (downcase (file-name-extension raw-path ".")))
 	    (if (string= ".org" (downcase (file-name-extension raw-path ".")))
 		(concat (file-name-sans-extension raw-path) ".md")
 		(concat (file-name-sans-extension raw-path) ".md")
 	      raw-path)))
 	      raw-path)))
-	 (type (org-element-property :type link))
-	 (raw-path (raw-path (org-element-property :path link)))
+	 (raw-type (org-element-property :type link))
+	 (type (if (string= raw-type "attachment")
+		   ;; Attachments are simplified representations of
+		   ;; file links.  When exporting, expose attachments
+		   ;; as if they were file links.
+		   "file"
+		 raw-type))
+	 (raw-path (org-element-property :path link))
 	 (path (cond
 	 (path (cond
 		((member type '("http" "https" "ftp" "mailto"))
 		((member type '("http" "https" "ftp" "mailto"))
-		 (concat type ":" path))
+		 (concat type ":" raw-path))
 		((string= type "file")
 		((string= type "file")
+		 (when (string= raw-type "attachment")
+		   (setq raw-path (file-relative-name (org-attach-expand raw-path))))
 		 (org-export-file-uri (funcall link-org-files-as-md raw-path)))
 		 (org-export-file-uri (funcall link-org-files-as-md raw-path)))
 		(t raw-path))))
 		(t raw-path))))
     (cond
     (cond
@@ -432,7 +444,7 @@ INFO is a plist holding contextual information.  See
 		(org-export-get-reference destination info))))
 		(org-export-get-reference destination info))))
 	  (_
 	  (_
 	   (let ((description
 	   (let ((description
-		  (or (org-string-nw-p contents)
+		  (or (org-string-nw-p desc)
 		      (let ((number (org-export-get-ordinal destination info)))
 		      (let ((number (org-export-get-ordinal destination info)))
 			(cond
 			(cond
 			 ((not number) nil)
 			 ((not number) nil)

+ 15 - 2
lisp/ox-odt.el

@@ -32,6 +32,10 @@
 (require 'ox)
 (require 'ox)
 (require 'table nil 'noerror)
 (require 'table nil 'noerror)
 
 
+;;; Function Declarations
+
+(declare-function org-attach-expand "org-attach" (file))
+
 ;;; Define Back-End
 ;;; Define Back-End
 
 
 (org-export-define-backend 'odt
 (org-export-define-backend 'odt
@@ -2692,7 +2696,13 @@ Return nil, otherwise."
 DESC is the description part of the link, or the empty string.
 DESC is the description part of the link, or the empty string.
 INFO is a plist holding contextual information.  See
 INFO is a plist holding contextual information.  See
 `org-export-data'."
 `org-export-data'."
-  (let* ((type (org-element-property :type link))
+  (let* ((raw-type (org-element-property :type link))
+	 (type (if (string= raw-type "attachment")
+		   ;; Attachments are simplified representations of
+		   ;; file links.  When exporting, expose attachments
+		   ;; as if they were file links.
+		   "file"
+		 raw-type))
 	 (raw-path (org-element-property :path link))
 	 (raw-path (org-element-property :path link))
 	 ;; Ensure DESC really exists, or set it to nil.
 	 ;; Ensure DESC really exists, or set it to nil.
 	 (desc (and (not (string= desc "")) desc))
 	 (desc (and (not (string= desc "")) desc))
@@ -2701,7 +2711,10 @@ INFO is a plist holding contextual information.  See
 	 (path (cond
 	 (path (cond
 		((member type '("http" "https" "ftp" "mailto"))
 		((member type '("http" "https" "ftp" "mailto"))
 		 (concat type ":" raw-path))
 		 (concat type ":" raw-path))
-		((string= type "file") (org-export-file-uri raw-path))
+		((string= type "file")
+		 (when (string= raw-type "attachment")
+		   (setq raw-path (file-relative-name (org-attach-expand raw-path))))
+		 (org-export-file-uri raw-path))
 		(t raw-path)))
 		(t raw-path)))
 	 ;; Convert & to &amp; for correct XML representation
 	 ;; Convert & to &amp; for correct XML representation
 	 (path (replace-regexp-in-string "&" "&amp;" path)))
 	 (path (replace-regexp-in-string "&" "&amp;" path)))

+ 15 - 2
lisp/ox-texinfo.el

@@ -28,6 +28,10 @@
 (require 'cl-lib)
 (require 'cl-lib)
 (require 'ox)
 (require 'ox)
 
 
+;;; Function Declarations
+
+(declare-function org-attach-expand "org-attach" (file))
+
 (defvar orgtbl-exp-regexp)
 (defvar orgtbl-exp-regexp)
 
 
 
 
@@ -1045,14 +1049,23 @@ nil."
 DESC is the description part of the link, or the empty string.
 DESC is the description part of the link, or the empty string.
 INFO is a plist holding contextual information.  See
 INFO is a plist holding contextual information.  See
 `org-export-data'."
 `org-export-data'."
-  (let* ((type (org-element-property :type link))
+  (let* ((raw-type (org-element-property :type link))
+	 (type (if (string= raw-type "attachment")
+		   ;; Attachments are simplified representations of
+		   ;; file links.  When exporting, expose attachments
+		   ;; as if they were file links.
+		   "file"
+		 raw-type))
 	 (raw-path (org-element-property :path link))
 	 (raw-path (org-element-property :path link))
 	 ;; Ensure DESC really exists, or set it to nil.
 	 ;; Ensure DESC really exists, or set it to nil.
 	 (desc (and (not (string= desc "")) desc))
 	 (desc (and (not (string= desc "")) desc))
 	 (path (cond
 	 (path (cond
 		((member type '("http" "https" "ftp"))
 		((member type '("http" "https" "ftp"))
 		 (concat type ":" raw-path))
 		 (concat type ":" raw-path))
-		((string= type "file") (org-export-file-uri raw-path))
+		((string= type "file")
+		 (when (string= raw-type "attachment")
+		   (setq raw-path (org-attach-expand raw-path)))
+		 (org-export-file-uri raw-path))
 		(t raw-path))))
 		(t raw-path))))
     (cond
     (cond
      ((org-export-custom-protocol-maybe link desc 'texinfo))
      ((org-export-custom-protocol-maybe link desc 'texinfo))