]> git.donarmstrong.com Git - org-ref.git/blobdiff - org-ref.el
another minor tweak of cite express regexp
[org-ref.git] / org-ref.el
index 8495d42be827fb40498b2fd157a54a5457b1dad7..248a417f1b7defa3dac79f16480a358210956365 100644 (file)
@@ -326,7 +326,7 @@ You will see a message in the minibuffer when on a cite, ref or label link."
                       (replace-regexp-in-string "\*" "\\\\*" x)
                       )
                     org-ref-cite-types "\\|") "\\)"
-  ":\\([a-zA-Z0-9-_:]*,?\\)*"))
+  ":\\([a-zA-Z0-9-_:\\./]*,?\\)*"))
 
 
 (setq org-ref-label-re
@@ -504,7 +504,8 @@ Format according to the type in `org-ref-bibliography-entry-format'."
                 (loop for file in org-ref-bibliography-files do
                       (if (org-ref-key-in-file-p key (file-truename file))
                           (throw 'result file)
-                        (message "%s not found in %s" key (file-truename file))))))
+                        (message "%s not found in %s"
+                                 key (file-truename file))))))
 
     (with-temp-buffer
       (insert-file-contents file)
@@ -975,10 +976,9 @@ ARG does nothing."
        :type "custom_id"
        :link (format "[[#%s]]" (org-entry-get (point) "CUSTOM_ID"))))
 
-    ;; and to #+label: lines. In a table these are retrieved by :name
-    ;; properties.
-    (when (and (-contains? '(paragraph table src-block)
-                          (org-element-type object))
+    ;; and to #+label: lines
+
+    (when (and (equal (org-element-type object) 'paragraph)
               (org-element-property :name object))
       (org-store-link-props
        :type "ref"
@@ -993,10 +993,8 @@ ARG does nothing."
    "on clicking goto the label. Navigate back with C-c &"
    (org-mark-ring-push)
    ;; next search from beginning of the buffer
-
    ;; it is possible you would not find the label if narrowing is in effect
    (widen)
-
    (unless
        (or
        ;; our label links
@@ -1012,20 +1010,15 @@ ARG does nothing."
        ;; #+label: name  org-definition
        (progn
          (goto-char (point-min))
-         (re-search-forward (format "^#\\+label:\\s-*\\(%s\\)\\b" label) nil t))
+         (re-search-forward
+          (format "^#\\+label:\\s-*\\(%s\\)\\b" label) nil t))
 
        ;; org tblname
        (progn
          (goto-char (point-min))
-         (re-search-forward (format "^#\\+tblname:\\s-*\\(%s\\)\\b" label) nil t))
-
-;; Commented out because these ref links do not actually translate correctly in LaTeX.
-;; you need [[#label]] links.
-       ;; CUSTOM_ID
-;      (progn
-;        (goto-char (point-min))
-;        (re-search-forward (format ":CUSTOM_ID:\s-*\\(%s\\)" label) nil t))
-       )
+         (re-search-forward
+          (format "^#\\+tblname:\\s-*\\(%s\\)\\b" label) nil t)))
+
      ;; we did not find anything, so go back to where we came
      (org-mark-ring-goto)
      (error "%s not found" label))
@@ -1038,14 +1031,20 @@ ARG does nothing."
     ((eq format 'latex)
      (format "\\ref{%s}" keyword)))))
 
+
 (defun org-ref-get-org-labels ()
  "Return a list of #+LABEL: labels."
   (save-excursion
     (goto-char (point-min))
     (let ((matches '()))
       (while (re-search-forward "^#\\+label:\\s-+\\(.*\\)\\b" (point-max) t)
-       (add-to-list 'matches (match-string-no-properties 1) t))
-matches)))
+       ;; do not do this for tables. We get those in `org-ref-get-tblnames'.
+       ;; who would have thought you have save match data here? Trust me. When
+       ;; I wrote this, you did.
+       (unless (save-match-data  (equal (car (org-element-at-point)) 'table))
+         (add-to-list 'matches (match-string-no-properties 1) t)))
+      matches)))
+
 
 (defun org-ref-get-custom-ids ()
  "Return a list of custom_id properties in the buffer."
@@ -1055,7 +1054,8 @@ matches)))
       (let ((custom_id (org-entry-get (point) "CUSTOM_ID")))
        (when (not (null custom_id))
          (setq results (append results (list custom_id)))))))
-results))
+   results))
+
 
 (defun org-ref-get-latex-labels ()
   "Return list of matchin LaTeX defined labels in buffer."
@@ -1064,7 +1064,8 @@ results))
     (let ((matches '()))
       (while (re-search-forward "\\\\label{\\([a-zA-z0-9:-]*\\)}" (point-max) t)
        (add-to-list 'matches (match-string-no-properties 1) t))
-matches)))
+      matches)))
+
 
 (defun org-ref-get-tblnames ()
   "Return list of table names in the buffer."
@@ -1072,6 +1073,7 @@ matches)))
     (lambda (table)
       (org-element-property :name table))))
 
+
 (defun org-ref-get-labels ()
   "Return a list of labels in the buffer that you can make a ref link to.
 This is used to complete ref links and in helm menus."
@@ -1080,15 +1082,22 @@ This is used to complete ref links and in helm menus."
       (widen)
       (goto-char (point-min))
       (let ((matches '()))
-        ;; these are the label:stuff  kinds
-       (while (re-search-forward "[^#+]label:\\([a-zA-z0-9:-]*\\)" (point-max) t)
+        ;; these are the org-ref label:stuff  kinds
+       (while (re-search-forward
+               "[^#+]label:\\([a-zA-z0-9:-]*\\)" (point-max) t)
          (add-to-list 'matches (match-string-no-properties 1) t))
+       ;; now add all the other kinds of labels.
        (append matches
+               ;; #+label:
                (org-ref-get-org-labels)
+               ;; \label{}
                (org-ref-get-latex-labels)
+               ;; #+tblname: and actually #+label
                (org-ref-get-tblnames)
+               ;; CUSTOM_IDs
                (org-ref-get-custom-ids))))))
 
+
 (defun org-ref-helm-insert-label-link ()
   "Insert a label link. helm just shows you what labels already exist.
 If you are on a label link, replace it."
@@ -1100,7 +1109,8 @@ If you are on a label link, replace it."
                      ;; default action is to open to the label
                      (action . (lambda (label)
                                  ;; unfortunately I do not have markers here
-                                 (org-open-link-from-string (format "ref:%s" label))))
+                                 (org-open-link-from-string
+                                  (format "ref:%s" label))))
                      ;; if you select a label, replace current one
                      (action . (lambda (label)
                                  (switch-to-buffer ,cb)
@@ -1162,6 +1172,7 @@ If you are on a label link, replace it."
                                         (or label
                                             helm-pattern))))))))))))
 
+
 (defun org-ref-complete-link (&optional arg)
   "Completion function for ref links.
 Optional argument ARG Does nothing."
@@ -1169,11 +1180,13 @@ Optional argument ARG Does nothing."
     (setq label (completing-read "label: " (org-ref-get-labels)))
     (format "ref:%s" label)))
 
+
 (defun org-ref-insert-ref-link ()
   "Completion function for a ref link."
  (interactive)
  (insert (org-ref-complete-link)))
 
+
 (defun org-ref-helm-insert-ref-link ()
   "Helm menu to insert ref links to labels in the document.
 If you are on link, replace with newly selected label.
@@ -1272,20 +1285,14 @@ Use C-u C-u to insert a [[#custom-id]] link"
        ;; #+label: name  org-definition
        (progn
          (goto-char (point-min))
-         (re-search-forward (format "^#\\+label:\\s-*\\(%s\\)\\b" label) nil t))
+         (re-search-forward
+          (format "^#\\+label:\\s-*\\(%s\\)\\b" label) nil t))
 
        ;; org tblname
        (progn
          (goto-char (point-min))
-         (re-search-forward (format "^#\\+tblname:\\s-*\\(%s\\)\\b" label) nil t))
-
-;; Commented out because these ref links do not actually translate correctly in LaTeX.
-;; you need [[#label]] links.
-       ;; CUSTOM_ID
-;      (progn
-;        (goto-char (point-min))
-;        (re-search-forward (format ":CUSTOM_ID:\s-*\\(%s\\)" label) nil t))
-       )
+         (re-search-forward
+          (format "^#\\+tblname:\\s-*\\(%s\\)\\b" label) nil t)))
      ;; we did not find anything, so go back to where we came
      (org-mark-ring-goto)
      (error "%s not found" label))
@@ -1297,6 +1304,7 @@ Use C-u C-u to insert a [[#custom-id]] link"
     ((eq format 'latex)
      (format "\\pageref{%s}" keyword)))))
 
+
 (defun org-pageref-complete-link (&optional arg)
   "Completion function for ref links.
 Optional argument ARG Does nothing."
@@ -1304,11 +1312,13 @@ Optional argument ARG Does nothing."
     (setq label (completing-read "label: " (org-ref-get-labels)))
     (format "ref:%s" label)))
 
+
 (defun org-pageref-insert-ref-link ()
   "Insert a pageref link with completion."
  (interactive)
  (insert (org-pageref-complete-link)))
 
+
 ;; *** nameref link
 (org-add-link-type
  "nameref"
@@ -1405,7 +1415,9 @@ keyword we clicked on.  We also strip the text properties."
                (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match
              (setq key-beginning link-string-beginning))) ; no match found
          ;; save the key we clicked on.
-         (setq bibtex-key (org-ref-strip-string (buffer-substring key-beginning key-end)))
+         (setq bibtex-key
+               (org-ref-strip-string
+                (buffer-substring key-beginning key-end)))
          (set-text-properties 0 (length bibtex-key) nil bibtex-key)
          bibtex-key)
       ;; link with description. assume only one key
@@ -1655,8 +1667,8 @@ Prompt for NEW-FILE includes bib files in `org-ref-default-bibliography', and bi
   (interactive)
   (doi-utils-crossref (org-ref-get-doi-at-point)))
 
-;; *** DEPRECATED Minibuffer menu
-;; See [[Helm bibtex setup]]
+;; *** Minibuffer menu
+
 (defun org-ref-cite-onclick-minibuffer-menu (&optional link-string)
   "Action when a cite link is clicked on.
 Provides a menu of context sensitive actions.  If the bibtex entry
@@ -2383,7 +2395,7 @@ Makes a new buffer with clickable links."
           (kill-buffer "*Missing citations*"))
       (message "No bad cite links found"))))
 
-;; ** helm interface to bad citations, labels, refs in orgfile
+;; ** helm interface to bad citations, labels, refs and files in orgfile
 (defun org-ref-bad-cite-candidates ()
   "Return a list of conses (key . marker) where key does not exist in the known bibliography files, and marker points to the key."
   (let* ((cp (point))                  ; save to return to later
@@ -2450,6 +2462,10 @@ Makes a new buffer with clickable links."
          ;; this is a multiply defined label.
          (let ((cp (point)))
            (goto-char (point-min))
+           (while (re-search-forward
+                   (format  "[^#+]label:%s\\s-" label) nil t)
+             (push (cons label (point-marker)) multiple-labels))
+           (goto-char (point-min))
            (while (re-search-forward
                    (format  "\\label{%s}\\s-?" label) nil t)
              (push (cons label (point-marker)) multiple-labels))
@@ -2466,6 +2482,29 @@ Makes a new buffer with clickable links."
            (goto-char cp)))))
       multiple-labels))
 
+(defun org-ref-bad-file-link-candidates ()
+  "Return list of conses (link . marker) wehre the file in the link does not exist."
+  (let* ((bad-files '()))
+    (org-element-map (org-element-parse-buffer) 'link
+      (lambda (link)
+       (let ((type (org-element-property :type link)))
+         (when (or  (string= "file" type)
+                    (string= "attachfile" type))
+           (unless (file-exists-p (org-element-property :path link))
+             (add-to-list 'bad-files
+                          (cons (org-element-property :path link)
+                                (save-excursion
+                                  (goto-char
+                                   (org-element-property :begin link))
+                                  (point-marker)))))))))
+    ;; Let us also check \attachfile{fname}
+    (save-excursion
+      (goto-char (point-min))
+      (while (re-search-forward "\\attachfile{\\(.*\\)}" nil t)
+       (unless (file-exists-p (match-string 1))
+         (add-to-list 'bad-files (cons (match-string 1) (point-marker))))))
+    bad-files))
+
 ;;;###autoload
 (defun org-ref ()
   "Opens a helm interface to actions for org-ref.
@@ -2474,7 +2513,8 @@ Shows bad citations, ref links and labels"
   (let ((cb (current-buffer))
        (bad-citations (org-ref-bad-cite-candidates))
        (bad-refs (org-ref-bad-ref-candidates))
-       (bad-labels (org-ref-bad-label-candidates)))
+       (bad-labels (org-ref-bad-label-candidates))
+       (bad-files (org-ref-bad-file-link-candidates)))
 
     (helm :sources `(((name . "Bad citations")
                       (candidates . ,bad-citations)
@@ -2494,6 +2534,12 @@ Shows bad citations, ref links and labels"
                                          (switch-to-buffer (marker-buffer marker))
                                          (goto-char marker))))
                     ;;
+                    ((name . "Bad file links")
+                     (candidates . ,bad-files)
+                     (lambda (marker)
+                                  (switch-to-buffer (marker-buffer marker))
+                                  (goto-char marker)))
+                    ;;
                     ((name . "Utilities")
                      (candidates . (("Check buffer again" . org-ref)
                                     ("Insert citation" . helm-bibtex)
@@ -2518,8 +2564,7 @@ Shows bad citations, ref links and labels"
                                     ))
                      (action . (lambda (x)
                                  (switch-to-buffer ,cb)
-                                 (funcall x))))
-                     ))))
+                                 (funcall x))))))))
 
 ;; ** Find non-ascii charaters
 (defun org-ref-find-non-ascii-characters ()
@@ -2800,87 +2845,88 @@ Shows bad citations, ref links and labels"
 (defun org-ref-link-message ()
   "Print a minibuffer message about the link that point is on."
   (interactive)
-  (when (eq major-mode 'org-mode)
-    (let* ((object (org-element-context))
-          (type (org-element-property :type object)))
-      (save-excursion
-       (cond
-        ;; cite links
-        ((-contains? org-ref-cite-types type)
-         (message (org-ref-get-citation-string-at-point)))
-
-        ;; message some context about the label we are referring to
-        ((string= type "ref")
-         (message "%scount: %s"
-                  (org-ref-get-label-context
-                   (org-element-property :path object))
-                  (org-ref-count-labels
-                       (org-element-property :path object))))
-
-        ((string= type "eqref")
-         (message "%scount: %s"
-                  (org-ref-get-label-context
-                   (org-element-property :path object))
-                  (org-ref-count-labels
-                       (org-element-property :path object))))
-
-        ;; message the count
-        ((string= type "label")
-         (let ((count (org-ref-count-labels
-                       (org-element-property :path object))))
-           ;; get plurality on occurrence correct
-           (message (concat
-                     (number-to-string count)
-                     " occurence"
-                     (when (or (= count 0)
-                               (> count 1))
-                       "s")))))
-
-        ((string= type "custom-id")
-         (save-excursion
-           (org-open-link-from-string
-            (format "[[#%s]]" (org-element-property :path object)))
-           (message "%s" (org-get-heading))))
-
-         ;; check if the bibliography files exist.
-        ((string= type "bibliography")
-         (let* ((bibfile)
-                ;; object is the link you clicked on
-                (object (org-element-context))
-                (link-string (org-element-property :path object))
-                (link-string-beginning)
-                (link-string-end))
-           (save-excursion
-             (goto-char (org-element-property :begin object))
-             (search-forward link-string nil nil 1)
-             (setq link-string-beginning (match-beginning 0))
-             (setq link-string-end (match-end 0)))
-
-            ;; make sure we are in link and not before the :
-           (when (> link-string-beginning (point))
-             (goto-char link-string-beginning))
-
-           ;; now if we have comma separated bibliographies
-           ;; we find the one clicked on. we want to
-           ;; search forward to next comma from point
+  (save-restriction
+    (widen)
+    (when (eq major-mode 'org-mode)
+      (let* ((object (org-element-context))
+            (type (org-element-property :type object)))
+       (save-excursion
+         (cond
+          ;; cite links
+          ((-contains? org-ref-cite-types type)
+           (message (org-ref-get-citation-string-at-point)))
+
+          ;; message some context about the label we are referring to
+          ((string= type "ref")
+           (message "%scount: %s"
+                    (org-ref-get-label-context
+                     (org-element-property :path object))
+                    (org-ref-count-labels
+                     (org-element-property :path object))))
+
+          ((string= type "eqref")
+           (message "%scount: %s"
+                    (org-ref-get-label-context
+                     (org-element-property :path object))
+                    (org-ref-count-labels
+                     (org-element-property :path object))))
+
+          ;; message the count
+          ((string= type "label")
+           (let ((count (org-ref-count-labels
+                         (org-element-property :path object))))
+             ;; get plurality on occurrence correct
+             (message (concat
+                       (number-to-string count)
+                       " occurence"
+                       (when (or (= count 0)
+                                 (> count 1))
+                         "s")))))
+
+          ((string= type "custom-id")
            (save-excursion
-             (if (search-forward "," link-string-end 1 1)
-                 (setq key-end (- (match-end 0) 1)) ; we found a match
-               (setq key-end (point)))) ; no comma found so take the point
+             (org-open-link-from-string
+              (format "[[#%s]]" (org-element-property :path object)))
+             (message "%s" (org-get-heading))))
+
+          ;; check if the bibliography files exist.
+          ((string= type "bibliography")
+           (let* ((bibfile)
+                  ;; object is the link you clicked on
+                  (object (org-element-context))
+                  (link-string (org-element-property :path object))
+                  (link-string-beginning)
+                  (link-string-end))
+             (save-excursion
+               (goto-char (org-element-property :begin object))
+               (search-forward link-string nil nil 1)
+               (setq link-string-beginning (match-beginning 0))
+               (setq link-string-end (match-end 0)))
+
+             ;; make sure we are in link and not before the :
+             (when (> link-string-beginning (point))
+               (goto-char link-string-beginning))
+
+             ;; now if we have comma separated bibliographies
+             ;; we find the one clicked on. we want to
+             ;; search forward to next comma from point
+             (save-excursion
+               (if (search-forward "," link-string-end 1 1)
+                   (setq key-end (- (match-end 0) 1)) ; we found a match
+                 (setq key-end (point)))) ; no comma found so take the point
 
-           ;; and backward to previous comma from point
-           (save-excursion
-             (if (search-backward "," link-string-beginning 1 1)
-                 (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match
-               (setq key-beginning (point)))) ; no match found
-           ;; save the key we clicked on.
-           (setq bibfile
-                 (org-ref-strip-string
-                  (buffer-substring key-beginning key-end)))
-           (if (file-exists-p bibfile)
-               (message "%s exists." bibfile)
-             (message "!!! %s NOT FOUND !!!" bibfile))))
-        )))))
+             ;; and backward to previous comma from point
+             (save-excursion
+               (if (search-backward "," link-string-beginning 1 1)
+                   (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match
+                 (setq key-beginning (point)))) ; no match found
+             ;; save the key we clicked on.
+             (setq bibfile
+                   (org-ref-strip-string
+                    (buffer-substring key-beginning key-end)))
+             (if (file-exists-p bibfile)
+                 (message "%s exists." bibfile)
+               (message "!!! %s NOT FOUND !!!" bibfile))))))))))
 
 ;; ** aliases
 (defalias 'oro 'org-ref-open-citation-at-point)