forked from mirrors/org-mode
ox: Add link localisation feature using persist
* lisp/ox.el (org-export-link-remote-p): A new function to determine whether a link refers to a remote resource. (org-export-link--remote-local-copy): Download and return the local location of a remote resource link. (org-export-link-localise): Transform remote links to refer to a local copy of the resource. * lisp/ox-latex.el (org-latex-link, org-latex-inline-image-rules): Make use of the new functions for remote resources in ox.el to support embedding https and tramp -linked files.
This commit is contained in:
parent
b3ceafd0b9
commit
6ee45518f3
|
@ -755,8 +755,11 @@ environment."
|
||||||
|
|
||||||
(defcustom org-latex-inline-image-rules
|
(defcustom org-latex-inline-image-rules
|
||||||
`(("file" . ,(rx "."
|
`(("file" . ,(rx "."
|
||||||
(or "pdf" "jpeg" "jpg" "png" "ps" "eps" "tikz" "pgf" "svg")
|
(or "pdf" "jpeg" "jpg" "png" "ps" "eps" "tikz" "pgf" "svg")
|
||||||
eos)))
|
eos))
|
||||||
|
("https" . ,(rx "."
|
||||||
|
(or "jpeg" "jpg" "png" "ps" "eps" "tikz" "pgf" "svg")
|
||||||
|
eos)))
|
||||||
"Rules characterizing image files that can be inlined into LaTeX.
|
"Rules characterizing image files that can be inlined into LaTeX.
|
||||||
|
|
||||||
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
|
||||||
|
@ -2588,7 +2591,7 @@ INFO is a plist holding contextual information. See
|
||||||
;; Link type is handled by a special function.
|
;; Link type is handled by a special function.
|
||||||
((org-export-custom-protocol-maybe link desc 'latex info))
|
((org-export-custom-protocol-maybe link desc 'latex info))
|
||||||
;; Image file.
|
;; Image file.
|
||||||
(imagep (org-latex--inline-image link info))
|
(imagep (org-latex--inline-image (org-export-link-localise link) info))
|
||||||
;; Radio link: Transcode target's contents and use them as link's
|
;; Radio link: Transcode target's contents and use them as link's
|
||||||
;; description.
|
;; description.
|
||||||
((string= type "radio")
|
((string= type "radio")
|
||||||
|
|
41
lisp/ox.el
41
lisp/ox.el
|
@ -4446,6 +4446,47 @@ Return value can be an object or an element:
|
||||||
(concat (if (string-prefix-p "/" fullname) "file://" "file:///")
|
(concat (if (string-prefix-p "/" fullname) "file://" "file:///")
|
||||||
fullname)))))
|
fullname)))))
|
||||||
|
|
||||||
|
(defun org-export-link-remote-p (link)
|
||||||
|
"Returns non-nil if the link refers to a remote resource."
|
||||||
|
(or (member (org-element-property :type link) '("http" "https" "ftp"))
|
||||||
|
(and (string= (org-element-property :type link) "file")
|
||||||
|
(file-remote-p (org-element-property :path link)))))
|
||||||
|
|
||||||
|
(defun org-export-link--remote-local-copy (link)
|
||||||
|
"Download the remote resource specified by LINK, and return its local path."
|
||||||
|
;; TODO work this into ol.el as a link parameter, say :download.
|
||||||
|
(let* ((location-type
|
||||||
|
(pcase (org-element-property :type link)
|
||||||
|
((or "http" "https" "ftp") 'url)
|
||||||
|
((and "file" (guard (file-remote-p
|
||||||
|
(org-element-property :path link))))
|
||||||
|
'file)
|
||||||
|
(_ (error "Cannot copy %s:%s to a local file"
|
||||||
|
(org-element-property :type link)
|
||||||
|
(org-element-property :path link)))))
|
||||||
|
(path
|
||||||
|
(pcase location-type
|
||||||
|
('url
|
||||||
|
(concat (org-element-property :type link)
|
||||||
|
":" (org-element-property :path link)))
|
||||||
|
('file
|
||||||
|
(org-element-property :path link)))))
|
||||||
|
(or (org-persist-read location-type path)
|
||||||
|
(org-persist-register location-type path
|
||||||
|
:write-immediately t))))
|
||||||
|
|
||||||
|
(defun org-export-link-localise (link)
|
||||||
|
"If LINK refers to a remote resource, modify it to point to a local downloaded copy."
|
||||||
|
(when (org-export-link-remote-p link)
|
||||||
|
(let* ((local-path (org-export-link--remote-local-copy link)))
|
||||||
|
(setcdr link
|
||||||
|
(thread-first (cadr link)
|
||||||
|
(plist-put :type "file")
|
||||||
|
(plist-put :path local-path)
|
||||||
|
(plist-put :raw-link (concat "file:" local-path))
|
||||||
|
list))))
|
||||||
|
link)
|
||||||
|
|
||||||
;;;; For References
|
;;;; For References
|
||||||
;;
|
;;
|
||||||
;; `org-export-get-reference' associate a unique reference for any
|
;; `org-export-get-reference' associate a unique reference for any
|
||||||
|
|
Loading…
Reference in a new issue