Allow omitting the "file:" prefix in some file links.

The file path must be absolute, or it must start with "./" or "../".
This commit is contained in:
Carsten Dominik 2008-06-24 08:37:50 +02:00
parent 84c2010d2c
commit 9b084b22f5
5 changed files with 66 additions and 26 deletions

View File

@ -17,6 +17,23 @@
** Overview
** Details
*** Simplified way to specify file links
In a link, you can now leave uout the "file:" prefix if you
write an absolute file name like =/Users/dominik/.emacs= or
=~/.emacs=, or if you write a relative file name by using
=./= or =../= to start the file path. You cannot write a
plain file name, because plain text is interpreted as an
internal link.
So for example, a link to an image /A.jpg/ with a thumbnail
/B.jpg/ can now be written like
#+begin_src org
[[./A.jpg][./B.jpg] ]
#+end_src
*** Changes in iCalendar export
Deadline and scheduling time stamps are now treated
differently in iCalendar export. The default behavior is now

View File

@ -2399,7 +2399,9 @@ the colon. The following list shows examples for each link type.
@example
http://www.astro.uva.nl/~dominik @r{on the web}
file:/home/dominik/images/jupiter.jpg @r{file, absolute path}
/home/dominik/images/jupiter.jpg @r{same as above}
file:papers/last.pdf @r{file, relative path}
./papers/last.pdf @r{same as above}
news:comp.emacs @r{Usenet link}
mailto:adent@@galaxy.net @r{Mail link}
vm:folder @r{VM folder link}

View File

@ -5,6 +5,9 @@
(org-icalendar-include-todo): Default changed to t.
(org-print-icalendar-entries): Implement better utilization of
scheduling and deadline time stamps.
(org-export-target-internal-links, org-export-as-html): Allow file
lines without the "file:" prefix if the file path is an absolute
path or starts with ".".
* org-clock.el (org-clocktable-shift): Also undertand yesterday,
lastweek etc.

View File

@ -1415,10 +1415,12 @@ on this string to produce the exported version."
(defun org-export-kill-licensed-text ()
"Remove all text that is marked with a :org-license-to-kill property."
(let (p)
(let (p q)
(while (setq p (text-property-any (point-min) (point-max)
:org-license-to-kill t))
(delete-region p (next-single-property-change p :org-license-to-kill)))))
(delete-region
p (or (next-single-property-change p :org-license-to-kill)
(point-max))))))
(defun org-export-define-heading-targets (target-alist)
"Find all headings and define the targets for them.
@ -1472,20 +1474,25 @@ let the link point to the corresponding section."
(slink (org-solidify-link-text link))
found props pos
(target
(or (cdr (assoc slink target-alist))
(save-excursion
(unless (string-match org-link-types-re link)
(setq found (condition-case nil (org-link-search link)
(error nil)))
(when (and found
(or (org-on-heading-p)
(not (eq found 'dedicated))))
(or (get-text-property (point) 'target)
(get-text-property
(max (point-min)
(1- (previous-single-property-change
(point) 'target)))
'target))))))))
(cond
((cdr (assoc slink target-alist)))
((string-match org-link-types-re link) nil)
((or (file-name-absolute-p link)
(string-match "^\\." link))
nil)
(t
(save-excursion
(setq found (condition-case nil (org-link-search link)
(error nil)))
(when (and found
(or (org-on-heading-p)
(not (eq found 'dedicated))))
(or (get-text-property (point) 'target)
(get-text-property
(max (point-min)
(1- (previous-single-property-change
(point) 'target)))
'target))))))))
(when target
(set-match-data md)
(goto-char (match-beginning 1))
@ -2954,8 +2961,14 @@ lang=\"%s\" xml:lang=\"%s\">
(setq start 0)
(while (string-match org-bracket-link-analytic-regexp line start)
(setq start (match-beginning 0))
(setq type (if (match-end 2) (match-string 2 line) "internal"))
(setq path (match-string 3 line))
(setq type (cond
((match-end 2) (match-string 2 line))
((save-match-data
(or (file-name-absolute-p path)
(string-match "^\\.\\.?/" path)))
"file")
(t "internal")))
(setq desc1 (if (match-end 5) (match-string 5 line))
desc2 (if (match-end 2) (concat type ":" path) path)
descp (and desc1 (not (equal desc1 desc2)))
@ -2987,6 +3000,13 @@ lang=\"%s\" xml:lang=\"%s\">
;; standard URL
(setq link (concat type ":" path))
(setq rpl (concat "<a href=\"" link "\">" desc "</a>")))
((functionp (setq fnc (nth 2 (assoc type org-link-protocols))))
;; The link protocol has a function for format the link
(setq rpl
(save-match-data
(funcall fnc (org-link-unescape path) desc1 'html))))
((string= type "file")
;; FILE link
(let* ((filename path)
@ -3027,12 +3047,6 @@ lang=\"%s\" xml:lang=\"%s\">
(concat "<a href=\"" thefile "\">" desc "</a>")))
(if (not valid) (setq rpl desc))))
((functionp (setq fnc (nth 2 (assoc type org-link-protocols))))
;; The link protocol has a function for format the link
(setq rpl
(save-match-data
(funcall fnc (org-link-unescape path) desc1 'html))))
(t
;; just publish the path, as default
(setq rpl (concat "<i>&lt;" type ":"

View File

@ -7123,9 +7123,13 @@ optional argument IN-EMACS is non-nil, Emacs will visit the file."
(while (string-match " *\n *" link)
(setq link (replace-match " " t t link)))
(setq link (org-link-expand-abbrev link))
(if (string-match org-link-re-with-space2 link)
(setq type (match-string 1 link) path (match-string 2 link))
(setq type "thisfile" path link))
(cond
((or (file-name-absolute-p link)
(string-match "^\\.\\.?/" link))
(setq type "file" path link))
((string-match org-link-re-with-space2 link)
(setq type (match-string 1 link) path (match-string 2 link)))
(t (setq type "thisfile" path link)))
(throw 'match t)))
(when (get-text-property (point) 'org-linked-text)