Browse Source

org-element: Extract search option and application in "file"-type links

* lisp/org-element.el (org-element-link-type-is-file): New variable.
(org-element-link-parser): Extract search option and application in
"file"-type links.
* contrib/lisp/org-e-html.el (org-e-html-link): Remove components
  extraction since this in now done in `org-element-link-parser'.
* contrib/lisp/org-e-odt.el: Remove components extraction since this
  in now done in `org-element-link-parser'.
* contrib/lisp/org-e-texinfo.el (org-e-texinfo-link): Remove
  components extraction since this in now done in
  `org-element-link-parser'.
* contrib/lisp/org-e-latex.el (org-e-latex-link): Remove components
  extraction since this in now done in `org-element-link-parser'.
* contrib/lisp/org-e-man.el (org-e-man-link): Remove components
  extraction since this in now done in `org-element-link-parser'.
* contrib/lisp/org-e-groff.el (org-e-groff-link): Remove components
  extraction since this in now done in `org-element-link-parser'.
* contrib/lisp/org-md.el (org-md-link): Remove components extraction
  since this in now done in `org-element-link-parser'.
* testing/lisp/test-org-element.el: Add tests.
Nicolas Goaziou 12 years ago
parent
commit
d86f09a854

+ 0 - 2
contrib/lisp/org-e-groff.el

@@ -1336,8 +1336,6 @@ INFO is a plist holding contextual information.  See
                 ((member type '("http" "https" "ftp" "mailto"))
                  (concat type ":" raw-path))
                 ((string= type "file")
-                 (when (string-match "\\(.+\\)::.+" raw-path)
-                   (setq raw-path (match-string 1 raw-path)))
                  (if (file-name-absolute-p raw-path)
                      (concat "file://" (expand-file-name raw-path))
                    (concat "file://" raw-path)))

+ 0 - 4
contrib/lisp/org-e-html.el

@@ -2277,10 +2277,6 @@ INFO is a plist holding contextual information.  See
 		((member type '("http" "https" "ftp" "mailto"))
 		 (concat type ":" raw-path))
 		((string= type "file")
-		 ;; Extract just the file path and strip all other
-		 ;; components.
-		 (when (string-match "\\(.+\\)::.+" raw-path)
-		   (setq raw-path (match-string 1 raw-path)))
 		 ;; Treat links to ".org" files as ".html", if needed.
 		 (setq raw-path (funcall --link-org-files-as-html-maybe
 					 raw-path info))

+ 0 - 2
contrib/lisp/org-e-latex.el

@@ -1748,8 +1748,6 @@ INFO is a plist holding contextual information.  See
 		((member type '("http" "https" "ftp" "mailto"))
 		 (concat type ":" raw-path))
 		((string= type "file")
-		 (when (string-match "\\(.+\\)::.+" raw-path)
-		   (setq raw-path (match-string 1 raw-path)))
 		 (if (file-name-absolute-p raw-path)
 		     (concat "file://" (expand-file-name raw-path))
 		   (concat "file://" raw-path)))

+ 0 - 2
contrib/lisp/org-e-man.el

@@ -731,8 +731,6 @@ INFO is a plist holding contextual information.  See
                 ((member type '("http" "https" "ftp" "mailto"))
                  (concat type ":" raw-path))
                 ((string= type "file")
-                 (when (string-match "\\(.+\\)::.+" raw-path)
-                   (setq raw-path (match-string 1 raw-path)))
                  (if (file-name-absolute-p raw-path)
                      (concat "file://" (expand-file-name raw-path))
                    (concat "file://" raw-path)))

+ 0 - 2
contrib/lisp/org-e-odt.el

@@ -2485,8 +2485,6 @@ INFO is a plist holding contextual information.  See
 		((member type '("http" "https" "ftp" "mailto"))
 		 (concat type ":" raw-path))
 		((string= type "file")
-		 (when (string-match "\\(.+\\)::.+" raw-path)
-		   (setq raw-path (match-string 1 raw-path)))
 		 (if (file-name-absolute-p raw-path)
 		     (concat "file://" (expand-file-name raw-path))
 		   (concat "file://" raw-path)))

+ 0 - 2
contrib/lisp/org-e-texinfo.el

@@ -1223,8 +1223,6 @@ INFO is a plist holding contextual information.  See
 		((member type '("http" "https" "ftp"))
 		 (concat type ":" raw-path))
 		((string= type "file")
-		 (when (string-match "\\(.+\\)::.+" raw-path)
-		   (setq raw-path (match-string 1 raw-path)))
 		 (if (file-name-absolute-p raw-path)
 		     (concat "file://" (expand-file-name raw-path))
 		   (concat "file://" raw-path)))

+ 0 - 4
contrib/lisp/org-md.el

@@ -307,10 +307,6 @@ a communication channel."
 			   ((member type '("http" "https" "ftp"))
 			    (concat type ":" raw-path))
 			   ((equal type "file")
-			    ;; Extract just the file path and strip
-			    ;; all other components.
-			    (when (string-match "\\(.+\\)::.+" raw-path)
-			      (setq raw-path (match-string 1 raw-path)))
 			    ;; Treat links to ".org" files as ".html",
 			    ;; if needed.
 			    (setq raw-path

+ 26 - 3
lisp/org-element.el

@@ -214,6 +214,12 @@ regexp matching one object can also match the other object.")
 Names must be uppercase.  Any block whose name has no association
 is parsed with `org-element-special-block-parser'.")
 
+(defconst org-element-link-type-is-file
+  '("file" "file+emacs" "file+sys" "docview")
+  "List of link types equivalent to \"file\".
+Only these types can accept search options and an explicit
+application to open them.")
+
 (defconst org-element-affiliated-keywords
   '("CAPTION" "DATA" "HEADER" "HEADERS" "LABEL" "NAME" "PLOT" "RESNAME" "RESULT"
     "RESULTS" "SOURCE" "SRCNAME" "TBLNAME")
@@ -2717,14 +2723,15 @@ beginning position."
   "Parse link at point.
 
 Return a list whose CAR is `link' and CDR a plist with `:type',
-`:path', `:raw-link', `:begin', `:end', `:contents-begin',
-`:contents-end' and `:post-blank' as keywords.
+`:path', `:raw-link', `:application', `:search-option', `:begin',
+`:end', `:contents-begin', `:contents-end' and `:post-blank' as
+keywords.
 
 Assume point is at the beginning of the link."
   (save-excursion
     (let ((begin (point))
 	  end contents-begin contents-end link-end post-blank path type
-	  raw-link link)
+	  raw-link link search-option application)
       (cond
        ;; Type 1: Text targeted from a radio target.
        ((and org-target-link-regexp (looking-at org-target-link-regexp))
@@ -2779,10 +2786,26 @@ Assume point is at the beginning of the link."
       ;; LINK-END variable.
       (setq post-blank (progn (goto-char link-end) (skip-chars-forward " \t"))
 	    end (point))
+      ;; Extract search option and opening application out of
+      ;; "file"-type links.
+      (when (member type org-element-link-type-is-file)
+	;; Application.
+	(cond ((string-match "^file\\+\\(.*\\)$" type)
+	       (setq application (match-string 1 type)))
+	      ((not (string-match "^file" type))
+	       (setq application type)))
+	;; Extract search option from PATH.
+	(when (string-match "::\\(.*\\)$" path)
+	  (setq search-option (match-string 1 path)
+		path (replace-match "" nil nil path)))
+	;; Make sure TYPE always report "file".
+	(setq type "file"))
       (list 'link
 	    (list :type type
 		  :path path
 		  :raw-link (or raw-link path)
+		  :application application
+		  :search-option search-option
 		  :begin begin
 		  :end end
 		  :contents-begin contents-begin

+ 20 - 0
testing/lisp/test-org-element.el

@@ -1101,6 +1101,26 @@ e^{i\\pi}+1=0
       (org-element-property
        :type
        (org-element-map (org-element-parse-buffer) 'link 'identity nil t)))))
+  ;; 2.9 File-type link with search option.
+  (should
+   (equal
+    '(("file" "projects.org" "*task title"))
+    (org-test-with-temp-text "[[file:projects.org::*task title]]"
+      (org-element-map
+       (org-element-parse-buffer) 'link
+       (lambda (l) (list (org-element-property :type l)
+		    (org-element-property :path l)
+		    (org-element-property :search-option l)))))))
+  ;; 2.10 File-type link with application.
+  (should
+   (equal
+    '(("file" "projects.org" "docview"))
+    (org-test-with-temp-text "[[docview:projects.org]]"
+      (org-element-map
+       (org-element-parse-buffer) 'link
+       (lambda (l) (list (org-element-property :type l)
+		    (org-element-property :path l)
+		    (org-element-property :application l)))))))
   ;; 3. Plain link.
   (should
    (org-test-with-temp-text "A link: http://orgmode.org"