Function: org-link-expand-abbrev

org-link-expand-abbrev is a byte-compiled function defined in ol.el.gz.

Signature

(org-link-expand-abbrev LINK)

Documentation

Replace link abbreviations in LINK string.

Abbreviations are defined in org-link-abbrev-alist.

Source Code

;; Defined in /usr/src/emacs/lisp/org/ol.el.gz
(defun org-link-expand-abbrev (link)
  "Replace link abbreviations in LINK string.
Abbreviations are defined in `org-link-abbrev-alist'."
  (if (not (string-match "^\\([^:]*\\)\\(::?\\(.*\\)\\)?$" link)) link
    (let* ((key (match-string 1 link))
	   (as (or (assoc key org-link-abbrev-alist-local)
		   (assoc key org-link-abbrev-alist)))
	   (tag (and (match-end 2) (match-string 3 link)))
	   rpl)
      (if (not as)
	  link
	(setq rpl (cdr as))
        ;; Drop any potentially dangerous text properties like
        ;; `modification-hooks' that may be used as an attack vector.
        (substring-no-properties
	 (cond
	  ((symbolp rpl) (funcall rpl tag))
	  ((string-match "%(\\([^)]+\\))" rpl)
           (let ((rpl-fun-symbol (intern-soft (match-string 1 rpl))))
             ;; Using `unsafep-function' is not quite enough because
             ;; Emacs considers functions like `genenv' safe, while
             ;; they can potentially be used to expose private system
             ;; data to attacker if abbreviated link is clicked.
             (if (or (eq t (get rpl-fun-symbol 'org-link-abbrev-safe))
                     (eq t (get rpl-fun-symbol 'pure)))
                 (replace-match
                  (save-match-data
                    (funcall (intern-soft (match-string 1 rpl)) tag))
                  t t rpl)
               (org-display-warning
                (format "Disabling unsafe link abbrev: %s
You may mark function safe via (put '%s 'org-link-abbrev-safe t)"
                        rpl (match-string 1 rpl)))
               (setq org-link-abbrev-alist-local (delete as org-link-abbrev-alist-local)
                     org-link-abbrev-alist (delete as org-link-abbrev-alist))
               link
	       )))
	  ((string-match "%s" rpl) (replace-match (or tag "") t t rpl))
	  ((string-match "%h" rpl)
	   (replace-match (url-hexify-string (or tag "")) t t rpl))
	  (t (concat rpl tag))))))))